home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 5
/
FreshFish_July-August1994.bin
/
bbs
/
gnu
/
gnat-1.80-diffs.lha
/
src
/
diffs
/
gnat-1.80.diffs
Wrap
Text File
|
1994-07-12
|
1MB
|
31,399 lines
diff -rc --new-file /src/baseline/gnat-1.80/Product-Info gnat-1.80/Product-Info
*** /src/baseline/gnat-1.80/Product-Info Thu Jan 1 00:00:00 1970
--- gnat-1.80/Product-Info Tue Jul 12 17:21:10 1994
***************
*** 0 ****
--- 1,20 ----
+ .name
+ gnat
+ .fullname
+ GNU Ada compiler
+ .type
+ Programmer Tool
+ .short
+ GNU Ada compiler.
+ .description
+ Port of the GNU Ada compiler. Requires matching gcc 2.5.8 distribution.
+ .version
+ 1.80
+ .author
+ .requirements
+ Amiga binaries require ixemul.library.
+ Requires gcc 2.5.8.
+ .distribution
+ GNU Public License
+ .described-by
+ Fred Fish (fnf@amigalib.com)
diff -rc --new-file /src/baseline/gnat-1.80/README-amiga gnat-1.80/README-amiga
*** /src/baseline/gnat-1.80/README-amiga Thu Jan 1 00:00:00 1970
--- gnat-1.80/README-amiga Thu Jul 7 10:36:24 1994
***************
*** 0 ****
--- 1,136 ----
+ This is the GNU Ada compiler, GNAT. The compiler is in a 'hacker
+ state', ie. it is complete and certainly not bug free. But you it can
+ compile itself, more than 110,000 lines of Ada, and many other
+ programs.
+ I have compiled the entire thing, including the compilers, the library
+ and the other utility program that came with it. I have not test any
+ of it extensively, except for compiling itself and a few old programs
+ I had from school.
+ The only mandatory files you need are gnat1 and gnatbind for the amiga
+ and the source, if you want to compile it yourself.
+ those files are
+ gnat1-gnatbind.lha
+ and gnat-1.80-src.lha
+
+ and of course, the gcc-2.5.8 source
+
+ There is a third file, gnat-1.80-bin.lha, it contains everything
+ needed to run compile ada programs, but not the source to recompile
+ GNAT.
+
+ In gnat-1.80-src.lha there is a directory called corrections, these
+ are some thing that needed to be done to gnat to get it to compile,
+ just *ruff* notes. ( don't trust the diffs , they be backward ).
+ The problem I ran into were:
+ 1. the compiler generates bad code for the parser (par.o)
+ the statement that it compiles wrong is something like
+
+ exit when SS_FLAG.uncd
+
+ par.s.diff will show you where the problem is, and a
+ working alternative.
+
+ 2. The compiler craps out with an interanl error, on two
+ code statement in uintp.adb.
+ Unitp.adb.diff shows a workaround that seem to work.
+
+ 3. The compiler bombs on some code in atree.adb.
+ Atree.adb.changes shows how to change the code,
+ but it must be repeated a couple of time.
+
+ 4. There is also a problem with the 'md' file. A replacement
+ is in the correction directory along with the original.
+
+ I also had a few other problem compiling the sytem, most seem to be
+ related to memory constraints. Plan on a lot of memory to recompile
+ this thing, > 14meg. ( most of the files do not need that much memory
+ but there are a couple that do, par-*.ad?. Also *lots* of disk space.
+
+ Another problem for amiga owners seems to be the stack. I compiled
+ one old program and ran it, it needed 470,000 stack to run. I have no
+ idea how to work around this.
+
+ Happy ADAing.
+
+ Pass Travis
+
+ ptravis@rs6.tcs.tulane.edu
+
+ ======================================================================
+ These notes added by Fred Fish.
+
+ * This file has been renamed README-amiga
+
+ * There is a new directory, "amiga", containing amiga specific
+ notes and such.
+
+ * The "corrections" directory refered to above has been moved
+ to amiga/corrections, and is not used.
+
+
+ ===============
+ REBUILDING GNAT
+ ===============
+
+ (1) Start with the baseline FSF gcc 2.5.8 archive gcc-2.5.8.tar.gz.
+ Ungzip it, and then untar it:
+
+ gzip -d gcc-2.5.8.tar.gz
+ tar -xvf gcc-2.5.8.tar
+ rm gcc-2.5.8.tar
+
+ Note: if you are starting with my CD distribution, you
+ can skip steps 1 and 2, and simply clone the gcc-2.5.8
+ tree under gnu:src/amiga to use as a starting point with
+ step 3.
+
+ (2) Cd to the gcc root directory and apply the diffs that turn the
+ baseline FSF gcc into Amiga gcc:
+
+ cd gcc-2.5.8
+ patch -p1 <gnu:src/amiga/gnat-1.80/amiga/gcc-2.5.8.diffs
+ delete #?.orig
+ delete config/m68k/#?.orig
+
+ (3) Now apply the diffs that are needed to amiga gcc files for amiga
+ gnat. These diffs don't add any files, just change the gcc ones:
+
+ patch -p1 <gnu:src/amiga/gnat-1.80/amiga/gcc-gnat.diffs
+ delete #?.orig
+ delete #?/#?/#?.orig
+
+ (4) Now copy the new ada specific source files from the gnat
+ distribution into the gcc source directory:
+
+ copy gnu:src/amiga/gnat-1.80/src "" all clone
+
+ (5) Delete the diff files provided with gnat, they are already taken
+ care of by the patches applied above.
+
+ delete #?.diff
+
+ (6) Configure gcc/gnat for amigados:
+
+ sh configure amigados
+
+ (7) Build just the ada portions:
+
+ make LANGUAGES=ada
+
+ (8) Build the ada runtime
+
+ make tmp-adainclude
+
+ (9) Install the ada binaries:
+
+ copy gnat1 gnu:lib/gcc-lib/amigados/2.5.8/gnat1
+ copy gnatbind gnu:bin/gnatbind
+ copy gnatbl gnu:bin/gnatbl
+ copy gnatchop gnu:bin/gnatchop
+ copy gnatf gnu:bin/gnatf
+ copy gnatk8 gnu:bin/gnatk8
+ copy gnatsplit gnu:bin/gnatsplit
+
+ (10) Install the ada runtime:
+
+ make install-gnatlib
diff -rc --new-file /src/baseline/gnat-1.80/amiga/corrections/Makefile gnat-1.80/amiga/corrections/Makefile
*** /src/baseline/gnat-1.80/amiga/corrections/Makefile Thu Jan 1 00:00:00 1970
--- gnat-1.80/amiga/corrections/Makefile Thu Jun 23 13:13:15 1994
***************
*** 0 ****
--- 1,3326 ----
+ VPATH = /Work/projects/gcc/gcc-2.5.8
+ VPATH = /Work/projects/gcc/gcc-2.5.8
+ # Makefile for GNU C compiler.
+ # Copyright (C) 1987, 88, 90, 91, 92, 1993 Free Software Foundation, Inc.
+
+ #This file is part of GNU CC.
+
+ #GNU CC is free software; you can redistribute it and/or modify
+ #it under the terms of the GNU General Public License as published by
+ #the Free Software Foundation; either version 2, or (at your option)
+ #any later version.
+
+ #GNU CC is distributed in the hope that it will be useful,
+ #but WITHOUT ANY WARRANTY; without even the implied warranty of
+ #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ #GNU General Public License for more details.
+
+ #You should have received a copy of the GNU General Public License
+ #along with GNU CC; see the file COPYING. If not, write to
+ #the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ # The targets for external use include:
+ # all, doc, proto, install, install-cross, install-cross-rest,
+ # uninstall, TAGS, mostlyclean, clean, distclean, realclean,
+ # stage1, stage2, stage3, stage4.
+
+ # Suppress smart makes who think they know how to automake Yacc files
+ .y.c:
+
+ # Variables that exist for you to override.
+ # See below for how to change them for certain systems.
+
+ # Selection of languages to be made.
+ LANGUAGES = c c++ objective-c ada proto
+
+ ALLOCA =
+ ALLOCA_FLAGS =
+ ALLOCA_FINISH = true
+
+ # Various ways of specifying flags for compilations:
+ # CFLAGS is for the user to override to, e.g., do a bootstrap with -O2.
+ # BOOT_CFLAGS is the value of CFLAGS to pass
+ # to the stage2 and stage3 compilations
+ # XCFLAGS is used for most compilations but not when using the GCC just built.
+ XCFLAGS =
+ CFLAGS = -g
+ BOOT_CFLAGS = -O $(CFLAGS)
+ # These exists to be overridden by the x-* and t-* files, respectively.
+ X_CFLAGS =
+ T_CFLAGS =
+
+ X_CPPFLAGS =
+ T_CPPFLAGS =
+
+ CC = cc
+ BISON = bison
+ BISONFLAGS =
+ AR = ar
+ OLDAR_FLAGS = qc
+ AR_FLAGS = rc
+ SHELL = /bin/sh
+ # on sysV, define this as cp.
+ INSTALL = cp
+ # These permit overriding just for certain files.
+ INSTALL_PROGRAM = $(INSTALL)
+ INSTALL_DATA = $(INSTALL)
+ SYMLINK = ln -s
+ MAKEINFO = makeinfo
+ TEXI2DVI = texi2dvi
+
+ # Define this as & to perform parallel make on a Sequent.
+ # Note that this has some bugs, and it seems currently necessary
+ # to compile all the gen* files first by hand to avoid erroneous results.
+ P =
+
+ # How to invoke ranlib.
+ RANLIB = ranlib
+ # Test to use to see whether ranlib exists on the system.
+ RANLIB_TEST = [ -f /usr/bin/ranlib -o -f /bin/ranlib ]
+
+ # Compiler to use for compiling libgcc1.a.
+ # OLDCC should not be the GNU C compiler,
+ # since that would compile typical libgcc1.a functions such as mulsi3
+ # into infinite recursions.
+ OLDCC = cc
+
+ # CFLAGS for use with OLDCC, for compiling libgcc1.a.
+ # NOTE: -O does not work on some Unix systems!
+ CCLIBFLAGS = -O
+
+ # Version of ar to use when compiling libgcc1.a.
+ OLDAR = ar
+
+ # Target to use when installing include directory. Either
+ # install-headers-tar or install-headers-cpio.
+ INSTALL_HEADERS_DIR = install-headers-cp
+
+ # The GCC to use for compiling libgcc2.a, enquire, and cross-test.
+ # Usually the one we just built.
+ # Don't use this as a dependency--use $(GCC_PASSES) or $(GCC_PARTS).
+ GCC_FOR_TARGET = ./xgcc -B./
+
+ # This is used instead of ALL_CFLAGS when compiling with GCC_FOR_TARGET.
+ # It omits XCFLAGS, and specifies -B./.
+ # It also specifies -B$(tooldir)/ to find as and ld for a cross compiler.
+ GCC_CFLAGS=$(INTERNAL_CFLAGS) $(X_CFLAGS) $(T_CFLAGS) $(CFLAGS)
+
+ # Special flags for compiling enquire.
+ # We disable optimization to make floating point more reliable.
+ ENQUIRE_CFLAGS = -DNO_MEM -DNO_STDDEF -DNO_LONG_DOUBLE_IO -O0
+ ENQUIRE_LDFLAGS = $(LDFLAGS)
+
+ # Tools to use when building a cross-compiler.
+ # These are used because `configure' appends `cross-make'
+ # to the makefile when making a cross-compiler.
+
+ TARGET_TOOLPREFIX = $(tooldir)/bin/
+ AR_FOR_TARGET = $(TARGET_TOOLPREFIX)ar
+ AR_FOR_TARGET_FLAGS = rc
+ RANLIB_FOR_TARGET = $(TARGET_TOOLPREFIX)ranlib
+ RANLIB_TEST_FOR_TARGET = [ -f $(TARGET_TOOLPREFIX)ranlib ]
+
+ # Dir to search for system headers. Overridden by cross-make.
+ SYSTEM_HEADER_DIR = /usr/include
+
+ # Control whether to run fixproto.
+ STMP_FIXPROTO = stmp-fixproto
+
+ # There may be a premade insn-attrtab.c for this machine.
+ # (You could rebuild it with genattrtab as usual, but it takes a long time.)
+ # PREMADE_ATTRTAB is the file name of the file to use.
+ # PREMADE_ATTRTAB_MD is the md file it corresponds to.
+ PREMADE_ATTRTAB_MD = Makefile # Guaranteed not to cmp equal to md.
+ PREMADE_ATTRTAB =
+
+ target=amiga
+ xmake_file=m68k/x-amigados
+ tmake_file=../Makefile.in
+ version=2.5.8
+ mainversion=`sed -e 's/.*\"\([0-9]*\.[0-9]*\).*/\1/' < $(srcdir)/version.c`
+
+ # Directory where sources are, from where we are.
+ srcdir = /Work/projects/gcc/gcc-2.5.8
+ # Common prefix for installation directories.
+ # NOTE: This directory must exist when you start installation.
+ prefix = /gnu
+ # Directory in which to put localized header files. On the systems with
+ # gcc as the native cc, `local_prefix' may not be `prefix' which is
+ # `/usr'.
+ # NOTE: local_prefix *should not* default from prefix.
+ local_prefix = /local
+ # Directory in which to put host dependent programs and libraries
+ exec_prefix = $(prefix)
+ # Directory in which to put the executable for the command `gcc'
+ bindir = $(exec_prefix)/bin
+ # Directory in which to put the directories used by the compiler.
+ libdir = $(exec_prefix)/lib
+ # Directory in which the compiler finds executables, libraries, etc.
+ libsubdir = $(libdir)/gcc-lib/$(target)/$(version)
+ # Directory to search for site-specific includes.
+ includedir = $(local_prefix)/include
+ # assertdir is overridden in cross-make.
+ # (But this currently agrees with what is in cross-make.)
+ assertdir = $(tooldir)/include
+ # where the info files go
+ infodir = $(prefix)/info
+ # Extension (if any) to put in installed man-page filename.
+ manext = .1
+ # Directory in which to put man pages.
+ mandir = $(prefix)/man/man1
+ # Directory in which to find other cross-compilation tools and headers.
+ # Used in install-cross.
+ tooldir = $(exec_prefix)/$(target)
+ # Dir for temp files.
+ tmpdir = /tmp
+
+ # Additional system libraries to link with.
+ CLIB=
+
+ # Change this to a null string if obstacks are installed in the
+ # system library.
+ OBSTACK=obstack.o
+
+ # Specify the rule for actually making libgcc.a,
+ LIBGCC = libgcc.a
+ # and the rule for installing it.
+ INSTALL_LIBGCC = install-libgcc
+
+ # Specify the rule for actually making libgcc1.a.
+ # The value may be empty; that means to do absolutely nothing
+ # with or for libgcc1.a.
+ LIBGCC1 = libgcc1.a
+
+ # Specify the rule for making libgcc1.a for a cross-compiler.
+ # The default rule assumes that libgcc1.a is supplied by the user.
+ CROSS_LIBGCC1 = libgcc1.cross
+
+ # Specify the rule for actually making libgcc2.a.
+ LIBGCC2 = libgcc2.a
+
+ # Options to use when compiling libgcc2.a.
+ # -g1 causes output of debug info only for file-scope entities.
+ # we use this here because that should be enough, and also
+ # so that -g1 will be tested.
+ LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) -g1
+
+ # Additional options to use when compiling libgcc2.a.
+ # Some targets override this to -Iinclude
+ LIBGCC2_INCLUDES =
+
+ # Things which must be built before building libgcc2.a.
+ # Some targets override this to stmp-int-hdrs
+ LIBGCC2_DEPS =
+
+ # Enquire target (This is a variable so that a target can choose not to
+ # build it.)
+ ENQUIRE = enquire
+
+ # Cross-test target (must also be overridable for a target)
+ CROSS_TEST = cross-test
+
+ # List of extra executables that should be compiled for this target machine
+ # that are used for compiling from source code to object code.
+ # The rules for compiling them should be in the t-* file for the machine.
+ EXTRA_PASSES =
+
+ # Like EXTRA_PASSES, but these are used when linking.
+ EXTRA_PROGRAMS =
+
+ # List of extra object files that should be compiled for this target machine.
+ # The rules for compiling them should be in the t-* file for the machine.
+ EXTRA_PARTS =
+
+ # List of extra object files that should be compiled and linked with
+ # compiler proper (cc1, cc1obj, cc1plus, gnat1).
+ EXTRA_OBJS =
+
+ # List of additional header files to install.
+ # Often this is edited directly by `configure'.
+ EXTRA_HEADERS =
+
+ # Set this to `ld' to enable use of collect2.
+ # USE_COLLECT2 =
+ # It is convenient for configure to add the assignment at the beginning,
+ # so don't override it here.
+
+ # List of extra C and assembler files to add to libgcc1.a.
+ # Assembler files should have names ending in `.asm'.
+ LIB1FUNCS_EXTRA =
+
+ # List of extra C and assembler files to add to libgcc2.a.
+ # Assembler files should have names ending in `.asm'.
+ LIB2FUNCS_EXTRA =
+
+ # Default float.h source to use for cross-compiler.
+ CROSS_FLOAT_H=float.h-cross
+
+ # Program to convert libraries.
+ LIBCONVERT =
+
+ # Control whether header files are installed.
+ INSTALL_HEADERS=install-headers
+
+ # Options for tar when copying trees. So HPUX can override it.
+ TAROUTOPTS = xpBf
+
+ # Select which version of fixincludes to use (I.E. regular versus SVR4)
+ # This value is overridden directly by configure.
+ FIXINCLUDES = Makefile.in
+
+ # Additional directories of header files to run fixincludes on.
+ # These should be directories searched automatically by default
+ # just as /usr/include is.
+ # *Do not* use this for directories that happen to contain
+ # header files, but are not searched automatically by default.
+ # On most systems, this is empty.
+ OTHER_FIXINCLUDES_DIRS=
+
+ # List of things which should already be built whenever we try to use xgcc
+ # to compile anything (without linking).
+ GCC_PASSES=xgcc cc1 cpp $(EXTRA_PASSES)
+
+ # List of things which should already be built whenever we try to use xgcc
+ # to link anything.
+ GCC_PARTS=$(GCC_PASSES) $(LIBGCC) $(EXTRA_PROGRAMS) $(USE_COLLECT2) $(EXTRA_PARTS)
+
+ # Directory to link to, when using the target `maketest'.
+ DIR = ../gcc
+
+ # Guaranteed to not exist when not passing md through cpp.
+ MD_FILE = md-cpp-not-used
+
+ # Flags to use when cross-building GCC.
+ # Prefix to apply to names of object files when using them
+ # to run on the machine we are compiling on.
+ HOST_PREFIX=
+ # Prefix to apply to names of object files when compiling them
+ # to run on the machine we are compiling on.
+ # The default for this variable is chosen to keep these rules
+ # out of the way of the other rules for compiling the same source files.
+ HOST_PREFIX_1=loser-
+ HOST_CC=$(CC)
+ HOST_CFLAGS=$(ALL_CFLAGS)
+ HOST_CLIB=$(CLIB)
+ HOST_LDFLAGS=$(LDFLAGS)
+ HOST_CPPFLAGS=$(ALL_CPPFLAGS)
+ HOST_ALLOCA=$(ALLOCA)
+ HOST_MALLOC=$(MALLOC)
+ HOST_OBSTACK=$(OBSTACK)
+
+ # Choose the real default target.
+ ALL=all.internal
+
+ # Choose the real install target.
+ INSTALL_TARGET=install-normal
+
+ # Source for float.h. Overridden by cross-make.
+ FLOAT_H=float.h-nat
+
+ # End of variables for you to override.
+
+ # Definition of `all' is here so that new rules inserted by sed
+ # do not specify the default target.
+ # The real definition is under `all.internal' (for native compilers)
+ # or `all.cross' (for cross compilers).
+ all: all.indirect
+
+ # This tells GNU Make version 3 not to put all variables in the environment.
+ .NOEXPORT:
+
+ # sed inserts variable overrides after the following line.
+ ####target overrides
+ ####host overrides
+ # Note: It doesn't do any good to try to define prefix or local_prefix
+ # in the host overrides because configure will just change them back.
+ # You either have to give an appropriate option to configure or live with
+ # an Amiga specific patch to configure. See the note in configure. -fnf
+
+ # Building under amigados almost certainly requires an already working gcc.
+ # Use gccv, which is a gcc compiled with AMIGADOS_FORK_GCC so "-pipe" will
+ # work and get exercised. To bootstrap with the regular gcc just do
+ # "make CC=gcc". To bootstrap without "-pipe" do "make PIPE=".
+
+ CC = gcc
+
+ # Disable -pipe for now since I had problems bootstrapping gcc 2.5.5 with
+ # it. (fnf)
+ #PIPE = -pipe
+
+ # Allow the user to override the default host optimization with gcc, or if the
+ # host compiler is not gcc and doesn't understand -O<N>.
+
+ X_OPTIMIZE = -O2
+
+ # The standard additional host flags for the compiler.
+
+ X_CFLAGS = $(X_OPTIMIZE)
+
+ # Man pages get a wierd suffix...
+
+ manext = .0
+
+ # We really shouldn't specify CFLAGS from here, but there's no other way
+ # to get rid of the `-g' indoctrinated by Makefile.in. Note this becomes
+ # part of both the host compilation CFLAGS and the target compilation
+ # CFLAGS.
+
+ CFLAGS =
+
+ # Ranlib does exist, but may not be in a path where the default RANLIB_TEST
+ # expects it, so just force it to true.
+
+ RANLIB_TEST = true
+
+ # My current version of ln doesn't work, so use cp instead. -fnf
+
+ HARDLINK = cp
+ # Note: It doesn't do any good to try to define prefix or local_prefix
+ # in the host overrides because configure will just change them back.
+ # You either have to give an appropriate option to configure or live with
+ # an Amiga specific patch to configure. See the note in configure. -fnf
+
+ # Building under amigados almost certainly requires an already working gcc.
+ # Use gccv, which is a gcc compiled with AMIGADOS_FORK_GCC so "-pipe" will
+ # work and get exercised. To bootstrap with the regular gcc just do
+ # "make CC=gcc". To bootstrap without "-pipe" do "make PIPE=".
+
+ CC = gcc
+
+ # Disable -pipe for now since I had problems bootstrapping gcc 2.5.5 with
+ # it. (fnf)
+ #PIPE = -pipe
+
+ # Allow the user to override the default host optimization with gcc, or if the
+ # host compiler is not gcc and doesn't understand -O<N>.
+
+ X_OPTIMIZE = -O2
+
+ # The standard additional host flags for the compiler.
+
+ X_CFLAGS = $(X_OPTIMIZE)
+
+ # Man pages get a wierd suffix...
+
+ manext = .0
+
+ # We really shouldn't specify CFLAGS from here, but there's no other way
+ # to get rid of the `-g' indoctrinated by Makefile.in. Note this becomes
+ # part of both the host compilation CFLAGS and the target compilation
+ # CFLAGS.
+
+ CFLAGS =
+
+ # Ranlib does exist, but may not be in a path where the default RANLIB_TEST
+ # expects it, so just force it to true.
+
+ RANLIB_TEST = true
+
+ # My current version of ln doesn't work, so use cp instead. -fnf
+
+ HARDLINK = cp
+ ####cross overrides
+ ####build overrides
+
+ # Now figure out from those variables how to compile and link.
+
+ all.indirect: $(ALL)
+
+ # IN_GCC tells obstack.h to use gstddef.h.
+ INTERNAL_CFLAGS = $(CROSS) -DIN_GCC
+
+ # This is the variable actually used when we compile.
+ ALL_CFLAGS = $(INTERNAL_CFLAGS) $(X_CFLAGS) $(T_CFLAGS) $(CFLAGS) $(XCFLAGS)
+
+ # Likewise.
+ ALL_CPPFLAGS = $(CPPFLAGS) $(X_CPPFLAGS) $(T_CPPFLAGS)
+
+ # Even if ALLOCA is set, don't use it if compiling with GCC.
+ USE_ALLOCA= ` case "${CC}" in "${OLDCC}") echo ${ALLOCA} ;; esac `
+ USE_HOST_ALLOCA= ` case "${HOST_CC}"@"${HOST_ALLOCA}" in "${OLDCC}"@?*) echo ${HOST_PREFIX}${HOST_ALLOCA} ;; esac `
+ USE_HOST_MALLOC= ` case "${HOST_MALLOC}" in ?*) echo ${HOST_PREFIX}${HOST_MALLOC} ;; esac `
+ USE_HOST_OBSTACK= ` case "${HOST_OBSTACK}" in ?*) echo ${HOST_PREFIX}${HOST_OBSTACK} ;; esac `
+
+ # Dependency on obstack, alloca, malloc or whatever library facilities
+ # are not installed in the system libraries.
+ # We don't use USE_ALLOCA because backquote expansion doesn't work in deps.
+ LIBDEPS= $(OBSTACK) $(ALLOCA) $(MALLOC)
+
+ # Likewise, for use in the tools that must run on this machine
+ # even if we are cross-building GCC.
+ # We don't use USE_ALLOCA because backquote expansion doesn't work in deps.
+ HOST_LIBDEPS= $(HOST_PREFIX)$(HOST_OBSTACK) $(HOST_PREFIX)$(HOST_ALLOCA) $(HOST_PREFIX)$(HOST_MALLOC)
+
+ # How to link with both our special library facilities
+ # and the system's installed libraries.
+ LIBS = $(OBSTACK) $(USE_ALLOCA) $(MALLOC) $(CLIB)
+
+ # Likewise, for use in the tools that must run on this machine
+ # even if we are cross-building GCC.
+ HOST_LIBS = $(USE_HOST_OBSTACK) $(USE_HOST_ALLOCA) $(USE_HOST_MALLOC) \
+ $(HOST_CLIB)
+
+ HOST_RTL = $(HOST_PREFIX)rtl.o
+ HOST_RTLANAL = $(HOST_PREFIX)rtlanal.o
+ HOST_PRINT = $(HOST_PREFIX)print-rtl.o
+
+ # Specify the directories to be searched for header files.
+ # Both . and srcdir are used, in that order,
+ # so that tm.h and config.h will be found in the compilation
+ # subdirectory rather than in the source directory.
+ INCLUDES = -I. -I$(srcdir) -I$(srcdir)/config
+ SUBDIR_INCLUDES = -I.. -I../$(srcdir) -I../$(srcdir)/config
+
+ # Always use -I$(srcdir)/config when compiling.
+ .c.o:
+ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
+
+ # This tells GNU make version 3 not to export all the variables
+ # defined in this file into the environment.
+ .NOEXPORT:
+
+ # Lists of files for various purposes.
+
+ # A list of all the language-specific executables.
+ COMPILERS = cc1 cc1plus cc1obj gnat1
+
+ # Language-specific object files for C.
+ C_OBJS = c-parse.o c-lang.o c-lex.o c-pragma.o \
+ c-decl.o c-typeck.o c-convert.o c-aux-info.o c-common.o c-iterate.o
+
+ # Language-specific object files for Objective C.
+ OBJC_OBJS = objc-parse.o objc-act.o c-lex.o c-pragma.o \
+ c-decl.o c-typeck.o c-convert.o c-aux-info.o c-common.o c-iterate.o
+
+ # Language-specific object files for C++.
+ CPLUS_OBJS = cp-parse.o cp-decl.o cp-decl2.o \
+ cp-typeck.o cp-type2.o cp-tree.o cp-ptree.o \
+ cp-cvt.o cp-search.o cp-lex.o cp-gc.o cp-call.o \
+ cp-class.o cp-init.o cp-method.o cp-except.o \
+ cp-expr.o cp-pt.o cp-edsel.o cp-xref.o \
+ $(CPLUS_INPUT) cp-spew.o c-common.o cp-error.o cp-errfn.o
+
+ # Languages-specific object files for Ada.
+ # Object files for gnat1 from C sources.
+ GNAT1_C_OBJS = b_gnat1.o a-adaint.o a-gettty.o a-gtran3.o a-misc.o a-trans3.o \
+ a-trans4.o a-trans.o a-uintp.o
+
+ # Object files from Ada sources that are used by gnat1 and gnatf
+ GNAT_ADA_OBJS = alloc.o atree.o casing.o comperr.o csets.o debug.o \
+ debug_a.o einfo.o elists.o errout.o excep.o expand.o \
+ exp_attr.o exp_ch2.o exp_ch3.o \
+ exp_ch4.o exp_ch5.o exp_ch6.o exp_ch7.o exp_ch8.o exp_ch9.o exp_ch10.o \
+ exp_ch11.o exp_ch12.o exp_ch13.o exp_intr.o exp_prag.o exp_util.o fname.o \
+ frontend.o \
+ get_targ.o gnatvsn.o itypes.o krunch.o lib.o limits.o namet.o nlists.o \
+ nmake.o opt.o osint.o output.o par.o rat.o rtsfind.o scans.o scn.o \
+ sdefault.o sem.o sem_attr.o sem_ch3.o sem_ch4.o \
+ sem_ch5.o sem_ch6.o sem_ch7.o sem_ch8.o sem_ch9.o sem_ch10.o sem_ch11.o \
+ sem_ch12.o sem_ch13.o sem_disp.o sem_eval.o sem_intr.o sem_prag.o \
+ sem_res.o sem_type.o \
+ sem_util.o sinfo.o sinfo-cn.o sinput.o snames.o sprint.o stand.o \
+ stringt.o style.o switch.o system.o s-assert.o s-secsta.o \
+ s-stalib.o s-stoele.o s-strcon.o s-strequ.o s-tasoli.o s-taspda.o s-traceb.o \
+ s-enviro.o tbuild.o treepr.o treeprs.o ttypes.o ttypef.o types.o \
+ uintp.o uname.o unixlib.o usage.o widechar.o
+
+ # Object files for gnat executables
+ GNATF_OBJS = $(GNAT_ADA_OBJS) gnatfdrv.o xref.o xref_tab.o a-adaint.o \
+ a-gettty.o
+ GNAT1_ADA_OBJS = $(GNAT_ADA_OBJS) back_end.o gnat1drv.o
+ GNAT1_OBJS = $(GNAT1_C_OBJS) $(GNAT1_ADA_OBJS)
+ GNATBIND_OBJS = gnatbind.o ali.o alloc.o bcheck.o binde.o binderr.o bindgen.o \
+ bindusg.o butil.o debug.o excep.o gnatvsn.o limits.o namet.o \
+ opt.o osint.o output.o sdefault.o switch.o system.o \
+ s-assert.o s-strequ.o s-tasoli.o s-taspda.o s-traceb.o s-secsta.o \
+ s-stalib.o s-stoele.o s-enviro.o types.o unixlib.o widechar.o a-adaint.o
+
+ # ??? should this include all the s-*.o files explicitly?
+ GKRUNCH_OBJS = ada.o a-ioexce.o a-teioau.o a-textio.o gkrunch.o krunch.o \
+ system.o s-enviro.o s-stoele.o s-secsta.o s-taspda.o s-tasoli.o \
+ s-stalib.o $(LIBGNAT_OBJS)
+
+ # The runtime library for gnat comprises two directories. One contains the
+ # Ada source files that the compiler (gnat1) needs -- these files are listed
+ # by ADA_INCLUDE_SRCS -- and the other contains the object files and their
+ # corresponding .ali files for the parts written in Ada, libgnat.a for
+ # the parts of the runtime written in C, and libpthreads.a for the pthreads
+ # emulation library. LIBGNAT_OBJS lists the objects that go into libgnat.a,
+ # while GNAT_RTL_OBJS lists the object files compiled from Ada sources that
+ # go into the directory. The pthreads emulation is built in the threads
+ # subdirectory and copied.
+ LIBGNAT_SRCS = io-aux.c a-cio.c get_errno.c
+
+ LIBGNAT_OBJS = io-aux.o a-cio.o get_errno.o
+
+ # NOTE ??? - when the -I option for compiling Ada code is made to work,
+ # the library installation will change and there will be a
+ # GNAT_RTL_SRCS. Right now we count on being able to build GNAT_RTL_OBJS
+ # from ADA_INCLUDE_SRCS.
+ GNAT_RTL_OBJS = ada.o a-calend.o \
+ a-chlat1.o a-cwila1.o a-finali.o \
+ a-charac.o \
+ a-ioexce.o \
+ a-numeri.o \
+ a-numaux.o \
+ a-nlelfu.o \
+ a-nllefu.o \
+ a-nselfu.o \
+ a-nuelfu.o a-nuranu.o \
+ a-string.o a-strmap.o a-strbou.o a-strcon.o\
+ a-strfix.o a-strsea.o a-tags.o \
+ a-taside.o \
+ a-textio.o \
+ a-teioau.o calendar.o interfac.o ioexcept.o \
+ system.o \
+ s-addima.o \
+ s-assert.o \
+ s-enviro.o \
+ s-errrep.o \
+ s-cconst.o \
+ s-comexc.o \
+ s-finimp.o \
+ s-poscon.o \
+ s-poserr.o \
+ s-posrte.o \
+ s-postim.o \
+ s-pthrea.o \
+ s-img_b.o \
+ s-img_c.o s-img_i.o s-imglli.o \
+ s-img_f.o s-img_lf.o s-imgllf.o s-img_sf.o \
+ s-img_wc.o \
+ s-secsta.o \
+ s-stalib.o \
+ s-std.o s-stoele.o \
+ s-strcon.o s-strequ.o \
+ s-taprob.o \
+ s-taruty.o \
+ s-tasabo.o \
+ s-tasoli.o \
+ s-tasclo.o \
+ s-taskin.o \
+ s-tasmem.o \
+ s-taspda.o \
+ s-taspri.o \
+ s-tasque.o \
+ s-tasren.o \
+ s-tassta.o \
+ s-tastal.o \
+ s-tatise.o \
+ s-tcmasp.o \
+ s-timtyp.o \
+ s-unstyp.o \
+ s-xp.o \
+ s-xp_bml.o \
+ s-xp_bmi.o \
+ s-xp_f.o s-xp_i.o \
+ s-xp_lf.o s-xp_li.o s-xp_llf.o s-xp_lli.o \
+ s-xp_nbm.o \
+ s-xp_sf.o s-xp_si.o s-xp_ssi.o \
+ text_io.o \
+ io.o a-cio.o get_errno.o
+
+ ADA_INCLUDE_SRCS = ada.ads \
+ a-astaco.ads \
+ a-calend.ads a-calend.adb \
+ a-calcon.ads a-calcon.adb \
+ a-caldel.adb \
+ a-charac.ads a-charac.adb \
+ a-chlat1.ads a-cwila1.ads \
+ a-decima.ads \
+ a-direio.ads a-direio.adb \
+ a-dynpri.ads \
+ a-except.ads a-finali.ads a-finali.adb \
+ a-interr.ads \
+ a-intnam.ads \
+ a-ioexce.ads \
+ a-numeri.ads \
+ a-numaux.ads \
+ a-nuelfu.ads \
+ a-ngelfu.ads \
+ a-ngelfu.adb \
+ a-ngcoty.ads \
+ a-ngcoty.adb \
+ a-ngcefu.ads \
+ a-ngcefu.adb \
+ a-nlelfu.ads \
+ a-nllefu.ads \
+ a-nuranu.ads \
+ a-nuranu.adb \
+ a-nselfu.ads \
+ a-reatim.ads \
+ a-sequio.ads a-sequio.adb\
+ a-string.ads \
+ a-strcon.ads \
+ a-strbou.ads a-strbou.adb \
+ a-strfix.ads a-strfix.adb \
+ a-strsea.ads a-strsea.adb \
+ a-strmap.ads a-strmap.adb \
+ a-stwibo.ads a-stwibo.adb \
+ a-stwico.ads \
+ a-stwifi.ads a-stwifi.adb \
+ a-stwima.ads a-stwima.adb \
+ a-stwise.ads a-stwise.adb \
+ a-stwiun.ads a-stwiun.adb \
+ a-strunb.ads a-strunb.adb \
+ a-storio.ads a-storio.adb \
+ a-stream.ads a-ststio.ads \
+ a-tags.adb a-tags.ads \
+ a-sytaco.ads \
+ a-tasatt.ads a-tasatt.adb \
+ a-taside.ads a-taside.adb \
+ a-textio.ads a-textio.adb \
+ a-teioau.ads a-teioau.adb \
+ a-ticoio.ads a-ticoio.adb \
+ a-teiopi.ads \
+ a-unccon.ads a-unccon.adb \
+ a-uncdea.ads a-uncdea.adb \
+ a-witeio.ads \
+ a-wticio.ads a-wticio.adb \
+ a-wtiopi.ads \
+ calendar.ads \
+ directio.ads \
+ interfac.ads \
+ i-c.ads i-c.adb \
+ i-cpoint.ads \
+ i-cstrin.ads i-cstrin.adb\
+ i-cobol.ads i-fortra.ads \
+ ioexcept.ads \
+ sequenio.ads \
+ s-assert.ads \
+ s-addima.ads s-addima.adb \
+ s-errrep.ads s-errrep.adb \
+ s-cconst.ads \
+ s-comexc.ads s-comexc.adb \
+ s-enviro.ads s-enviro.adb \
+ s-finimp.ads s-finimp.adb \
+ s-img_b.adb s-img_b.ads \
+ s-img_c.adb s-img_c.ads s-img_f.ads s-img_f.adb \
+ s-img_i.ads s-img_i.adb s-img_lf.adb s-img_lf.ads \
+ s-imgllf.adb s-imgllf.ads s-imglli.adb s-imglli.ads \
+ s-img_sf.adb s-img_sf.ads s-img_wc.ads s-img_wc.adb \
+ s-poscon.ads \
+ s-poserr.ads \
+ s-posrte.ads s-posrte.adb \
+ s-postim.ads s-postim.adb \
+ s-pthrea.ads s-pthrea.adb \
+ s-reatim.ads s-reatim.adb \
+ s-retico.ads s-retico.adb \
+ s-retide.ads s-retide.adb \
+ s-secsta.ads s-secsta.adb \
+ s-stalib.ads \
+ s-std.ads s-std.adb \
+ s-stoele.ads s-stoele.adb \
+ s-strcon.adb s-strcon.ads \
+ s-strequ.adb s-strequ.ads \
+ s-taprob.adb s-taprob.ads \
+ s-taruty.adb s-taruty.ads \
+ s-tasabo.adb s-tasabo.ads \
+ s-tasoli.adb s-tasoli.ads \
+ s-taspda.adb s-taspda.ads \
+ s-tasclo.adb s-tasclo.ads \
+ s-taskin.adb s-taskin.ads \
+ s-tasmem.adb s-tasmem.ads \
+ s-taspri.adb s-taspri.ads \
+ s-tasque.adb s-tasque.ads \
+ s-tasren.adb s-tasren.ads \
+ s-tassta.adb s-tassta.ads \
+ s-tastal.adb s-tastal.ads \
+ s-tatise.adb s-tatise.ads \
+ s-tcmasp.adb s-tcmasp.ads \
+ s-timtyp.ads \
+ system.ads \
+ s-xp.adb s-xp.ads \
+ s-xp_bml.ads s-xp_bml.adb \
+ s-xp_bmi.ads s-xp_bmi.adb \
+ s-xp_f.ads s-xp_i.ads s-xp_lf.ads s-xp_li.ads \
+ s-xp_llf.ads s-xp_lli.ads \
+ s-xp_nbm.adb s-xp_nbm.ads \
+ s-xp_sf.ads s-xp_si.ads \
+ s-xp_ssi.ads \
+ s-unstyp.ads \
+ text_io.ads \
+ unchconv.adb unchconv.ads \
+ unchdeal.adb unchdeal.ads \
+ io.ads io.adb
+
+ # Files specific to the C interpreter bytecode compiler(s).
+ BC_OBJS = bc-emit.o bc-optab.o
+
+ # Language-independent object files.
+ OBJS = toplev.o version.o tree.o print-tree.o stor-layout.o fold-const.o \
+ function.o stmt.o expr.o calls.o expmed.o explow.o optabs.o varasm.o \
+ rtl.o print-rtl.o rtlanal.o emit-rtl.o real.o \
+ dbxout.o sdbout.o dwarfout.o xcoffout.o \
+ integrate.o jump.o cse.o loop.o unroll.o flow.o stupid.o combine.o \
+ regclass.o local-alloc.o global.o reload.o reload1.o caller-save.o \
+ insn-peep.o reorg.o sched.o final.o recog.o reg-stack.o \
+ insn-opinit.o insn-recog.o insn-extract.o insn-output.o insn-emit.o \
+ insn-attrtab.o aux-output.o getpwd.o convert.o $(EXTRA_OBJS)
+
+ # GEN files are listed separately, so they can be built before doing parallel
+ # makes for cc1 or cc1plus. Otherwise sequent parallel make attempts to load
+ # them before rtl.o is compiled.
+ GEN= genemit genoutput genrecog genextract genflags gencodes genconfig genpeep
+
+ # Files to be copied away after each stage in building.
+ STAGESTUFF = *.o insn-flags.h insn-config.h insn-codes.h \
+ insn-output.c insn-recog.c insn-emit.c insn-extract.c insn-peep.c \
+ insn-attr.h insn-attrtab.c insn-opinit.c \
+ stamp-flags stamp-config stamp-codes \
+ stamp-output stamp-recog stamp-emit stamp-extract stamp-peep \
+ stamp-attr stamp-attrtab stamp-opinit stamp-proto \
+ genemit genoutput genrecog genextract genflags gencodes genconfig genpeep \
+ genattrtab genattr genopinit \
+ bc-arity.h bc-opcode.h bc-opname.h \
+ stamp-bcarity stamp-bcopcode stamp-bcopname \
+ bi-arity bi-opcode bi-opname \
+ $(GCC_PASSES) $(EXTRA_PARTS) $(EXTRA_PROGRAMS) gcc-cross cccp g++ g++-cross \
+ cc1plus cc1obj enquire protoize unprotoize specs collect2 $(USE_COLLECT2)
+
+ # Members of libgcc1.a.
+ LIB1FUNCS = _mulsi3 _udivsi3 _divsi3 _umodsi3 _modsi3 \
+ _lshrsi3 _lshlsi3 _ashrsi3 _ashlsi3 \
+ _divdf3 _muldf3 _negdf2 _adddf3 _subdf3 \
+ _fixdfsi _fixsfsi _floatsidf _floatsisf _truncdfsf2 _extendsfdf2 \
+ _addsf3 _negsf2 _subsf3 _mulsf3 _divsf3 \
+ _eqdf2 _nedf2 _gtdf2 _gedf2 _ltdf2 _ledf2 \
+ _eqsf2 _nesf2 _gtsf2 _gesf2 _ltsf2 _lesf2
+
+ # Library members defined in libgcc2.c.
+ LIB2FUNCS = _muldi3 _divdi3 _moddi3 _udivdi3 _umoddi3 _negdi2 \
+ _lshrdi3 _lshldi3 _ashldi3 _ashrdi3 _ffsdi2 \
+ _udiv_w_sdiv _udivmoddi4 _cmpdi2 _ucmpdi2 _floatdidf _floatdisf \
+ _fixunsdfsi _fixunssfsi _fixunsdfdi _fixdfdi _fixunssfdi _fixsfdi \
+ _fixxfdi _fixunsxfdi _floatdixf _fixunsxfsi \
+ _fixtfdi _fixunstfdi _floatditf \
+ __gcc_bcmp _varargs _eprintf _op_new _new_handler _op_delete \
+ _bb _shtab _clear_cache _trampoline __main _exit _ctors
+
+ # Header files that are made available under the same name
+ # to programs compiled with GCC.
+ USER_H = va-alpha.h va-h8300.h va-i860.h va-i960.h va-mips.h va-m88k.h \
+ va-pa.h va-pyr.h va-sparc.h va-clipper.h va-spur.h proto.h $(EXTRA_HEADERS)
+
+ # The files that "belong" in CONFIG_H are deliberately omitted
+ # because having them there would not be useful in actual practice.
+ # All they would do is cause complete recompilation every time
+ # one of the machine description files is edited.
+ # That may or may not be what one wants to do.
+ # If it is, rm *.o is an easy way to do it.
+ # CONFIG_H = config.h tm.h
+ CONFIG_H =
+ RTL_H = rtl.h rtl.def machmode.h machmode.def
+ TREE_H = tree.h real.h tree.def machmode.h machmode.def
+ CPLUS_TREE_H = $(TREE_H) cp-tree.h cp-tree.def
+ BYTECODE_H = bytecode.h bc-emit.h bc-optab.h
+
+ # Avoid a lot of time thinking about remaking Makefile.in and *.def.
+ .SUFFIXES: .in .def
+
+ # Say how to compile Ada programs.
+ .SUFFIXES: .ada .adb .ads
+
+ ADA_CC=$(CC)
+ ADAFLAGS= -gnatg -gnata
+ BOOT_ADAFLAGS= $(ADAFLAGS)
+ ALL_ADAFLAGS= $(CFLAGS) $(ADAFLAGS)
+ GNATBIND= gnatbind
+
+ .ada.o:
+ $(ADA_CC) -c $(ALL_ADAFLAGS) $<
+ .adb.o:
+ $(ADA_CC) -c $(ALL_ADAFLAGS) $<
+ .ads.o:
+ $(ADA_CC) -c $(ALL_ADAFLAGS) $<
+
+ Makefile: $(srcdir)/Makefile.in $(srcdir)/configure $(srcdir)/version.c \
+ $(srcdir)/config/$(xmake_file) $(srcdir)/config/$(tmake_file)
+ sh config.status
+
+ all.internal: start.encap rest.encap
+ # This is what to compile if making a cross-compiler.
+ # Note that we can compile enquire using the cross-compiler just built,
+ # although we can't run it on this machine.
+ all.cross: native gcc-cross g++-cross specs $(LIBGCC) stmp-headers $(STMP_FIXPROTO) $(CROSS_TEST) $(ENQUIRE) $(EXTRA_PARTS)
+ # This is what to compile if making gcc with a cross-compiler.
+ all.build: native xgcc g++ $(EXTRA_PARTS)
+ # This is what must be made before installing GCC and converting libraries.
+ start.encap: native xgcc g++ specs $(LIBGCC1) xlimits.h
+ # Use this to make a GCC that will be used only to recompile GCC.
+ for-bootstrap: start.encap $(LIBGCC)
+ # These can't be made, with COFF encapsulation, until after GCC can run.
+ rest.encap: $(LIBGCC) stmp-headers $(STMP_FIXPROTO) $(EXTRA_PARTS)
+ # This is what is made with the host's compiler
+ # whether making a cross compiler or not.
+ native: config.status cpp $(LANGUAGES) $(EXTRA_PASSES) $(EXTRA_PROGRAMS) $(USE_COLLECT2)
+
+ # Define the names for selecting languages in LANGUAGES.
+ # Note that it would be nice to move the dependency on g++
+ # into the C++ rule, but that needs a little bit of work
+ # to do the right thing within all.cross.
+ C c: cc1
+ C++ c++: cc1plus
+ # The next two ought to depend on objc-runtime, but that doesn't work yet.
+ OBJC objc: cc1obj
+ OBJECTIVE-C objective-c: cc1obj
+ Ada ada: gnat1 gnatbind gnatbl gnatf gkrunch gnatchop
+ true
+ PROTO: proto
+
+ # Really, really stupid make features, such as SUN's KEEP_STATE, may force
+ # a target to build even if it is up-to-date. So we must verify that
+ # config.status does not exist before failing.
+ config.status:
+ @if [ ! -f config.status ] ; then \
+ echo You must configure gcc. Look at the INSTALL file for details.; \
+ false; \
+ else \
+ true; \
+ fi
+
+ # On the target machine, finish building a cross compiler.
+ # This does the things that can't be done on the host machine.
+ rest.cross: $(LIBGCC) gfloat.h specs
+
+ # Verify that it works to compile and link cross-test.
+ # If it does, then there are sufficient replacements for libgcc1.a.
+ cross-test: cross-test.o native gcc-cross $(LIBGCC) $(GCC_PARTS)
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) cross-test.o -o $@
+ cross-test.o: cross-test.c native gcc-cross
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(ALL_CPPFLAGS) -c $(srcdir)/cross-test.c
+
+ # Recompile all the language-independent object files.
+ # This is used only if the user explicitly asks for it.
+ compilations: ${OBJS}
+
+ # We call this executable `xgcc' rather than `gcc'
+ # to avoid confusion if the current directory is in the path
+ # and CC is `gcc'. It is renamed to `gcc' when it is installed.
+ xgcc: gcc.o version.o $(LIBDEPS)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o xgcc gcc.o version.o $(LIBS)
+
+ # Dump a specs file to make -B./ read these specs over installed ones.
+ specs: xgcc
+ $(GCC_FOR_TARGET) -dumpspecs > specs
+
+ # Create the compiler driver for g++.
+ g++: g++.o $(LIBDEPS)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o g++ g++.o $(LIBS)
+
+ # We do want to create an executable named `xgcc', so we can use it to
+ # compile libgcc2.a.
+ # Also create gcc-cross, so that install-common will install properly.
+ gcc-cross: xgcc
+ cp xgcc gcc-cross
+
+ # Create a version of the g++ driver which calls the cross-compiler.
+ g++-cross: $(srcdir)/g++.c
+ $(CC) $(ALL_CFLAGS) $(INCLUDES) $(LDFLAGS) -o g++-cross \
+ -DGCC_NAME=\"$(target)-gcc\" $(srcdir)/g++.c version.o $(LIBS)
+
+ cc1: $(P) $(C_OBJS) $(OBJS) $(BC_OBJS) $(LIBDEPS)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o cc1 $(C_OBJS) $(OBJS) $(BC_OBJS) $(LIBS)
+
+ cc1plus: $(P) $(CPLUS_OBJS) $(OBJS) $(BC_OBJS) $(LIBDEPS)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o cc1plus $(CPLUS_OBJS) $(BC_OBJS) $(OBJS) $(LIBS)
+
+ cc1obj: $(P) $(OBJC_OBJS) $(OBJS) $(BC_OBJS) $(LIBDEPS)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o cc1obj $(OBJC_OBJS) $(OBJS) $(BC_OBJS) $(LIBS)
+
+ # Needs to be built with CC=gcc
+ gnat1: $(P) $(GNAT1_OBJS) $(OBJS) $(BC_OBJS) $(LIBDEPS)
+ $(ADA_CC) $(ALL_CFLAGS) $(LDFLAGS) -o gnat1 $(GNAT1_OBJS) $(OBJS) $(BC_OBJS) $(LIBS)
+
+ gnatf: $(P) $(GNATF_OBJS) b_gnatf.o
+ $(ADA_CC) $(ALL_CFLAGS) $(LDFLAGS) -o gnatf $(GNATF_OBJS) b_gnatf.o
+
+ gnatbind: $(P) $(GNATBIND_OBJS) b_gnatb.o
+ $(ADA_CC) $(ALL_CFLAGS) $(LDFLAGS) -o gnatbind $(GNATBIND_OBJS)\
+ b_gnatb.o
+
+ gkrunch: $(P) $(GKRUNCH_OBJS) b_gkrun.o
+ $(ADA_CC) $(ALL_CFLAGS) $(LDFLAGS) -o gkrunch $(GKRUNCH_OBJS) b_gkrun.o
+
+ gnatchop: $(P) gnatchop.o
+ $(ADA_CC) $(ALL_CFLAGS) $(LDFLAGS) -o gnatchop gnatchop.o
+
+ gnatbl.o: gnatbl.c config.status
+ $(ADA_CC) -c $(ALL_CFLAGS) $(INCLUDES) \
+ -DADA_RTL_OBJ_DIR="\"$(ADA_RTL_OBJ_DIR)\"" gnatbl.c
+
+ gnatbl: gnatbl.o
+ $(ADA_CC) -o gnatbl $(ALL_CFLAGS) $(LDFLAGS) gnatbl.o
+
+ # .s files for cross-building
+ gnat-cross: force
+ make $(GNAT1_ADA_OBJS) CC="gcc -Bstage1/" CFLAGS="-S -gnatp"
+
+ # Copy float.h from its source.
+ gfloat.h: $(FLOAT_H)
+ cp $(FLOAT_H) gfloat.h
+
+ # Create float.h source for the native machine.
+ float.h-nat: enquire
+ -./enquire -f > tmp-float.h
+ mv tmp-float.h float.h-nat
+
+ # Create a dummy float.h source for a cross-compiler.
+ float.h-cross:
+ echo "#error float.h values not known for cross-compiler" > float.h-cross
+
+ # Used to compile enquire with standard cc, but have forgotten why.
+ # Let's try with GCC.
+ enquire: enquire.o $(GCC_PARTS)
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(ENQUIRE_LDFLAGS) enquire.o -o $@
+ enquire.o: $(srcdir)/enquire.c $(GCC_PASSES)
+ # -if [ "$(srcdir)" != "." ]; then rm -f ./enquire.c; else true; fi
+ # -cp $(srcdir)/enquire.c . > /dev/null 2>&1
+ # Breaking this line caused a problem with one version of GNU make.
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(ALL_CPPFLAGS) $(ENQUIRE_CFLAGS) -I. -c $(srcdir)/enquire.c
+
+ # Build the version of limits.h that we will install.
+ xlimits.h: glimits.h limitx.h limity.h
+ if [ -f $(SYSTEM_HEADER_DIR)/limits.h ] ; then \
+ cat $(srcdir)/limitx.h $(srcdir)/glimits.h $(srcdir)/limity.h > xlimits.h; \
+ else \
+ cat $(srcdir)/glimits.h > xlimits.h; \
+ fi
+
+ # Build libgcc.a.
+ # This is done in two parts because some functions, in libgcc1.c,
+ # must be compiled with something other than GCC,
+ # while the rest, in libgcc2.c, must be compiled with xgcc.
+ # That means we can't do libgcc2.c until after xgcc, cc1, etc.
+
+ # Use this as value of LIBGCC1 to cause conversion to GNU library format.
+ # LIBCONVERT should put its output in libgcc1.conv.
+ libgcc1.conv: libgcc1.a
+ $(LIBCONVERT) libgcc1.a libgcc1.conv
+
+ # Use this as value of LIBGCC1 to inhibit use of libgcc1.c entirely.
+ # Make an empty file instead.
+ libgcc1.null: $(GCC_PASSES)
+ echo "__foo () {}" > dummy.c
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) -c dummy.c
+ $(OLDAR) $(OLDAR_FLAGS) libgcc1.null dummy.o
+ rm -f dummy.o dummy.c
+
+ # This is $(LIBGCC1) for a cross-compiler.
+ # We have no automatic way of building libgcc1.a,
+ # so it's up to the installer to find a way to do that.
+ # This rule deliberately does not depend on libgcc1.a
+ # so that it will fail if the installer hasn't provided it.
+ libgcc1.cross:
+ mv libgcc1.a libgcc1.cross || (echo You must find a way to make libgcc1.a; false)
+
+ # Compile the library of arithmetic subroutines with the native compiler.
+ # Don't compile it with GCC!
+ # (That would cause most arithmetic functions to call themselves.)
+ libgcc1.a: libgcc1.c $(CONFIG_H) $(LIB1FUNCS_EXTRA) config.status
+ -rm -f tmplibgcc1.a
+ # Actually build it in tmplibgcc1.a, then rename at end,
+ # so that libgcc1.a itself remains nonexistent if compilation is aborted.
+ # -e causes any failing command to make this rule fail.
+ # -e doesn't work in certain shells, so we test $$? as well.
+ # lynx has a broken ar, it always complains when the initial library is
+ # empty, thus this command works only if we don't do -e
+ # There is a trailing backslash (\) deleted from the following line.
+ # set -e;
+ for name in $(LIB1FUNCS); \
+ do \
+ echo $${name}; \
+ rm -f $${name}.o; \
+ $(OLDCC) $(CCLIBFLAGS) $(INCLUDES) -c -DL$${name} $(srcdir)/libgcc1.c; \
+ if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
+ mv libgcc1.o $${name}.o; \
+ $(OLDAR) $(OLDAR_FLAGS) tmplibgcc1.a $${name}.o; \
+ rm -f $${name}.o; \
+ done
+ # Some shells crash when a loop has no items.
+ # So make sure there is always at least one--`..'.
+ # Then ignore it.
+ # We don't use -e here because there are if statements
+ # that should not make the command give up when the if condition is false.
+ # Instead, we test for failure after each command where it matters.
+ -for file in .. $(LIB1FUNCS_EXTRA); \
+ do \
+ if [ x$${file} != x.. ]; then \
+ name=`echo $${file} | sed -e 's/[.]c$$//' -e 's/[.]asm$$//'`; \
+ echo $${name}; \
+ if [ $${name}.asm = $${file} ]; then \
+ cp $${file} $${name}.s || exit 1; file=$${name}.s; \
+ else true; fi; \
+ $(OLDCC) $(CCLIBFLAGS) $(INCLUDES) -c $${file}; \
+ if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
+ $(OLDAR) $(OLDAR_FLAGS) tmplibgcc1.a $${name}.o; \
+ if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
+ rm -f $${name}.[so]; \
+ else true; \
+ fi; \
+ done
+ mv tmplibgcc1.a libgcc1.a
+
+ # Compiling libgcc2.a requires making sure that cc1, etc. have been compiled.
+ # But recompiling cc1 should not force recompilation of libgcc2.a.
+ # If you want to force recompilation, delete libgcc2.a.
+ libgcc2.ready: $(GCC_PASSES) $(LIBGCC2_DEPS)
+ -if [ -f libgcc2.ready ] ; then \
+ true; \
+ else \
+ touch libgcc2.ready; \
+ fi
+
+ libgcc2.a: libgcc2.c libgcc2.ready $(CONFIG_H) $(LIB2FUNCS_EXTRA) \
+ machmode.h longlong.h gbl-ctors.h config.status
+ # Actually build it in tmplibgcc2.a, then rename at end,
+ # so that libgcc2.a itself remains nonexistent if compilation is aborted.
+ -rm -f tmplibgcc2.a
+ # -e causes any failing command to make this rule fail.
+ # -e doesn't work in certain shells, so we test $$? as well.
+ # lynx has a broken ar, it always complains when the initial library is
+ # empty, thus this command works only if we don't do -e
+ # There is a trailing backslash (\) deleted from the following line.
+ # set -e;
+ for name in $(LIB2FUNCS); \
+ do \
+ echo $${name}; \
+ $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) -c -DL$${name} \
+ $(srcdir)/libgcc2.c -o $${name}.o; \
+ if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
+ $(AR) $(AR_FLAGS) tmplibgcc2.a $${name}.o; \
+ rm -f $${name}.o; \
+ done
+ # Some shells crash when a loop has no items.
+ # So make sure there is always at least one--`..'.
+ # Then ignore it.
+ # We don't use -e here because there are if statements
+ # that should not make the command give up when the if condition is false.
+ # Instead, we test for failure after each command where it matters.
+ -for file in .. $(LIB2FUNCS_EXTRA); \
+ do \
+ if [ x$${file} != x.. ]; then \
+ name=`echo $${file} | sed -e 's/[.]c$$//' -e 's/[.]asm$$//'`; \
+ echo $${name}; \
+ if [ $${name}.asm = $${file} ]; then \
+ cp $${file} $${name}.s || exit 1; file=$${name}.s; \
+ else true; fi; \
+ $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) -c $${file}; \
+ if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
+ $(AR) $(AR_FLAGS) tmplibgcc2.a $${name}.o; \
+ rm -f $${name}.[so]; \
+ else true; \
+ fi; \
+ done
+ mv tmplibgcc2.a libgcc2.a
+ # These lines were deleted from above the mv command
+ # because ranlibing libgcc.a itself should suffice.
+ # -if [ x${HPUX_GAS} = x ] ; then \
+ # if $(RANLIB_TEST) ; then $(RANLIB) tmplibgcc2.a; else true; fi \
+ # else true; fi
+
+ # Combine the various libraries into a single library, libgcc.a.
+ libgcc.a: $(LIBGCC1) $(LIBGCC2)
+ -rm -rf tmplibgcc.a libgcc.a tmpcopy
+ mkdir tmpcopy
+ -if [ x$(LIBGCC1) != x ]; \
+ then (cd tmpcopy; $(AR) x ../$(LIBGCC1)); \
+ else true; \
+ fi
+ # Some versions of ar (specifically the one in RISC/os 5.x), create an
+ # unwritable table of contents file, and then print an error message when
+ # the second ar command tries to overwrite this file. To avoid the error
+ # message from ar, we make sure all files are writable.
+ (cd tmpcopy; chmod +w * > /dev/null 2>&1)
+ (cd tmpcopy; $(AR) x ../$(LIBGCC2))
+ (cd tmpcopy; $(AR) $(AR_FLAGS) ../tmplibgcc.a *.o)
+ rm -rf tmpcopy
+ -if $(RANLIB_TEST) ; then $(RANLIB) tmplibgcc.a; else true; fi
+ # Actually build it in tmplibgcc.a, then rename at end,
+ # so that libgcc.a itself remains nonexistent if compilation is aborted.
+ mv tmplibgcc.a libgcc.a
+
+ objc-runtime: libobjc.a
+
+ # Build the Objective C runtime library.
+ libobjc.a: cc1obj libgcc2.ready $(USE_COLLECT2) $(EXTRA_PARTS)
+ if [ -d objc ]; then true; else mkdir objc; fi
+ thisdir1=`pwd`; \
+ srcdir1=`cd $(srcdir); pwd`; \
+ cd objc; \
+ $(MAKE) -f $${srcdir1}/objc/Makefile libobjc.a \
+ srcdir=$${srcdir1} tooldir=$(tooldir) AR="$(AR)" AR_FLAGS="$(AR_FLAGS)" \
+ GCC_FOR_TARGET="$${thisdir1}/xgcc -B$${thisdir1}/" \
+ GCC_CFLAGS="$(GCC_CFLAGS)"
+ -rm -f libobjc.a
+ ln objc/libobjc.a . >/dev/null 2>&1 || cp objc/libobjc.a .
+ -if $(RANLIB_TEST) ; then $(RANLIB) libobjc.a; else true; fi
+
+ # This is used by objc/Makefile if the user runs that directly.
+ sublibobjc.a: cc1obj libgcc2.ready
+ thisdir1=`pwd`; \
+ srcdir1=`cd $(srcdir); pwd`; \
+ cd objc; \
+ $(MAKE) -f $$srcdir1/objc/Makefile libobjc.a \
+ srcdir=$$srcdir1 tooldir=$(tooldir) AR="$(AR)" AR_FLAGS="$(AR_FLAGS)" \
+ GCC_FOR_TARGET="$$thisdir1/xgcc -B$$thisdir1/" \
+ GCC_CFLAGS="$(GCC_CFLAGS)"
+
+ ada-runtime : $(GNAT_RTL_OBJS) libgnat.a
+
+ libgnat.a : $(LIBGNAT_OBJS)
+ -rm -f libgnat.a
+ $(AR) rc libgnat.a $(LIBGNAT_OBJS)
+
+ # The pthreads emulation is presumed to only work for sunos4.1
+ # Create a dummy (links will fail) in other cases
+ stamp-pthreads :
+ (cd threads/src; \
+ $(MAKE) clean; \
+ $(MAKE) CC="../../xgcc -B../../" `case $(target) in sparc-sun-sunos4.1*) true;; \
+ *) echo OBJS=fake.o ;; esac`)
+ touch stamp-pthreads
+
+ # Compile two additional files that are linked with every program
+ # linked using GCC on system V, for the sake of C++ constructors.
+ crtbegin.o: crtstuff.c $(GCC_PASSES) $(CONFIG_H) gbl-ctors.h
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) -DCRT_BEGIN \
+ -finhibit-size-directive -fno-inline-functions \
+ -g0 -c $(srcdir)/crtstuff.c -o crtbegin.o
+
+ crtend.o: crtstuff.c $(GCC_PASSES) $(CONFIG_H) gbl-ctors.h
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) -DCRT_END \
+ -finhibit-size-directive -fno-inline-functions \
+ -g0 -c $(srcdir)/crtstuff.c -o crtend.o
+
+ # Compiling object files from source files.
+
+ # Note that dependencies on obstack.h are not written
+ # because that file is not part of GCC.
+ # Dependencies on gvarargs.h are not written
+ # because all that file does, when not compiling with GCC,
+ # is include the system varargs.h.
+
+ # C language specific files.
+
+ c-parse.o : $(srcdir)/c-parse.c $(CONFIG_H) $(TREE_H) c-lex.h c-parse.h \
+ c-tree.h input.h flags.h
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c $(srcdir)/c-parse.c
+ $(srcdir)/c-parse.c $(srcdir)/c-parse.h: $(srcdir)/c-parse.y
+ cd $(srcdir); $(BISON) $(BISONFLAGS) -d c-parse.y -o c-parse.c
+ $(srcdir)/c-parse.y: $(srcdir)/c-parse.in
+ sed -e "/^ifobjc$$/,/^end ifobjc$$/d" \
+ -e "/^ifc$$/d" -e "/^end ifc$$/d" \
+ $(srcdir)/c-parse.in > $(srcdir)/c-parse.y
+
+ c-decl.o : c-decl.c $(CONFIG_H) $(TREE_H) c-tree.h c-lex.h flags.h
+ c-typeck.o : c-typeck.c $(CONFIG_H) $(TREE_H) c-tree.h flags.h
+ c-lang.o : c-lang.c $(CONFIG_H) $(TREE_H)
+ c-lex.o : c-lex.c $(CONFIG_H) $(TREE_H) c-lex.h c-tree.h c-parse.h \
+ input.h flags.h
+ c-aux-info.o : c-aux-info.c $(CONFIG_H) $(TREE_H) c-tree.h flags.h
+ c-convert.o : c-convert.c $(CONFIG_H) $(TREE_H) flags.h
+ c-pragma.o: c-pragma.c $(CONFIG_H) $(TREE_H)
+ c-iterate.o: c-iterate.c $(CONFIG_H) $(TREE_H) $(RTL_H) c-tree.h flags.h
+
+ # C++ language specific files.
+
+ cp-parse.o : $(srcdir)/cp-parse.c $(CONFIG_H) $(CPLUS_TREE_H) flags.h cp-lex.h
+ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ `echo $(srcdir)/cp-parse.c | sed 's,^\./,,'`
+
+ $(srcdir)/cp-parse.c $(srcdir)/cp-parse.h : $(srcdir)/cp-parse.y
+ @echo expect 27 shift/reduce conflicts and 14 reduce/reduce conflicts
+ cd $(srcdir); $(BISON) $(BISONFLAGS) -d -o cp-parse.c cp-parse.y
+ cd $(srcdir); grep '^#define[ ]*YYEMPTY' cp-parse.c >>cp-parse.h
+
+ cp-spew.o : cp-spew.c $(CONFIG_H) $(CPLUS_TREE_H) \
+ $(srcdir)/cp-parse.h flags.h cp-lex.h
+ cp-lex.o : cp-lex.c $(CONFIG_H) $(CPLUS_TREE_H) \
+ $(srcdir)/cp-parse.h $(srcdir)/cp-input.c flags.h cp-hash.h cp-lex.h
+ cp-decl.o : cp-decl.c $(CONFIG_H) $(CPLUS_TREE_H) flags.h \
+ cp-lex.h cp-decl.h stack.h
+ cp-decl2.o : cp-decl2.c $(CONFIG_H) $(CPLUS_TREE_H) flags.h \
+ cp-lex.h cp-decl.h
+ cp-type2.o : cp-type2.c $(CONFIG_H) $(CPLUS_TREE_H) flags.h
+ cp-typeck.o : cp-typeck.c $(CONFIG_H) $(CPLUS_TREE_H) flags.h $(RTL_H)
+ cp-class.o : cp-class.c $(CONFIG_H) $(CPLUS_TREE_H) flags.h
+ cp-call.o : cp-call.c $(CONFIG_H) $(CPLUS_TREE_H) flags.h
+ cp-init.o : cp-init.c $(CONFIG_H) $(CPLUS_TREE_H) flags.h $(RTL_H)
+ cp-method.o : cp-method.c $(CONFIG_H) $(CPLUS_TREE_H)
+ cp-cvt.o : cp-cvt.c $(CONFIG_H) $(CPLUS_TREE_H)
+ cp-search.o : cp-search.c $(CONFIG_H) $(CPLUS_TREE_H) stack.h flags.h
+ cp-tree.o : cp-tree.c $(CONFIG_H) $(CPLUS_TREE_H) flags.h
+ cp-ptree.o : cp-ptree.c $(CONFIG_H) $(CPLUS_TREE_H)
+ cp-gc.o : cp-gc.c $(CONFIG_H) $(CPLUS_TREE_H) flags.h
+ cp-except.o : cp-except.c $(CONFIG_H) $(CPLUS_TREE_H) flags.h $(RTL_H)
+ cp-expr.o : cp-expr.c $(CONFIG_H) $(CPLUS_TREE_H) $(RTL_H) flags.h \
+ expr.h insn-codes.h
+ cp-edsel.o : cp-edsel.c $(CONFIG_H) $(CPLUS_TREE_H) stack.h flags.h
+ cp-xref.o : cp-xref.c $(CONFIG_H) $(CPLUS_TREE_H) input.h
+ cp-pt.o : cp-pt.c $(CONFIG_H) $(CPLUS_TREE_H) cp-decl.h cp-parse.h
+ cp-error.o : cp-error.c $(CONFIG_H) $(CPLUS_TREE_H)
+ cp-errfn.o : cp-errfn.c $(CONFIG_H) $(CPLUS_TREE_H)
+
+ g++.o : g++.c $(CONFIG_H) gvarargs.h
+
+ # Ada language specific files.
+
+ ada_extra_files : treeprs.ads a-einfo.h a-sinfo.h nmake.adb \
+ nmake.ads
+
+ b_gnat1.c : $(GNAT1_ADA_OBJS)
+ $(GNATBIND) -o b_gnat1.c -n -t gnat1drv.ali
+ b_gnat1.o : b_gnat1.c
+
+ b_gnatf.c : $(GNATF_OBJS)
+ $(GNATBIND) -o b_gnatf.c -t gnatfdrv.ali
+
+ b_gnatf.o : b_gnatf.c
+
+
+ b_gnatb.c : $(GNATBIND_OBJS)
+ $(GNATBIND) -o b_gnatb.c -t gnatbind.ali
+ b_gnatb.o : b_gnatb.c
+
+ b_gkrun.c : $(GKRUNCH_OBJS)
+ $(GNATBIND) -o b_gkrun.c -t gkrunch.ali
+
+ b_gkrun.o : b_gkrun.c
+
+ treeprs.ads : treeprs.adt sinfo.ads xtreeprs.spt
+ spitbol xtreeprs.spt
+
+ a-einfo.h : einfo.ads einfo.adb xeinfo.spt
+ spitbol xeinfo.spt
+
+ a-sinfo.h : sinfo.ads xsinfo.spt
+ spitbol xsinfo.spt
+
+ nmake.adb : nmake.adt sinfo.ads xnmake.spt
+ spitbol xnmake.spt -b
+
+ nmake.ads : nmake.adt sinfo.ads xnmake.spt
+ spitbol xnmake.spt -s
+
+ mkttypef.o : mkttypef.c hconfig.h machmode.h real.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/mkttypef.c
+
+ mkttypef : mkttypef.o $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o mkttypef \
+ mkttypef.o $(HOST_LIBS)
+
+ ttypef.ads: stamp-ttypef; @true
+ stamp-ttypef : ttypef.adt mkttypef $(srcdir)/move-if-change
+ ./mkttypef ttypef.adt > tmp-ttypef.ads
+ $(srcdir)/move-if-change tmp-ttypef.ads ttypef.ads
+ touch stamp-ttypef
+
+ ADA_INCLUDE_DIR = $(prefix)/adainclude
+ ADA_RTL_OBJ_DIR = $(libsubdir)/adalib
+ # Note: the strings below do not make sense for Ada strings in the OS/2
+ # case. This is ignored for now since the OS/2 version doesn't use
+ # these -- there are no default locations.
+ sdefault.ads: stamp-sdefault ; @true
+ stamp-sdefault : config.status version.c $(srcdir)/move-if-change \
+ Makefile.in
+ echo package Sdefault is >tmp-sdefault.ads
+ echo " Include_Dir_Default_Name : constant String" >>tmp-sdefault.ads
+ echo " := \"$(ADA_INCLUDE_DIR)/\";" >>tmp-sdefault.ads
+ echo " Object_Dir_Default_Name : constant String" >>tmp-sdefault.ads
+ echo " := \"$(ADA_RTL_OBJ_DIR)/\";" >>tmp-sdefault.ads
+ echo "end Sdefault;" >> tmp-sdefault.ads
+ $(srcdir)/move-if-change tmp-sdefault.ads sdefault.ads
+ touch stamp-sdefault
+
+ A_MISC_H = a-misc.h a-tree.def
+
+ # special compiles for sdefault without -gnatg, to avoid long line error
+ osint.o : alloc.ads debug.ads limits.ads namet.ads opt.ads osint.ads \
+ osint.adb output.ads sdefault.ads switch.ads system.ads \
+ s-assert.ads s-strequ.ads s-enviro.ads \
+ table.ads table.adb types.ads unchdeal.ads \
+ unchdeal.adb unixlib.ads
+ $(ADA_CC) -c $(CFLAGS) -gnata osint.adb
+
+ sdefault.o : sdefault.ads
+ $(ADA_CC) -c $(CFLAGS) -gnata $<
+
+ a-adaint.o : $(CONFIG_H)
+
+ a-gtran3.o : $(CONFIG_H) $(TREE_H) obstack.h flags.h convert.h a-ada.h \
+ a-types.h a-atree.h a-sinfo.h a-snames.h a-einfo.h a-namet.h a-string.h \
+ a-uintp.h a-trans.h a-trans3.h a-trans4.h a-gtran3.h $(A_MISC_H) a-rtree.h
+
+ a-ptypes.o : $(CONFIG_H)
+
+ a-misc.o : $(CONFIG_H) $(TREE_H) a-ada.h a-types.h a-atree.h a-sinfo.h \
+ a-einfo.h a-namet.h a-string.h a-uintp.h a-trans.h a-trans3.h $(A_MISC_H) \
+ a-rtree.h flags.h $(RTL_H) expr.h insn-codes.h
+
+ a-trans3.o : $(CONFIG_H) $(TREE_H) flags.h a-ada.h a-types.h a-atree.h \
+ a-sinfo.h a-einfo.h a-namet.h a-string.h a-uintp.h a-trans.h a-gtran3.h \
+ a-trans3.h a-trans4.h $(A_MISC_H) a-rtree.h convert.h
+
+ a-trans4.o : $(CONFIG_H) $(TREE_H) flags.h a-ada.h a-types.h a-atree.h \
+ a-sinfo.h a-einfo.h a-namet.h a-snames.h a-string.h a-uintp.h a-trans.h \
+ a-trans3.h a-trans4.h $(A_MISC_H)
+
+ a-trans.o : $(CONFIG_H) $(TREE_H) flags.h a-ada.h a-types.h a-atree.h \
+ a-sinfo.h a-snames.h a-einfo.h a-namet.h a-string.h a-uintp.h a-trans.h \
+ a-trans3.h a-gtran3.h a-trans4.h $(A_MISC_H) a-rtree.h
+
+ a-uintp.o : $(CONFIG_H) $(TREE_H) a-ada.h a-types.h a-atree.h a-sinfo.h \
+ a-einfo.h a-namet.h a-string.h a-uintp.h
+
+ a-ioexce.o : ada.ads a-ioexce.ads
+
+ a-teioau.o : ada.ads a-ioexce.ads a-textio.ads a-teioau.ads a-teioau.adb \
+ system.ads
+
+ a-textio.o : ada.ads a-ioexce.ads a-textio.ads a-textio.adb a-teioau.ads
+
+ ada.o : ada.ads
+
+ ali.o : ali.ads ali.adb binderr.ads butil.ads debug.ads limits.ads \
+ namet.ads opt.ads osint.ads output.ads system.ads table.ads table.adb \
+ types.ads unchdeal.ads unchdeal.adb
+
+ alloc.o : alloc.ads
+
+ atree.o : alloc.ads atree.ads atree.adb casing.ads comperr.ads debug.ads \
+ einfo.ads nlists.ads output.ads sinfo.ads sinput.ads system.ads \
+ s-assert.ads table.ads table.adb types.ads unchconv.ads unchconv.adb \
+ unchdeal.ads unchdeal.adb
+
+ back_end.o : alloc.ads atree.ads back_end.ads back_end.adb casing.ads \
+ debug.ads einfo.ads elists.ads lib.ads limits.ads namet.ads nlists.ads \
+ output.ads sinfo.ads sinput.ads stringt.ads system.ads table.ads \
+ table.adb ttypes.ads get_targ.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+
+ bcheck.o : ali.ads bcheck.ads bcheck.adb binderr.ads debug.ads limits.ads \
+ namet.ads opt.ads output.ads system.ads table.ads table.adb types.ads \
+ unchdeal.ads unchdeal.adb
+
+ binde.o : ali.ads binde.ads binde.adb binderr.ads butil.ads debug.ads \
+ limits.ads namet.ads opt.ads output.ads system.ads s-assert.ads \
+ table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+
+ binderr.o : binderr.ads binderr.adb butil.ads debug.ads excep.ads \
+ limits.ads namet.ads opt.ads osint.ads output.ads system.ads table.ads \
+ table.adb types.ads unchdeal.ads unchdeal.adb
+
+ bindgen.o : ali.ads binde.ads bindgen.ads bindgen.adb debug.ads limits.ads \
+ namet.ads opt.ads osint.ads output.ads system.ads table.ads table.adb \
+ types.ads unchdeal.ads unchdeal.adb
+
+ bindusg.o : bindusg.ads bindusg.adb osint.ads output.ads \
+ system.ads types.ads unchdeal.ads unchdeal.adb
+
+ butil.o : butil.ads butil.adb debug.ads limits.ads namet.ads output.ads \
+ system.ads table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+
+ casing.o : casing.ads casing.adb csets.ads debug.ads limits.ads namet.ads \
+ output.ads scans.ads sinput.ads system.ads table.ads table.adb \
+ types.ads unchdeal.ads unchdeal.adb widechar.ads
+
+ comperr.o : alloc.ads atree.ads casing.ads comperr.ads comperr.adb \
+ debug.ads einfo.ads errout.ads excep.ads osint.ads output.ads sinfo.ads \
+ sinput.ads sprint.ads system.ads s-traceb.ads table.ads table.adb \
+ treepr.ads types.ads unchdeal.ads unchdeal.adb
+
+ csets.o : csets.ads csets.adb opt.ads system.ads types.ads unchdeal.ads \
+ unchdeal.adb
+
+ debug.o : debug.ads debug.adb
+
+ debug_a.o : alloc.ads atree.ads casing.ads comperr.ads debug.ads \
+ debug_a.ads debug_a.adb einfo.ads output.ads sinfo.ads sinput.ads \
+ system.ads table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+
+ einfo.o : alloc.ads atree.ads debug.ads einfo.ads einfo.adb limits.ads \
+ namet.ads nlists.ads output.ads sinfo.ads snames.ads system.ads \
+ s-assert.ads table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+
+ elists.o : alloc.ads debug.ads elists.ads elists.adb output.ads system.ads \
+ table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+
+ errout.o : alloc.ads atree.ads casing.ads csets.ads debug.ads einfo.ads \
+ errout.ads errout.adb excep.ads exp_util.ads lib.ads limits.ads \
+ namet.ads opt.ads output.ads rtsfind.ads scans.ads sinfo.ads sinput.ads \
+ stand.ads system.ads s-assert.ads table.ads table.adb ttypes.ads \
+ get_targ.ads types.ads uintp.ads uname.ads unchdeal.ads unchdeal.adb
+
+ excep.o : excep.ads
+
+ exp_attr.o : alloc.ads atree.ads debug.ads einfo.ads exp_attr.ads \
+ exp_attr.adb exp_ch9.ads itypes.ads limits.ads namet.ads nlists.ads \
+ nmake.ads opt.ads output.ads rtsfind.ads sem.ads sem_res.ads \
+ sem_util.ads sinfo.ads snames.ads stand.ads system.ads table.ads \
+ table.adb tbuild.ads ttypes.ads get_targ.ads types.ads uintp.ads unchdeal.ads \
+ unchdeal.adb
+
+ exp_ch10.o : exp_ch10.ads
+
+ exp_ch11.o : exp_ch11.ads
+
+ exp_ch12.o : exp_ch12.ads
+
+ exp_ch13.o : alloc.ads atree.ads debug.ads einfo.ads exp_ch13.ads \
+ exp_ch13.adb exp_ch3.ads nlists.ads nmake.ads output.ads rtsfind.ads \
+ sinfo.ads snames.ads system.ads table.ads table.adb tbuild.ads \
+ types.ads unchdeal.ads unchdeal.adb
+
+ exp_ch2.o : alloc.ads atree.ads debug.ads einfo.ads exp_ch2.ads \
+ exp_ch2.adb nlists.ads nmake.ads opt.ads output.ads sem.ads sinfo.ads \
+ snames.ads system.ads table.ads table.adb tbuild.ads types.ads \
+ unchdeal.ads unchdeal.adb
+
+ exp_ch3.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads exp_ch3.ads \
+ exp_ch3.adb exp_ch4.ads exp_ch7.ads exp_ch9.ads exp_util.ads itypes.ads \
+ limits.ads namet.ads nlists.ads nmake.ads opt.ads output.ads \
+ rtsfind.ads sem.ads sem_res.ads sem_util.ads sinfo.ads snames.ads \
+ stand.ads system.ads s-assert.ads table.ads table.adb tbuild.ads \
+ ttypes.ads get_targ.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+
+ exp_ch4.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads exp_ch3.ads \
+ exp_ch4.ads exp_ch4.adb exp_ch7.ads exp_ch9.ads exp_util.ads itypes.ads \
+ limits.ads namet.ads nlists.ads nmake.ads opt.ads output.ads \
+ rtsfind.ads sem.ads sem_ch5.ads sem_res.ads sem_util.ads sinfo.ads \
+ snames.ads stand.ads system.ads s-assert.ads table.ads table.adb \
+ tbuild.ads ttypes.ads get_targ.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+
+ exp_ch5.o : alloc.ads atree.ads debug.ads einfo.ads exp_ch5.ads \
+ exp_ch5.adb exp_ch7.ads exp_ch9.ads exp_util.ads limits.ads namet.ads \
+ nlists.ads nmake.ads opt.ads output.ads rtsfind.ads sem.ads \
+ sem_util.ads sinfo.ads snames.ads stand.ads system.ads table.ads \
+ table.adb tbuild.ads ttypes.ads get_targ.ads types.ads uintp.ads unchdeal.ads \
+ unchdeal.adb
+
+ exp_ch6.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads errout.ads \
+ exp_ch6.ads exp_ch6.adb exp_ch7.ads exp_ch9.ads exp_util.ads limits.ads \
+ namet.ads nlists.ads nmake.ads opt.ads output.ads rtsfind.ads sem.ads \
+ sem_ch3.ads sem_disp.ads sem_util.ads sinfo.ads snames.ads stand.ads \
+ system.ads s-assert.ads table.ads table.adb tbuild.ads types.ads \
+ unchdeal.ads unchdeal.adb
+
+ exp_ch7.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads exp_ch7.ads \
+ exp_ch7.adb exp_ch9.ads exp_util.ads expand.ads limits.ads namet.ads \
+ nlists.ads nmake.ads opt.ads output.ads rtsfind.ads sem.ads sem_ch8.ads \
+ sem_res.ads sem_util.ads sinfo.ads snames.ads stand.ads system.ads \
+ s-assert.ads table.ads table.adb tbuild.ads types.ads unchdeal.ads \
+ unchdeal.adb
+
+ exp_ch8.o : exp_ch8.ads
+
+ exp_ch9.o : alloc.ads atree.ads debug.ads einfo.ads exp_ch3.ads \
+ exp_ch6.ads exp_ch9.ads exp_ch9.adb exp_util.ads limits.ads namet.ads \
+ nlists.ads nmake.ads opt.ads output.ads rtsfind.ads sem.ads \
+ sem_ch11.ads sem_res.ads sem_util.ads sinfo.ads snames.ads stand.ads \
+ system.ads s-assert.ads table.ads table.adb tbuild.ads ttypes.ads \
+ get_targ.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+
+ exp_intr.o : exp_intr.ads exp_intr.adb types.ads
+
+ exp_prag.o : alloc.ads atree.ads debug.ads einfo.ads exp_prag.ads \
+ exp_prag.adb exp_util.ads nlists.ads nmake.ads opt.ads output.ads \
+ rtsfind.ads sem.ads sinfo.ads snames.ads system.ads s-assert.ads \
+ table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+
+ exp_util.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads elists.ads \
+ errout.ads exp_util.ads exp_util.adb itypes.ads lib.ads limits.ads \
+ namet.ads nlists.ads nmake.ads opt.ads output.ads rtsfind.ads sem.ads \
+ sem_ch13.ads sem_res.ads sem_util.ads sinfo.ads sinput.ads snames.ads \
+ stand.ads system.ads table.ads table.adb tbuild.ads ttypes.ads \
+ get_targ.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+
+ expand.o : alloc.ads atree.ads debug.ads debug_a.ads einfo.ads \
+ exp_attr.ads exp_ch13.ads exp_ch2.ads exp_ch3.ads exp_ch4.ads \
+ exp_ch5.ads exp_ch6.ads exp_ch7.ads exp_ch9.ads exp_prag.ads \
+ exp_util.ads expand.ads expand.adb output.ads rtsfind.ads sinfo.ads \
+ system.ads table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+
+ fname.o : debug.ads fname.ads fname.adb krunch.ads limits.ads namet.ads \
+ opt.ads osint.ads output.ads system.ads s-assert.ads table.ads \
+ table.adb types.ads unchdeal.ads unchdeal.adb widechar.ads
+
+ frontend.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads elists.ads \
+ errout.ads frontend.ads frontend.adb lib.ads limits.ads namet.ads \
+ nlists.ads opt.ads output.ads par.ads rtsfind.ads scn.ads sem.ads \
+ sinfo.ads sinput.ads snames.ads sprint.ads stand.ads system.ads \
+ table.ads table.adb tbuild.ads treepr.ads types.ads unchdeal.ads \
+ unchdeal.adb usage.ads
+
+ gkrunch.o : ada.ads a-ioexce.ads a-textio.ads a-textio.adb a-teioau.ads \
+ gkrunch.adb krunch.ads system.ads s-enviro.ads
+
+ gnat1drv.o : alloc.ads atree.ads back_end.ads casing.ads comperr.ads \
+ csets.ads debug.ads einfo.ads errout.ads excep.ads frontend.ads \
+ gnat1drv.ads gnat1drv.adb gnatvsn.ads lib.ads limits.ads namet.ads \
+ opt.ads osint.ads output.ads par.ads sinfo.ads snames.ads sprint.ads \
+ stringt.ads system.ads s-assert.ads s-secsta.ads s-stalib.ads \
+ s-stoele.ads s-taspda.ads s-tasoli.ads table.ads table.adb treepr.ads \
+ ttypes.ads get_targ.ads types.ads uintp.ads unchconv.ads unchconv.adb unchdeal.ads \
+ unchdeal.adb usage.ads
+
+ gnatbind.o : ali.ads bcheck.ads binde.ads binderr.ads bindgen.ads \
+ bindusg.ads butil.ads debug.ads excep.ads gnatbind.adb gnatvsn.ads \
+ limits.ads namet.ads opt.ads osint.ads output.ads system.ads \
+ s-secsta.ads s-stalib.ads s-stoele.ads s-taspda.ads s-tasoli.ads \
+ table.ads table.adb types.ads unchconv.ads unchconv.adb unchdeal.ads \
+ unchdeal.adb
+
+ gnatfdrv.o : casing.ads comperr.ads csets.ads debug.ads einfo.ads \
+ errout.ads excep.ads frontend.ads gnatfdrv.ads gnatfdrv.adb gnatvsn.ads \
+ lib.ads limits.ads namet.ads opt.ads osint.ads output.ads par.ads \
+ snames.ads sprint.ads stringt.ads system.ads s-assert.ads table.ads \
+ table.adb treepr.ads ttypes.ads get_targ.ads types.ads uintp.ads unchdeal.ads \
+ unchdeal.adb usage.ads xref.ads xref_tab.ads
+
+ gnatvsn.o : gnatvsn.ads
+
+ itypes.o : alloc.ads atree.ads debug.ads einfo.ads itypes.ads itypes.adb \
+ limits.ads namet.ads nlists.ads output.ads sem_util.ads sinfo.ads \
+ stand.ads system.ads s-assert.ads table.ads table.adb types.ads \
+ unchdeal.ads unchdeal.adb
+
+ krunch.o : krunch.ads krunch.adb
+
+ lib.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ excep.ads fname.ads gnatvsn.ads lib.ads lib.adb lib-list.adb \
+ lib-load.adb lib-sort.adb lib-writ.adb limits.ads namet.ads nlists.ads \
+ osint.ads output.ads par.ads scn.ads sinfo.ads sinput.ads system.ads \
+ table.ads table.adb types.ads uname.ads unchdeal.ads unchdeal.adb
+
+ limits.o : limits.ads
+
+ namet.o : alloc.ads debug.ads limits.ads namet.ads namet.adb \
+ namet-hash.adb output.ads system.ads s-assert.ads table.ads table.adb \
+ types.ads unchdeal.ads unchdeal.adb widechar.ads
+
+ nlists.o : alloc.ads atree.ads debug.ads einfo.ads nlists.ads nlists.adb \
+ output.ads sinfo.ads system.ads s-assert.ads table.ads table.adb \
+ types.ads unchdeal.ads unchdeal.adb
+
+ nmake.o : alloc.ads atree.ads debug.ads einfo.ads nlists.ads nmake.ads \
+ nmake.adb output.ads sinfo.ads snames.ads system.ads table.ads \
+ table.adb types.ads unchdeal.ads unchdeal.adb
+
+ opt.o : opt.ads system.ads types.ads unchdeal.ads unchdeal.adb
+
+ osint.o : debug.ads limits.ads namet.ads opt.ads osint.ads osint.adb \
+ output.ads sdefault.ads switch.ads system.ads s-assert.ads \
+ s-enviro.ads s-secsta.ads s-tasoli.ads table.ads table.adb types.ads \
+ unchdeal.ads unchdeal.adb unixlib.ads
+
+ output.o : output.ads output.adb system.ads types.ads unchdeal.ads \
+ unchdeal.adb unixlib.ads
+
+ par.o : alloc.ads atree.ads casing.ads csets.ads debug.ads einfo.ads \
+ elists.ads errout.ads excep.ads fname.ads lib.ads limits.ads namet.ads \
+ nlists.ads nmake.ads opt.ads output.ads par.ads par.adb par-ch10.adb \
+ par-ch11.adb par-ch12.adb par-ch13.adb par-ch2.adb par-ch3.adb \
+ par-ch4.adb par-ch5.adb par-ch6.adb par-ch7.adb par-ch8.adb par-ch9.adb \
+ par-endh.adb par-labl.adb par-load.adb par-prag.adb par-sync.adb \
+ par-tchk.adb par-util.adb scans.ads scn.ads sinfo.ads sinfo-cn.ads \
+ sinput.ads snames.ads style.ads system.ads s-assert.ads table.ads \
+ table.adb tbuild.ads ttypes.ads get_targ.ads types.ads uintp.ads uname.ads \
+ unchdeal.ads unchdeal.adb
+
+ rat.o : alloc.ads atree.ads debug.ads einfo.ads nlists.ads nmake.ads \
+ output.ads rat.ads rat.adb sinfo.ads system.ads s-assert.ads table.ads \
+ table.adb ttypes.ads get_targ.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+
+ rtsfind.o : alloc.ads atree.ads casing.ads csets.ads debug.ads einfo.ads \
+ excep.ads fname.ads lib.ads limits.ads namet.ads nlists.ads nmake.ads \
+ opt.ads output.ads rtsfind.ads rtsfind.adb sem.ads sem_util.ads \
+ sinfo.ads snames.ads system.ads s-assert.ads table.ads table.adb \
+ tbuild.ads types.ads unchdeal.ads unchdeal.adb
+
+ s-assert.o : system.ads s-assert.ads
+
+ s-enviro.o : system.ads s-enviro.ads s-enviro.adb
+
+ s-secsta.o : system.ads s-secsta.ads s-secsta.adb s-stoele.ads \
+ s-taspda.ads unchconv.ads unchconv.adb unchdeal.ads unchdeal.adb
+
+ s-stalib.o : system.ads s-secsta.ads s-stalib.ads s-stoele.ads \
+ s-taspda.ads s-tasoli.ads unchconv.ads unchconv.adb unchdeal.ads \
+ unchdeal.adb
+
+ s-stoele.o : system.ads s-stoele.ads s-stoele.adb unchconv.ads \
+ unchconv.adb
+
+ s-strcon.o : system.ads s-strcon.ads s-strcon.adb
+
+ s-strequ.o : system.ads s-strequ.ads s-strequ.adb
+
+ s-tasoli.o : system.ads s-taspda.ads s-tasoli.ads s-tasoli.adb
+
+ s-taspda.o : system.ads s-secsta.ads s-taspda.ads s-taspda.adb \
+ s-tasoli.ads unchconv.ads unchconv.adb unchdeal.ads unchdeal.adb
+
+ s-traceb.o : debug.ads system.ads s-traceb.ads s-traceb.adb
+
+ scans.o : scans.ads scans.adb system.ads types.ads unchdeal.ads \
+ unchdeal.adb
+
+ scn.o : alloc.ads atree.ads casing.ads csets.ads debug.ads einfo.ads \
+ errout.ads lib.ads limits.ads namet.ads opt.ads output.ads scans.ads \
+ scn.ads scn.adb scn-nlit.adb scn-slit.adb sinfo.ads sinput.ads \
+ snames.ads stringt.ads style.ads system.ads s-assert.ads table.ads \
+ table.adb ttypes.ads get_targ.ads types.ads uintp.ads unchdeal.ads unchdeal.adb \
+ widechar.ads
+
+ sdefault.o : sdefault.ads
+
+ sem.o : alloc.ads atree.ads casing.ads comperr.ads debug.ads debug_a.ads \
+ einfo.ads errout.ads exp_util.ads expand.ads lib.ads limits.ads \
+ namet.ads nlists.ads opt.ads output.ads rtsfind.ads sem.ads sem.adb \
+ sem_attr.ads sem_ch10.ads sem_ch11.ads sem_ch12.ads sem_ch13.ads \
+ sem_ch3.ads sem_ch4.ads sem_ch5.ads sem_ch6.ads sem_ch7.ads sem_ch8.ads \
+ sem_ch9.ads sem_prag.ads sem_util.ads sinfo.ads snames.ads stand.ads \
+ system.ads s-assert.ads table.ads table.adb types.ads unchdeal.ads \
+ unchdeal.adb
+
+ sem_attr.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ excep.ads limits.ads namet.ads nlists.ads nmake.ads opt.ads output.ads \
+ rtsfind.ads sem.ads sem_attr.ads sem_attr.adb sem_ch4.ads sem_ch6.ads \
+ sem_ch8.ads sem_eval.ads sem_res.ads sem_type.ads sem_util.ads \
+ sinfo.ads sinput.ads snames.ads stand.ads stringt.ads system.ads \
+ s-assert.ads table.ads table.adb tbuild.ads ttypes.ads ttypef.ads \
+ get_targ.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+
+ sem_ch10.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ lib.ads limits.ads namet.ads nlists.ads nmake.ads opt.ads output.ads \
+ sem.ads sem_ch10.ads sem_ch10.adb sem_ch6.ads sem_ch7.ads sem_ch8.ads \
+ sem_util.ads sinfo.ads sinfo-cn.ads sinput.ads snames.ads stand.ads \
+ stringt.ads system.ads table.ads table.adb tbuild.ads types.ads \
+ uname.ads unchdeal.ads unchdeal.adb
+
+ sem_ch11.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ lib.ads limits.ads namet.ads nlists.ads opt.ads output.ads sem.ads \
+ sem_ch11.ads sem_ch11.adb sem_ch5.ads sem_ch8.ads sem_util.ads \
+ sinfo.ads snames.ads stand.ads system.ads table.ads table.adb types.ads \
+ unchdeal.ads unchdeal.adb
+
+ sem_ch12.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads elists.ads \
+ errout.ads exp_util.ads lib.ads limits.ads namet.ads nlists.ads \
+ nmake.ads opt.ads output.ads rtsfind.ads sem.ads sem_ch10.ads \
+ sem_ch12.ads sem_ch12.adb sem_ch13.ads sem_ch3.ads sem_ch6.ads \
+ sem_ch7.ads sem_ch8.ads sem_res.ads sem_util.ads sinfo.ads sinfo-cn.ads \
+ snames.ads stand.ads system.ads s-assert.ads table.ads table.adb \
+ tbuild.ads types.ads uname.ads unchdeal.ads unchdeal.adb
+
+ sem_ch13.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads errout.ads \
+ excep.ads limits.ads namet.ads nlists.ads nmake.ads opt.ads output.ads \
+ rtsfind.ads sem.ads sem_ch13.ads sem_ch13.adb sem_ch3.ads sem_ch8.ads \
+ sem_res.ads sem_util.ads sinfo.ads snames.ads stand.ads system.ads \
+ table.ads table.adb ttypes.ads types.ads uintp.ads unchdeal.ads \
+ get_targ.ads unchdeal.adb
+
+ sem_ch3.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads errout.ads \
+ exp_ch3.ads exp_util.ads itypes.ads limits.ads namet.ads nlists.ads \
+ nmake.ads opt.ads output.ads rat.ads rtsfind.ads sem.ads sem_ch12.ads \
+ sem_ch13.ads sem_ch3.ads sem_ch3.adb sem_ch5.ads sem_ch6.ads \
+ sem_ch7.ads sem_ch8.ads sem_eval.ads sem_res.ads sem_type.ads \
+ sem_util.ads sinfo.ads snames.ads stand.ads system.ads s-assert.ads \
+ table.ads table.adb tbuild.ads ttypes.ads types.ads uintp.ads \
+ get_targ.ads unchdeal.ads unchdeal.adb
+
+ sem_ch4.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads exp_ch4.ads \
+ itypes.ads limits.ads namet.ads nlists.ads nmake.ads opt.ads output.ads \
+ sem.ads sem_ch3.ads sem_ch4.ads sem_ch4.adb sem_ch8.ads sem_type.ads \
+ sem_util.ads sinfo.ads snames.ads stand.ads system.ads table.ads \
+ table.adb tbuild.ads types.ads unchdeal.ads unchdeal.adb
+
+ sem_ch5.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads exp_ch7.ads \
+ itypes.ads limits.ads namet.ads nlists.ads opt.ads output.ads sem.ads \
+ sem_ch3.ads sem_ch5.ads sem_ch5.adb sem_ch8.ads sem_disp.ads \
+ sem_eval.ads sem_res.ads sem_type.ads sem_util.ads sinfo.ads snames.ads \
+ stand.ads system.ads s-assert.ads table.ads table.adb ttypes.ads \
+ get_targ.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+
+ sem_ch6.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ exp_ch7.ads exp_util.ads lib.ads limits.ads namet.ads nlists.ads \
+ nmake.ads opt.ads output.ads rtsfind.ads sem.ads sem_ch12.ads \
+ sem_ch3.ads sem_ch4.ads sem_ch6.ads sem_ch6.adb sem_ch8.ads \
+ sem_disp.ads sem_res.ads sem_util.ads sinfo.ads sinfo-cn.ads sinput.ads \
+ snames.ads stand.ads stringt.ads system.ads table.ads table.adb \
+ tbuild.ads treepr.ads types.ads unchdeal.ads unchdeal.adb
+
+ sem_ch7.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads elists.ads \
+ errout.ads exp_util.ads itypes.ads lib.ads limits.ads namet.ads \
+ nlists.ads opt.ads output.ads rtsfind.ads sem.ads sem_ch12.ads \
+ sem_ch13.ads sem_ch3.ads sem_ch7.ads sem_ch7.adb sem_ch8.ads \
+ sem_util.ads sinfo.ads sinput.ads snames.ads stand.ads system.ads \
+ table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+
+ sem_ch8.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads limits.ads \
+ namet.ads nlists.ads nmake.ads opt.ads output.ads sem.ads sem_attr.ads \
+ sem_ch3.ads sem_ch4.ads sem_ch5.ads sem_ch6.ads sem_ch8.ads sem_ch8.adb \
+ sem_res.ads sem_type.ads sem_util.ads sinfo.ads sinfo-cn.ads snames.ads \
+ stand.ads system.ads s-assert.ads table.ads table.adb tbuild.ads \
+ types.ads unchdeal.ads unchdeal.adb
+
+ sem_ch9.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads exp_ch7.ads \
+ exp_ch9.ads limits.ads namet.ads nlists.ads nmake.ads opt.ads \
+ output.ads sem.ads sem_ch3.ads sem_ch4.ads sem_ch5.ads sem_ch6.ads \
+ sem_ch8.ads sem_ch9.ads sem_ch9.adb sem_res.ads sem_util.ads sinfo.ads \
+ snames.ads stand.ads system.ads table.ads table.adb tbuild.ads \
+ ttypes.ads get_targ.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+
+ sem_disp.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads errout.ads \
+ exp_ch6.ads nlists.ads output.ads sem_disp.ads sem_disp.adb \
+ sem_util.ads sinfo.ads system.ads table.ads table.adb types.ads \
+ unchdeal.ads unchdeal.adb
+
+ sem_eval.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads itypes.ads \
+ limits.ads namet.ads nlists.ads nmake.ads opt.ads output.ads rat.ads \
+ sem_eval.ads sem_eval.adb sem_util.ads sinfo.ads snames.ads stand.ads \
+ stringt.ads system.ads s-assert.ads table.ads table.adb tbuild.ads \
+ ttypes.ads get_targ.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+
+ sem_intr.o : sem_intr.ads sem_intr.adb types.ads
+
+ sem_prag.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ exp_util.ads lib.ads limits.ads namet.ads nlists.ads nmake.ads opt.ads \
+ output.ads rtsfind.ads sem.ads sem_ch8.ads sem_eval.ads sem_prag.ads \
+ sem_prag.adb sem_res.ads sem_util.ads sinfo.ads snames.ads stand.ads \
+ stringt.ads system.ads table.ads table.adb tbuild.ads ttypes.ads \
+ get_targ.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+
+ sem_res.o : alloc.ads atree.ads debug.ads debug_a.ads einfo.ads elists.ads \
+ errout.ads exp_util.ads expand.ads itypes.ads limits.ads namet.ads \
+ nlists.ads nmake.ads opt.ads output.ads rtsfind.ads sem.ads \
+ sem_attr.ads sem_ch3.ads sem_ch4.ads sem_ch5.ads sem_ch8.ads \
+ sem_disp.ads sem_eval.ads sem_res.ads sem_res.adb sem_type.ads \
+ sem_util.ads sinfo.ads snames.ads stand.ads stringt.ads system.ads \
+ s-assert.ads table.ads table.adb tbuild.ads ttypes.ads types.ads \
+ get_targ.ads uintp.ads unchdeal.ads unchdeal.adb
+
+ sem_type.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads limits.ads \
+ namet.ads output.ads sem_ch6.ads sem_ch8.ads sem_type.ads sem_type.adb \
+ sem_util.ads sinfo.ads snames.ads stand.ads system.ads s-assert.ads \
+ table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+
+ sem_util.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ itypes.ads limits.ads namet.ads nlists.ads nmake.ads opt.ads output.ads \
+ scans.ads scn.ads sem.ads sem_eval.ads sem_res.ads sem_type.ads \
+ sem_util.ads sem_util.adb sinfo.ads sinput.ads snames.ads stand.ads \
+ style.ads system.ads s-assert.ads s-secsta.ads s-strcon.ads \
+ s-tasoli.ads table.ads table.adb tbuild.ads ttypes.ads types.ads \
+ get_targ.ads uintp.ads unchdeal.ads unchdeal.adb
+
+ sinfo-cn.o : alloc.ads atree.ads debug.ads einfo.ads output.ads sinfo.ads \
+ sinfo-cn.ads sinfo-cn.adb system.ads table.ads table.adb types.ads \
+ unchdeal.ads unchdeal.adb
+
+ sinfo.o : alloc.ads atree.ads debug.ads einfo.ads output.ads sinfo.ads \
+ sinfo.adb system.ads s-assert.ads table.ads table.adb types.ads \
+ unchdeal.ads unchdeal.adb
+
+ sinput.o : alloc.ads casing.ads debug.ads limits.ads namet.ads osint.ads \
+ output.ads sinput.ads sinput.adb system.ads s-assert.ads table.ads \
+ table.adb types.ads unchdeal.ads unchdeal.adb
+
+ snames.o : debug.ads limits.ads namet.ads output.ads snames.ads snames.adb \
+ system.ads s-assert.ads table.ads table.adb types.ads unchdeal.ads \
+ unchdeal.adb
+
+ sprint.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads itypes.ads \
+ lib.ads limits.ads namet.ads nlists.ads output.ads sem_util.ads \
+ sinfo.ads sprint.ads sprint.adb stand.ads stringt.ads system.ads \
+ table.ads table.adb ttypes.ads types.ads uintp.ads uname.ads \
+ get_targ.ads unchdeal.ads unchdeal.adb
+
+ stand.o : alloc.ads atree.ads csets.ads debug.ads einfo.ads gnatvsn.ads \
+ limits.ads namet.ads nlists.ads nmake.ads opt.ads output.ads \
+ sem_util.ads sinfo.ads snames.ads stand.ads stand.adb system.ads \
+ s-assert.ads table.ads table.adb ttypes.ads ttypef.ads types.ads \
+ get_targ.ads uintp.ads unchdeal.ads unchdeal.adb
+
+ stringt.o : alloc.ads debug.ads output.ads stringt.ads stringt.adb \
+ system.ads s-assert.ads table.ads table.adb types.ads unchdeal.ads \
+ unchdeal.adb
+
+ style.o : alloc.ads atree.ads casing.ads csets.ads debug.ads einfo.ads \
+ errout.ads limits.ads namet.ads output.ads scans.ads sinfo.ads \
+ sinput.ads style.ads style.adb system.ads table.ads table.adb types.ads \
+ unchdeal.ads unchdeal.adb
+
+ switch.o : debug.ads opt.ads osint.ads output.ads switch.ads switch.adb \
+ system.ads types.ads unchdeal.ads unchdeal.adb
+
+ system.o : system.ads
+
+ tbuild.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads limits.ads \
+ namet.ads nlists.ads nmake.ads output.ads sinfo.ads stand.ads \
+ system.ads s-assert.ads table.ads table.adb tbuild.ads tbuild.adb \
+ types.ads unchdeal.ads unchdeal.adb
+
+ treepr.o : alloc.ads atree.ads casing.ads comperr.ads csets.ads debug.ads \
+ einfo.ads elists.ads itypes.ads lib.ads limits.ads namet.ads nlists.ads \
+ output.ads sem_util.ads sinfo.ads sinput.ads stand.ads stringt.ads \
+ system.ads table.ads table.adb treepr.ads treepr.adb treeprs.ads \
+ ttypes.ads get_targ.ads types.ads uintp.ads uname.ads unchdeal.ads unchdeal.adb
+
+ treeprs.o : sinfo.ads system.ads treeprs.ads types.ads unchdeal.ads \
+ unchdeal.adb
+
+ ttypef.o : ttypes.ads get_targ.ads ttypef.ads
+
+ ttypes.o : get_targ.ads system.ads ttypes.ads types.ads unchdeal.ads \
+ get_targ.ads unchdeal.adb
+
+ types.o : system.ads types.ads types.adb unchdeal.ads unchdeal.adb
+
+ uintp.o : alloc.ads debug.ads limits.ads namet.ads output.ads system.ads \
+ s-assert.ads table.ads table.adb ttypes.ads types.ads uintp.ads \
+ uintp.adb unchdeal.ads unchdeal.adb
+
+ uname.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads lib.ads \
+ limits.ads namet.ads nlists.ads output.ads sinfo.ads sinput.ads \
+ system.ads s-assert.ads table.ads table.adb types.ads uname.ads \
+ uname.adb unchdeal.ads unchdeal.adb
+
+ unixlib.o : system.ads types.ads unchdeal.ads unchdeal.adb unixlib.ads \
+ unixlib.adb
+
+ usage.o : osint.ads output.ads system.ads types.ads unchdeal.ads \
+ unchdeal.adb usage.ads usage.adb
+
+ widechar.o : system.ads s-assert.ads types.ads unchdeal.ads unchdeal.adb \
+ widechar.ads widechar.adb
+
+ xref.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads lib.ads \
+ limits.ads namet.ads nlists.ads opt.ads osint.ads output.ads sinfo.ads \
+ sinput.ads sprint.ads stand.ads system.ads s-assert.ads table.ads \
+ table.adb types.ads unchdeal.ads unchdeal.adb xref.ads xref.adb \
+ xref_tab.ads
+
+ xref_tab.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ lib.ads limits.ads namet.ads osint.ads output.ads sinfo.ads sinput.ads \
+ stand.ads system.ads s-secsta.ads s-strcon.ads s-tasoli.ads table.ads \
+ table.adb treepr.ads types.ads unchdeal.ads unchdeal.adb xref_tab.ads \
+ xref_tab.adb
+
+
+ # To make a configuration always use collect2, set USE_COLLECT2 to ld.
+ ld: collect2
+ rm -f ld
+ ln collect2 ld
+
+ collect2 : collect2.o version.o $(LIBDEPS)
+ # Don't try modifying collect2 (aka ld) in place--it might be linking this.
+ -rm -f collect2
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o collect2 collect2.o version.o $(LIBS)
+
+ collect2.o : collect2.c $(CONFIG_H) gstab.h
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ -DTARGET_MACHINE=\"$(target)\" \
+ -c `echo $(srcdir)/collect2.c | sed 's,^\./,,'`
+
+ # Objective C language specific files.
+
+ objc-parse.o : $(srcdir)/objc-parse.c $(CONFIG_H) $(TREE_H) c-lex.h \
+ c-tree.h input.h flags.h objc-act.h
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c $(srcdir)/objc-parse.c
+ $(srcdir)/objc-parse.c : $(srcdir)/objc-parse.y
+ cd $(srcdir); $(BISON) $(BISONFLAGS) objc-parse.y -o objc-parse.c
+ $(srcdir)/objc-parse.y: $(srcdir)/c-parse.in
+ sed -e "/^ifc$$/,/^end ifc$$/d" \
+ -e "/^ifobjc$$/d" -e "/^end ifobjc$$/d" \
+ $(srcdir)/c-parse.in > $(srcdir)/objc-parse.y
+
+ objc-act.o : objc-act.c $(CONFIG_H) $(TREE_H) $(RTL_H) c-tree.h c-lex.h \
+ flags.h objc-act.h input.h function.h $(srcdir)/c-parse.h
+
+ # A file used by all variants of C.
+
+ c-common.o : c-common.c $(CONFIG_H) $(TREE_H) c-tree.h c-lex.h flags.h
+
+ # Language-independent files.
+
+ gcc.o: gcc.c $(CONFIG_H) gvarargs.h config.status
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ -DSTANDARD_STARTFILE_PREFIX=\"$(libdir)/\" \
+ -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc-lib/\" \
+ -DDEFAULT_TARGET_MACHINE=\"$(target)\" \
+ -DTOOLDIR_BASE_PREFIX=\"$(exec_prefix)/\" \
+ -DTOOLDIR=\"$(tooldir)/\" \
+ $(MAYBE_TARGET_DEFAULT) \
+ -c `echo $(srcdir)/gcc.c | sed 's,^\./,,'`
+
+ dumpvers: dumpvers.c
+
+ version.o: version.c
+ obstack.o: obstack.c
+
+ convert.o: convert.c $(CONFIG_H) $(TREE_H) flags.h convert.h
+
+ tree.o : tree.c $(CONFIG_H) $(TREE_H) gvarargs.h flags.h function.h
+ print-tree.o : print-tree.c $(CONFIG_H) $(TREE_H)
+ stor-layout.o : stor-layout.c $(CONFIG_H) $(TREE_H) function.h
+ fold-const.o : fold-const.c $(CONFIG_H) $(TREE_H) flags.h
+ toplev.o : toplev.c $(CONFIG_H) $(TREE_H) $(RTL_H) flags.h input.h \
+ insn-attr.h xcoffout.h defaults.h
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ $(MAYBE_TARGET_DEFAULT) $(MAYBE_USE_COLLECT2) \
+ -c `echo $(srcdir)/toplev.c | sed 's,^\./,,'`
+
+ rtl.o : rtl.c $(CONFIG_H) $(RTL_H)
+
+ print-rtl.o : print-rtl.c $(CONFIG_H) $(RTL_H)
+ rtlanal.o : rtlanal.c $(CONFIG_H) $(RTL_H)
+
+ toplev.o: bytecode.h bc-emit.h
+ varasm.o : varasm.c $(CONFIG_H) $(TREE_H) $(RTL_H) flags.h function.h \
+ defaults.h insn-codes.h expr.h hard-reg-set.h regs.h xcoffout.h bytecode.h
+ function.o : function.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h function.h \
+ insn-flags.h insn-codes.h expr.h regs.h hard-reg-set.h insn-config.h \
+ recog.h output.h bytecode.h
+ stmt.o : stmt.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h function.h \
+ insn-flags.h insn-config.h insn-codes.h hard-reg-set.h expr.h loop.h \
+ recog.h bytecode.h bc-typecd.h bc-typecd.def bc-opcode.h bc-optab.h \
+ bc-emit.h
+ expr.o : expr.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h function.h \
+ insn-flags.h insn-codes.h expr.h insn-config.h recog.h output.h \
+ typeclass.h bytecode.h bc-opcode.h bc-typecd.h bc-typecd.def bc-optab.h \
+ bc-emit.h modemap.def
+ calls.o : calls.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h expr.h insn-codes.h \
+ insn-flags.h gvarargs.h
+ expmed.o : expmed.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h \
+ insn-flags.h insn-config.h insn-codes.h expr.h recog.h real.h
+ explow.o : explow.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h hard-reg-set.h \
+ insn-config.h expr.h recog.h insn-flags.h insn-codes.h
+ optabs.o : optabs.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h \
+ insn-flags.h insn-config.h insn-codes.h expr.h recog.h reload.h
+ dbxout.o : dbxout.c $(CONFIG_H) $(TREE_H) $(RTL_H) flags.h regs.h \
+ insn-config.h reload.h gstab.h xcoffout.h defaults.h output.h
+ sdbout.o : sdbout.c $(CONFIG_H) $(TREE_H) $(RTL_H) gsyms.h flags.h \
+ insn-config.h reload.h
+ dwarfout.o : dwarfout.c $(CONFIG_H) $(TREE_H) $(RTL_H) dwarf.h flags.h \
+ insn-config.h reload.h output.h defaults.h
+ xcoffout.o : xcoffout.c $(CONFIG_H) $(TREE_H) $(RTL_H) xcoffout.h flags.h
+ emit-rtl.o : emit-rtl.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h gvarargs.h \
+ function.h regs.h insn-config.h insn-codes.h real.h expr.h bytecode.h \
+ bc-opcode.h bc-typecd.h bc-typecd.def bc-optab.h bc-emit.h bc-opname.h
+ real.o : real.c $(CONFIG_H) $(TREE_H)
+ getpwd.o : getpwd.c $(CONFIG_H)
+
+ integrate.o : integrate.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h integrate.h \
+ insn-flags.h insn-config.h insn-codes.h expr.h real.h function.h \
+ bytecode.h
+
+ jump.o : jump.c $(CONFIG_H) $(RTL_H) flags.h hard-reg-set.h regs.h \
+ insn-config.h insn-flags.h insn-codes.h expr.h real.h
+ stupid.o : stupid.c $(CONFIG_H) $(RTL_H) regs.h hard-reg-set.h flags.h
+
+ cse.o : cse.c $(CONFIG_H) $(RTL_H) regs.h hard-reg-set.h flags.h real.h \
+ insn-config.h recog.h
+ loop.o : loop.c $(CONFIG_H) $(RTL_H) flags.h loop.h insn-config.h \
+ insn-flags.h insn-codes.h regs.h hard-reg-set.h recog.h expr.h real.h
+ unroll.o : unroll.c $(CONFIG_H) $(RTL_H) insn-config.h insn-codes.h \
+ integrate.h regs.h flags.h expr.h loop.h
+ flow.o : flow.c $(CONFIG_H) $(RTL_H) flags.h insn-config.h \
+ basic-block.h regs.h hard-reg-set.h output.h
+ combine.o : combine.c $(CONFIG_H) $(RTL_H) gvarargs.h flags.h \
+ insn-config.h insn-flags.h insn-codes.h insn-attr.h regs.h expr.h \
+ basic-block.h recog.h real.h hard-reg-set.h
+ regclass.o : regclass.c $(CONFIG_H) $(RTL_H) hard-reg-set.h flags.h \
+ basic-block.h regs.h insn-config.h recog.h reload.h real.h bytecode.h
+ local-alloc.o : local-alloc.c $(CONFIG_H) $(RTL_H) flags.h basic-block.h \
+ regs.h hard-reg-set.h insn-config.h recog.h output.h
+ global.o : global.c $(CONFIG_H) $(RTL_H) flags.h \
+ basic-block.h regs.h hard-reg-set.h insn-config.h output.h
+
+ reload.o : reload.c $(CONFIG_H) $(RTL_H) flags.h \
+ reload.h recog.h hard-reg-set.h insn-config.h insn-codes.h regs.h real.h
+ reload1.o : reload1.c $(CONFIG_H) $(RTL_H) flags.h expr.h \
+ reload.h regs.h hard-reg-set.h insn-config.h insn-flags.h insn-codes.h \
+ basic-block.h recog.h output.h
+ caller-save.o : caller-save.c $(CONFIG_H) $(RTL_H) flags.h \
+ regs.h hard-reg-set.h insn-config.h basic-block.h recog.h reload.h expr.h
+ reorg.o : reorg.c $(CONFIG_H) $(RTL_H) conditions.h hard-reg-set.h \
+ basic-block.h regs.h insn-config.h insn-attr.h insn-flags.h recog.h \
+ flags.h output.h
+ sched.o : sched.c $(CONFIG_H) $(RTL_H) basic-block.h regs.h hard-reg-set.h \
+ flags.h insn-config.h insn-attr.h
+ final.o : final.c $(CONFIG_H) $(RTL_H) $(TREE_H) gvarargs.h flags.h regs.h \
+ recog.h conditions.h insn-config.h insn-attr.h real.h output.h \
+ hard-reg-set.h insn-flags.h insn-codes.h gstab.h xcoffout.h defaults.h
+ recog.o : recog.c $(CONFIG_H) $(RTL_H) \
+ regs.h recog.h hard-reg-set.h flags.h insn-config.h insn-attr.h \
+ insn-flags.h insn-codes.h real.h
+ reg-stack.o : reg-stack.c $(CONFIG_H) $(RTL_H) $(TREE_H) \
+ regs.h hard-reg-set.h flags.h insn-config.h
+
+ aux-output.o : aux-output.c $(CONFIG_H) \
+ $(RTL_H) regs.h hard-reg-set.h real.h insn-config.h conditions.h \
+ insn-flags.h output.h insn-attr.h insn-codes.h
+
+ # Build auxiliary files that support ecoff format.
+ mips-tfile: mips-tfile.o version.o $(LIBDEPS)
+ $(CC) $(CFLAGS) $(LDFLAGS) -o mips-tfile mips-tfile.o version.o $(LIBS)
+
+ mips-tfile.o : mips-tfile.c $(CONFIG_H) $(RTL_H)
+
+ mips-tdump: mips-tdump.o version.o $(LIBDEPS)
+ $(CC) $(CFLAGS) $(LDFLAGS) -o mips-tdump mips-tdump.o version.o $(LIBS)
+
+ mips-tdump.o : mips-tdump.c $(CONFIG_H) $(RTL_H)
+
+ # Normally this target is not used; but it is used if you
+ # define ALLOCA=alloca.o. In that case, you must get a suitable alloca.c
+ # from the GNU Emacs distribution.
+ alloca.o: alloca.c
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(ALLOCA_FLAGS) \
+ -c `echo $(srcdir)/alloca.c | sed 's,^\./,,'`
+ $(ALLOCA_FINISH)
+
+ # Generate header and source files from the machine description,
+ # and compile them.
+
+ .PRECIOUS: insn-config.h insn-flags.h insn-codes.h \
+ insn-emit.c insn-recog.c insn-extract.c insn-output.c insn-peep.c \
+ insn-attr.h insn-attrtab.c
+
+ # The following pair of rules has this effect:
+ # genconfig is run only if the md has changed since genconfig was last run;
+ # but the file insn-config.h is touched only when its contents actually change.
+
+ # Each of the other insn-* files is handled by a similar pair of rules.
+
+ # This causes an anomaly in the results of make -n
+ # because insn-* is older than stamp-*
+ # and thus make -n thinks that insn-* will be updated
+ # and force recompilation of things that depend on it.
+ # We use move-if-change precisely to avoid such recompilation.
+ # But there is no way to teach make -n that it will be avoided.
+
+ # Each of the insn-*.[ch] rules has a semicolon at the end,
+ # for otherwise the system Make on SunOS 4.1 never tries
+ # to recompile insn-*.o. To avoid problems and extra noise from
+ # versions of make which don't like empty commands (nothing after the
+ # trailing `;'), we call true for each.
+
+ insn-config.h: stamp-config ; @true
+ stamp-config : md genconfig $(srcdir)/move-if-change
+ ./genconfig md > tmp-config.h
+ $(srcdir)/move-if-change tmp-config.h insn-config.h
+ touch stamp-config
+
+ insn-flags.h: stamp-flags ; @true
+ stamp-flags : md genflags $(srcdir)/move-if-change
+ ./genflags md > tmp-flags.h
+ $(srcdir)/move-if-change tmp-flags.h insn-flags.h
+ touch stamp-flags
+
+ insn-codes.h: stamp-codes ; @true
+ stamp-codes : md gencodes $(srcdir)/move-if-change
+ ./gencodes md > tmp-codes.h
+ $(srcdir)/move-if-change tmp-codes.h insn-codes.h
+ touch stamp-codes
+
+ insn-emit.o : insn-emit.c $(CONFIG_H) $(RTL_H) expr.h real.h output.h \
+ insn-config.h insn-flags.h insn-codes.h
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-emit.c
+
+ insn-emit.c: stamp-emit ; @true
+ stamp-emit : md genemit $(srcdir)/move-if-change
+ ./genemit md > tmp-emit.c
+ $(srcdir)/move-if-change tmp-emit.c insn-emit.c
+ touch stamp-emit
+
+ insn-recog.o : insn-recog.c $(CONFIG_H) $(RTL_H) insn-config.h recog.h \
+ real.h output.h flags.h
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-recog.c
+
+ insn-recog.c: stamp-recog ; @true
+ stamp-recog : md genrecog $(srcdir)/move-if-change
+ ./genrecog md > tmp-recog.c
+ $(srcdir)/move-if-change tmp-recog.c insn-recog.c
+ touch stamp-recog
+
+ insn-opinit.o : insn-opinit.c $(CONFIG_H) $(RTL_H) insn-codes.h insn-flags.h \
+ insn-config.h flags.h rtl.h recog.h expr.h reload.h
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-opinit.c
+
+ insn-opinit.c: stamp-opinit ; @true
+ stamp-opinit : md genopinit $(srcdir)/move-if-change
+ ./genopinit md > tmp-opinit.c
+ $(srcdir)/move-if-change tmp-opinit.c insn-opinit.c
+ touch stamp-opinit
+
+ insn-extract.o : insn-extract.c $(CONFIG_H) $(RTL_H)
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-extract.c
+
+ insn-extract.c: stamp-extract ; @true
+ stamp-extract : md genextract $(srcdir)/move-if-change
+ ./genextract md > tmp-extract.c
+ $(srcdir)/move-if-change tmp-extract.c insn-extract.c
+ touch stamp-extract
+
+ insn-peep.o : insn-peep.c $(CONFIG_H) $(RTL_H) regs.h output.h real.h
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-peep.c
+
+ insn-peep.c: stamp-peep ; @true
+ stamp-peep : md genpeep $(srcdir)/move-if-change
+ ./genpeep md > tmp-peep.c
+ $(srcdir)/move-if-change tmp-peep.c insn-peep.c
+ touch stamp-peep
+
+ insn-attrtab.o : insn-attrtab.c $(CONFIG_H) $(RTL_H) regs.h real.h output.h \
+ insn-attr.h insn-config.h
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-attrtab.c
+
+ insn-attr.h: stamp-attr ; @true
+ stamp-attr : md genattr $(srcdir)/move-if-change
+ ./genattr md > tmp-attr.h
+ $(srcdir)/move-if-change tmp-attr.h insn-attr.h
+ touch stamp-attr
+
+ insn-attrtab.c: stamp-attrtab ; @true
+ stamp-attrtab : md genattrtab $(srcdir)/move-if-change
+ if cmp -s $(PREMADE_ATTRTAB_MD) md; \
+ then \
+ echo Using $(PREMADE_ATTRTAB); \
+ cp $(PREMADE_ATTRTAB) tmp-attrtab.c; \
+ else \
+ ./genattrtab md > tmp-attrtab.c; \
+ fi
+ $(srcdir)/move-if-change tmp-attrtab.c insn-attrtab.c
+ touch stamp-attrtab
+
+ insn-output.o : insn-output.c $(CONFIG_H) $(RTL_H) regs.h real.h conditions.h \
+ hard-reg-set.h insn-config.h insn-flags.h insn-attr.h output.h recog.h \
+ insn-codes.h
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-output.c
+
+ insn-output.c: stamp-output ; @true
+ stamp-output : md genoutput $(srcdir)/move-if-change
+ ./genoutput md > tmp-output.c
+ $(srcdir)/move-if-change tmp-output.c insn-output.c
+ touch stamp-output
+
+ # Compile the programs that generate insn-* from the machine description.
+ # They are compiled with $(HOST_CC), and associated libraries,
+ # since they need to run on this machine
+ # even if GCC is being compiled to run on some other machine.
+
+ # $(CONFIG_H) is omitted from the deps of the gen*.o
+ # because these programs don't really depend on anything
+ # about the target machine. They do depend on config.h itself,
+ # since that describes the host machine.
+
+ # Pass the md file through cpp if the target requests it.
+ $(MD_FILE): $(CPP_MD)
+ -if [ -f md.pre-cpp ]; then \
+ rm -f md ; ./cpp $(CPP_MD_FLAGS) md.pre-cpp | sed 's/^# /; /g' > md ; \
+ else true ; \
+ fi
+
+ genconfig : genconfig.o $(HOST_RTL) $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o genconfig \
+ genconfig.o $(HOST_RTL) $(HOST_LIBS)
+
+ genconfig.o : genconfig.c $(RTL_H) hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genconfig.c
+
+ genflags : genflags.o $(HOST_RTL) $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o genflags \
+ genflags.o $(HOST_RTL) $(HOST_LIBS)
+
+ genflags.o : genflags.c $(RTL_H) hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genflags.c
+
+ gencodes : gencodes.o $(HOST_RTL) $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o gencodes \
+ gencodes.o $(HOST_RTL) $(HOST_LIBS)
+
+ gencodes.o : gencodes.c $(RTL_H) hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/gencodes.c
+
+ genemit : genemit.o $(HOST_RTL) $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o genemit \
+ genemit.o $(HOST_RTL) $(HOST_LIBS)
+
+ genemit.o : genemit.c $(RTL_H) hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genemit.c
+
+ genopinit : genopinit.o $(HOST_RTL) $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o genopinit \
+ genopinit.o $(HOST_RTL) $(HOST_LIBS)
+
+ genopinit.o : genopinit.c $(RTL_H) hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genopinit.c
+
+ genrecog : genrecog.o $(HOST_RTL) $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o genrecog \
+ genrecog.o $(HOST_RTL) $(HOST_LIBS)
+
+ genrecog.o : genrecog.c $(RTL_H) hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genrecog.c
+
+ genextract : genextract.o $(HOST_RTL) $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o genextract \
+ genextract.o $(HOST_RTL) $(HOST_LIBS)
+
+ genextract.o : genextract.c $(RTL_H) hconfig.h insn-config.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genextract.c
+
+ genpeep : genpeep.o $(HOST_RTL) $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o genpeep \
+ genpeep.o $(HOST_RTL) $(HOST_LIBS)
+
+ genpeep.o : genpeep.c $(RTL_H) hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genpeep.c
+
+ genattr : genattr.o $(HOST_RTL) $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o genattr \
+ genattr.o $(HOST_RTL) $(HOST_LIBS)
+
+ genattr.o : genattr.c $(RTL_H) hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genattr.c
+
+ genattrtab : genattrtab.o $(HOST_RTL) $(HOST_PRINT) $(HOST_RTLANAL) $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o genattrtab \
+ genattrtab.o $(HOST_RTL) $(HOST_PRINT) $(HOST_RTLANAL) $(HOST_LIBS)
+
+ genattrtab.o : genattrtab.c $(RTL_H) hconfig.h insn-config.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genattrtab.c
+
+ genoutput : genoutput.o $(HOST_RTL) $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o genoutput \
+ genoutput.o $(HOST_RTL) $(HOST_LIBS)
+
+ genoutput.o : genoutput.c $(RTL_H) hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/genoutput.c
+
+ # Compile the libraries to be used by gen*.
+ # If we are not cross-building, gen* use the same .o's that cc1 will use,
+ # and HOST_PREFIX_1 is `foobar', just to ensure these rules don't conflict
+ # with the rules for rtl.o, alloca.o, etc.
+ $(HOST_PREFIX_1)rtl.o: $(srcdir)/rtl.c $(CONFIG_H) $(RTL_H)
+ rm -f $(HOST_PREFIX)rtl.c
+ sed -e 's/config[.]h/hconfig.h/' $(srcdir)/rtl.c > $(HOST_PREFIX)rtl.c
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)rtl.c
+
+ $(HOST_PREFIX_1)print-rtl.o: $(srcdir)/print-rtl.c $(CONFIG_H) $(RTL_H)
+ rm -f $(HOST_PREFIX)print-rtl.c
+ sed -e 's/config[.]h/hconfig.h/' $(srcdir)/print-rtl.c > $(HOST_PREFIX)print-rtl.c
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)print-rtl.c
+
+ $(HOST_PREFIX_1)rtlanal.o: $(srcdir)/rtlanal.c $(CONFIG_H) $(RTL_H)
+ rm -f $(HOST_PREFIX)rtlanal.c
+ sed -e 's/config[.]h/hconfig.h/' $(srcdir)/rtlanal.c > $(HOST_PREFIX)rtlanal.c
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)rtlanal.c
+
+ $(HOST_PREFIX_1)alloca.o: alloca.c
+ rm -f $(HOST_PREFIX)alloca.c
+ cp $(srcdir)/alloca.c $(HOST_PREFIX)alloca.c
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)alloca.c
+
+ $(HOST_PREFIX_1)obstack.o: obstack.c
+ rm -f $(HOST_PREFIX)obstack.c
+ sed -e 's/config[.]h/hconfig.h/' $(srcdir)/obstack.c > $(HOST_PREFIX)obstack.c
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)obstack.c
+
+ $(HOST_PREFIX_1)malloc.o: malloc.c
+ rm -f $(HOST_PREFIX)malloc.c
+ sed -e 's/config[.]h/hconfig.h/' $(srcdir)/malloc.c > $(HOST_PREFIX)malloc.c
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)malloc.c
+
+ # This satisfies the dependency that we get if you cross-compile a compiler
+ # that does not need to compile alloca, malloc or whatever.
+ $(HOST_PREFIX_1):
+ touch $(HOST_PREFIX_1)
+
+ # Remake bytecode files.
+ # BI_ALL=bi-run.o
+ BI_ALL=
+ BC_ALL=bc-opname.h bc-opcode.h bc-arity.h
+ BI_OBJ=bi-parser.o bi-lexer.o bi-reverse.o
+
+
+ bc-emit.o : bc-emit.c $(CONFIG_H) $(RTL_H) real.h $(BYTECODE_H) \
+ bc-arity.h bc-opcode.h bc-typecd.h bc-typecd.def bi-run.h bytetypes.h
+ bc-optab.o : bc-optab.c $(CONFIG_H) $(REAL_H) $(BYTECODE_H) \
+ bc-opcode.h bc-typecd.h bc-typecd.def
+
+
+ bytecode: $(BI_ALL) $(BC_ALL)
+
+ bi-arity: bi-arity.o $(BI_OBJ) $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o bi-arity \
+ bi-arity.o $(BI_OBJ) $(HOST_LIBS)
+ bi-opcode: bi-opcode.o $(BI_OBJ) $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o bi-opcode \
+ bi-opcode.o $(BI_OBJ) $(HOST_LIBS)
+ bi-opname: bi-opname.o $(BI_OBJ) $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o bi-opname \
+ bi-opname.o $(BI_OBJ) $(HOST_LIBS)
+
+ bi-run.o: $(srcdir)/bi-run.c $(srcdir)/bi-run.h $(srcdir)/bc-typecd.h \
+ bc-opname.h bc-arity.h bc-opcode.h
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c $(srcdir)/bi-run.c
+ $(srcdir)/bi-parser.c $(srcdir)/bi-parser.h: $(srcdir)/bi-parser.y
+ cd $(srcdir); $(BISON) $(BISONFLAGS) -d bi-parser.y -o bi-parser.c
+ bi-parser.o: $(srcdir)/bi-parser.c $(srcdir)/bi-defs.h hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) \
+ $(srcdir)/bi-parser.c
+ bi-lexer.o: $(srcdir)/bi-lexer.c $(srcdir)/bi-parser.h hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) \
+ $(srcdir)/bi-lexer.c
+ bi-arity.o: bi-arity.c $(srcdir)/bi-defs.h hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) \
+ $(srcdir)/bi-arity.c
+ bi-opcode.o: bi-opcode.c $(srcdir)/bi-defs.h hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) \
+ $(srcdir)/bi-opcode.c
+ bi-opname.o: bi-opname.c $(srcdir)/bi-defs.h hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) \
+ $(srcdir)/bi-opname.c
+ bi-reverse.o: bi-reverse.c $(srcdir)/bi-defs.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) \
+ $(srcdir)/bi-reverse.c
+
+
+ bc-arity.h: stamp-bcarity ; @true
+ stamp-bcarity : $(srcdir)/bytecode.def bi-arity $(srcdir)/move-if-change
+ ./bi-arity < $(srcdir)/bytecode.def >tmp-bc-arity.h
+ $(srcdir)/move-if-change tmp-bc-arity.h bc-arity.h
+ touch stamp-bcarity
+
+ bc-opcode.h: stamp-bcopcode ; @true
+ stamp-bcopcode : $(srcdir)/bytecode.def bi-opcode $(srcdir)/move-if-change
+ ./bi-opcode < $(srcdir)/bytecode.def >tmp-bcopcd.h
+ $(srcdir)/move-if-change tmp-bcopcd.h bc-opcode.h
+ touch stamp-bcopcode
+
+ bc-opname.h: stamp-bcopname ; @true
+ stamp-bcopname : $(srcdir)/bytecode.def bi-opname $(srcdir)/move-if-change
+ ./bi-opname < $(srcdir)/bytecode.def >tmp-bcopnm.h
+ $(srcdir)/move-if-change tmp-bcopnm.h bc-opname.h
+ touch stamp-bcopname
+
+ bytecode.mostlyclean:
+ -rm -f bc-arity.h bc-opcode.h bc-opname.h
+
+ bytecode.distclean bytecode.clean: bytecode.mostlyclean
+ -rm -f bi-arity bi-opcode bi-opname bi-lexer
+
+ bytecode.realclean: bytecode.clean
+ -rm -f bi-parser.c bi-parser.h
+
+
+ # Remake cpp and protoize.
+
+ # Making the preprocessor
+ cpp: cccp
+ -rm -f cpp
+ ln cccp cpp
+ cccp: cccp.o cexp.o version.o $(LIBDEPS)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o cccp cccp.o cexp.o version.o $(LIBS)
+ cexp.o: $(srcdir)/cexp.c $(CONFIG_H)
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c $(srcdir)/cexp.c
+ $(srcdir)/cexp.c: $(srcdir)/cexp.y
+ cd $(srcdir); $(BISON) -o cexp.c cexp.y
+ cccp.o: cccp.c $(CONFIG_H) pcp.h version.c config.status
+ # The reason we use $(libdir)/g++-include rather than using libsubdir
+ # is for compatibility with the current version of libg++.
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ -DGCC_INCLUDE_DIR=\"$(libsubdir)/include\" \
+ -DGPLUSPLUS_INCLUDE_DIR=\"$(libdir)/g++-include\" \
+ -DLOCAL_INCLUDE_DIR=\"$(local_prefix)/include\" \
+ -DCROSS_INCLUDE_DIR=\"$(libsubdir)/sys-include\" \
+ -DTOOL_INCLUDE_DIR=\"$(tooldir)/include\" \
+ -DTOOLDIR=\"$(tooldir)/\" \
+ -c `echo $(srcdir)/cccp.c | sed 's,^\./,,'`
+
+ # Note for the stamp targets, we run the program `true' instead of
+ # having an empty command (nothing following the semicolon).
+
+ proto: config.status protoize unprotoize SYSCALLS.c.X
+
+ protoize: protoize.o getopt.o getopt1.o getpwd.o version.o $(LIBDEPS)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) \
+ protoize.o getopt.o getopt1.o getpwd.o version.o $(LIBS) -o $@
+ protoize.o: stamp-proto ; @true
+
+ unprotoize: unprotoize.o getopt.o getopt1.o getpwd.o version.o $(LIBDEPS)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) \
+ unprotoize.o getopt.o getopt1.o getpwd.o version.o $(LIBS) -o $@
+ unprotoize.o: stamp-proto ; @true
+
+ stamp-proto: $(srcdir)/protoize.c getopt.h $(CONFIG_H)
+ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ -DGCC_INCLUDE_DIR=\"$(libsubdir)/include\" \
+ -DGPLUSPLUS_INCLUDE_DIR=\"$(libdir)/g++-include\" \
+ -DCROSS_INCLUDE_DIR=\"$(libsubdir)/sys-include\" \
+ -DTOOL_INCLUDE_DIR=\"$(tooldir)/include\" \
+ -DLOCAL_INCLUDE_DIR=\"$(local_prefix)/include\" \
+ -DSTD_PROTO_DIR=\"$(libsubdir)\" \
+ -DUNPROTOIZE $(srcdir)/protoize.c
+ mv protoize.o unprotoize.o
+ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ -DGCC_INCLUDE_DIR=\"$(libsubdir)/include\" \
+ -DGPLUSPLUS_INCLUDE_DIR=\"$(libdir)/g++-include\" \
+ -DCROSS_INCLUDE_DIR=\"$(libsubdir)/sys-include\" \
+ -DTOOL_INCLUDE_DIR=\"$(tooldir)/include\" \
+ -DLOCAL_INCLUDE_DIR=\"$(local_prefix)/include\" \
+ -DSTD_PROTO_DIR=\"$(libsubdir)\" \
+ $(srcdir)/protoize.c
+ touch stamp-proto
+
+ getopt.o: $(srcdir)/getopt.c getopt.h
+ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/getopt.c
+ getopt1.o: $(srcdir)/getopt1.c getopt.h
+ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/getopt1.c
+
+ # This info describes the target machine, so compile with GCC just built.
+ SYSCALLS.c.X: $(srcdir)/sys-types.h $(srcdir)/sys-protos.h $(GCC_PASSES)
+ -rm -f SYSCALLS.c tmp-SYSCALLS.s
+ cat $(srcdir)/sys-types.h $(srcdir)/sys-protos.h > SYSCALLS.c
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ -aux-info $@ -S -o tmp-SYSCALLS.s SYSCALLS.c
+ -rm -f SYSCALLS.c tmp-SYSCALLS.s
+
+
+ test-protoize-simple: ./protoize ./unprotoize $(GCC_PASSES)
+ -rm -f tmp-proto.[cso]
+ cp $(srcdir)/protoize.c tmp-proto.c
+ chmod u+w tmp-proto.c
+ ./protoize -N -B ./ -x getopt.h -c "-B./ -Wall -Wwrite-strings \
+ $(CFLAGS) $(INCLUDES) \
+ -DGCC_INCLUDE_DIR=0 \
+ -DGPLUSPLUS_INCLUDE_DIR=0 \
+ -DCROSS_INCLUDE_DIR=0 \
+ -DTOOL_INCLUDE_DIR=0 \
+ -DSTD_PROTO_DIR=0" tmp-proto.c
+ @echo '**********' Expect 400 lines of differences.
+ -diff $(srcdir)/protoize.c tmp-proto.c > tmp-proto.diff
+ -wc -l tmp-proto.diff
+ ./unprotoize -N -x getopt.h -c "-B./ -Wall -Wwrite-strings \
+ $(CFLAGS) $(INCLUDES) \
+ -DGCC_INCLUDE_DIR=0 \
+ -DGPLUSPLUS_INCLUDE_DIR=0 \
+ -DCROSS_INCLUDE_DIR=0 \
+ -DTOOL_INCLUDE_DIR=0 \
+ -DSTD_PROTO_DIR=0" tmp-proto.c
+ @echo Expect zero differences.
+ diff $(srcdir)/protoize.c tmp-proto.c | cat
+ -rm -f tmp-proto.[cso]
+
+ # Build the include directory. The stamp files are stmp-* rather than
+ # stamp-* so that mostlyclean does not force the include directory to
+ # be rebuilt.
+
+ # Build the include directory except for float.h (which depends upon
+ # enquire).
+ stmp-int-hdrs: stmp-fixinc $(USER_H) gvarargs.h gstdarg.h gstddef.h \
+ xlimits.h objc-headers
+ # Copy in the headers provided with gcc.
+ # The sed command gets just the last file name component;
+ # this is necessary because VPATH could add a dirname.
+ # Using basename would be simpler, but some systems don't have it.
+ objdir=`pwd`; \
+ cd $(srcdir); \
+ for file in $(USER_H); do \
+ realfile=`echo $$file | sed -e 's|.*/\([^/]*\)$$|\1|'`; \
+ rm -f $$objdir/include/$$realfile; \
+ cp $$realfile $$objdir/include; \
+ chmod a+r $$objdir/include/$$realfile; \
+ done
+ rm -f include/varargs.h
+ cp $(srcdir)/gvarargs.h include/varargs.h
+ chmod a+r include/varargs.h
+ rm -f include/stdarg.h
+ cp $(srcdir)/gstdarg.h include/stdarg.h
+ chmod a+r include/stdarg.h
+ rm -f include/stddef.h
+ cp $(srcdir)/gstddef.h include/stddef.h
+ chmod a+r include/stddef.h
+ rm -f include/limits.h
+ cp xlimits.h include/limits.h
+ chmod a+r include/limits.h
+ # Install the README
+ rm -f include/README
+ cp $(srcdir)/README-fixinc include/README
+ chmod a+r include/README
+ touch stmp-int-hdrs
+
+ # Build the complete include directory.
+ stmp-headers: stmp-int-hdrs gfloat.h
+ rm -f include/float.h
+ cp gfloat.h include/float.h
+ chmod a+r include/float.h
+ touch stmp-headers
+
+ # Running fixincludes requires making sure that xgcc and cpp have been
+ # compiled (they are used to get the value of __SIZE_TYPE__).
+ # But recompiling xgcc should not force the the header files to be
+ # fixed again. If you want to do that, delete stmp-fixinc.
+ fixinc.ready: xgcc cpp
+ -if [ -f fixinc.ready ] ; then \
+ true; \
+ else \
+ touch fixinc.ready; \
+ fi
+
+ # Build fixed copies of system files.
+ stmp-fixinc: $(srcdir)/$(FIXINCLUDES) gsyslimits.h fixinc.ready
+ rm -rf include
+ mkdir include
+ if [ x$(FIXINCLUDES) != xMakefile.in ]; \
+ then \
+ for dir in $(SYSTEM_HEADER_DIR) $(OTHER_FIXINCLUDES_DIRS); do \
+ if [ -d $$dir ]; \
+ then \
+ $(srcdir)/$(FIXINCLUDES) include $$dir $(srcdir) "`pwd`/xgcc -B`pwd`/"; \
+ else true; fi; \
+ done; \
+ else true; \
+ fi
+ rm -f include/syslimits.h
+ if [ -f include/limits.h ]; then \
+ mv include/limits.h include/syslimits.h; \
+ else \
+ cp $(srcdir)/gsyslimits.h include/syslimits.h; \
+ fi
+ chmod a+r include/syslimits.h
+ touch stmp-fixinc
+
+ # copy objc header files into build directory
+ objc-headers: stmp-fixinc
+ if [ -d objc ]; then true; else mkdir objc; fi
+ thisdir1=`pwd`; \
+ srcdir1=`cd $(srcdir); pwd`; \
+ cd objc; \
+ $(MAKE) -f $${srcdir1}/objc/Makefile copy-headers \
+ srcdir=$${srcdir1} tooldir=$(tooldir) AR="$(AR)" AR_FLAGS="$(AR_FLAGS)" \
+ GCC_FOR_TARGET="$${thisdir1}/xgcc -B$${thisdir1}/" \
+ GCC_CFLAGS="$(GCC_CFLAGS)" incinstalldir=$${thisdir1}/include
+ touch objc-headers
+
+ # Files related to the fixproto script.
+
+ deduced.h: $(GCC_PASSES) $(srcdir)/scan-types.sh stmp-int-hdrs
+ CC="$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(ALL_CPPFLAGS) -I. -I$(srcdir) -Iinclude -I${SYSTEM_HEADER_DIR}"; \
+ export CC; \
+ $(srcdir)/scan-types.sh "$(srcdir)" >tmp-deduced.h
+ mv tmp-deduced.h deduced.h
+
+ gen-protos: gen-protos.o scan.o $(HOST_LIBDEPS)
+ ${HOST_CC} $(HOST_CFLAGS) $(HOST_LDFLAGS) -o gen-protos \
+ gen-protos.o scan.o $(HOST_LIBS)
+
+ gen-protos.o: gen-protos.c scan.h hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/gen-protos.c
+
+ scan.o: scan.c scan.h hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/scan.c
+
+ xsys-protos.h: $(GCC_PASSES) $(srcdir)/sys-protos.h deduced.h gen-protos Makefile
+ cat deduced.h $(srcdir)/sys-protos.h > fixtmp.c
+ $(GCC_FOR_TARGET) fixtmp.c -E \
+ | sed -e 's/ / /g' -e 's/ *(/ (/g' -e 's/ [ ]*/ /g' -e 's/( )/()/' \
+ | ./gen-protos >xsys-protos.h
+ rm -rf fixtmp.c
+
+ fix-header: fix-header.o scan-decls.o scan.o xsys-protos.h $(HOST_LIBDEPS)
+ $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o fix-header \
+ fix-header.o scan-decls.o scan.o $(HOST_LIBS)
+
+ fix-header.o: fix-header.c obstack.h scan.h xsys-protos.h hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/fix-header.c
+
+ scan-decls.o: scan-decls.c scan.h hconfig.h
+ $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/scan-decls.c
+
+ # stmp-fixproto depends on this, not on fix-header directly.
+ # The idea is to make sure fix-header gets built,
+ # but not rerun fixproto after each stage
+ # just because fix-header's mtime has changed.
+ fixhdr.ready: fix-header
+ -if [ -f fixhdr.ready ] ; then \
+ true; \
+ else \
+ touch fixhdr.ready; \
+ fi
+
+ # stmp-headers is to make sure fixincludes has already finished.
+ # The if statement is so that we don't run fixproto a second time
+ # if it has already been run on the files in `include'.
+ stmp-fixproto: fixhdr.ready fixproto stmp-headers
+ @echo "Various warnings and error messages from fixproto are normal"
+ -if [ -d include ] ; then true; else mkdir include; fi
+ if [ -f include/fixed ] ; then true; \
+ else \
+ CPP="$(GCC_FOR_TARGET) -E"; export CPP; \
+ ${srcdir}/fixproto include include $(SYSTEM_HEADER_DIR); \
+ touch include/fixed; \
+ fi
+ touch stmp-fixproto
+
+ # Remake the info files.
+
+ doc: info
+ info: $(srcdir)/cpp.info $(srcdir)/gcc.info
+
+ $(srcdir)/cpp.info: cpp.texi
+ cd $(srcdir); $(MAKEINFO) cpp.texi
+
+ #$(srcdir)/gplus.info: gplus.texi
+ # $(MAKEINFO) `echo $(srcdir)/gplus.texi | sed 's,^\./,,'`
+
+ $(srcdir)/gcc.info: gcc.texi extend.texi install.texi invoke.texi \
+ md.texi rtl.texi tm.texi
+ cd $(srcdir); $(MAKEINFO) gcc.texi
+
+ dvi: $(srcdir)/gcc.dvi $(srcdir)/cpp.dvi
+
+ # This works with GNU Make's default rule.
+ $(srcdir)/gcc.dvi: gcc.texi extend.texi install.texi invoke.texi \
+ md.texi rtl.texi tm.texi
+ $(TEXI2DVI) $<
+
+ # This works with GNU Make's default rule.
+ $(srcdir)/cpp.dvi: cpp.texi
+ $(TEXI2DVI) $<
+
+ $(srcdir)/INSTALL: install1.texi install.texi
+ $(MAKEINFO) -D INSTALLONLY --no-header --no-split \
+ `echo $(srcdir)/install1.texi | sed 's,^\./,,'`
+
+ # Deletion of files made during compilation.
+ # There are four levels of this:
+ # `mostlyclean', `clean', `distclean' and `realclean'.
+ # `mostlyclean' is useful while working on a particular type of machine.
+ # It deletes most, but not all, of the files made by compilation.
+ # It does not delete libgcc.a or its parts, so it won't have to be recompiled.
+ # `clean' deletes everything made by running `make all'.
+ # `distclean' also deletes the files made by config.
+ # `realclean' also deletes everything that could be regenerated automatically.
+
+
+ mostlyclean: bytecode.mostlyclean
+ -rm -f $(STAGESTUFF)
+ # Clean the objc subdir if we created one.
+ if [ -d objc ]; then \
+ srcdir1=`cd $(srcdir); pwd`; \
+ cd objc; $(MAKE) -f $$srcdir1/objc/Makefile mostlyclean; \
+ else true; fi
+ -rm -f libobjc.a
+ # Delete the temporary source copies for cross compilation.
+ -rm -f $(HOST_PREFIX_1)rtl.c $(HOST_PREFIX_1)rtlanal.c
+ -rm -f $(HOST_PREFIX_1)alloca.c $(HOST_PREFIX_1)malloc.c
+ -rm -f $(HOST_PREFIX_1)obstack.c
+ # Delete the temp files made in the course of building libgcc.a.
+ -rm -f tmplibgcc* tmpcopy xlimits.h
+ for name in $(LIB1FUNCS); do rm -f $${name}.c; done
+ # Delete other temporary files.
+ -rm -f tmp-float.h tmp-gcc.xtar.gz
+ -rm -f tmp-foo1 tmp-foo2 tmp-proto.* tmp-unproto.1 tmp-SYSCALLS.s
+ # Delete the stamp files.
+ -rm -f stamp-* tmp-*
+ # Delete debugging dump files.
+ -rm -f *.greg *.lreg *.combine *.flow *.cse *.jump *.rtl *.tree *.loop
+ -rm -f *.dbr *.jump2 *.sched *.cse2 *.sched2 *.stack
+ # Delete some files made during installation.
+ -rm -f specs gfloat.h float.h-* enquire SYSCALLS.c.X SYSCALLS.c
+ -rm -f collect collect2 ld mips-tfile mips-tdump alloca.s
+ # Delete files generated for fixproto
+ -rm -rf fix-header xsys-protos.h deduced.h tmp-deduced.h \
+ gen-protos fixproto.list fixtmp.* fixhdr.ready
+ # Delete unwanted output files from TeX.
+ -rm -f *.toc *.log *.vr *.fn *.cp *.tp *.ky *.pg
+ # Delete sorted indices we don't actually use.
+ -rm -f gcc.vrs gcc.kys gcc.tps gcc.pgs gcc.fns
+ # Delete core dumps.
+ -rm -f core config/core
+
+ # Delete all files made by compilation
+ # that don't exist in the distribution.
+ clean: mostlyclean bytecode.clean
+ # It may not be quite desirable to delete unprotoize.c here,
+ # but the spec for `make clean' requires it.
+ # Using unprotoize.c is not quite right in the first place,
+ # but what better way is there?
+ -rm -f libgcc.a libgcc1.a libgcc2.a libgcc2.ready libgcc1.null
+ -rm -f *.dvi
+ -if [ -f md.pre-cpp ]; then \
+ rm -f md ; \
+ fi
+ # Delete the include directory.
+ -rm -rf stmp-* fixinc.ready include objc-headers
+
+ # Delete all files that users would normally create
+ # while building and installing GCC.
+ distclean: clean bytecode.distclean
+ -rm -f tm.h aux-output.c config.h config.status tconfig.h hconfig.h
+ -rm -f md md.pre-cpp
+ -rm -f Makefile *.oaux
+ -rm -fr stage1 stage2 stage3 stage4
+ -rm -f cp-parse.output
+ -rm -f objc-parse.output
+ -rm -f c-parse.output
+
+ # Delete anything likely to be found in the source directory
+ # that shouldn't be in the distribution.
+ extraclean: distclean
+ -rm -rf =* ./"#"* *~* config/=* config/"#"* config/*~*
+ -rm -f patch* *.orig *.rej config/patch* config/*.orig config/*.rej
+ -rm -f config/*/=* config/*/"#"* config/*/*~*
+ -rm -f config/*/*.orig config/*/*.rej
+ -rm -f objc/=* objc/"#"* objc/*~*
+ -rm -f objc/*.orig objc/*.rej
+ -rm -f *.dvi *.oaux *.d *.[zZ] *.gz
+ -rm -f *.tar *.xtar *diff *.diff.* *.tar.* *.xtar.* *diffs
+ -rm -f *lose config/*lose config/*/*lose
+ -rm -f *.s *.s[0-9] *.i install1.texi config/ChangeLog
+ -rm -f djefoo
+
+ # Get rid of every file that's generated from some other file.
+ # Most of these files ARE PRESENT in the GCC distribution.
+ realclean: distclean bytecode.realclean
+ -rm -f c-parse.y objc-parse.y
+ -rm -f cp-parse.c cp-parse.h cp-parse.output
+ -rm -f objc-parse.c objc-parse.output
+ -rm -f c-parse.c c-parse.h c-parse.output
+ -rm -f cexp.c cexp.output TAGS
+ -rm -f cpp.info* cpp.??s cpp.*aux
+ -rm -f gcc.info* gcc.??s gcc.*aux
+ -rm -f gplus.info* gplus.??s gplus.*aux
+
+ # Entry points `install' and `uninstall'.
+ # Also use `install-collect2' to install collect2 when the config files don't.
+
+ # The semicolon is to prevent the install.sh -> install default rule
+ # from doing anything. Having it run true helps avoid problems and
+ # noise from versions of make which don't like to have null commands.
+ install: $(INSTALL_TARGET) ; @true
+
+ # Copy the compiler files into directories where they will be run.
+ install-normal: install-common $(INSTALL_HEADERS) $(INSTALL_LIBGCC) \
+ install-man install-info
+
+ # Do nothing while making gcc with a cross-compiler. The person who
+ # makes gcc for the target machine has to know how to put a complete
+ # gcc together by hand.
+ install-build: force
+ @echo You have to install gcc on your target machine by hand.
+
+ # Run this on the target machine
+ # to finish installation of cross compiler.
+ install-cross-rest: install-float-h-cross
+
+ # Install float.h for cross compiler.
+ # Run this on the target machine!
+ install-float-h-cross: install-dir
+ # if [ -f enquire ] ; then true; else false; fi
+ # Note: don't use -. We should fail right away if enquire was not made.
+ ./enquire -f > $(tmpdir)/float.h
+ -rm -f $(libsubdir)/include/float.h
+ $(INSTALL_DATA) $(tmpdir)/float.h $(libsubdir)/include/float.h
+ -rm -f $(tmpdir)/float.h
+ chmod a-x $(libsubdir)/include/float.h
+
+ # Create the installation directory.
+ install-dir:
+ -if [ -d $(libdir) ] ; then true ; else mkdir $(libdir) ; fi
+ -if [ -d $(libdir)/gcc-lib ] ; then true ; else mkdir $(libdir)/gcc-lib ; fi
+ # This dir isn't currently searched by cpp.
+ # -if [ -d $(libdir)/gcc-lib/include ] ; then true ; else mkdir $(libdir)/gcc-lib/include ; fi
+ -if [ -d $(libdir)/gcc-lib/$(target) ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target) ; fi
+ -if [ -d $(libdir)/gcc-lib/$(target)/$(version) ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target)/$(version) ; fi
+ -if [ -d $(libdir)/gcc-lib/$(target)/$(version)/include ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target)/$(version)/include ; fi
+ -if [ -d $(bindir) ] ; then true ; else mkdir $(bindir) ; fi
+ -if [ -d $(includedir) ] ; then true ; else mkdir $(includedir) ; fi
+ -if [ -d $(tooldir) ] ; then true ; else mkdir $(tooldir) ; fi
+ -if [ -d $(assertdir) ] ; then true ; else mkdir $(assertdir) ; fi
+ -if [ -d $(infodir) ] ; then true ; else mkdir $(infodir) ; fi
+ # We don't use mkdir -p to create the parents of mandir,
+ # because some systems don't support it.
+ # Instead, we use this technique to create the immediate parent of mandir.
+ -parent=`echo $(mandir)|sed -e 's@/[^/]*$$@@'`; \
+ if [ -d $$parent ] ; then true ; else mkdir $$parent ; fi
+ -if [ -d $(mandir) ] ; then true ; else mkdir $(mandir) ; fi
+
+ # Install the compiler executables built during cross compilation.
+ install-common: native install-dir xgcc $(EXTRA_PARTS)
+ for file in $(COMPILERS); do \
+ if [ -f $$file ] ; then \
+ rm -f $(libsubdir)/$$file; \
+ $(INSTALL_PROGRAM) $$file $(libsubdir)/$$file; \
+ else true; \
+ fi; \
+ done
+ for file in $(EXTRA_PASSES) $(EXTRA_PARTS) $(EXTRA_PROGRAMS) $(USE_COLLECT2) ..; do \
+ if [ x"$$file" != x.. ]; then \
+ rm -f $(libsubdir)/$$file; \
+ $(INSTALL_PROGRAM) $$file $(libsubdir)/$$file; \
+ else true; fi; \
+ done
+ # Don't mess with specs if it doesn't exist yet.
+ -if [ -f specs ] ; then \
+ rm -f $(libsubdir)/specs; \
+ $(INSTALL_DATA) specs $(libsubdir)/specs; \
+ fi
+ # Install the driver program as $(target)-gcc
+ # and also as either gcc (if native) or $(tooldir)/bin/gcc.
+ -if [ -f gcc-cross ] ; then \
+ rm -f $(bindir)/$(target)-gcc; \
+ $(INSTALL_PROGRAM) gcc-cross $(bindir)/$(target)-gcc; \
+ if [ -d $(tooldir)/bin/. ] ; then \
+ rm -f $(tooldir)/bin/gcc; \
+ $(INSTALL_PROGRAM) gcc-cross $(tooldir)/bin/gcc; \
+ else true; fi; \
+ if [ -f cc1plus ] ; then \
+ rm -f $(bindir)/$(target)-g++; \
+ $(INSTALL_PROGRAM) g++-cross $(bindir)/$(target)-g++; \
+ chmod a+x $(bindir)/$(target)-g++; \
+ rm -f $(bindir)/$(target)-c++; \
+ ln $(bindir)/$(target)-g++ $(bindir)/$(target)-c++; \
+ fi ; \
+ else \
+ rm -f $(bindir)/gcc; \
+ $(INSTALL_PROGRAM) xgcc $(bindir)/gcc; \
+ rm -f $(bindir)/$(target)-gcc-1; \
+ ln $(bindir)/gcc $(bindir)/$(target)-gcc-1; \
+ mv $(bindir)/$(target)-gcc-1 $(bindir)/$(target)-gcc; \
+ if [ -f gnat1 ] ; then \
+ rm -f $(bindir)/gnatbind; \
+ $(INSTALL_PROGRAM) gnatbind $(bindir)/gnatbind; \
+ chmod a+x $(bindir)/gnatbind; \
+ rm -f $(bindir)/gnatsplit; \
+ $(INSTALL_PROGRAM) gnatsplit $(bindir)/gnatsplit; \
+ chmod a+x $(bindir)/gnatsplit; \
+ rm -f $(bindir)/gnatchop; \
+ $(INSTALL_PROGRAM) gnatchop $(bindir)/gnatchop; \
+ chmod a+x $(bindir)/gnatchop; \
+ rm -f $(bindir)/gnatbl; \
+ $(INSTALL_PROGRAM) gnatbl $(bindir)/gnatbl; \
+ chmod a+x $(bindir)/gnatbl; \
+ rm -f $(bindir)/gnatf; \
+ $(INSTALL_PROGRAM) gnatf $(bindir)/gnatf; \
+ chmod a+x $(bindir)/gnatf; \
+ rm -f $(bindir)/gkrunch; \
+ $(INSTALL_PROGRAM) gkrunch $(bindir)/gkrunch; \
+ chmod a+x $(bindir)/gkrunch; \
+ $(MAKE) install-gnatlib; \
+ fi; \
+ if [ -f cc1plus ] ; then \
+ rm -f $(bindir)/g++; \
+ $(INSTALL_PROGRAM) g++ $(bindir)/g++; \
+ chmod a+x $(bindir)/g++; \
+ rm -f $(bindir)/c++; \
+ ln $(bindir)/g++ $(bindir)/c++; \
+ fi ; \
+ fi
+ # Install protoize if it was compiled.
+ -if [ -f protoize ]; \
+ then \
+ rm -f $(bindir)/protoize; \
+ $(INSTALL_PROGRAM) protoize $(bindir)/protoize; \
+ rm -f $(bindir)/unprotoize; \
+ $(INSTALL_PROGRAM) unprotoize $(bindir)/unprotoize; \
+ rm -f $(libsubdir)/SYSCALLS.c.X; \
+ $(INSTALL_DATA) SYSCALLS.c.X $(libsubdir)/SYSCALLS.c.X; \
+ chmod a-x $(libsubdir)/SYSCALLS.c.X; \
+ fi
+ -rm -f $(libsubdir)/cpp
+ $(INSTALL_PROGRAM) cpp $(libsubdir)/cpp
+
+ install-gnatlib:
+ rm -rf tmp-adainclude stamp-pthreads
+ $(MAKE) tmp-adainclude
+ $(MAKE) stamp-pthreads
+ rm -rf $(ADA_RTL_OBJ_DIR)
+ mkdir $(ADA_RTL_OBJ_DIR)
+ mv tmp-adainclude/*.o tmp-adainclude/*.ali tmp-adainclude/*.a \
+ threads/lib/libpthreads.a $(ADA_RTL_OBJ_DIR)
+ rm -rf $(ADA_INCLUDE_DIR)
+ mkdir $(ADA_INCLUDE_DIR)
+ mv tmp-adainclude/*.ad[bs] $(ADA_INCLUDE_DIR)
+ if $(RANLIB_TEST) ; then $(RANLIB) $(ADA_RTL_OBJ_DIR)/*.a; \
+ else true; fi
+
+ tmp-adainclude:
+ rm -rf tmp-adainclude-tmp
+ mkdir tmp-adainclude-tmp
+ for file in $(ADA_INCLUDE_SRCS) $(LIBGNAT_SRCS); do \
+ cp $$file tmp-adainclude-tmp/$$file; \
+ done
+ (cd tmp-adainclude-tmp; $(MAKE) CC="../xgcc -B../" CFLAGS="-g -O2" \
+ -f ../Makefile ada-runtime)
+ mv tmp-adainclude-tmp tmp-adainclude
+
+ # Install the info files.
+ install-info: doc install-dir
+ -rm -f $(infodir)/cpp.info* $(infodir)/gcc.info*
+ cd $(srcdir); for f in cpp.info* gcc.info*; \
+ do $(INSTALL_DATA) $$f $(infodir)/$$f; done
+ -chmod a-x $(infodir)/cpp.info* $(infodir)/gcc.info*
+
+ # Install the man pages.
+ install-man: install-dir $(srcdir)/gcc.1 $(srcdir)/cccp.1 $(srcdir)/g++.1
+ -rm -f $(mandir)/gcc$(manext)
+ -$(INSTALL_DATA) $(srcdir)/gcc.1 $(mandir)/gcc$(manext)
+ -chmod a-x $(mandir)/gcc$(manext)
+ -rm -f $(mandir)/cccp$(manext)
+ -$(INSTALL_DATA) $(srcdir)/cccp.1 $(mandir)/cccp$(manext)
+ -chmod a-x $(mandir)/cccp$(manext)
+ -$(INSTALL_DATA) $(srcdir)/g++.1 $(mandir)/g++$(manext)
+ -chmod a-x $(mandir)/g++$(manext)
+
+ # Install the library.
+ install-libgcc: libgcc.a install-dir
+ -if [ -f libgcc.a ] ; then \
+ rm -f $(libsubdir)/libgcc.a; \
+ $(INSTALL_DATA) libgcc.a $(libsubdir)/libgcc.a; \
+ if $(RANLIB_TEST) ; then \
+ (cd $(libsubdir); $(RANLIB) libgcc.a); else true; fi; \
+ chmod a-x $(libsubdir)/libgcc.a; \
+ else true; fi
+
+ # Install the objc run time library.
+ install-libobjc: libobjc.a install-dir
+ -if [ -f libobjc.a ] ; then \
+ rm -f $(libsubdir)/libobjc.a; \
+ $(INSTALL_DATA) libobjc.a $(libsubdir)/libobjc.a; \
+ if $(RANLIB_TEST) ; then \
+ (cd $(libsubdir); $(RANLIB) libobjc.a); else true; fi; \
+ chmod a-x $(libsubdir)/libobjc.a; \
+ else true; fi
+
+ # Install all the header files built in the include subdirectory.
+ install-headers: install-include-dir $(INSTALL_HEADERS_DIR) install-assert-h
+ # Fix symlinks to absolute paths in the installed include directory to
+ # point to the installed directory, not the build directory.
+ -files=`cd $(libsubdir)/include; find . -type l -print 2>/dev/null`; \
+ if [ $$? -eq 0 ]; then \
+ dir=`cd include; pwd`; \
+ for i in $$files; do \
+ dest=`ls -ld $(libsubdir)/include/$$i | sed -n 's/.*-> //p'`; \
+ if expr "$$dest" : "$$dir.*" > /dev/null; then \
+ rm -f $(libsubdir)/include/$$i; \
+ ln -s `echo $$i | sed "s|/[^/]*|/..|g" | sed 's|/..$$||'``echo "$$dest" | sed "s|$$dir||"` $(libsubdir)/include/$$i; \
+ fi; \
+ done; \
+ fi
+
+ # Create or recreate the gcc private include file directory.
+ install-include-dir: install-dir
+ -rm -rf $(libsubdir)/include
+ mkdir $(libsubdir)/include
+ -chmod a+rx $(libsubdir)/include
+
+ # Install the include directory using tar.
+ install-headers-tar: stmp-headers $(STMP_FIXPROTO) install-include-dir
+ cd include; \
+ (tar cf - .; exit 0) | (cd $(libsubdir)/include; tar $(TAROUTOPTS) - )
+ # /bin/sh on some systems returns the status of the first tar,
+ # and that can lose with GNU tar which always writes a full block.
+ # So use `exit 0' to ignore its exit status.
+
+ # Install the include directory using cpio.
+ install-headers-cpio: stmp-headers $(STMP_FIXPROTO) install-include-dir
+ cd include; find . -print | cpio -pdum $(libsubdir)/include
+
+ # Put assert.h where it won't override GNU libc's assert.h.
+ # It goes in a dir that is searched after GNU libc's headers;
+ # thus, the following conditionals are no longer needed.
+ # But it's not worth deleting them now.
+ ## Don't replace the assert.h already there if it is not from GCC.
+ ## This code would be simpler if it tested for -f ... && ! grep ...
+ ## but supposedly the ! operator is missing in sh on some systems.
+ install-assert-h: assert.h install-dir
+ if [ -f $(assertdir)/assert.h ]; \
+ then \
+ if grep "__eprintf" $(assertdir)/assert.h >/dev/null; \
+ then \
+ rm -f $(assertdir)/assert.h; \
+ $(INSTALL_DATA) $(srcdir)/assert.h $(assertdir)/assert.h; \
+ chmod a-x $(assertdir)/assert.h; \
+ else true; \
+ fi; \
+ else \
+ rm -f $(assertdir)/assert.h; \
+ $(INSTALL_DATA) $(srcdir)/assert.h $(assertdir)/assert.h; \
+ chmod a-x $(assertdir)/assert.h; \
+ fi
+
+ # Use this target to install the program `collect2' under the name `ld'.
+ install-collect2: collect2 install-dir
+ $(INSTALL_PROGRAM) collect2 $(libsubdir)/ld
+ # Install the driver program as $(libsubdir)/gcc for collect2.
+ $(INSTALL_PROGRAM) xgcc $(libsubdir)/gcc
+
+ # Cancel installation by deleting the installed files.
+ uninstall:
+ -rm -rf $(libsubdir)
+ -rm -rf $(bindir)/gcc
+ -rm -rf $(bindir)/protoize
+ -rm -rf $(bindir)/unprotoize
+ -rm -rf $(mandir)/gcc$(manext)
+ -rm -rf $(mandir)/g++$(manext)
+ -rm -rf $(mandir)/cccp$(manext)
+ -rm -rf $(mandir)/protoize$(manext)
+ -rm -rf $(mandir)/unprotoize$(manext)
+
+ # These exist for maintenance purposes.
+
+ # Update the tags table.
+ TAGS: force
+ cd $(srcdir); \
+ mkdir temp; \
+ mv -f c-parse.[ch] cp-parse.[ch] objc-parse.c cexp.c =*.[chy] temp; \
+ etags *.y *.h *.c; \
+ mv temp/* .; \
+ rmdir temp
+
+ # Create the distribution tar file.
+ #dist: gcc-$(version).tar.gz
+ dist: gcc.xtar.gz
+
+ gcc.xtar.gz: gcc.xtar
+ gzip < gcc.xtar > tmp-gcc.xtar.gz
+ mv tmp-gcc.xtar.gz gcc.xtar.gz
+
+ #gcc-$(version).tar.gz: gcc-$(version).tar
+ # gzip < gcc-$(version).tar > gcc-$(version).tar.gz
+
+ #gcc-$(version).tar:
+ gcc.xtar: distdir
+ # Make the distribution.
+ tar chf gcc.xtar gcc-$(version)
+
+ distdir: doc $(srcdir)/INSTALL c-parse.y objc-parse.y cp-parse.y \
+ c-parse.c cp-parse.c objc-parse.c cexp.c
+ @if grep -s "for version ${mainversion}" gcc.texi > /dev/null; \
+ then true; \
+ else echo "You must update the version number in \`gcc.texi'"; sleep 10;\
+ fi
+ # Update the version number in README
+ awk '$$1 " " $$2 " " $$3 == "This directory contains" \
+ { $$6 = version; print $$0 } \
+ $$1 " " $$2 " " $$3 != "This directory contains"' \
+ version=$(version) README > tmp.README
+ mv tmp.README README
+ -rm -rf gcc-$(version) tmp
+ # Put all the files in a temporary subdirectory
+ # which has the name that we want to have in the tar file.
+ mkdir tmp
+ mkdir tmp/config
+ mkdir tmp/objc
+ for file in *[0-9a-zA-Z+]; do \
+ ln $$file tmp > /dev/null 2>&1 || cp $$file tmp; \
+ done
+ cd config; \
+ for file in *[0-9a-zA-Z+]; do \
+ if test -d $$file && test "$$file" != RCS; then \
+ mkdir ../tmp/config/$$file; \
+ cd $$file; \
+ for subfile in *[0-9a-zA-Z+]; do \
+ ln $$subfile ../../tmp/config/$$file >/dev/null 2>&1 \
+ || cp $$subfile ../../tmp/config/$$file; \
+ done; \
+ cd ..; \
+ else \
+ ln $$file ../tmp/config >/dev/null 2>&1 \
+ || cp $$file ../tmp/config; \
+ fi; \
+ done
+ cd objc; \
+ for file in *[0-9a-zA-Z+]; do \
+ ln $$file ../tmp/objc >/dev/null 2>&1 || cp $$file ../tmp/objc; \
+ done
+ ln .gdbinit tmp
+ mv tmp gcc-$(version)
+ # Get rid of everything we don't want in the distribution.
+ cd gcc-$(version); make -f Makefile.in extraclean
+
+ # make diff oldversion=M.N
+ # creates a diff file between an older distribution and this one.
+ # The -P option assumes this is GNU diff.
+ diff:
+ diff -rc2P -x c-parse.y -x c-parse.c -x c-parse.h -x objc-parse.y \
+ -x cp-parse.c -x cp-parse.h -x cexp.c -x bi-parser.c \
+ -x objc-parse.c -x TAGS -x "gcc.??" -x "gcc.??s" -x gcc.aux \
+ -x "cpp.??s" -x "cpp.??" -x cpp.aux -x "cpp.info*" -x "gcc.info*" \
+ gcc-$(oldversion) gcc-$(version) > diffs
+
+ # do make -f ../gcc/Makefile maketest DIR=../gcc
+ # in the intended test directory to make it a suitable test directory.
+ # THIS IS OBSOLETE; use the -srcdir operand in configure instead.
+ maketest:
+ ln -s $(DIR)/*.[chy] .
+ ln -s $(DIR)/configure .
+ ln -s $(DIR)/*.def .
+ -rm -f =*
+ ln -s $(DIR)/.gdbinit .
+ ln -s $(DIR)/$(FIXINCLUDES) .
+ -ln -s $(DIR)/bison.simple .
+ ln -s $(DIR)/config .
+ ln -s $(DIR)/move-if-change .
+ # The then and else were swapped to avoid a problem on Ultrix.
+ if [ ! -f Makefile ] ; then ln -s $(DIR)/Makefile .; else false; fi
+ -rm tm.h aux-output.c config.h md
+ make clean
+ # You must then run config to set up for compilation.
+
+ bootstrap: force
+ # Only build the C compiler for stage1, because that is the only one that
+ # we can guarantee will build with the native compiler, and also it is the
+ # only thing useful for building stage2.
+ $(MAKE) CC="$(CC)" libdir=$(libdir) LANGUAGES=c
+ $(MAKE) stage1
+ # This used to define ALLOCA as empty, but that would lead to bad results
+ # for a subsequent `make install' since that would not have ALLOCA empty.
+ # To prevent `make install' from compiling alloca.o and then relinking cc1
+ # because alloca.o is newer, we permit these recursive makes to compile
+ # alloca.o. Then cc1 is newer, so it won't have to be relinked.
+ $(MAKE) CC="stage1/xgcc -Bstage1/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+ $(MAKE) stage2
+ $(MAKE) CC="stage2/xgcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+
+ bootstrap2: force
+ $(MAKE) CC="stage1/xgcc -Bstage1/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+ $(MAKE) stage2
+ $(MAKE) CC="stage2/xgcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+
+ bootstrap3: force
+ $(MAKE) CC="stage2/xgcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+
+ # Compare the object files in the current directory with those in the
+ # stage2 directory.
+
+ # ./ avoids bug in some versions of tail.
+ compare: force
+ for file in *.o; do \
+ tail +16c ./$$file > tmp-foo1; \
+ tail +16c stage2/$$file > tmp-foo2 2>/dev/null \
+ && (cmp tmp-foo1 tmp-foo2 || echo $$file differs); \
+ done
+ -rm -f tmp-foo*
+
+ # Similar, but compare with stage3 directory
+ compare3: force
+ for file in *.o; do \
+ tail +16c $$file > tmp-foo1; \
+ tail +16c stage3/$$file > tmp-foo2 2>/dev/null \
+ && (cmp tmp-foo1 tmp-foo2 || echo $$file differs); \
+ done
+ -rm -f tmp-foo*
+
+ # Copy the object files from a particular stage into a subdirectory.
+ stage1: force
+ -if [ -d stage1 ] ; then true ; else mkdir stage1 ; fi
+ -mv $(STAGESTUFF) stage1
+ -rm -f stage1/libgcc.a
+ -cp libgcc.a stage1
+ -if $(RANLIB_TEST) ; then $(RANLIB) stage1/libgcc.a; else true; fi
+
+ stage2: force
+ -if [ -d stage2 ] ; then true ; else mkdir stage2 ; fi
+ -mv $(STAGESTUFF) stage2
+ -rm -f stage2/libgcc.a
+ -cp libgcc.a stage2
+ -if $(RANLIB_TEST) ; then $(RANLIB) stage2/libgcc.a; else true; fi
+
+ stage3: force
+ -if [ -d stage3 ] ; then true ; else mkdir stage3 ; fi
+ -mv $(STAGESTUFF) stage3
+ -rm -f stage3/libgcc.a
+ -cp libgcc.a stage3
+ -if $(RANLIB_TEST) ; then $(RANLIB) stage3/libgcc.a; else true; fi
+
+ stage4: force
+ -if [ -d stage4 ] ; then true ; else mkdir stage4 ; fi
+ -mv $(STAGESTUFF) stage4
+ -rm -f stage4/libgcc.a
+ -cp libgcc.a stage4
+ -if $(RANLIB_TEST) ; then $(RANLIB) stage4/libgcc.a; else true; fi
+
+ # gnat bootstrapping targets - use the same stage directories
+ gnatboot: force
+ $(MAKE) gnat1 CC="$(CC)" CFLAGS="$(CFLAGS)" ADA_CC="$(ADA_CC)" ADAFLAGS="$(ADAFLAGS)"
+ $(MAKE) gnatbind CC="$(CC)" CFLAGS="$(CFLAGS)" ADA_CC="$(ADA_CC)" ADAFLAGS="$(ADAFLAGS)"
+ $(MAKE) gnatstage1
+ $(MAKE) CC="gcc -Bstage1/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage1/gnatbind gnat1
+ $(MAKE) CC="gcc -Bstage1/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage1/gnatbind gnatbind
+ $(MAKE) gnatstage2
+ $(MAKE) CC="gcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage2/gnatbind gnat1
+ $(MAKE) CC="gcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage2/gnatbind gnatbind
+
+ gnatboot2: force
+ $(MAKE) CC="gcc -Bstage1/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage1/gnatbind gnat1
+ $(MAKE) CC="gcc -Bstage1/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage1/gnatbind gnatbind
+ $(MAKE) gnatstage2
+ $(MAKE) CC="gcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage2/gnatbind gnat1
+ $(MAKE) CC="gcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage2/gnatbind gnatbind
+
+ gnatboot3: force
+ $(MAKE) CC="gcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage2/gnatbind gnat1
+ $(MAKE) CC="gcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage2/gnatbind gnatbind
+
+ gnatcompare: force
+ for file in $(GNAT1_ADA_OBJS); do \
+ tail +16c $$file > tmp-foo1; \
+ tail +16c stage2/$$file > tmp-foo2 2>/dev/null \
+ && (cmp tmp-foo1 tmp-foo2 || echo $$file differs); \
+ done
+ -rm -f tmp-foo*
+
+ gnatstage1: force
+ -if [ -d stage1 ] ; then true ; else mkdir stage1 ; fi
+ -mv -f *.ali stage1
+ -mv -f $(GNAT1_ADA_OBJS) $(GNATBIND_OBJS) $(GNATF_OBJS) $(GKRUNCH_OBJS) gnat1 gnatbind stage1
+
+ gnatstage2: force
+ -if [ -d stage2 ] ; then true ; else mkdir stage2 ; fi
+ -mv -f *.ali stage2
+ -mv -f $(GNAT1_ADA_OBJS) $(GNATBIND_OBJS) $(GNATF_OBJS) $(GKRUNCH_OBJS) gnat1 gnatbind stage2
+
+ gnatclean: force
+ rm -f $(GNAT1_OBJS) $(GNATF_OBJS) $(GNATBIND_OBJS) $(GKRUNCH_OBJS) \
+ $(GNAT_RTL_OBJS) *.ali gnat1 gnatbind
+
+ # Copy just the executable files from a particular stage into a subdirectory,
+ # and delete the object files. Use this if you're just verifying a version
+ # that is pretty sure to work, and you are short of disk space.
+ risky-stage1: force
+ -if [ -d stage1 ] ; then true ; else mkdir stage1 ; fi
+ -mv $(GCC_PARTS) stage1
+ -rm -f stage1/libgcc.a
+ -cp libgcc.a stage1 && $(RANLIB) stage1/libgcc.a
+ -make clean
+
+ risky-stage2: force
+ -if [ -d stage2 ] ; then true ; else mkdir stage2 ; fi
+ -mv $(GCC_PARTS) stage2
+ -rm -f stage2/libgcc.a
+ -cp libgcc.a stage2 && $(RANLIB) stage2/libgcc.a
+ -make clean
+
+ risky-stage3: force
+ -if [ -d stage3 ] ; then true ; else mkdir stage3 ; fi
+ -mv $(GCC_PARTS) stage3
+ -rm -f stage3/libgcc.a
+ -cp libgcc.a stage3 && $(RANLIB) stage3/libgcc.a
+ -make clean
+
+ risky-stage4: force
+ -if [ -d stage4 ] ; then true ; else mkdir stage4 ; fi
+ -mv $(GCC_PARTS) stage4
+ -rm -f stage4/libgcc.a
+ -cp libgcc.a stage4 && $(RANLIB) stage4/libgcc.a
+ -make clean
+
+ #In GNU Make, ignore whether `stage*' exists.
+ .PHONY: stage1 stage2 stage3 stage4 clean realclean TAGS bootstrap
+ .PHONY: risky-stage1 risky-stage2 risky-stage3 risky-stage4
+
+ force:
diff -rc --new-file /src/baseline/gnat-1.80/amiga/corrections/atree.adb.changes gnat-1.80/amiga/corrections/atree.adb.changes
*** /src/baseline/gnat-1.80/amiga/corrections/atree.adb.changes Thu Jan 1 00:00:00 1970
--- gnat-1.80/amiga/corrections/atree.adb.changes Thu Jun 23 13:13:08 1994
***************
*** 0 ****
--- 1,9 ----
+ function Flag65 (N : Node_Id) return Boolean is
+ begin
+ -- pragma Assert (Nkind (N) in N_Entity);
+ -- return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag65;
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Byte_Ptr
+ (Node_Kind_Ptr'
+ (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag65;
+ end Flag65;
diff -rc --new-file /src/baseline/gnat-1.80/amiga/corrections/m68k.md gnat-1.80/amiga/corrections/m68k.md
*** /src/baseline/gnat-1.80/amiga/corrections/m68k.md Thu Jan 1 00:00:00 1970
--- gnat-1.80/amiga/corrections/m68k.md Thu Jun 23 13:13:10 1994
***************
*** 0 ****
--- 1,5690 ----
+ ;;- Machine description for GNU compiler
+ ;;- Motorola 68000 Version
+ ;; Copyright (C) 1987, 1988, 1993 Free Software Foundation, Inc.
+
+ ;; This file is part of GNU CC.
+
+ ;; GNU CC is free software; you can redistribute it and/or modify
+ ;; it under the terms of the GNU General Public License as published by
+ ;; the Free Software Foundation; either version 2, or (at your option)
+ ;; any later version.
+
+ ;; GNU CC is distributed in the hope that it will be useful,
+ ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ ;; GNU General Public License for more details.
+
+ ;; You should have received a copy of the GNU General Public License
+ ;; along with GNU CC; see the file COPYING. If not, write to
+ ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+ ;;- instruction definitions
+
+ ;;- @@The original PO technology requires these to be ordered by speed,
+ ;;- @@ so that assigner will pick the fastest.
+
+ ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
+
+ ;;- When naming insn's (operand 0 of define_insn) be careful about using
+ ;;- names from other targets machine descriptions.
+
+ ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
+ ;;- updates for most instructions.
+
+ ;;- Operand classes for the register allocator:
+ ;;- 'a' one of the address registers can be used.
+ ;;- 'd' one of the data registers can be used.
+ ;;- 'f' one of the m68881 registers can be used
+ ;;- 'r' either a data or an address register can be used.
+ ;;- 'x' if one of the Sun FPA registers
+ ;;- 'y' if one of the Low Sun FPA registers (fpa0-fpa15).
+
+ ;;- Immediate Floating point operator constraints
+ ;;- 'G' a floating point constant that is *NOT* one of the standard
+ ;; 68881 constant values (to force calling output_move_const_double
+ ;; to get it from rom if it is a 68881 constant).
+ ;;- 'H' one of the standard FPA constant values
+ ;;
+ ;; See the functions standard_XXX_constant_p in output-m68k.c for more
+ ;; info.
+
+ ;;- Immediate integer operand constraints:
+ ;;- 'I' 1 .. 8
+ ;;- 'J' -32768 .. 32767
+ ;;- 'K' all integers EXCEPT -128 .. 127
+ ;;- 'L' -8 .. -1
+
+ ;;- Assembler specs:
+ ;;- "%." size separator ("." or "") move%.l d0,d1
+ ;;- "%#" immediate separator ("#" or "") move%.l %#0,d0
+ ;;- "%-" push operand "sp@-" move%.l d0,%-
+ ;;- "%+" pop operand "sp@+" move%.l d0,%+
+ ;;- "%@" top of stack "sp@" move%.l d0,%@
+ ;;- "%!" fpcr register
+ ;;- "%$" single-precision fp specifier ("s" or "") f%$add.x fp0,fp1
+ ;;- "%&" double-precision fp specifier ("d" or "") f%&add.x fp0,fp1
+
+ ;;- Information about 68040 port.
+
+ ;;- The 68040 executes all 68030 and 68881/2 instructions, but some must
+ ;;- be emulated in software by the OS. It is faster to avoid these
+ ;;- instructions and issue a library call rather than trapping into
+ ;;- the kernel. The affected instructions are fintrz and fscale. The
+ ;;- TARGET_68040 flag turns the use of the opcodes off.
+
+ ;;- The '040 also implements a set of new floating-point instructions
+ ;;- which specify the rounding precision in the opcode. This finally
+ ;;- permit the 68k series to be truly IEEE compliant, and solves all
+ ;;- issues of excess precision accumulating in the extended registers.
+ ;;- By default, GCC does not use these instructions, since such code will
+ ;;- not run on an '030. To use these instructions, use the -m68040-only
+ ;;- switch. By changing TARGET_DEFAULT to include TARGET_68040_ONLY,
+ ;;- you can make these instructions the default.
+
+ ;;- These new instructions aren't directly in the md. They are brought
+ ;;- into play by defining "%$" and "%&" to expand to "s" and "d" rather
+ ;;- than "".
+
+
+ ;;- FPA port explanation:
+
+ ;;- Usage of the Sun FPA and the 68881 together
+
+ ;;- The current port of gcc to the sun fpa disallows use of the m68881
+ ;;- instructions completely if code is targeted for the fpa. This is
+ ;;- for the following reasons:
+
+ ;;- 1) Expressing the preference hierarchy (ie. use the fpa if you
+ ;;- can, the 68881 otherwise, and data registers only if you are
+ ;;- forced to it) is a bitch with the current constraint scheme,
+ ;;- especially since it would have to work for any combination of
+ ;;- -mfpa, -m68881.
+
+ ;;- 2) There are no instructions to move between the two types of
+ ;;- registers; the stack must be used as an intermediary.
+
+ ;;- It could indeed be done; I think the best way would be to have
+ ;;- separate patterns for TARGET_FPA (which implies a 68881),
+ ;;- TARGET_68881, and no floating point co-processor. Use
+ ;;- define_expands for all of the named instruction patterns, and
+ ;;- include code in the FPA instruction to deal with the 68881 with
+ ;;- preferences specifically set to favor the fpa. Some of this has
+ ;;- already been done:
+ ;;-
+ ;;- 1) Separation of most of the patterns out into a TARGET_FPA
+ ;;- case and a TARGET_68881 case (the exceptions are the patterns
+ ;;- which would need one define_expand and three define_insn's under
+ ;;- it (with a lot of duplicate code between them) to replace the
+ ;;- current single define_insn. These are mov{[ds]f,[ds]i} and the
+ ;;- first two patterns in the md.
+ ;;-
+ ;;- Some would still have to be done:
+ ;;-
+ ;;- 1) Add code to the fpa patterns which correspond to 68881
+ ;;- patterns to deal with the 68881 case (including preferences!).
+ ;;- What you might actually do here is combine the fpa and 68881 code
+ ;;- back together into one pattern for those instructions where it's
+ ;;- absolutely necessary and save yourself some duplicate code. I'm
+ ;;- not completely sure as to whether you could get away with doing
+ ;;- this only for the mov* insns, or if you'd have to do it for all
+ ;;- named insns.
+ ;;- 2) Add code to the mov{[ds]f,[ds]i} instructions to handle
+ ;;- moving between fpa regs and 68881 regs.
+
+ ;;- Since the fpa is more powerful than the 68881 and also has more
+ ;;- registers, and since I think the resultant md would be medium ugly
+ ;;- (lot's of duplicate code, ugly constraint strings), I elected not
+ ;;- to do this change.
+
+ ;;- Another reason why someone *might* want to do the change is to
+ ;;- control which register classes are accessed in a slightly cleaner
+ ;;- way than I have. See the blurb on CONDITIONAL_REGISTER_USAGE in
+ ;;- the internals manual.
+
+ ;;- Yet another reason why someone might want to do this change is to
+ ;;- allow use of some of the 68881 insns which have no equivalent on
+ ;;- the fpa. The sqrt instruction comes fairly quickly to mind.
+
+ ;;- If this is ever done, don't forget to change sun3.h so that
+ ;;- it *will* define __HAVE_68881__ when the FPA is in use.
+
+ ;;- Condition code hack
+
+ ;;- When a floating point compare is done in the fpa, the resulting
+ ;;- condition codes are left in the fpastatus register. The values in
+ ;;- this register must be moved into the 68000 cc register before any
+ ;;- jump is executed. Once this has been done, regular jump
+ ;;- instructions are fine (ie. floating point jumps are not necessary.
+ ;;- They are only done if the cc is in the 68881).
+
+ ;;- The instructions that move the fpastatus register to the 68000
+ ;;- register clobber a data register (the move cannot be done direct).
+ ;;- These instructions might be bundled either with the compare
+ ;;- instruction, or the branch instruction. If we were using both the
+ ;;- fpa and the 68881 together, we would wish to only mark the
+ ;;- register clobbered if we were doing the compare in the fpa, but I
+ ;;- think that that decision (whether to clobber the register or not)
+ ;;- must be done before register allocation (makes sense) and hence we
+ ;;- can't know if the floating point compare will be done in the fpa
+ ;;- or the fp. So whenever we are asked for code that uses the fpa,
+ ;;- we will mark a data register as clobbered. This is reasonable, as
+ ;;- almost all floating point compare operations done with fpa code
+ ;;- enabled will be done in the fpa. It's even more reasonable since
+ ;;- we decided to make the 68881 and the fpa mutually exclusive.
+
+ ;;- We place to code to move the fpastatus register inside of a
+ ;;- define_expand so that we can do it conditionally based on whether
+ ;;- we are targeting an fpa or not.
+
+ ;;- This still leaves us with the question of where we wish to put the
+ ;;- code to move the fpastatus reg. If we put it in the compare
+ ;;- instruction, we can restrict the clobbering of the register to
+ ;;- floating point compares, but we can't take advantage of floating
+ ;;- point subtracts & etc. that alter the fpastatus register. If we
+ ;;- put it in the branch instruction, all branches compiled with fpa
+ ;;- code enabled will clobber a data register, but we will be able to
+ ;;- take advantage of fpa subtracts. This balance favors putting the
+ ;;- code in with the compare instruction.
+
+ ;;- Note that if some enterprising hacker should decide to switch
+ ;;- this, he'll need to modify the code in NOTICE_UPDATE_CC.
+
+ ;;- Usage of the top 16 fpa registers
+
+ ;;- The only locations which we may transfer fpa registers 16-31 from
+ ;;- or to are the fpa registers 0-15. (68000 registers and memory
+ ;;- locations are impossible). This causes problems in gcc, which
+ ;;- assumes that mov?? instructions require no additional registers
+ ;;- (see section 11.7) and since floating point moves *must* be
+ ;;- supported into general registers (see section 12.3 under
+ ;;- HARD_REGNO_OK_FOR_MODE_P) from anywhere.
+
+ ;;- My solution was to reserve fpa0 for moves into or out of these top
+ ;;- 16 registers and to disparage the choice to reload into or out of
+ ;;- these registers as much as I could. That alternative is always
+ ;;- last in the list, so it will not be used unless all else fails. I
+ ;;- will note that according to my current information, sun's compiler
+ ;;- doesn't use these top 16 registers at all.
+
+ ;;- There is another possible way to do it. I *believe* that if you
+ ;;- make absolutely sure that the code will not be executed in the
+ ;;- reload pass, you can support the mov?? names with define_expands
+ ;;- which require new registers. This may be possible by the
+ ;;- appropriate juggling of constraints. I may come back to this later.
+
+ ;;- Usage of constant RAM
+
+ ;;- This has been handled correctly (I believe) but the way I've done
+ ;;- it could use a little explanation. The constant RAM can only be
+ ;;- accessed when the instruction is in "command register" mode.
+ ;;- "command register" mode means that no accessing of memory or the
+ ;;- 68000 registers is being done. This can be expressed easily in
+ ;;- constraints, so generally the mode of the instruction is
+ ;;- determined by a branch off of which_alternative. In outputting
+ ;;- instructions, a 'w' means to output an access to the constant ram
+ ;;- (if the arg is CONST_DOUBLE and is one of the available
+ ;;- constants), and 'x' means to output a register pair (if the arg is
+ ;;- a 68000 register) and a 'y' is the combination of the above two
+ ;;- processes. You use a 'y' in two operand DF instructions where you
+ ;;- *know* the other operand is an fpa register, you use an 'x' in DF
+ ;;- instructions where the arg might be a 68000 register and the
+ ;;- instruction is *not* in "command register" mode, and you use a 'w'
+ ;;- in two situations: 1) The instruction *is* in command register
+ ;;- mode (and hence won't be accessing 68000 registers), or 2) The
+ ;;- instruction is a two operand SF instruction where you know the
+ ;;- other operand is an fpa register.
+
+ ;;- Optimization issues
+
+ ;;- I actually think that I've included all of the fpa instructions
+ ;;- that should be included. Note that if someone is interested in
+ ;;- doing serious floating point work on the sun fpa, I would advise
+ ;;- the use of the "asm" instruction in gcc to allow you to use the
+ ;;- sin, cos, and exponential functions on the fpa board.
+
+ ;;- END FPA Explanation Section.
+
+
+ ;;- Some of these insn's are composites of several m68000 op codes.
+ ;;- The assembler (or final @@??) insures that the appropriate one is
+ ;;- selected.
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "push_operand" "=m")
+ (match_operand:DF 1 "general_operand" "ro<>fyE"))]
+ ""
+ "*
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fmove%.d %f1,%0\";
+ if (FPA_REG_P (operands[1]))
+ return \"fpmove%.d %1, %x0\";
+ return output_move_double (operands);
+ }")
+
+ (define_insn ""
+ [(set (match_operand:DI 0 "push_operand" "=m")
+ (match_operand:DI 1 "general_operand" "ro<>Fy"))]
+ ""
+ "*
+ {
+ return output_move_double (operands);
+ }")
+
+ ;; We don't want to allow a constant operand for test insns because
+ ;; (set (cc0) (const_int foo)) has no mode information. Such insns will
+ ;; be folded while optimizing anyway.
+ (define_insn "tstsi"
+ [(set (cc0)
+ (match_operand:SI 0 "nonimmediate_operand" "rm"))]
+ ""
+ "*
+ {
+ #ifdef ISI_OV
+ /* ISI's assembler fails to handle tstl a0. */
+ if (! ADDRESS_REG_P (operands[0]))
+ #else
+ if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
+ #endif
+ return \"tst%.l %0\";
+ /* If you think that the 68020 does not support tstl a0,
+ reread page B-167 of the 68020 manual more carefully. */
+ /* On an address reg, cmpw may replace cmpl. */
+ #ifdef SGS_CMP_ORDER
+ return \"cmp%.w %0,%#0\";
+ #else
+ return \"cmp%.w %#0,%0\";
+ #endif
+ }")
+
+ ;; This can't use an address register, because comparisons
+ ;; with address registers as second operand always test the whole word.
+ (define_insn "tsthi"
+ [(set (cc0)
+ (match_operand:HI 0 "nonimmediate_operand" "dm"))]
+ ""
+ "tst%.w %0")
+
+ (define_insn "tstqi"
+ [(set (cc0)
+ (match_operand:QI 0 "nonimmediate_operand" "dm"))]
+ ""
+ "tst%.b %0")
+
+ (define_expand "tstsf"
+ [(set (cc0)
+ (match_operand:SF 0 "general_operand" ""))]
+ "TARGET_68881 || TARGET_FPA"
+ "
+ {
+ if (TARGET_FPA)
+ {
+ emit_insn (gen_tstsf_fpa (operands[0]));
+ DONE;
+ }
+ }")
+
+ (define_insn "tstsf_fpa"
+ [(set (cc0)
+ (match_operand:SF 0 "general_operand" "xmdF"))
+ (clobber (match_scratch:SI 1 "=d"))]
+ "TARGET_FPA"
+ "fptst%.s %x0\;fpmove fpastatus,%1\;movw %1,cc")
+
+ (define_insn ""
+ [(set (cc0)
+ (match_operand:SF 0 "general_operand" "fdm"))]
+ "TARGET_68881"
+ "*
+ {
+ cc_status.flags = CC_IN_68881;
+ if (FP_REG_P (operands[0]))
+ return \"ftst%.x %0\";
+ return \"ftst%.s %0\";
+ }")
+
+ (define_expand "tstdf"
+ [(set (cc0)
+ (match_operand:DF 0 "general_operand" ""))]
+ "TARGET_68881 || TARGET_FPA"
+ "
+ {
+ if (TARGET_FPA)
+ {
+ emit_insn (gen_tstsf_fpa (operands[0]));
+ DONE;
+ }
+ }")
+
+ (define_insn "tstdf_fpa"
+ [(set (cc0)
+ (match_operand:DF 0 "general_operand" "xrmF"))
+ (clobber (match_scratch:SI 1 "=d"))]
+ "TARGET_FPA"
+ "fptst%.d %x0\;fpmove fpastatus,%1\;movw %1,cc")
+
+ (define_insn ""
+ [(set (cc0)
+ (match_operand:DF 0 "general_operand" "fm"))]
+ "TARGET_68881"
+ "*
+ {
+ cc_status.flags = CC_IN_68881;
+ if (FP_REG_P (operands[0]))
+ return \"ftst%.x %0\";
+ return \"ftst%.d %0\";
+ }")
+
+ ;; compare instructions.
+
+ ;; A composite of the cmp, cmpa, & cmpi m68000 op codes.
+ (define_insn "cmpsi"
+ [(set (cc0)
+ (compare (match_operand:SI 0 "nonimmediate_operand" "rKs,mr,>")
+ (match_operand:SI 1 "general_operand" "mr,Ksr,>")))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
+ #ifdef SGS_CMP_ORDER
+ return \"cmpm%.l %0,%1\";
+ #else
+ return \"cmpm%.l %1,%0\";
+ #endif
+ if (REG_P (operands[1])
+ || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM))
+ { cc_status.flags |= CC_REVERSED;
+ #ifdef SGS_CMP_ORDER
+ return \"cmp%.l %d1,%d0\";
+ #else
+ return \"cmp%.l %d0,%d1\";
+ #endif
+ }
+ #ifdef SGS_CMP_ORDER
+ return \"cmp%.l %d0,%d1\";
+ #else
+ return \"cmp%.l %d1,%d0\";
+ #endif
+ }")
+
+ (define_insn "cmphi"
+ [(set (cc0)
+ (compare (match_operand:HI 0 "nonimmediate_operand" "rnm,d,n,m,>")
+ (match_operand:HI 1 "general_operand" "d,rnm,m,n,>")))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
+ #ifdef SGS_CMP_ORDER
+ return \"cmpm%.w %0,%1\";
+ #else
+ return \"cmpm%.w %1,%0\";
+ #endif
+ if ((REG_P (operands[1]) && !ADDRESS_REG_P (operands[1]))
+ || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM))
+ { cc_status.flags |= CC_REVERSED;
+ #ifdef SGS_CMP_ORDER
+ return \"cmp%.w %d1,%d0\";
+ #else
+ return \"cmp%.w %d0,%d1\";
+ #endif
+ }
+ #ifdef SGS_CMP_ORDER
+ return \"cmp%.w %d0,%d1\";
+ #else
+ return \"cmp%.w %d1,%d0\";
+ #endif
+ }")
+
+ (define_insn "cmpqi"
+ [(set (cc0)
+ (compare (match_operand:QI 0 "nonimmediate_operand" "dn,md,>")
+ (match_operand:QI 1 "general_operand" "dm,nd,>")))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
+ #ifdef SGS_CMP_ORDER
+ return \"cmpm%.b %0,%1\";
+ #else
+ return \"cmpm%.b %1,%0\";
+ #endif
+ if (REG_P (operands[1])
+ || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM))
+ { cc_status.flags |= CC_REVERSED;
+ #ifdef SGS_CMP_ORDER
+ return \"cmp%.b %d1,%d0\";
+ #else
+ return \"cmp%.b %d0,%d1\";
+ #endif
+ }
+ #ifdef SGS_CMP_ORDER
+ return \"cmp%.b %d0,%d1\";
+ #else
+ return \"cmp%.b %d1,%d0\";
+ #endif
+ }")
+
+ (define_expand "cmpdf"
+ [(set (cc0)
+ (compare (match_operand:DF 0 "general_operand" "")
+ (match_operand:DF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "
+ {
+ if (TARGET_FPA)
+ {
+ emit_insn (gen_cmpdf_fpa (operands[0], operands[1]));
+ DONE;
+ }
+ }")
+
+ (define_insn "cmpdf_fpa"
+ [(set (cc0)
+ (compare (match_operand:DF 0 "general_operand" "x,y")
+ (match_operand:DF 1 "general_operand" "xH,rmF")))
+ (clobber (match_scratch:SI 2 "=d,d"))]
+ "TARGET_FPA"
+ "fpcmp%.d %y1,%0\;fpmove fpastatus,%2\;movw %2,cc")
+
+ (define_insn ""
+ [(set (cc0)
+ (compare (match_operand:DF 0 "general_operand" "f,mG")
+ (match_operand:DF 1 "general_operand" "fmG,f")))]
+ "TARGET_68881"
+ "*
+ {
+ cc_status.flags = CC_IN_68881;
+ #ifdef SGS_CMP_ORDER
+ if (REG_P (operands[0]))
+ {
+ if (REG_P (operands[1]))
+ return \"fcmp%.x %0,%1\";
+ else
+ return \"fcmp%.d %0,%f1\";
+ }
+ cc_status.flags |= CC_REVERSED;
+ return \"fcmp%.d %1,%f0\";
+ #else
+ if (REG_P (operands[0]))
+ {
+ if (REG_P (operands[1]))
+ return \"fcmp%.x %1,%0\";
+ else
+ return \"fcmp%.d %f1,%0\";
+ }
+ cc_status.flags |= CC_REVERSED;
+ return \"fcmp%.d %f0,%1\";
+ #endif
+ }")
+
+ (define_expand "cmpsf"
+ [(set (cc0)
+ (compare (match_operand:SF 0 "general_operand" "")
+ (match_operand:SF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "
+ {
+ if (TARGET_FPA)
+ {
+ emit_insn (gen_cmpsf_fpa (operands[0], operands[1]));
+ DONE;
+ }
+ }")
+
+ (define_insn "cmpsf_fpa"
+ [(set (cc0)
+ (compare (match_operand:SF 0 "general_operand" "x,y")
+ (match_operand:SF 1 "general_operand" "xH,rmF")))
+ (clobber (match_scratch:SI 2 "=d,d"))]
+ "TARGET_FPA"
+ "fpcmp%.s %w1,%x0\;fpmove fpastatus,%2\;movw %2,cc")
+
+ (define_insn ""
+ [(set (cc0)
+ (compare (match_operand:SF 0 "general_operand" "f,mdG")
+ (match_operand:SF 1 "general_operand" "fmdG,f")))]
+ "TARGET_68881"
+ "*
+ {
+ cc_status.flags = CC_IN_68881;
+ #ifdef SGS_CMP_ORDER
+ if (FP_REG_P (operands[0]))
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fcmp%.x %0,%1\";
+ else
+ return \"fcmp%.s %0,%f1\";
+ }
+ cc_status.flags |= CC_REVERSED;
+ return \"fcmp%.s %1,%f0\";
+ #else
+ if (FP_REG_P (operands[0]))
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fcmp%.x %1,%0\";
+ else
+ return \"fcmp%.s %f1,%0\";
+ }
+ cc_status.flags |= CC_REVERSED;
+ return \"fcmp%.s %f0,%1\";
+ #endif
+ }")
+
+ ;; Recognizers for btst instructions.
+
+ (define_insn ""
+ [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "do")
+ (const_int 1)
+ (minus:SI (const_int 7)
+ (match_operand:SI 1 "general_operand" "di"))))]
+ ""
+ "* { return output_btst (operands, operands[1], operands[0], insn, 7); }")
+
+ (define_insn ""
+ [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "d")
+ (const_int 1)
+ (minus:SI (const_int 31)
+ (match_operand:SI 1 "general_operand" "di"))))]
+ ""
+ "* { return output_btst (operands, operands[1], operands[0], insn, 31); }")
+
+ ;; The following two patterns are like the previous two
+ ;; except that they use the fact that bit-number operands
+ ;; are automatically masked to 3 or 5 bits.
+
+ (define_insn ""
+ [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "do")
+ (const_int 1)
+ (minus:SI (const_int 7)
+ (and:SI
+ (match_operand:SI 1 "general_operand" "d")
+ (const_int 7)))))]
+ ""
+ "* { return output_btst (operands, operands[1], operands[0], insn, 7); }")
+
+ (define_insn ""
+ [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "d")
+ (const_int 1)
+ (minus:SI (const_int 31)
+ (and:SI
+ (match_operand:SI 1 "general_operand" "d")
+ (const_int 31)))))]
+ ""
+ "* { return output_btst (operands, operands[1], operands[0], insn, 31); }")
+
+ ;; Nonoffsettable mem refs are ok in this one pattern
+ ;; since we don't try to adjust them.
+ (define_insn ""
+ [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "md")
+ (const_int 1)
+ (match_operand:SI 1 "general_operand" "i")))]
+ "GET_CODE (operands[1]) == CONST_INT
+ && (unsigned) INTVAL (operands[1]) < 8"
+ "*
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, 7 - INTVAL (operands[1]));
+ return output_btst (operands, operands[1], operands[0], insn, 7);
+ }")
+
+ (define_insn ""
+ [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "do")
+ (const_int 1)
+ (match_operand:SI 1 "general_operand" "i")))]
+ "GET_CODE (operands[1]) == CONST_INT"
+ "*
+ {
+ if (GET_CODE (operands[0]) == MEM)
+ {
+ operands[0] = adj_offsettable_operand (operands[0],
+ INTVAL (operands[1]) / 8);
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ 7 - INTVAL (operands[1]) % 8);
+ return output_btst (operands, operands[1], operands[0], insn, 7);
+ }
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ 31 - INTVAL (operands[1]));
+ return output_btst (operands, operands[1], operands[0], insn, 31);
+ }")
+
+
+ ;; move instructions
+
+ ;; A special case in which it is not desirable
+ ;; to reload the constant into a data register.
+ (define_insn ""
+ [(set (match_operand:SI 0 "push_operand" "=m")
+ (match_operand:SI 1 "general_operand" "J"))]
+ "GET_CODE (operands[1]) == CONST_INT
+ && INTVAL (operands[1]) >= -0x8000
+ && INTVAL (operands[1]) < 0x8000"
+ "*
+ {
+ if (operands[1] == const0_rtx)
+ return \"clr%.l %0\";
+ return \"pea %a1\";
+ }")
+
+ ;This is never used.
+ ;(define_insn "swapsi"
+ ; [(set (match_operand:SI 0 "general_operand" "+r")
+ ; (match_operand:SI 1 "general_operand" "+r"))
+ ; (set (match_dup 1) (match_dup 0))]
+ ; ""
+ ; "exg %1,%0")
+
+ ;; Special case of fullword move when source is zero.
+ ;; The reason this is special is to avoid loading a zero
+ ;; into a data reg with moveq in order to store it elsewhere.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=g")
+ (const_int 0))]
+ ;; clr insns on 68000 read before writing.
+ ;; This isn't so on the 68010, but we have no alternative for it.
+ "(TARGET_68020
+ || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))"
+ "*
+ {
+ if (ADDRESS_REG_P (operands[0]))
+ return \"sub%.l %0,%0\";
+ /* moveq is faster on the 68000. */
+ if (DATA_REG_P (operands[0]) && !TARGET_68020)
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"moveq%.l %#0,%0\";
+ #else
+ return \"moveq %#0,%0\";
+ #endif
+ return \"clr%.l %0\";
+ }")
+
+ ;; General case of fullword move.
+ ;;
+ ;; This is the main "hook" for PIC code. When generating
+ ;; PIC, movsi is responsible for determining when the source address
+ ;; needs PIC relocation and appropriately calling legitimize_pic_address
+ ;; to perform the actual relocation.
+ ;;
+ ;; In both the PIC and non-PIC cases the patterns generated will
+ ;; matched by the next define_insn.
+ (define_expand "movsi"
+ [(set (match_operand:SI 0 "general_operand" "")
+ (match_operand:SI 1 "general_operand" ""))]
+ ""
+ "
+ {
+ if (flag_pic && symbolic_operand (operands[1], SImode))
+ {
+ #ifdef LEGITIMATE_BASEREL_OPERAND_P
+ if (flag_pic < 3 || !LEGITIMATE_BASEREL_OPERAND_P (operands[1]))
+ #endif
+ {
+ /* The source is an address which requires PIC relocation.
+ Call legitimize_pic_address with the source, mode, and a relocation
+ register (a new pseudo, or the final destination if reload_in_progress
+ is set). Then fall through normally */
+ extern rtx legitimize_pic_address();
+ rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode);
+ operands[1] = legitimize_pic_address (operands[1], SImode, temp);
+ }
+ }
+ }")
+
+ ;; General case of fullword move. The register constraints
+ ;; force integer constants in range for a moveq to be reloaded
+ ;; if they are headed for memory.
+ (define_insn ""
+ ;; Notes: make sure no alternative allows g vs g.
+ ;; We don't allow f-regs since fixed point cannot go in them.
+ ;; We do allow y and x regs since fixed point is allowed in them.
+ [(set (match_operand:SI 0 "general_operand" "=g,da,y,!*x*r*m")
+ (match_operand:SI 1 "general_operand" "daymKs,i,g,*x*r*m"))]
+ ""
+ "*
+ {
+ if (which_alternative == 3)
+ return \"fpmove%.l %x1,fpa0\;fpmove%.l fpa0,%x0\";
+ if (FPA_REG_P (operands[1]) || FPA_REG_P (operands[0]))
+ return \"fpmove%.l %x1,%x0\";
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ if (operands[1] == const0_rtx
+ && (DATA_REG_P (operands[0])
+ || GET_CODE (operands[0]) == MEM)
+ /* clr insns on 68000 read before writing.
+ This isn't so on the 68010, but we have no alternative for it. */
+ && (TARGET_68020
+ || !(GET_CODE (operands[0]) == MEM
+ && MEM_VOLATILE_P (operands[0]))))
+ return \"clr%.l %0\";
+ else if (DATA_REG_P (operands[0])
+ && INTVAL (operands[1]) < 128
+ && INTVAL (operands[1]) >= -128)
+ {
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"moveq%.l %1,%0\";
+ #else
+ return \"moveq %1,%0\";
+ #endif
+ }
+ #ifndef NO_ADDSUB_Q
+ else if (DATA_REG_P (operands[0])
+ /* Do this with a moveq #N-8, dreg; addq #8,dreg */
+ && INTVAL (operands[1]) < 136
+ && INTVAL (operands[1]) >= 128)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) - 8);
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"moveq%.l %1,%0\;addq%.w %#8,%0\";
+ #else
+ return \"moveq %1,%0\;addq%.w %#8,%0\";
+ #endif
+ }
+ else if (DATA_REG_P (operands[0])
+ /* Do this with a moveq #N+8, dreg; subq #8,dreg */
+ && INTVAL (operands[1]) < -128
+ && INTVAL (operands[1]) >= -136)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) + 8);
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"moveq%.l %1,%0;subq%.w %#8,%0\";
+ #else
+ return \"moveq %1,%0;subq%.w %#8,%0\";
+ #endif
+ }
+ #endif
+ else if (DATA_REG_P (operands[0])
+ /* If N is in the right range and is even, then use
+ moveq #N/2, dreg; addl dreg,dreg */
+ && INTVAL (operands[1]) > 127
+ && INTVAL (operands[1]) <= 254
+ && INTVAL (operands[1]) % 2 == 0)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) / 2);
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"moveq%.l %1,%0\;add%.w %0,%0\";
+ #else
+ return \"moveq %1,%0\;add%.w %0,%0\";
+ #endif
+ }
+ else if (ADDRESS_REG_P (operands[0])
+ && INTVAL (operands[1]) < 0x8000
+ && INTVAL (operands[1]) >= -0x8000)
+ return \"move%.w %1,%0\";
+ else if (push_operand (operands[0], SImode)
+ && INTVAL (operands[1]) < 0x8000
+ && INTVAL (operands[1]) >= -0x8000)
+ return \"pea %a1\";
+ }
+ else if ((GET_CODE (operands[1]) == SYMBOL_REF
+ || GET_CODE (operands[1]) == CONST)
+ && push_operand (operands[0], SImode))
+ return \"pea %a1\";
+ else if ((GET_CODE (operands[1]) == SYMBOL_REF
+ || GET_CODE (operands[1]) == CONST)
+ && ADDRESS_REG_P (operands[0]))
+ return \"lea %a1,%0\";
+ return \"move%.l %1,%0\";
+ }")
+
+ (define_insn "movhi"
+ [(set (match_operand:HI 0 "general_operand" "=g")
+ (match_operand:HI 1 "general_operand" "g"))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ if (operands[1] == const0_rtx
+ && (DATA_REG_P (operands[0])
+ || GET_CODE (operands[0]) == MEM)
+ /* clr insns on 68000 read before writing.
+ This isn't so on the 68010, but we have no alternative for it. */
+ && (TARGET_68020
+ || !(GET_CODE (operands[0]) == MEM
+ && MEM_VOLATILE_P (operands[0]))))
+ return \"clr%.w %0\";
+ else if (DATA_REG_P (operands[0])
+ && INTVAL (operands[1]) < 128
+ && INTVAL (operands[1]) >= -128)
+ {
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"moveq%.l %1,%0\";
+ #else
+ return \"moveq %1,%0\";
+ #endif
+ }
+ else if (INTVAL (operands[1]) < 0x8000
+ && INTVAL (operands[1]) >= -0x8000)
+ return \"move%.w %1,%0\";
+ }
+ else if (CONSTANT_P (operands[1]))
+ return \"move%.l %1,%0\";
+ #ifndef SGS_NO_LI
+ /* Recognize the insn before a tablejump, one that refers
+ to a table of offsets. Such an insn will need to refer
+ to a label on the insn. So output one. Use the label-number
+ of the table of offsets to generate this label. */
+ if (GET_CODE (operands[1]) == MEM
+ && GET_CODE (XEXP (operands[1], 0)) == PLUS
+ && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
+ || GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == LABEL_REF)
+ && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) != PLUS
+ && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) != PLUS)
+ {
+ rtx labelref;
+ if (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF)
+ labelref = XEXP (XEXP (operands[1], 0), 0);
+ else
+ labelref = XEXP (XEXP (operands[1], 0), 1);
+ #if defined (MOTOROLA) && !defined (SGS_SWITCH_TABLES)
+ #ifdef SGS
+ asm_fprintf (asm_out_file, \"\\tset %LLI%d,.+2\\n\",
+ CODE_LABEL_NUMBER (XEXP (labelref, 0)));
+ #else /* not SGS */
+ asm_fprintf (asm_out_file, \"\\t.set %LLI%d,.+2\\n\",
+ CODE_LABEL_NUMBER (XEXP (labelref, 0)));
+ #endif /* not SGS */
+ #else /* SGS_SWITCH_TABLES or not MOTOROLA */
+ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"LI\",
+ CODE_LABEL_NUMBER (XEXP (labelref, 0)));
+ #ifdef SGS_SWITCH_TABLES
+ /* Set flag saying we need to define the symbol
+ LD%n (with value L%n-LI%n) at the end of the switch table. */
+ switch_table_difference_label_flag = 1;
+ #endif /* SGS_SWITCH_TABLES */
+ #endif /* SGS_SWITCH_TABLES or not MOTOROLA */
+ }
+ #endif /* SGS_NO_LI */
+ return \"move%.w %1,%0\";
+ }")
+
+ (define_insn "movstricthi"
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm"))
+ (match_operand:HI 1 "general_operand" "rmn"))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ if (operands[1] == const0_rtx
+ && (DATA_REG_P (operands[0])
+ || GET_CODE (operands[0]) == MEM)
+ /* clr insns on 68000 read before writing.
+ This isn't so on the 68010, but we have no alternative for it. */
+ && (TARGET_68020
+ || !(GET_CODE (operands[0]) == MEM
+ && MEM_VOLATILE_P (operands[0]))))
+ return \"clr%.w %0\";
+ }
+ return \"move%.w %1,%0\";
+ }")
+
+ (define_insn "movqi"
+ [(set (match_operand:QI 0 "general_operand" "=d,*a,m,m,?*a")
+ (match_operand:QI 1 "general_operand" "dmi*a,d*a,dmi,?*a,m"))]
+ ""
+ "*
+ {
+ rtx xoperands[4];
+
+ /* This is probably useless, since it loses for pushing a struct
+ of several bytes a byte at a time. */
+ if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC
+ && XEXP (XEXP (operands[0], 0), 0) == stack_pointer_rtx
+ && ! ADDRESS_REG_P (operands[1]))
+ {
+ xoperands[1] = operands[1];
+ xoperands[2]
+ = gen_rtx (MEM, QImode,
+ gen_rtx (PLUS, VOIDmode, stack_pointer_rtx, const1_rtx));
+ /* Just pushing a byte puts it in the high byte of the halfword. */
+ /* We must put it in the low-order, high-numbered byte. */
+ output_asm_insn (\"move%.b %1,%-\;move%.b %@,%2\", xoperands);
+ return \"\";
+ }
+
+ /* Moving a byte into an address register is not possible. */
+ /* Use d0 as an intermediate, but don't clobber its contents. */
+ if (ADDRESS_REG_P (operands[0]) && GET_CODE (operands[1]) == MEM)
+ {
+ /* ??? For 2.5, don't allow this choice and use secondary reloads
+ instead.
+
+ See if the address register is used in the address. If it
+ is, we have to generate a more complex sequence than those below. */
+ if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
+ operands[1], NULL_RTX))
+ {
+ /* See if the stack pointer is used in the address. If it isn't,
+ we can push d0 or d1 (the insn can't use both of them) on
+ the stack, perform our move into d0/d1, copy the byte from d0/1,
+ and pop d0/1. */
+ if (! reg_mentioned_p (stack_pointer_rtx, operands[1]))
+ {
+ if (refers_to_regno_p (0, 1, operands[1], NULL_RTX))
+ return \"move%.l %/d0,%-\;move%.b %1,%/d0\;move%.l %/d0,%0\;move%.l %+,%/d0\";
+ else
+ return \"move%.l %/d1,%-\;move%.b %1,%/d1\;move%.l %/d1,%0\;move%.l %+,%/d1\";
+ }
+ else
+ {
+ /* Otherwise, we know that d0 cannot be used in the address
+ (since sp and one address register is). Assume that sp is
+ being used as a base register and replace the address
+ register that is our operand[0] with d0. */
+ rtx reg_map[FIRST_PSEUDO_REGISTER];
+ int i;
+
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+ reg_map[i] = 0;
+
+ reg_map[REGNO (operands[0])] = gen_rtx (REG, Pmode, 0);
+ operands[1] = copy_rtx (operands[1]);
+ replace_regs (operands[1], reg_map, FIRST_PSEUDO_REGISTER, 0);
+ return \"exg %/d0,%0\;move%.b %1,%/d0\;exg %/d0,%0\";
+ }
+ }
+
+ /* If the address of operand 1 uses d0, choose d1 as intermediate. */
+ if (refers_to_regno_p (0, 1, operands[1], NULL_RTX))
+ return \"exg %/d1,%0\;move%.b %1,%/d1\;exg %/d1,%0\";
+ /* Otherwise d0 is usable.
+ (An effective address on the 68k can't use two d-regs.) */
+ else
+ return \"exg %/d0,%0\;move%.b %1,%/d0\;exg %/d0,%0\";
+ }
+
+ /* Likewise for moving from an address reg. */
+ if (ADDRESS_REG_P (operands[1]) && GET_CODE (operands[0]) == MEM)
+ {
+ /* ??? For 2.5, don't allow this choice and use secondary reloads
+ instead.
+
+ See if the address register is used in the address. If it
+ is, we have to generate a more complex sequence than those below. */
+ if (refers_to_regno_p (REGNO (operands[1]), REGNO (operands[1]) + 1,
+ operands[0], NULL_RTX))
+ {
+ /* See if the stack pointer is used in the address. If it isn't,
+ we can push d0 or d1 (the insn can't use both of them) on
+ the stack, copy the byte to d0/1, perform our move from d0/d1,
+ and pop d0/1. */
+ if (! reg_mentioned_p (stack_pointer_rtx, operands[0]))
+ {
+ if (refers_to_regno_p (0, 1, operands[0], NULL_RTX))
+ return \"move%.l %/d0,%-\;move%.l %1,%/d0\;move%.b %/d0,%0\;move%.l %+,%/d0\";
+ else
+ return \"move%.l %/d1,%-\;move%.l %1,%/d1\;move%.b %/d1,%0\;move%.l %+,%/d1\";
+ }
+ else
+ {
+ /* Otherwise, we know that d0 cannot be used in the address
+ (since sp and one address register is). Assume that sp is
+ being used as a base register and replace the address
+ register that is our operand[1] with d0. */
+ rtx reg_map[FIRST_PSEUDO_REGISTER];
+ int i;
+
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+ reg_map[i] = 0;
+
+ reg_map[REGNO (operands[1])] = gen_rtx (REG, Pmode, 0);
+ operands[0] = copy_rtx (operands[0]);
+ replace_regs (operands[0], reg_map, FIRST_PSEUDO_REGISTER, 0);
+ return \"exg %/d0,%1\;move%.b %/d0,%0\;exg %/d0,%1\";
+ }
+ }
+
+ if (refers_to_regno_p (0, 1, operands[0], NULL_RTX))
+ return \"exg %/d1,%1\;move%.b %/d1,%0\;exg %/d1,%1\";
+ else
+ return \"exg %/d0,%1\;move%.b %/d0,%0\;exg %/d0,%1\";
+ }
+
+ /* clr and st insns on 68000 read before writing.
+ This isn't so on the 68010, but we have no alternative for it. */
+ if (TARGET_68020
+ || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))
+ {
+ if (operands[1] == const0_rtx)
+ return \"clr%.b %0\";
+ if (GET_CODE (operands[1]) == CONST_INT
+ && INTVAL (operands[1]) == -1)
+ {
+ CC_STATUS_INIT;
+ return \"st %0\";
+ }
+ }
+ if (GET_CODE (operands[1]) != CONST_INT && CONSTANT_P (operands[1]))
+ return \"move%.l %1,%0\";
+ if (ADDRESS_REG_P (operands[0]) || ADDRESS_REG_P (operands[1]))
+ return \"move%.w %1,%0\";
+ return \"move%.b %1,%0\";
+ }")
+
+ (define_insn "movstrictqi"
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm"))
+ (match_operand:QI 1 "general_operand" "dmn"))]
+ ""
+ "*
+ {
+ if (operands[1] == const0_rtx
+ /* clr insns on 68000 read before writing.
+ This isn't so on the 68010, but we have no alternative for it. */
+ && (TARGET_68020
+ || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))))
+ return \"clr%.b %0\";
+ return \"move%.b %1,%0\";
+ }")
+
+ (define_insn "movsf"
+ [(set (match_operand:SF 0 "general_operand" "=rmf,x,y,rm,!x,!rm")
+ (match_operand:SF 1 "general_operand" "rmfF,xH,rmF,y,rm,x"))]
+ ; [(set (match_operand:SF 0 "general_operand" "=rmf")
+ ; (match_operand:SF 1 "general_operand" "rmfF"))]
+ ""
+ "*
+ {
+ if (which_alternative >= 4)
+ return \"fpmove%.s %1,fpa0\;fpmove%.s fpa0,%0\";
+ if (FPA_REG_P (operands[0]))
+ {
+ if (FPA_REG_P (operands[1]))
+ return \"fpmove%.s %x1,%x0\";
+ else if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ return output_move_const_single (operands);
+ else if (FP_REG_P (operands[1]))
+ return \"fmove%.s %1,sp@-\;fpmove%.d sp@+, %0\";
+ return \"fpmove%.s %x1,%x0\";
+ }
+ if (FPA_REG_P (operands[1]))
+ {
+ if (FP_REG_P (operands[0]))
+ return \"fpmove%.s %x1,sp@-\;fmove%.s sp@+,%0\";
+ else
+ return \"fpmove%.s %x1,%x0\";
+ }
+ if (FP_REG_P (operands[0]))
+ {
+ if (FP_REG_P (operands[1]))
+ return \"f%$move%.x %1,%0\";
+ else if (ADDRESS_REG_P (operands[1]))
+ return \"move%.l %1,%-\;f%$move%.s %+,%0\";
+ else if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ return output_move_const_single (operands);
+ return \"f%$move%.s %f1,%0\";
+ }
+ if (FP_REG_P (operands[1]))
+ {
+ if (ADDRESS_REG_P (operands[0]))
+ return \"fmove%.s %1,%-\;move%.l %+,%0\";
+ return \"fmove%.s %f1,%0\";
+ }
+ return \"move%.l %1,%0\";
+ }")
+
+ (define_insn "movdf"
+ [(set (match_operand:DF 0 "general_operand" "=rm,rf,rf,&rof<>,y,rm,x,!x,!rm")
+ (match_operand:DF 1 "general_operand" "rf,m,0,rofE<>,rmE,y,xH,rm,x"))]
+ ; [(set (match_operand:DF 0 "general_operand" "=rm,&rf,&rof<>")
+ ; (match_operand:DF 1 "general_operand" "rf,m,rofF<>"))]
+ ""
+ "*
+ {
+ if (which_alternative == 7)
+ return \"fpmove%.d %x1,fpa0\;fpmove%.d fpa0,%x0\";
+ if (FPA_REG_P (operands[0]))
+ {
+ if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ return output_move_const_double (operands);
+ if (FP_REG_P (operands[1]))
+ return \"fmove%.d %1,sp@-\;fpmove%.d sp@+,%x0\";
+ return \"fpmove%.d %x1,%x0\";
+ }
+ else if (FPA_REG_P (operands[1]))
+ {
+ if (FP_REG_P(operands[0]))
+ return \"fpmove%.d %x1,sp@-\;fmoved sp@+,%0\";
+ else
+ return \"fpmove%.d %x1,%x0\";
+ }
+ if (FP_REG_P (operands[0]))
+ {
+ if (FP_REG_P (operands[1]))
+ return \"f%&move%.x %1,%0\";
+ if (REG_P (operands[1]))
+ {
+ rtx xoperands[2];
+ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
+ output_asm_insn (\"move%.l %1,%-\", xoperands);
+ output_asm_insn (\"move%.l %1,%-\", operands);
+ return \"f%&move%.d %+,%0\";
+ }
+ if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ return output_move_const_double (operands);
+ return \"f%&move%.d %f1,%0\";
+ }
+ else if (FP_REG_P (operands[1]))
+ {
+ if (REG_P (operands[0]))
+ {
+ output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ return \"move%.l %+,%0\";
+ }
+ else
+ return \"fmove%.d %f1,%0\";
+ }
+ return output_move_double (operands);
+ }
+ ")
+
+ (define_expand "movxf"
+ [(set (match_operand:XF 0 "nonimmediate_operand" "")
+ (match_operand:XF 1 "general_operand" ""))]
+ ""
+ "
+ {
+ if (CONSTANT_P (operands[1]))
+ {
+ operands[1] = force_const_mem (XFmode, operands[1]);
+ if (! memory_address_p (XFmode, XEXP (operands[1], 0))
+ && ! reload_in_progress)
+ operands[1] = change_address (operands[1], XFmode,
+ XEXP (operands[1], 0));
+ }
+ }")
+
+ (define_insn ""
+ [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,!r,!f")
+ (match_operand:XF 1 "nonimmediate_operand" "m,f,f,f,r"))]
+ "TARGET_68881"
+ "*
+ {
+ if (FP_REG_P (operands[0]))
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fmove%.x %1,%0\";
+ if (REG_P (operands[1]))
+ {
+ rtx xoperands[2];
+ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 2);
+ output_asm_insn (\"move%.l %1,%-\", xoperands);
+ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
+ output_asm_insn (\"move%.l %1,%-\", xoperands);
+ output_asm_insn (\"move%.l %1,%-\", operands);
+ return \"fmove%.x %+,%0\";
+ }
+ if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ return \"fmove%.x %1,%0\";
+ return \"fmove%.x %f1,%0\";
+ }
+ if (REG_P (operands[0]))
+ {
+ output_asm_insn (\"fmove%.x %f1,%-\;move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ output_asm_insn (\"move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ return \"move%.l %+,%0\";
+ }
+ return \"fmove%.x %f1,%0\";
+ }
+ ")
+
+ (define_insn ""
+ [(set (match_operand:XF 0 "nonimmediate_operand" "=rm,rf,&rof<>")
+ (match_operand:XF 1 "nonimmediate_operand" "rf,m,rof<>"))]
+ "! TARGET_68881"
+ "*
+ {
+ if (FP_REG_P (operands[0]))
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fmove%.x %1,%0\";
+ if (REG_P (operands[1]))
+ {
+ rtx xoperands[2];
+ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 2);
+ output_asm_insn (\"move%.l %1,%-\", xoperands);
+ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
+ output_asm_insn (\"move%.l %1,%-\", xoperands);
+ output_asm_insn (\"move%.l %1,%-\", operands);
+ return \"fmove%.x %+,%0\";
+ }
+ if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ return \"fmove%.x %1,%0\";
+ return \"fmove%.x %f1,%0\";
+ }
+ if (FP_REG_P (operands[1]))
+ {
+ if (REG_P (operands[0]))
+ {
+ output_asm_insn (\"fmove%.x %f1,%-\;move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ output_asm_insn (\"move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ return \"move%.l %+,%0\";
+ }
+ else
+ return \"fmove%.x %f1,%0\";
+ }
+ return output_move_double (operands);
+ }
+ ")
+
+ ;; movdi can apply to fp regs in some cases
+ (define_insn "movdi"
+ ;; Let's see if it really still needs to handle fp regs, and, if so, why.
+ [(set (match_operand:DI 0 "general_operand" "=rm,r,&ro<>,y,rm,!*x,!rm")
+ (match_operand:DI 1 "general_operand" "rF,m,roi<>F,rmiF,y,rmF,*x"))]
+ ; [(set (match_operand:DI 0 "general_operand" "=rm,&r,&ro<>,!&rm,!&f,y,rm,x,!x,!rm")
+ ; (match_operand:DI 1 "general_operand" "r,m,roi<>,fF,rfmF,rmi,y,rm,x"))]
+ ; [(set (match_operand:DI 0 "general_operand" "=rm,&rf,&ro<>,!&rm,!&f")
+ ; (match_operand:DI 1 "general_operand" "r,m,roi<>,fF,rfF"))]
+ ""
+ "*
+ {
+ if (which_alternative == 8)
+ return \"fpmove%.d %x1,fpa0\;fpmove%.d fpa0,%x0\";
+ if (FPA_REG_P (operands[0]) || FPA_REG_P (operands[1]))
+ return \"fpmove%.d %x1,%x0\";
+ if (FP_REG_P (operands[0]))
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fmove%.x %1,%0\";
+ if (REG_P (operands[1]))
+ {
+ rtx xoperands[2];
+ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
+ output_asm_insn (\"move%.l %1,%-\", xoperands);
+ output_asm_insn (\"move%.l %1,%-\", operands);
+ return \"fmove%.d %+,%0\";
+ }
+ if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ return output_move_const_double (operands);
+ return \"fmove%.d %f1,%0\";
+ }
+ else if (FP_REG_P (operands[1]))
+ {
+ if (REG_P (operands[0]))
+ {
+ output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ return \"move%.l %+,%0\";
+ }
+ else
+ return \"fmove%.d %f1,%0\";
+ }
+ return output_move_double (operands);
+ }
+ ")
+
+ ;; Thus goes after the move instructions
+ ;; because the move instructions are better (require no spilling)
+ ;; when they can apply. It goes before the add/sub insns
+ ;; so we will prefer it to them.
+
+ (define_insn "pushasi"
+ [(set (match_operand:SI 0 "push_operand" "=m")
+ (match_operand:SI 1 "address_operand" "p"))]
+ ""
+ "pea %a1")
+
+ ;; truncation instructions
+ (define_insn "truncsiqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm,d")
+ (truncate:QI
+ (match_operand:SI 1 "general_operand" "doJ,i")))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[0]) == REG)
+ {
+ /* Must clear condition codes, since the move.l bases them on
+ the entire 32 bits, not just the desired 8 bits. */
+ CC_STATUS_INIT;
+ return \"move%.l %1,%0\";
+ }
+ if (GET_CODE (operands[1]) == MEM)
+ operands[1] = adj_offsettable_operand (operands[1], 3);
+ return \"move%.b %1,%0\";
+ }")
+
+ (define_insn "trunchiqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm,d")
+ (truncate:QI
+ (match_operand:HI 1 "general_operand" "doJ,i")))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[0]) == REG
+ && (GET_CODE (operands[1]) == MEM
+ || GET_CODE (operands[1]) == CONST_INT))
+ {
+ /* Must clear condition codes, since the move.w bases them on
+ the entire 16 bits, not just the desired 8 bits. */
+ CC_STATUS_INIT;
+ return \"move%.w %1,%0\";
+ }
+ if (GET_CODE (operands[0]) == REG)
+ {
+ /* Must clear condition codes, since the move.l bases them on
+ the entire 32 bits, not just the desired 8 bits. */
+ CC_STATUS_INIT;
+ return \"move%.l %1,%0\";
+ }
+ if (GET_CODE (operands[1]) == MEM)
+ operands[1] = adj_offsettable_operand (operands[1], 1);
+ return \"move%.b %1,%0\";
+ }")
+
+ (define_insn "truncsihi2"
+ [(set (match_operand:HI 0 "general_operand" "=dm,d")
+ (truncate:HI
+ (match_operand:SI 1 "general_operand" "roJ,i")))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[0]) == REG)
+ {
+ /* Must clear condition codes, since the move.l bases them on
+ the entire 32 bits, not just the desired 8 bits. */
+ CC_STATUS_INIT;
+ return \"move%.l %1,%0\";
+ }
+ if (GET_CODE (operands[1]) == MEM)
+ operands[1] = adj_offsettable_operand (operands[1], 2);
+ return \"move%.w %1,%0\";
+ }")
+
+ ;; zero extension instructions
+
+ (define_expand "zero_extendhisi2"
+ [(set (match_operand:SI 0 "register_operand" "")
+ (const_int 0))
+ (set (strict_low_part (match_dup 2))
+ (match_operand:HI 1 "general_operand" ""))]
+ ""
+ "
+ {
+ operands[1] = make_safe_from (operands[1], operands[0]);
+ if (GET_CODE (operands[0]) == SUBREG)
+ operands[2] = gen_rtx (SUBREG, HImode, SUBREG_REG (operands[0]),
+ SUBREG_WORD (operands[0]));
+ else
+ operands[2] = gen_rtx (SUBREG, HImode, operands[0], 0);
+ }")
+
+ (define_expand "zero_extendqihi2"
+ [(set (match_operand:HI 0 "register_operand" "")
+ (const_int 0))
+ (set (strict_low_part (match_dup 2))
+ (match_operand:QI 1 "general_operand" ""))]
+ ""
+ "
+ {
+ operands[1] = make_safe_from (operands[1], operands[0]);
+ if (GET_CODE (operands[0]) == SUBREG)
+ operands[2] = gen_rtx (SUBREG, QImode, SUBREG_REG (operands[0]),
+ SUBREG_WORD (operands[0]));
+ else
+ operands[2] = gen_rtx (SUBREG, QImode, operands[0], 0);
+ }")
+
+ (define_expand "zero_extendqisi2"
+ [(set (match_operand:SI 0 "register_operand" "")
+ (const_int 0))
+ (set (strict_low_part (match_dup 2))
+ (match_operand:QI 1 "general_operand" ""))]
+ ""
+ "
+ {
+ operands[1] = make_safe_from (operands[1], operands[0]);
+ if (GET_CODE (operands[0]) == SUBREG)
+ operands[2] = gen_rtx (SUBREG, QImode, SUBREG_REG (operands[0]),
+ SUBREG_WORD (operands[0]));
+ else
+ operands[2] = gen_rtx (SUBREG, QImode, operands[0], 0);
+ }")
+
+ ;; Patterns to recognize zero-extend insns produced by the combiner.
+ ;; We don't allow both operands in memory, because of aliasing problems.
+ ;; Explicitly disallow two memory operands via the condition since reloading
+ ;; of this case will result in worse code than the uncombined patterns.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=do<>,d<")
+ (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
+ "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM"
+ "*
+ {
+ if (DATA_REG_P (operands[0]))
+ {
+ if (GET_CODE (operands[1]) == REG
+ && REGNO (operands[0]) == REGNO (operands[1]))
+ return \"and%.l %#0xFFFF,%0\";
+ if (reg_mentioned_p (operands[0], operands[1]))
+ return \"move%.w %1,%0\;and%.l %#0xFFFF,%0\";
+ return \"clr%.l %0\;move%.w %1,%0\";
+ }
+ else if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
+ return \"move%.w %1,%0\;clr%.w %0\";
+ else if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == POST_INC)
+ return \"clr%.w %0\;move%.w %1,%0\";
+ else
+ {
+ output_asm_insn (\"clr%.w %0\", operands);
+ operands[0] = adj_offsettable_operand (operands[0], 2);
+ return \"move%.w %1,%0\";
+ }
+ }")
+
+ (define_insn ""
+ [(set (match_operand:HI 0 "general_operand" "=do<>,d")
+ (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "d,m")))]
+ "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM"
+ "*
+ {
+ if (DATA_REG_P (operands[0]))
+ {
+ if (GET_CODE (operands[1]) == REG
+ && REGNO (operands[0]) == REGNO (operands[1]))
+ return \"and%.w %#0xFF,%0\";
+ if (reg_mentioned_p (operands[0], operands[1]))
+ return \"move%.b %1,%0\;and%.w %#0xFF,%0\";
+ return \"clr%.w %0\;move%.b %1,%0\";
+ }
+ else if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
+ {
+ if (REGNO (XEXP (XEXP (operands[0], 0), 0))
+ == STACK_POINTER_REGNUM)
+ {
+ output_asm_insn (\"clr%.w %-\", operands);
+ operands[0] = gen_rtx (MEM, GET_MODE (operands[0]),
+ plus_constant (stack_pointer_rtx, 1));
+ return \"move%.b %1,%0\";
+ }
+ else
+ return \"move%.b %1,%0\;clr%.b %0\";
+ }
+ else if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == POST_INC)
+ return \"clr%.b %0\;move%.b %1,%0\";
+ else
+ {
+ output_asm_insn (\"clr%.b %0\", operands);
+ operands[0] = adj_offsettable_operand (operands[0], 1);
+ return \"move%.b %1,%0\";
+ }
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=do<>,d")
+ (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "d,m")))]
+ "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM"
+ "*
+ {
+ if (DATA_REG_P (operands[0]))
+ {
+ if (GET_CODE (operands[1]) == REG
+ && REGNO (operands[0]) == REGNO (operands[1]))
+ return \"and%.l %#0xFF,%0\";
+ if (reg_mentioned_p (operands[0], operands[1]))
+ return \"move%.b %1,%0\;and%.l %#0xFF,%0\";
+ return \"clr%.l %0\;move%.b %1,%0\";
+ }
+ else if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
+ {
+ operands[0] = XEXP (XEXP (operands[0], 0), 0);
+ #ifdef MOTOROLA
+ #ifdef SGS
+ return \"clr%.l -(%0)\;move%.b %1,3(%0)\";
+ #else
+ return \"clr%.l -(%0)\;move%.b %1,(3,%0)\";
+ #endif
+ #else
+ return \"clrl %0@-\;moveb %1,%0@(3)\";
+ #endif
+ }
+ else if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == POST_INC)
+ {
+ operands[0] = XEXP (XEXP (operands[0], 0), 0);
+ #ifdef MOTOROLA
+ #ifdef SGS
+ return \"clr%.l (%0)+\;move%.b %1,-1(%0)\";
+ #else
+ return \"clr%.l (%0)+\;move%.b %1,(-1,%0)\";
+ #endif
+ #else
+ return \"clrl %0@+\;moveb %1,%0@(-1)\";
+ #endif
+ }
+ else
+ {
+ output_asm_insn (\"clr%.l %0\", operands);
+ operands[0] = adj_offsettable_operand (operands[0], 3);
+ return \"move%.b %1,%0\";
+ }
+ }")
+
+ ;; sign extension instructions
+
+ (define_insn "extendhisi2"
+ [(set (match_operand:SI 0 "general_operand" "=*d,a")
+ (sign_extend:SI
+ (match_operand:HI 1 "nonimmediate_operand" "0,rm")))]
+ ""
+ "*
+ {
+ if (ADDRESS_REG_P (operands[0]))
+ return \"move%.w %1,%0\";
+ return \"ext%.l %0\";
+ }")
+
+ (define_insn "extendqihi2"
+ [(set (match_operand:HI 0 "general_operand" "=d")
+ (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "0")))]
+ ""
+ "ext%.w %0")
+
+ (define_insn "extendqisi2"
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "0")))]
+ "TARGET_68020"
+ "extb%.l %0")
+
+ ;; Conversions between float and double.
+
+ (define_expand "extendsfdf2"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (float_extend:DF
+ (match_operand:SF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=x,y")
+ (float_extend:DF
+ (match_operand:SF 1 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "fpstod %w1,%0")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=*fdm,f")
+ (float_extend:DF
+ (match_operand:SF 1 "general_operand" "f,dmF")))]
+ "TARGET_68881"
+ "*
+ {
+ if (FP_REG_P (operands[0]) && FP_REG_P (operands[1]))
+ {
+ if (REGNO (operands[0]) == REGNO (operands[1]))
+ {
+ /* Extending float to double in an fp-reg is a no-op.
+ NOTICE_UPDATE_CC has already assumed that the
+ cc will be set. So cancel what it did. */
+ cc_status = cc_prev_status;
+ return \"\";
+ }
+ return \"f%&move%.x %1,%0\";
+ }
+ if (FP_REG_P (operands[0]))
+ return \"f%&move%.s %f1,%0\";
+ if (DATA_REG_P (operands[0]) && FP_REG_P (operands[1]))
+ {
+ output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ return \"move%.l %+,%0\";
+ }
+ return \"fmove%.d %f1,%0\";
+ }")
+
+ ;; This cannot output into an f-reg because there is no way to be
+ ;; sure of truncating in that case.
+ ;; But on the Sun FPA, we can be sure.
+ (define_expand "truncdfsf2"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (float_truncate:SF
+ (match_operand:DF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=x,y")
+ (float_truncate:SF
+ (match_operand:DF 1 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "fpdtos %y1,%0")
+
+ ;; On the '040 we can truncate in a register accurately and easily.
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (float_truncate:SF
+ (match_operand:DF 1 "general_operand" "fmG")))]
+ "TARGET_68040_ONLY"
+ "*
+ {
+ if (FP_REG_P (operands[1]))
+ return \"f%$move%.x %1,%0\";
+ return \"f%$move%.d %f1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=dm")
+ (float_truncate:SF
+ (match_operand:DF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.s %f1,%0")
+
+ ;; Conversion between fixed point and floating point.
+ ;; Note that among the fix-to-float insns
+ ;; the ones that start with SImode come first.
+ ;; That is so that an operand that is a CONST_INT
+ ;; (and therefore lacks a specific machine mode).
+ ;; will be recognized as SImode (which is always valid)
+ ;; rather than as QImode or HImode.
+
+ (define_expand "floatsisf2"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (float:SF (match_operand:SI 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=y,x")
+ (float:SF (match_operand:SI 1 "general_operand" "rmi,x")))]
+ "TARGET_FPA"
+ "fpltos %1,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (float:SF (match_operand:SI 1 "general_operand" "dmi")))]
+ "TARGET_68881"
+ "f%$move%.l %1,%0")
+
+ (define_expand "floatsidf2"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (float:DF (match_operand:SI 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=y,x")
+ (float:DF (match_operand:SI 1 "general_operand" "rmi,x")))]
+ "TARGET_FPA"
+ "fpltod %1,%0")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (float:DF (match_operand:SI 1 "general_operand" "dmi")))]
+ "TARGET_68881"
+ "f%&move%.l %1,%0")
+
+ (define_insn "floathisf2"
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (float:SF (match_operand:HI 1 "general_operand" "dmn")))]
+ "TARGET_68881"
+ "f%$move%.w %1,%0")
+
+ (define_insn "floathidf2"
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (float:DF (match_operand:HI 1 "general_operand" "dmn")))]
+ "TARGET_68881"
+ "fmove%.w %1,%0")
+
+ (define_insn "floatqisf2"
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (float:SF (match_operand:QI 1 "general_operand" "dmn")))]
+ "TARGET_68881"
+ "fmove%.b %1,%0")
+
+ (define_insn "floatqidf2"
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (float:DF (match_operand:QI 1 "general_operand" "dmn")))]
+ "TARGET_68881"
+ "f%&move%.b %1,%0")
+
+ ;; New routines to convert floating-point values to integers
+ ;; to be used on the '040. These should be faster than trapping
+ ;; into the kernel to emulate fintrz. They should also be faster
+ ;; than calling the subroutines fixsfsi or fixdfsi.
+
+ (define_insn "fix_truncdfsi2"
+ [(set (match_operand:SI 0 "general_operand" "=dm")
+ (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
+ (clobber (match_scratch:SI 2 "=d"))
+ (clobber (match_scratch:SI 3 "=d"))]
+ "TARGET_68881 && TARGET_68040"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"fmovem%.l %!,%2\;moveq %#16,%3\;or%.l %2,%3\;and%.w %#-33,%3\;fmovem%.l %3,%!\;fmove%.l %1,%0\;fmovem%.l %2,%!\";
+ }")
+
+ (define_insn "fix_truncdfhi2"
+ [(set (match_operand:HI 0 "general_operand" "=dm")
+ (fix:HI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
+ (clobber (match_scratch:SI 2 "=d"))
+ (clobber (match_scratch:SI 3 "=d"))]
+ "TARGET_68881 && TARGET_68040"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"fmovem%.l %!,%2\;moveq %#16,%3\;or%.l %2,%3\;and%.w %#-33,%3\;fmovem%.l %3,%!\;fmove%.w %1,%0\;fmovem%.l %2,%!\";
+ }")
+
+ (define_insn "fix_truncdfqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm")
+ (fix:QI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
+ (clobber (match_scratch:SI 2 "=d"))
+ (clobber (match_scratch:SI 3 "=d"))]
+ "TARGET_68881 && TARGET_68040"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"fmovem%.l %!,%2\;moveq %#16,%3\;or%.l %2,%3\;and%.w %#-33,%3\;fmovem%.l %3,%!\;fmove%.b %1,%0\;fmovem%.l %2,%!\";
+ }")
+
+ ;; Convert a float to a float whose value is an integer.
+ ;; This is the first stage of converting it to an integer type.
+
+ (define_insn "ftruncdf2"
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (fix:DF (match_operand:DF 1 "general_operand" "fFm")))]
+ "TARGET_68881 && !TARGET_68040"
+ "*
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fintrz%.x %f1,%0\";
+ return \"fintrz%.d %f1,%0\";
+ }")
+
+ (define_insn "ftruncsf2"
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (fix:SF (match_operand:SF 1 "general_operand" "dfFm")))]
+ "TARGET_68881 && !TARGET_68040"
+ "*
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fintrz%.x %f1,%0\";
+ return \"fintrz%.s %f1,%0\";
+ }")
+
+ ;; Convert a float whose value is an integer
+ ;; to an actual integer. Second stage of converting float to integer type.
+ (define_insn "fixsfqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm")
+ (fix:QI (match_operand:SF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.b %1,%0")
+
+ (define_insn "fixsfhi2"
+ [(set (match_operand:HI 0 "general_operand" "=dm")
+ (fix:HI (match_operand:SF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.w %1,%0")
+
+ (define_insn "fixsfsi2"
+ [(set (match_operand:SI 0 "general_operand" "=dm")
+ (fix:SI (match_operand:SF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.l %1,%0")
+
+ (define_insn "fixdfqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm")
+ (fix:QI (match_operand:DF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.b %1,%0")
+
+ (define_insn "fixdfhi2"
+ [(set (match_operand:HI 0 "general_operand" "=dm")
+ (fix:HI (match_operand:DF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.w %1,%0")
+
+ (define_insn "fixdfsi2"
+ [(set (match_operand:SI 0 "general_operand" "=dm")
+ (fix:SI (match_operand:DF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.l %1,%0")
+
+ ;; Convert a float to an integer.
+ ;; On the Sun FPA, this is done in one step.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=x,y")
+ (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "xH,rmF"))))]
+ "TARGET_FPA"
+ "fpstol %w1,%0")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=x,y")
+ (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "xH,rmF"))))]
+ "TARGET_FPA"
+ "fpdtol %y1,%0")
+
+ ;; add instructions
+
+ ;; Note that the middle two alternatives are near-duplicates
+ ;; in order to handle insns generated by reload.
+ ;; This is needed since they are not themselves reloaded,
+ ;; so commutativity won't apply to them.
+ (define_insn "addsi3"
+ [(set (match_operand:SI 0 "general_operand" "=m,?a,?a,r")
+ (plus:SI (match_operand:SI 1 "general_operand" "%0,a,rJK,0")
+ (match_operand:SI 2 "general_operand" "dIKLs,rJK,a,mrIKLs")))]
+ ""
+ "*
+ {
+ if (! operands_match_p (operands[0], operands[1]))
+ {
+ if (!ADDRESS_REG_P (operands[1]))
+ {
+ rtx tmp = operands[1];
+
+ operands[1] = operands[2];
+ operands[2] = tmp;
+ }
+
+ /* These insns can result from reloads to access
+ stack slots over 64k from the frame pointer. */
+ if (((GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) + 0x8000 >= (unsigned) 0x10000))
+ || (flag_pic == 4 && operands[1] == pic_offset_table_rtx))
+ return \"move%.l %2,%0\;add%.l %1,%0\";
+ #ifdef SGS
+ if (GET_CODE (operands[2]) == REG)
+ return \"lea 0(%1,%2.l),%0\";
+ else
+ return \"lea %c2(%1),%0\";
+ #else /* not SGS */
+ #ifdef MOTOROLA
+ if (GET_CODE (operands[2]) == REG)
+ return \"lea (%1,%2.l),%0\";
+ else
+ return \"lea (%c2,%1),%0\";
+ #else /* not MOTOROLA (MIT syntax) */
+ if (GET_CODE (operands[2]) == REG)
+ return \"lea %1@(0,%2:l),%0\";
+ else
+ return \"lea %1@(%c2),%0\";
+ #endif /* not MOTOROLA */
+ #endif /* not SGS */
+ }
+ if (GET_CODE (operands[2]) == CONST_INT)
+ {
+ #ifndef NO_ADDSUB_Q
+ if (INTVAL (operands[2]) > 0
+ && INTVAL (operands[2]) <= 8)
+ return (ADDRESS_REG_P (operands[0])
+ ? \"addq%.w %2,%0\"
+ : \"addq%.l %2,%0\");
+ if (INTVAL (operands[2]) < 0
+ && INTVAL (operands[2]) >= -8)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[2]));
+ return (ADDRESS_REG_P (operands[0])
+ ? \"subq%.w %2,%0\"
+ : \"subq%.l %2,%0\");
+ }
+ /* On everything except the 68000 it is faster to use two
+ addqw instructions to add a small integer (8 < N <= 16)
+ to an address register. Likewise for subqw.*/
+ if (INTVAL (operands[2]) > 8
+ && INTVAL (operands[2]) <= 16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 8);
+ return \"addq%.w %#8,%0\;addq%.w %2,%0\";
+ }
+ if (INTVAL (operands[2]) < -8
+ && INTVAL (operands[2]) >= -16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[2]) - 8);
+ return \"subq%.w %#8,%0\;subq%.w %2,%0\";
+ }
+ #endif
+ if (ADDRESS_REG_P (operands[0])
+ && INTVAL (operands[2]) >= -0x8000
+ && INTVAL (operands[2]) < 0x8000)
+ return \"add%.w %2,%0\";
+ }
+ return \"add%.l %2,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=a")
+ (plus:SI (match_operand:SI 1 "general_operand" "0")
+ (sign_extend:SI
+ (match_operand:HI 2 "nonimmediate_operand" "rm"))))]
+ ""
+ "add%.w %2,%0")
+
+ (define_insn "addhi3"
+ [(set (match_operand:HI 0 "general_operand" "=m,r")
+ (plus:HI (match_operand:HI 1 "general_operand" "%0,0")
+ (match_operand:HI 2 "general_operand" "dn,rmn")))]
+ ""
+ "*
+ {
+ #ifndef NO_ADDSUB_Q
+ if (GET_CODE (operands[2]) == CONST_INT)
+ {
+ /* If the constant would be a negative number when interpreted as
+ HImode, make it negative. This is usually, but not always, done
+ elsewhere in the compiler. First check for constants out of range,
+ which could confuse us. */
+
+ if (INTVAL (operands[2]) >= 32768)
+ operands[2] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (operands[2]) - 65536);
+
+ if (INTVAL (operands[2]) > 0
+ && INTVAL (operands[2]) <= 8)
+ return \"addq%.w %2,%0\";
+ if (INTVAL (operands[2]) < 0
+ && INTVAL (operands[2]) >= -8)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[2]));
+ return \"subq%.w %2,%0\";
+ }
+ /* On everything except the 68000 it is faster to use two
+ addqw instructions to add a small integer (8 < N <= 16)
+ to an address register. Likewise for subqw. */
+ if (INTVAL (operands[2]) > 8
+ && INTVAL (operands[2]) <= 16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 8);
+ return \"addq%.w %#8,%0\;addq%.w %2,%0\";
+ }
+ if (INTVAL (operands[2]) < -8
+ && INTVAL (operands[2]) >= -16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[2]) - 8);
+ return \"subq%.w %#8,%0\;subq%.w %2,%0\";
+ }
+ }
+ #endif
+ return \"add%.w %2,%0\";
+ }")
+
+ ;; These insns must use MATCH_DUP instead of the more expected
+ ;; use of a matching constraint because the "output" here is also
+ ;; an input, so you can't use the matching constraint. That also means
+ ;; that you can't use the "%", so you need patterns with the matched
+ ;; operand in both positions.
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
+ (plus:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dn,rmn")))]
+ ""
+ "*
+ {
+ #ifndef NO_ADDSUB_Q
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ /* If the constant would be a negative number when interpreted as
+ HImode, make it negative. This is usually, but not always, done
+ elsewhere in the compiler. First check for constants out of range,
+ which could confuse us. */
+
+ if (INTVAL (operands[1]) >= 32768)
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (operands[1]) - 65536);
+
+ if (INTVAL (operands[1]) > 0
+ && INTVAL (operands[1]) <= 8)
+ return \"addq%.w %1,%0\";
+ if (INTVAL (operands[1]) < 0
+ && INTVAL (operands[1]) >= -8)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[1]));
+ return \"subq%.w %1,%0\";
+ }
+ /* On everything except the 68000 it is faster to use two
+ addqw instructions to add a small integer (8 < N <= 16)
+ to an address register. Likewise for subqw. */
+ if (INTVAL (operands[1]) > 8
+ && INTVAL (operands[1]) <= 16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) - 8);
+ return \"addq%.w %#8,%0\;addq%.w %1,%0\";
+ }
+ if (INTVAL (operands[1]) < -8
+ && INTVAL (operands[1]) >= -16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[1]) - 8);
+ return \"subq%.w %#8,%0\;subq%.w %1,%0\";
+ }
+ }
+ #endif
+ return \"add%.w %1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
+ (plus:HI (match_operand:HI 1 "general_operand" "dn,rmn")
+ (match_dup 0)))]
+ ""
+ "*
+ {
+ #ifndef NO_ADDSUB_Q
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ /* If the constant would be a negative number when interpreted as
+ HImode, make it negative. This is usually, but not always, done
+ elsewhere in the compiler. First check for constants out of range,
+ which could confuse us. */
+
+ if (INTVAL (operands[1]) >= 32768)
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (operands[1]) - 65536);
+
+ if (INTVAL (operands[1]) > 0
+ && INTVAL (operands[1]) <= 8)
+ return \"addq%.w %1,%0\";
+ if (INTVAL (operands[1]) < 0
+ && INTVAL (operands[1]) >= -8)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[1]));
+ return \"subq%.w %1,%0\";
+ }
+ /* On everything except the 68000 it is faster to use two
+ addqw instructions to add a small integer (8 < N <= 16)
+ to an address register. Likewise for subqw. */
+ if (INTVAL (operands[1]) > 8
+ && INTVAL (operands[1]) <= 16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) - 8);
+ return \"addq%.w %#8,%0\;addq%.w %1,%0\";
+ }
+ if (INTVAL (operands[1]) < -8
+ && INTVAL (operands[1]) >= -16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[1]) - 8);
+ return \"subq%.w %#8,%0\;subq%.w %1,%0\";
+ }
+ }
+ #endif
+ return \"add%.w %1,%0\";
+ }")
+
+ (define_insn "addqi3"
+ [(set (match_operand:QI 0 "general_operand" "=m,d")
+ (plus:QI (match_operand:QI 1 "general_operand" "%0,0")
+ (match_operand:QI 2 "general_operand" "dn,dmn")))]
+ ""
+ "*
+ {
+ #ifndef NO_ADDSUB_Q
+ if (GET_CODE (operands[2]) == CONST_INT)
+ {
+ if (INTVAL (operands[2]) >= 128)
+ operands[2] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (operands[2]) - 256);
+
+ if (INTVAL (operands[2]) > 0
+ && INTVAL (operands[2]) <= 8)
+ return \"addq%.b %2,%0\";
+ if (INTVAL (operands[2]) < 0 && INTVAL (operands[2]) >= -8)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[2]));
+ return \"subq%.b %2,%0\";
+ }
+ }
+ #endif
+ return \"add%.b %2,%0\";
+ }")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
+ (plus:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dn,dmn")))]
+ ""
+ "*
+ {
+ #ifndef NO_ADDSUB_Q
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ if (INTVAL (operands[1]) >= 128)
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (operands[1]) - 256);
+
+ if (INTVAL (operands[1]) > 0
+ && INTVAL (operands[1]) <= 8)
+ return \"addq%.b %1,%0\";
+ if (INTVAL (operands[1]) < 0 && INTVAL (operands[1]) >= -8)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[1]));
+ return \"subq%.b %1,%0\";
+ }
+ }
+ #endif
+ return \"add%.b %1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
+ (plus:QI (match_operand:QI 1 "general_operand" "dn,dmn")
+ (match_dup 0)))]
+ ""
+ "*
+ {
+ #ifndef NO_ADDSUB_Q
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ if (INTVAL (operands[1]) >= 128)
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (operands[1]) - 256);
+
+ if (INTVAL (operands[1]) > 0
+ && INTVAL (operands[1]) <= 8)
+ return \"addq%.b %1,%0\";
+ if (INTVAL (operands[1]) < 0 && INTVAL (operands[1]) >= -8)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[1]));
+ return \"subq%.b %1,%0\";
+ }
+ }
+ #endif
+ return \"add%.b %1,%0\";
+ }")
+
+ (define_expand "adddf3"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (plus:DF (match_operand:DF 1 "general_operand" "")
+ (match_operand:DF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=x,y")
+ (plus:DF (match_operand:DF 1 "general_operand" "%xH,y")
+ (match_operand:DF 2 "general_operand" "xH,dmF")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpadd%.d %y2,%0\";
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fpadd%.d %y1,%0\";
+ if (which_alternative == 0)
+ return \"fpadd3%.d %w2,%w1,%0\";
+ return \"fpadd3%.d %x2,%x1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (plus:DF (match_operand:DF 1 "general_operand" "%0")
+ (match_operand:DF 2 "general_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]))
+ return \"f%&add%.x %2,%0\";
+ return \"f%&add%.d %f2,%0\";
+ }")
+
+ (define_expand "addsf3"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (plus:SF (match_operand:SF 1 "general_operand" "")
+ (match_operand:SF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=x,y")
+ (plus:SF (match_operand:SF 1 "general_operand" "%xH,y")
+ (match_operand:SF 2 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpadd%.s %w2,%0\";
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fpadd%.s %w1,%0\";
+ if (which_alternative == 0)
+ return \"fpadd3%.s %w2,%w1,%0\";
+ return \"fpadd3%.s %2,%1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (plus:SF (match_operand:SF 1 "general_operand" "%0")
+ (match_operand:SF 2 "general_operand" "fdmF")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
+ return \"f%$add%.x %2,%0\";
+ return \"f%$add%.s %f2,%0\";
+ }")
+
+ ;; subtract instructions
+
+ (define_insn "subsi3"
+ [(set (match_operand:SI 0 "general_operand" "=m,r,!a,?d")
+ (minus:SI (match_operand:SI 1 "general_operand" "0,0,a,mrIKs")
+ (match_operand:SI 2 "general_operand" "dIKs,mrIKs,J,0")))]
+ ""
+ "*
+ {
+ if (! operands_match_p (operands[0], operands[1]))
+ {
+ if (operands_match_p (operands[0], operands[2]))
+ {
+ #ifndef NO_ADDSUB_Q
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ if (INTVAL (operands[1]) > 0
+ && INTVAL (operands[1]) <= 8)
+ return \"subq%.l %1,%0\;neg%.l %0\";
+ }
+ #endif
+ return \"sub%.l %1,%0\;neg%.l %0\";
+ }
+ /* This case is matched by J, but negating -0x8000
+ in an lea would give an invalid displacement.
+ So do this specially. */
+ if (INTVAL (operands[2]) == -0x8000)
+ return \"move%.l %1,%0\;sub%.l %2,%0\";
+ #ifdef SGS
+ return \"lea %n2(%1),%0\";
+ #else
+ #ifdef MOTOROLA
+ return \"lea (%n2,%1),%0\";
+ #else /* not MOTOROLA (MIT syntax) */
+ return \"lea %1@(%n2),%0\";
+ #endif /* not MOTOROLA */
+ #endif /* not SGS */
+ }
+ if (GET_CODE (operands[2]) == CONST_INT)
+ {
+ #ifndef NO_ADDSUB_Q
+ if (INTVAL (operands[2]) > 0
+ && INTVAL (operands[2]) <= 8)
+ return \"subq%.l %2,%0\";
+ /* Using two subqw for 8 < N <= 16 being subtracted from an
+ address register is faster on all but 68000 */
+ if (INTVAL (operands[2]) > 8
+ && INTVAL (operands[2]) <= 16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 8);
+ return \"subq%.w %#8,%0\;subq%.w %2,%0\";
+ }
+ #endif
+ if (ADDRESS_REG_P (operands[0])
+ && INTVAL (operands[2]) >= -0x8000
+ && INTVAL (operands[2]) < 0x8000)
+ return \"sub%.w %2,%0\";
+ }
+ return \"sub%.l %2,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=a")
+ (minus:SI (match_operand:SI 1 "general_operand" "0")
+ (sign_extend:SI
+ (match_operand:HI 2 "nonimmediate_operand" "rm"))))]
+ ""
+ "sub%.w %2,%0")
+
+ (define_insn "subhi3"
+ [(set (match_operand:HI 0 "general_operand" "=m,r")
+ (minus:HI (match_operand:HI 1 "general_operand" "0,0")
+ (match_operand:HI 2 "general_operand" "dn,rmn")))]
+ ""
+ "sub%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
+ (minus:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dn,rmn")))]
+ ""
+ "sub%.w %1,%0")
+
+ (define_insn "subqi3"
+ [(set (match_operand:QI 0 "general_operand" "=m,d")
+ (minus:QI (match_operand:QI 1 "general_operand" "0,0")
+ (match_operand:QI 2 "general_operand" "dn,dmn")))]
+ ""
+ "sub%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
+ (minus:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dn,dmn")))]
+ ""
+ "sub%.b %1,%0")
+
+ (define_expand "subdf3"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (minus:DF (match_operand:DF 1 "general_operand" "")
+ (match_operand:DF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=x,y,y")
+ (minus:DF (match_operand:DF 1 "general_operand" "xH,y,dmF")
+ (match_operand:DF 2 "general_operand" "xH,dmF,0")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fprsub%.d %y1,%0\";
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpsub%.d %y2,%0\";
+ if (which_alternative == 0)
+ return \"fpsub3%.d %w2,%w1,%0\";
+ return \"fpsub3%.d %x2,%x1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (minus:DF (match_operand:DF 1 "general_operand" "0")
+ (match_operand:DF 2 "general_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]))
+ return \"f%&sub%.x %2,%0\";
+ return \"f%&sub%.d %f2,%0\";
+ }")
+
+ (define_expand "subsf3"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (minus:SF (match_operand:SF 1 "general_operand" "")
+ (match_operand:SF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=x,y,y")
+ (minus:SF (match_operand:SF 1 "general_operand" "xH,y,rmF")
+ (match_operand:SF 2 "general_operand" "xH,rmF,0")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fprsub%.s %w1,%0\";
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpsub%.s %w2,%0\";
+ if (which_alternative == 0)
+ return \"fpsub3%.s %w2,%w1,%0\";
+ return \"fpsub3%.s %2,%1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (minus:SF (match_operand:SF 1 "general_operand" "0")
+ (match_operand:SF 2 "general_operand" "fdmF")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
+ return \"f%$sub%.x %2,%0\";
+ return \"f%$sub%.s %f2,%0\";
+ }")
+
+ ;; multiply instructions
+
+ (define_insn "mulhi3"
+ [(set (match_operand:HI 0 "general_operand" "=d")
+ (mult:HI (match_operand:HI 1 "general_operand" "%0")
+ (match_operand:HI 2 "general_operand" "dmn")))]
+ ""
+ "*
+ {
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"muls%.w %2,%0\";
+ #else
+ return \"muls %2,%0\";
+ #endif
+ }")
+
+ (define_insn "mulhisi3"
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (mult:SI (sign_extend:SI
+ (match_operand:HI 1 "nonimmediate_operand" "%0"))
+ (sign_extend:SI
+ (match_operand:HI 2 "nonimmediate_operand" "dm"))))]
+ ""
+ "*
+ {
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"muls%.w %2,%0\";
+ #else
+ return \"muls %2,%0\";
+ #endif
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (mult:SI (sign_extend:SI
+ (match_operand:HI 1 "nonimmediate_operand" "%0"))
+ (match_operand:SI 2 "const_int_operand" "n")))]
+ "INTVAL (operands[2]) >= -0x8000 && INTVAL (operands[2]) <= 0x7fff"
+ "*
+ {
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"muls%.w %2,%0\";
+ #else
+ return \"muls %2,%0\";
+ #endif
+ }")
+
+ (define_insn "mulsi3"
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (mult:SI (match_operand:SI 1 "general_operand" "%0")
+ (match_operand:SI 2 "general_operand" "dmsK")))]
+ "TARGET_68020"
+ "muls%.l %2,%0")
+
+ (define_insn "umulhisi3"
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (mult:SI (zero_extend:SI
+ (match_operand:HI 1 "nonimmediate_operand" "%0"))
+ (zero_extend:SI
+ (match_operand:HI 2 "nonimmediate_operand" "dm"))))]
+ ""
+ "*
+ {
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"mulu%.w %2,%0\";
+ #else
+ return \"mulu %2,%0\";
+ #endif
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (mult:SI (zero_extend:SI
+ (match_operand:HI 1 "nonimmediate_operand" "%0"))
+ (match_operand:SI 2 "const_int_operand" "n")))]
+ "INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 0xffff"
+ "*
+ {
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"mulu%.w %2,%0\";
+ #else
+ return \"mulu %2,%0\";
+ #endif
+ }")
+
+ ;; We need a separate DEFINE_EXPAND for u?mulsidi3 to be able to use the
+ ;; proper matching constraint. This is because the matching is between
+ ;; the high-numbered word of the DImode operand[0] and operand[1].
+ (define_expand "umulsidi3"
+ [(parallel
+ [(set (subreg:SI (match_operand:DI 0 "register_operand" "") 1)
+ (mult:SI (match_operand:SI 1 "register_operand" "")
+ (match_operand:SI 2 "nonimmediate_operand" "")))
+ (set (subreg:SI (match_dup 0) 0)
+ (truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1))
+ (zero_extend:DI (match_dup 2)))
+ (const_int 32))))])]
+ "TARGET_68020"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (mult:SI (match_operand:SI 1 "register_operand" "%0")
+ (match_operand:SI 2 "nonimmediate_operand" "dm")))
+ (set (match_operand:SI 3 "register_operand" "=d")
+ (truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1))
+ (zero_extend:DI (match_dup 2)))
+ (const_int 32))))]
+ "TARGET_68020"
+ "mulu%.l %2,%3:%0")
+
+ ; Match immediate case. For 2.4 only match things < 2^31.
+ ; It's tricky with larger values in these patterns since we need to match
+ ; values between the two parallel multiplies, between a CONST_DOUBLE and
+ ; a CONST_INT.
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (mult:SI (match_operand:SI 1 "register_operand" "%0")
+ (match_operand:SI 2 "const_int_operand" "n")))
+ (set (match_operand:SI 3 "register_operand" "=d")
+ (truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1))
+ (match_dup 2))
+ (const_int 32))))]
+ "TARGET_68020
+ && (unsigned) INTVAL (operands[2]) <= 0x7fffffff"
+ "mulu%.l %2,%3:%0")
+
+ (define_expand "mulsidi3"
+ [(parallel
+ [(set (subreg:SI (match_operand:DI 0 "register_operand" "") 1)
+ (mult:SI (match_operand:SI 1 "register_operand" "")
+ (match_operand:SI 2 "nonimmediate_operand" "")))
+ (set (subreg:SI (match_dup 0) 0)
+ (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_dup 1))
+ (sign_extend:DI (match_dup 2)))
+ (const_int 32))))])]
+ "TARGET_68020"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (mult:SI (match_operand:SI 1 "register_operand" "%0")
+ (match_operand:SI 2 "nonimmediate_operand" "dm")))
+ (set (match_operand:SI 3 "register_operand" "=d")
+ (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_dup 1))
+ (sign_extend:DI (match_dup 2)))
+ (const_int 32))))]
+ "TARGET_68020"
+ "muls%.l %2,%3:%0")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (mult:SI (match_operand:SI 1 "register_operand" "%0")
+ (match_operand:SI 2 "const_int_operand" "n")))
+ (set (match_operand:SI 3 "register_operand" "=d")
+ (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_dup 1))
+ (match_dup 2))
+ (const_int 32))))]
+ "TARGET_68020
+ /* This test is a noop on 32 bit machines,
+ but important for a cross-compiler hosted on 64-bit machines. */
+ && INTVAL (operands[2]) <= 0x7fffffff
+ && INTVAL (operands[2]) >= -0x80000000"
+ "muls%.l %2,%3:%0")
+
+ (define_expand "muldf3"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (mult:DF (match_operand:DF 1 "general_operand" "")
+ (match_operand:DF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=x,y")
+ (mult:DF (match_operand:DF 1 "general_operand" "%xH,y")
+ (match_operand:DF 2 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[1], operands[2]))
+ return \"fpsqr%.d %y1,%0\";
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpmul%.d %y2,%0\";
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fpmul%.d %y1,%0\";
+ if (which_alternative == 0)
+ return \"fpmul3%.d %w2,%w1,%0\";
+ return \"fpmul3%.d %x2,%x1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (mult:DF (match_operand:DF 1 "general_operand" "%0")
+ (match_operand:DF 2 "general_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (GET_CODE (operands[2]) == CONST_DOUBLE
+ && floating_exact_log2 (operands[2]) && !TARGET_68040)
+ {
+ int i = floating_exact_log2 (operands[2]);
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, i);
+ return \"fscale%.l %2,%0\";
+ }
+ if (REG_P (operands[2]))
+ return \"f%&mul%.x %2,%0\";
+ return \"f%&mul%.d %f2,%0\";
+ }")
+
+ (define_expand "mulsf3"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (mult:SF (match_operand:SF 1 "general_operand" "")
+ (match_operand:SF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=x,y")
+ (mult:SF (match_operand:SF 1 "general_operand" "%xH,y")
+ (match_operand:SF 2 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[1], operands[2]))
+ return \"fpsqr%.s %w1,%0\";
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpmul%.s %w2,%0\";
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fpmul%.s %w1,%0\";
+ if (which_alternative == 0)
+ return \"fpmul3%.s %w2,%w1,%0\";
+ return \"fpmul3%.s %2,%1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (mult:SF (match_operand:SF 1 "general_operand" "%0")
+ (match_operand:SF 2 "general_operand" "fdmF")))]
+ "TARGET_68881"
+ "*
+ {
+ #ifdef FSGLMUL_USE_S
+ if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
+ return (TARGET_68040_ONLY
+ ? \"fsmul%.s %2,%0\"
+ : \"fsglmul%.s %2,%0\");
+ #else
+ if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
+ return (TARGET_68040_ONLY
+ ? \"fsmul%.x %2,%0\"
+ : \"fsglmul%.x %2,%0\");
+ #endif
+ return (TARGET_68040_ONLY
+ ? \"fsmul%.s %f2,%0\"
+ : \"fsglmul%.s %f2,%0\");
+ }")
+
+ ;; divide instructions
+
+ (define_insn "divhi3"
+ [(set (match_operand:HI 0 "general_operand" "=d")
+ (div:HI (match_operand:HI 1 "general_operand" "0")
+ (match_operand:HI 2 "general_operand" "dmn")))]
+ ""
+ "*
+ {
+ #ifdef MOTOROLA
+ return \"ext%.l %0\;divs%.w %2,%0\";
+ #else
+ return \"extl %0\;divs %2,%0\";
+ #endif
+ }")
+
+ ;; These patterns don't work because the divs instruction is undefined if
+ ;; the quotient is more than 16 bits. This valid C would be miscompiled:
+ ;; int n; short d; unsigned short q; ... q = (unsigned int) (n / d);
+ ;; Imagine what happens when n = 100000 and d = 1.
+ ;;(define_insn "divhisi3"
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI
+ ;; (div:SI
+ ;; (match_operand:SI 1 "general_operand" "0")
+ ;; (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;;#ifdef MOTOROLA
+ ;; return \"divs%.w %2,%0\";
+ ;;#else
+ ;; return \"divs %2,%0\";
+ ;;#endif
+ ;;}")
+
+ ;;(define_insn ""
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI (div:SI (match_operand:SI 1 "general_operand" "0")
+ ;; (match_operand:SI 2 "const_int_operand" "n"))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;;#ifdef MOTOROLA
+ ;; return \"divs%.w %2,%0\";
+ ;;#else
+ ;; return \"divs %2,%0\";
+ ;;#endif
+ ;;}")
+
+ (define_insn "udivhi3"
+ [(set (match_operand:HI 0 "general_operand" "=d")
+ (udiv:HI (match_operand:HI 1 "general_operand" "0")
+ (match_operand:HI 2 "general_operand" "dmn")))]
+ ""
+ "*
+ {
+ #ifdef MOTOROLA
+ return \"and%.l %#0xFFFF,%0\;divu%.w %2,%0\";
+ #else
+ return \"andl %#0xFFFF,%0\;divu %2,%0\";
+ #endif
+ }")
+
+ ;; See comment before divhisi3 why these are commented out.
+ ;;(define_insn "udivhisi3"
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI
+ ;; (udiv:SI
+ ;; (match_operand:SI 1 "general_operand" "0")
+ ;; (zero_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;;#ifdef MOTOROLA
+ ;; return \"divu%.w %2,%0\";
+ ;;#else
+ ;; return \"divu %2,%0\";
+ ;;#endif
+ ;;}")
+
+ ;;(define_insn ""
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI (udiv:SI (match_operand:SI 1 "general_operand" "0")
+ ;; (match_operand:SI 2 "const_int_operand" "n"))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;;#ifdef MOTOROLA
+ ;; return \"divu%.w %2,%0\";
+ ;;#else
+ ;; return \"divu %2,%0\";
+ ;;#endif
+ ;;}")
+
+ (define_expand "divdf3"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (div:DF (match_operand:DF 1 "general_operand" "")
+ (match_operand:DF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=x,y,y")
+ (div:DF (match_operand:DF 1 "general_operand" "xH,y,rmF")
+ (match_operand:DF 2 "general_operand" "xH,rmF,0")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fprdiv%.d %y1,%0\";
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpdiv%.d %y2,%0\";
+ if (which_alternative == 0)
+ return \"fpdiv3%.d %w2,%w1,%0\";
+ return \"fpdiv3%.d %x2,%x1,%x0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (div:DF (match_operand:DF 1 "general_operand" "0")
+ (match_operand:DF 2 "general_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]))
+ return \"f%&div%.x %2,%0\";
+ return \"f%&div%.d %f2,%0\";
+ }")
+
+ (define_expand "divsf3"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (div:SF (match_operand:SF 1 "general_operand" "")
+ (match_operand:SF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=x,y,y")
+ (div:SF (match_operand:SF 1 "general_operand" "xH,y,rmF")
+ (match_operand:SF 2 "general_operand" "xH,rmF,0")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpdiv%.s %w2,%0\";
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fprdiv%.s %w1,%0\";
+ if (which_alternative == 0)
+ return \"fpdiv3%.s %w2,%w1,%0\";
+ return \"fpdiv3%.s %2,%1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (div:SF (match_operand:SF 1 "general_operand" "0")
+ (match_operand:SF 2 "general_operand" "fdmF")))]
+ "TARGET_68881"
+ "*
+ {
+ #ifdef FSGLDIV_USE_S
+ if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
+ return (TARGET_68040_ONLY
+ ? \"fsdiv%.s %2,%0\"
+ : \"fsgldiv%.s %2,%0\");
+ #else
+ if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
+ return (TARGET_68040_ONLY
+ ? \"fsdiv%.x %2,%0\"
+ : \"fsgldiv%.x %2,%0\");
+ #endif
+ return (TARGET_68040_ONLY
+ ? \"fsdiv%.s %f2,%0\"
+ : \"fsgldiv%.s %f2,%0\");
+ }")
+
+ ;; Remainder instructions.
+
+ (define_insn "modhi3"
+ [(set (match_operand:HI 0 "general_operand" "=d")
+ (mod:HI (match_operand:HI 1 "general_operand" "0")
+ (match_operand:HI 2 "general_operand" "dmn")))]
+ ""
+ "*
+ {
+ /* The swap insn produces cc's that don't correspond to the result. */
+ CC_STATUS_INIT;
+ #ifdef MOTOROLA
+ return \"ext%.l %0\;divs%.w %2,%0\;swap %0\";
+ #else
+ return \"extl %0\;divs %2,%0\;swap %0\";
+ #endif
+ }")
+
+ ;; See comment before divhisi3 why these are commented out.
+ ;;(define_insn "modhisi3"
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI
+ ;; (mod:SI
+ ;; (match_operand:SI 1 "general_operand" "0")
+ ;; (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;; /* The swap insn produces cc's that don't correspond to the result. */
+ ;; CC_STATUS_INIT;
+ ;;#ifdef MOTOROLA
+ ;; return \"divs%.w %2,%0\;swap %0\";
+ ;;#else
+ ;; return \"divs %2,%0\;swap %0\";
+ ;;#endif
+ ;;}")
+
+ ;;(define_insn ""
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI (mod:SI (match_operand:SI 1 "general_operand" "0")
+ ;; (match_operand:SI 2 "const_int_operand" "n"))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;; /* The swap insn produces cc's that don't correspond to the result. */
+ ;; CC_STATUS_INIT;
+ ;;#ifdef MOTOROLA
+ ;; return \"divs%.w %2,%0\;swap %0\";
+ ;;#else
+ ;; return \"divs %2,%0\;swap %0\";
+ ;;#endif
+ ;;}")
+
+ (define_insn "umodhi3"
+ [(set (match_operand:HI 0 "general_operand" "=d")
+ (umod:HI (match_operand:HI 1 "general_operand" "0")
+ (match_operand:HI 2 "general_operand" "dmn")))]
+ ""
+ "*
+ {
+ /* The swap insn produces cc's that don't correspond to the result. */
+ CC_STATUS_INIT;
+ #ifdef MOTOROLA
+ return \"and%.l %#0xFFFF,%0\;divu%.w %2,%0\;swap %0\";
+ #else
+ return \"andl %#0xFFFF,%0\;divu %2,%0\;swap %0\";
+ #endif
+ }")
+
+ ;; See comment before divhisi3 why these are commented out.
+ ;;(define_insn "umodhisi3"
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI
+ ;; (umod:SI
+ ;; (match_operand:SI 1 "general_operand" "0")
+ ;; (zero_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;; /* The swap insn produces cc's that don't correspond to the result. */
+ ;; CC_STATUS_INIT;
+ ;;#ifdef MOTOROLA
+ ;; return \"divu%.w %2,%0\;swap %0\";
+ ;;#else
+ ;; return \"divu %2,%0\;swap %0\";
+ ;;#endif
+ ;;}")
+
+ ;;(define_insn ""
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI (umod:SI (match_operand:SI 1 "general_operand" "0")
+ ;; (match_operand:SI 2 "const_int_operand" "n"))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;; /* The swap insn produces cc's that don't correspond to the result. */
+ ;; CC_STATUS_INIT;
+ ;;#ifdef MOTOROLA
+ ;; return \"divu%.w %2,%0\;swap %0\";
+ ;;#else
+ ;; return \"divu %2,%0\;swap %0\";
+ ;;#endif
+ ;;}")
+
+ (define_insn "divmodsi4"
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (div:SI (match_operand:SI 1 "general_operand" "0")
+ (match_operand:SI 2 "general_operand" "dmsK")))
+ (set (match_operand:SI 3 "general_operand" "=d")
+ (mod:SI (match_dup 1) (match_dup 2)))]
+ "TARGET_68020"
+ "*
+ {
+ if (find_reg_note (insn, REG_UNUSED, operands[3]))
+ return \"divs%.l %2,%0\";
+ else
+ return \"divsl%.l %2,%3:%0\";
+ }")
+
+ (define_insn "udivmodsi4"
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (udiv:SI (match_operand:SI 1 "general_operand" "0")
+ (match_operand:SI 2 "general_operand" "dmsK")))
+ (set (match_operand:SI 3 "general_operand" "=d")
+ (umod:SI (match_dup 1) (match_dup 2)))]
+ "TARGET_68020"
+ "*
+ {
+ if (find_reg_note (insn, REG_UNUSED, operands[3]))
+ return \"divu%.l %2,%0\";
+ else
+ return \"divul%.l %2,%3:%0\";
+ }")
+
+ ;; logical-and instructions
+
+ ;; Prevent AND from being made with sp. This doesn't exist in the machine
+ ;; and reload will cause inefficient code. Since sp is a FIXED_REG, we
+ ;; can't allocate pseudos into it.
+ (define_insn "andsi3"
+ [(set (match_operand:SI 0 "not_sp_operand" "=m,d")
+ (and:SI (match_operand:SI 1 "general_operand" "%0,0")
+ (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
+ ""
+ "*
+ {
+ int logval;
+ if (GET_CODE (operands[2]) == CONST_INT
+ && (INTVAL (operands[2]) | 0xffff) == 0xffffffff
+ && (DATA_REG_P (operands[0])
+ || offsettable_memref_p (operands[0])))
+ {
+ if (GET_CODE (operands[0]) != REG)
+ operands[0] = adj_offsettable_operand (operands[0], 2);
+ operands[2] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (operands[2]) & 0xffff);
+ /* Do not delete a following tstl %0 insn; that would be incorrect. */
+ CC_STATUS_INIT;
+ if (operands[2] == const0_rtx)
+ return \"clr%.w %0\";
+ return \"and%.w %2,%0\";
+ }
+ if (GET_CODE (operands[2]) == CONST_INT
+ && (logval = exact_log2 (~ INTVAL (operands[2]))) >= 0
+ && (DATA_REG_P (operands[0])
+ || offsettable_memref_p (operands[0])))
+ {
+ if (DATA_REG_P (operands[0]))
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, logval);
+ }
+ else
+ {
+ operands[0] = adj_offsettable_operand (operands[0], 3 - (logval / 8)); operands[1] = gen_rtx (CONST_INT, VOIDmode, logval % 8);
+ }
+ /* This does not set condition codes in a standard way. */
+ CC_STATUS_INIT;
+ return \"bclr %1,%0\";
+ }
+ return \"and%.l %2,%0\";
+ }")
+
+ (define_insn "andhi3"
+ [(set (match_operand:HI 0 "general_operand" "=m,d")
+ (and:HI (match_operand:HI 1 "general_operand" "%0,0")
+ (match_operand:HI 2 "general_operand" "dn,dmn")))]
+ ""
+ "and%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
+ (and:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dn,dmn")))]
+ ""
+ "and%.w %1,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
+ (and:HI (match_operand:HI 1 "general_operand" "dn,dmn")
+ (match_dup 0)))]
+ ""
+ "and%.w %1,%0")
+
+ (define_insn "andqi3"
+ [(set (match_operand:QI 0 "general_operand" "=m,d")
+ (and:QI (match_operand:QI 1 "general_operand" "%0,0")
+ (match_operand:QI 2 "general_operand" "dn,dmn")))]
+ ""
+ "and%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
+ (and:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dn,dmn")))]
+ ""
+ "and%.b %1,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
+ (and:QI (match_operand:QI 1 "general_operand" "dn,dmn")
+ (match_dup 0)))]
+ ""
+ "and%.b %1,%0")
+
+ ;; inclusive-or instructions
+
+ (define_insn "iorsi3"
+ [(set (match_operand:SI 0 "general_operand" "=m,d")
+ (ior:SI (match_operand:SI 1 "general_operand" "%0,0")
+ (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
+ ""
+ "*
+ {
+ register int logval;
+ if (GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) >> 16 == 0
+ && (DATA_REG_P (operands[0])
+ || offsettable_memref_p (operands[0])))
+ {
+ if (GET_CODE (operands[0]) != REG)
+ operands[0] = adj_offsettable_operand (operands[0], 2);
+ /* Do not delete a following tstl %0 insn; that would be incorrect. */
+ CC_STATUS_INIT;
+ return \"or%.w %2,%0\";
+ }
+ if (GET_CODE (operands[2]) == CONST_INT
+ && (logval = exact_log2 (INTVAL (operands[2]))) >= 0
+ && (DATA_REG_P (operands[0])
+ || offsettable_memref_p (operands[0])))
+ {
+ if (DATA_REG_P (operands[0]))
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, logval);
+ }
+ else
+ {
+ operands[0] = adj_offsettable_operand (operands[0], 3 - (logval / 8));
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, logval % 8);
+ }
+ CC_STATUS_INIT;
+ return \"bset %1,%0\";
+ }
+ return \"or%.l %2,%0\";
+ }")
+
+ (define_insn "iorhi3"
+ [(set (match_operand:HI 0 "general_operand" "=m,d")
+ (ior:HI (match_operand:HI 1 "general_operand" "%0,0")
+ (match_operand:HI 2 "general_operand" "dn,dmn")))]
+ ""
+ "or%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
+ (ior:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dn,dmn")))]
+ ""
+ "or%.w %1,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
+ (ior:HI (match_operand:HI 1 "general_operand" "dn,dmn")
+ (match_dup 0)))]
+ ""
+ "or%.w %1,%0")
+
+ (define_insn "iorqi3"
+ [(set (match_operand:QI 0 "general_operand" "=m,d")
+ (ior:QI (match_operand:QI 1 "general_operand" "%0,0")
+ (match_operand:QI 2 "general_operand" "dn,dmn")))]
+ ""
+ "or%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
+ (ior:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dn,dmn")))]
+ ""
+ "or%.b %1,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
+ (ior:QI (match_operand:QI 1 "general_operand" "dn,dmn")
+ (match_dup 0)))]
+ ""
+ "or%.b %1,%0")
+
+ ;; xor instructions
+
+ (define_insn "xorsi3"
+ [(set (match_operand:SI 0 "general_operand" "=do,m")
+ (xor:SI (match_operand:SI 1 "general_operand" "%0,0")
+ (match_operand:SI 2 "general_operand" "di,dKs")))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) >> 16 == 0
+ && (offsettable_memref_p (operands[0]) || DATA_REG_P (operands[0])))
+ {
+ if (! DATA_REG_P (operands[0]))
+ operands[0] = adj_offsettable_operand (operands[0], 2);
+ /* Do not delete a following tstl %0 insn; that would be incorrect. */
+ CC_STATUS_INIT;
+ return \"eor%.w %2,%0\";
+ }
+ return \"eor%.l %2,%0\";
+ }")
+
+ (define_insn "xorhi3"
+ [(set (match_operand:HI 0 "general_operand" "=dm")
+ (xor:HI (match_operand:HI 1 "general_operand" "%0")
+ (match_operand:HI 2 "general_operand" "dn")))]
+ ""
+ "eor%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm"))
+ (xor:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dn")))]
+ ""
+ "eor%.w %1,%0")
+
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm"))
+ (xor:HI (match_operand:HI 1 "general_operand" "dn")
+ (match_dup 0)))]
+ ""
+ "eor%.w %1,%0")
+
+ (define_insn "xorqi3"
+ [(set (match_operand:QI 0 "general_operand" "=dm")
+ (xor:QI (match_operand:QI 1 "general_operand" "%0")
+ (match_operand:QI 2 "general_operand" "dn")))]
+ ""
+ "eor%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm"))
+ (xor:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dn")))]
+ ""
+ "eor%.b %1,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm"))
+ (xor:QI (match_operand:QI 1 "general_operand" "dn")
+ (match_dup 0)))]
+ ""
+ "eor%.b %1,%0")
+
+ ;; negation instructions
+
+ (define_insn "negsi2"
+ [(set (match_operand:SI 0 "general_operand" "=dm")
+ (neg:SI (match_operand:SI 1 "general_operand" "0")))]
+ ""
+ "neg%.l %0")
+
+ (define_insn "neghi2"
+ [(set (match_operand:HI 0 "general_operand" "=dm")
+ (neg:HI (match_operand:HI 1 "general_operand" "0")))]
+ ""
+ "neg%.w %0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm"))
+ (neg:HI (match_dup 0)))]
+ ""
+ "neg%.w %0")
+
+ (define_insn "negqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm")
+ (neg:QI (match_operand:QI 1 "general_operand" "0")))]
+ ""
+ "neg%.b %0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm"))
+ (neg:QI (match_dup 0)))]
+ ""
+ "neg%.b %0")
+
+ (define_expand "negsf2"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (neg:SF (match_operand:SF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=x,y")
+ (neg:SF (match_operand:SF 1 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "fpneg%.s %w1,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f,d")
+ (neg:SF (match_operand:SF 1 "general_operand" "fdmF,0")))]
+ "TARGET_68881"
+ "*
+ {
+ if (DATA_REG_P (operands[0]))
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, 31);
+ return \"bchg %1,%0\";
+ }
+ if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
+ return \"f%$neg%.x %1,%0\";
+ return \"f%$neg%.s %f1,%0\";
+ }")
+
+ (define_expand "negdf2"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (neg:DF (match_operand:DF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=x,y")
+ (neg:DF (match_operand:DF 1 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "fpneg%.d %y1, %0")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=f,d")
+ (neg:DF (match_operand:DF 1 "general_operand" "fmF,0")))]
+ "TARGET_68881"
+ "*
+ {
+ if (DATA_REG_P (operands[0]))
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, 31);
+ return \"bchg %1,%0\";
+ }
+ if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
+ return \"f%&neg%.x %1,%0\";
+ return \"f%&neg%.d %f1,%0\";
+ }")
+
+ ;; Sqrt instruction for the 68881
+
+ (define_insn "sqrtdf2"
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (sqrt:DF (match_operand:DF 1 "general_operand" "fm")))]
+ "TARGET_68881"
+ "*
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fsqrt%.x %1,%0\";
+ else
+ return \"fsqrt%.d %1,%0\";
+ }")
+
+ ;; Absolute value instructions
+
+ (define_expand "abssf2"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (abs:SF (match_operand:SF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=x,y")
+ (abs:SF (match_operand:SF 1 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "fpabs%.s %y1,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (abs:SF (match_operand:SF 1 "general_operand" "fdmF")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
+ return \"f%$abs%.x %1,%0\";
+ return \"f%$abs%.s %f1,%0\";
+ }")
+
+ (define_expand "absdf2"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (abs:DF (match_operand:DF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=x,y")
+ (abs:DF (match_operand:DF 1 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "fpabs%.d %y1,%0")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (abs:DF (match_operand:DF 1 "general_operand" "fmF")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
+ return \"f%&abs%.x %1,%0\";
+ return \"f%&abs%.d %f1,%0\";
+ }")
+
+ ;; one complement instructions
+
+ (define_insn "one_cmplsi2"
+ [(set (match_operand:SI 0 "general_operand" "=dm")
+ (not:SI (match_operand:SI 1 "general_operand" "0")))]
+ ""
+ "not%.l %0")
+
+ (define_insn "one_cmplhi2"
+ [(set (match_operand:HI 0 "general_operand" "=dm")
+ (not:HI (match_operand:HI 1 "general_operand" "0")))]
+ ""
+ "not%.w %0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm"))
+ (not:HI (match_dup 0)))]
+ ""
+ "not%.w %0")
+
+ (define_insn "one_cmplqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm")
+ (not:QI (match_operand:QI 1 "general_operand" "0")))]
+ ""
+ "not%.b %0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm"))
+ (not:QI (match_dup 0)))]
+ ""
+ "not%.b %0")
+
+ ;; arithmetic shift instructions
+ ;; We don't need the shift memory by 1 bit instruction
+
+ ;; On all 68k models, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (ashift:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 16)"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"swap %0\;clr%.w %0\";
+ }")
+
+ ;; On the 68000, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (ashift:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(! TARGET_68020 && GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 24)"
+ "*
+ {
+ CC_STATUS_INIT;
+
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 16);
+ return \"asl%.w %2,%0\;swap %0\;clr%.w %0\";
+ }")
+
+ (define_insn "ashlsi3"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (ashift:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "general_operand" "dI")))]
+ ""
+ "*
+ {
+ if (operands[2] == const1_rtx)
+ return \"add%.l %0,%0\";
+ return \"asl%.l %2,%0\";
+ }")
+
+ (define_insn "ashlhi3"
+ [(set (match_operand:HI 0 "register_operand" "=d")
+ (ashift:HI (match_operand:HI 1 "register_operand" "0")
+ (match_operand:HI 2 "general_operand" "dI")))]
+ ""
+ "asl%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d"))
+ (ashift:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dI")))]
+ ""
+ "asl%.w %1,%0")
+
+ (define_insn "ashlqi3"
+ [(set (match_operand:QI 0 "register_operand" "=d")
+ (ashift:QI (match_operand:QI 1 "register_operand" "0")
+ (match_operand:QI 2 "general_operand" "dI")))]
+ ""
+ "asl%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d"))
+ (ashift:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dI")))]
+ ""
+ "asl%.b %1,%0")
+
+ ;; On all 68k models, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (ashiftrt:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 16)"
+ "swap %0\;ext%.l %0")
+
+ ;; On the 68000, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (ashiftrt:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(! TARGET_68020 && GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 24)"
+ "*
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 16);
+ return \"swap %0\;asr%.w %2,%0\;ext%.l %0\";
+ }")
+
+ (define_insn "ashrsi3"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (ashiftrt:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "general_operand" "dI")))]
+ ""
+ "*
+ {
+ return \"asr%.l %2,%0\";
+ }")
+
+ (define_insn "ashrhi3"
+ [(set (match_operand:HI 0 "register_operand" "=d")
+ (ashiftrt:HI (match_operand:HI 1 "register_operand" "0")
+ (match_operand:HI 2 "general_operand" "dI")))]
+ ""
+ "asr%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d"))
+ (ashiftrt:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dI")))]
+ ""
+ "asr%.w %1,%0")
+
+ (define_insn "ashrqi3"
+ [(set (match_operand:QI 0 "register_operand" "=d")
+ (ashiftrt:QI (match_operand:QI 1 "register_operand" "0")
+ (match_operand:QI 2 "general_operand" "dI")))]
+ ""
+ "asr%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d"))
+ (ashiftrt:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dI")))]
+ ""
+ "asr%.b %1,%0")
+
+ ;; logical shift instructions
+
+ ;; On all 68k models, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (lshift:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 16)"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"swap %0\;clr%.w %0\";
+ }")
+
+ ;; On the 68000, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (lshift:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(! TARGET_68020 && GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 24)"
+ "*
+ {
+ CC_STATUS_INIT;
+
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 16);
+ return \"lsl%.w %2,%0\;swap %0\;clr%.w %0\";
+ }")
+
+ (define_insn "lshlsi3"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (lshift:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "general_operand" "dI")))]
+ ""
+ "*
+ {
+ if (operands[2] == const1_rtx)
+ return \"add%.l %0,%0\";
+ return \"lsl%.l %2,%0\";
+ }")
+
+ (define_insn "lshlhi3"
+ [(set (match_operand:HI 0 "register_operand" "=d")
+ (lshift:HI (match_operand:HI 1 "register_operand" "0")
+ (match_operand:HI 2 "general_operand" "dI")))]
+ ""
+ "lsl%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d"))
+ (lshift:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dI")))]
+ ""
+ "lsl%.w %1,%0")
+
+ (define_insn "lshlqi3"
+ [(set (match_operand:QI 0 "register_operand" "=d")
+ (lshift:QI (match_operand:QI 1 "register_operand" "0")
+ (match_operand:QI 2 "general_operand" "dI")))]
+ ""
+ "lsl%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d"))
+ (lshift:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dI")))]
+ ""
+ "lsl%.b %1,%0")
+
+ ;; On all 68k models, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (lshiftrt:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 16)"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"clr%.w %0\;swap %0\";
+ }")
+
+ ;; On the 68000, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (lshiftrt:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(! TARGET_68020 && GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 24)"
+ "*
+ {
+ /* I think lsr%.w sets the CC properly. */
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 16);
+ return \"clr%.w %0\;swap %0\;lsr%.w %2,%0\";
+ }")
+
+ (define_insn "lshrsi3"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (lshiftrt:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "general_operand" "dI")))]
+ ""
+ "*
+ {
+ return \"lsr%.l %2,%0\";
+ }")
+
+ (define_insn "lshrhi3"
+ [(set (match_operand:HI 0 "register_operand" "=d")
+ (lshiftrt:HI (match_operand:HI 1 "register_operand" "0")
+ (match_operand:HI 2 "general_operand" "dI")))]
+ ""
+ "lsr%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d"))
+ (lshiftrt:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dI")))]
+ ""
+ "lsr%.w %1,%0")
+
+ (define_insn "lshrqi3"
+ [(set (match_operand:QI 0 "register_operand" "=d")
+ (lshiftrt:QI (match_operand:QI 1 "register_operand" "0")
+ (match_operand:QI 2 "general_operand" "dI")))]
+ ""
+ "lsr%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d"))
+ (lshiftrt:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dI")))]
+ ""
+ "lsr%.b %1,%0")
+
+ ;; rotate instructions
+
+ (define_insn "rotlsi3"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (rotate:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "general_operand" "dI")))]
+ ""
+ "rol%.l %2,%0")
+
+ (define_insn "rotlhi3"
+ [(set (match_operand:HI 0 "register_operand" "=d")
+ (rotate:HI (match_operand:HI 1 "register_operand" "0")
+ (match_operand:HI 2 "general_operand" "dI")))]
+ ""
+ "rol%.w %2,%0")
+
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d"))
+ (rotate:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dI")))]
+ ""
+ "rol%.w %1,%0")
+
+ (define_insn "rotlqi3"
+ [(set (match_operand:QI 0 "register_operand" "=d")
+ (rotate:QI (match_operand:QI 1 "register_operand" "0")
+ (match_operand:QI 2 "general_operand" "dI")))]
+ ""
+ "rol%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d"))
+ (rotate:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dI")))]
+ ""
+ "rol%.b %1,%0")
+
+ (define_insn "rotrsi3"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (rotatert:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "general_operand" "dI")))]
+ ""
+ "ror%.l %2,%0")
+
+ (define_insn "rotrhi3"
+ [(set (match_operand:HI 0 "register_operand" "=d")
+ (rotatert:HI (match_operand:HI 1 "register_operand" "0")
+ (match_operand:HI 2 "general_operand" "dI")))]
+ ""
+ "ror%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d"))
+ (rotatert:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dI")))]
+ ""
+ "ror%.w %1,%0")
+
+ (define_insn "rotrqi3"
+ [(set (match_operand:QI 0 "register_operand" "=d")
+ (rotatert:QI (match_operand:QI 1 "register_operand" "0")
+ (match_operand:QI 2 "general_operand" "dI")))]
+ ""
+ "ror%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d"))
+ (rotatert:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dI")))]
+ ""
+ "ror%.b %1,%0")
+
+ ;; Special cases of bit-field insns which we should
+ ;; recognize in preference to the general case.
+ ;; These handle aligned 8-bit and 16-bit fields,
+ ;; which can usually be done with move instructions.
+
+ ;
+ ; Special case for 32-bit field in memory. This only occurs when 32-bit
+ ; alignment of structure members is specified.
+ ;
+ ; The move is allowed to be odd byte aligned, because that's still faster
+ ; than an odd byte aligned bit field instruction.
+ ;
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o")
+ (match_operand:SI 1 "immediate_operand" "i")
+ (match_operand:SI 2 "immediate_operand" "i"))
+ (match_operand:SI 3 "general_operand" "rmi"))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[1]) == CONST_INT
+ && (INTVAL (operands[1]) == 32)
+ && GET_CODE (operands[2]) == CONST_INT
+ && (INTVAL (operands[2]) % 8) == 0
+ && ! mode_dependent_address_p (XEXP (operands[0], 0))"
+ "*
+ {
+ operands[0]
+ = adj_offsettable_operand (operands[0], INTVAL (operands[2]) / 8);
+
+ return \"move%.l %3,%0\";
+ }")
+
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+do")
+ (match_operand:SI 1 "immediate_operand" "i")
+ (match_operand:SI 2 "immediate_operand" "i"))
+ (match_operand:SI 3 "general_operand" "d"))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[1]) == CONST_INT
+ && (INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16)
+ && GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) % INTVAL (operands[1]) == 0
+ && (GET_CODE (operands[0]) == REG
+ || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
+ "*
+ {
+ if (REG_P (operands[0]))
+ {
+ if (INTVAL (operands[1]) + INTVAL (operands[2]) != 32)
+ return \"bfins %3,%0{%b2:%b1}\";
+ }
+ else
+ operands[0]
+ = adj_offsettable_operand (operands[0], INTVAL (operands[2]) / 8);
+
+ if (GET_CODE (operands[3]) == MEM)
+ operands[3] = adj_offsettable_operand (operands[3],
+ (32 - INTVAL (operands[1])) / 8);
+ if (INTVAL (operands[1]) == 8)
+ return \"move%.b %3,%0\";
+ return \"move%.w %3,%0\";
+ }")
+
+
+ ;
+ ; Special case for 32-bit field in memory. This only occurs when 32-bit
+ ; alignment of structure members is specified.
+ ;
+ ; The move is allowed to be odd byte aligned, because that's still faster
+ ; than an odd byte aligned bit field instruction.
+ ;
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=rm")
+ (zero_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o")
+ (match_operand:SI 2 "immediate_operand" "i")
+ (match_operand:SI 3 "immediate_operand" "i")))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[2]) == CONST_INT
+ && (INTVAL (operands[2]) == 32)
+ && GET_CODE (operands[3]) == CONST_INT
+ && (INTVAL (operands[3]) % 8) == 0
+ && ! mode_dependent_address_p (XEXP (operands[1], 0))"
+ "*
+ {
+ operands[1]
+ = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
+
+ return \"move%.l %1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=&d")
+ (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "do")
+ (match_operand:SI 2 "immediate_operand" "i")
+ (match_operand:SI 3 "immediate_operand" "i")))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[2]) == CONST_INT
+ && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
+ && GET_CODE (operands[3]) == CONST_INT
+ && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
+ && (GET_CODE (operands[1]) == REG
+ || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
+ "*
+ {
+ cc_status.flags |= CC_NOT_NEGATIVE;
+ if (REG_P (operands[1]))
+ {
+ if (INTVAL (operands[2]) + INTVAL (operands[3]) != 32)
+ return \"bfextu %1{%b3:%b2},%0\";
+ }
+ else
+ operands[1]
+ = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
+
+ output_asm_insn (\"clr%.l %0\", operands);
+ if (GET_CODE (operands[0]) == MEM)
+ operands[0] = adj_offsettable_operand (operands[0],
+ (32 - INTVAL (operands[1])) / 8);
+ if (INTVAL (operands[2]) == 8)
+ return \"move%.b %1,%0\";
+ return \"move%.w %1,%0\";
+ }")
+
+ ;
+ ; Special case for 32-bit field in memory. This only occurs when 32-bit
+ ; alignment of structure members is specified.
+ ;
+ ; The move is allowed to be odd byte aligned, because that's still faster
+ ; than an odd byte aligned bit field instruction.
+ ;
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=rm")
+ (sign_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o")
+ (match_operand:SI 2 "immediate_operand" "i")
+ (match_operand:SI 3 "immediate_operand" "i")))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[2]) == CONST_INT
+ && (INTVAL (operands[2]) == 32)
+ && GET_CODE (operands[3]) == CONST_INT
+ && (INTVAL (operands[3]) % 8) == 0
+ && ! mode_dependent_address_p (XEXP (operands[1], 0))"
+ "*
+ {
+ operands[1]
+ = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
+
+ return \"move%.l %1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "do")
+ (match_operand:SI 2 "immediate_operand" "i")
+ (match_operand:SI 3 "immediate_operand" "i")))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[2]) == CONST_INT
+ && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
+ && GET_CODE (operands[3]) == CONST_INT
+ && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
+ && (GET_CODE (operands[1]) == REG
+ || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
+ "*
+ {
+ if (REG_P (operands[1]))
+ {
+ if (INTVAL (operands[2]) + INTVAL (operands[3]) != 32)
+ return \"bfexts %1{%b3:%b2},%0\";
+ }
+ else
+ operands[1]
+ = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
+
+ if (INTVAL (operands[2]) == 8)
+ return \"move%.b %1,%0\;extb%.l %0\";
+ return \"move%.w %1,%0\;ext%.l %0\";
+ }")
+
+ ;; Bit field instructions, general cases.
+ ;; "o,d" constraint causes a nonoffsettable memref to match the "o"
+ ;; so that its address is reloaded.
+
+ (define_insn "extv"
+ [(set (match_operand:SI 0 "general_operand" "=d,d")
+ (sign_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o,d")
+ (match_operand:SI 2 "general_operand" "di,di")
+ (match_operand:SI 3 "general_operand" "di,di")))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "bfexts %1{%b3:%b2},%0")
+
+ (define_insn "extzv"
+ [(set (match_operand:SI 0 "general_operand" "=d,d")
+ (zero_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o,d")
+ (match_operand:SI 2 "general_operand" "di,di")
+ (match_operand:SI 3 "general_operand" "di,di")))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "*
+ {
+ if (GET_CODE (operands[2]) == CONST_INT)
+ {
+ if (INTVAL (operands[2]) != 32)
+ cc_status.flags |= CC_NOT_NEGATIVE;
+ }
+ else
+ {
+ CC_STATUS_INIT;
+ }
+ return \"bfextu %1{%b3:%b2},%0\";
+ }")
+
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d")
+ (match_operand:SI 1 "general_operand" "di,di")
+ (match_operand:SI 2 "general_operand" "di,di"))
+ (xor:SI (zero_extract:SI (match_dup 0) (match_dup 1) (match_dup 2))
+ (match_operand 3 "immediate_operand" "i,i")))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[3]) == CONST_INT
+ && (INTVAL (operands[3]) == -1
+ || (GET_CODE (operands[1]) == CONST_INT
+ && (~ INTVAL (operands[3]) & ((1 << INTVAL (operands[1]))- 1)) == 0))"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"bfchg %0{%b2:%b1}\";
+ }")
+
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d")
+ (match_operand:SI 1 "general_operand" "di,di")
+ (match_operand:SI 2 "general_operand" "di,di"))
+ (const_int 0))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"bfclr %0{%b2:%b1}\";
+ }")
+
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d")
+ (match_operand:SI 1 "general_operand" "di,di")
+ (match_operand:SI 2 "general_operand" "di,di"))
+ (const_int -1))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"bfset %0{%b2:%b1}\";
+ }")
+
+ (define_insn "insv"
+ [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d")
+ (match_operand:SI 1 "general_operand" "di,di")
+ (match_operand:SI 2 "general_operand" "di,di"))
+ (match_operand:SI 3 "general_operand" "d,d"))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "bfins %3,%0{%b2:%b1}")
+
+ ;; Now recognize bit field insns that operate on registers
+ ;; (or at least were intended to do so).
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "d")
+ (match_operand:SI 2 "general_operand" "di")
+ (match_operand:SI 3 "general_operand" "di")))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "bfexts %1{%b3:%b2},%0")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "d")
+ (match_operand:SI 2 "general_operand" "di")
+ (match_operand:SI 3 "general_operand" "di")))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "*
+ {
+ if (GET_CODE (operands[2]) == CONST_INT)
+ {
+ if (INTVAL (operands[2]) != 32)
+ cc_status.flags |= CC_NOT_NEGATIVE;
+ }
+ else
+ {
+ CC_STATUS_INIT;
+ }
+ return \"bfextu %1{%b3:%b2},%0\";
+ }")
+
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d")
+ (match_operand:SI 1 "general_operand" "di")
+ (match_operand:SI 2 "general_operand" "di"))
+ (const_int 0))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"bfclr %0{%b2:%b1}\";
+ }")
+
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d")
+ (match_operand:SI 1 "general_operand" "di")
+ (match_operand:SI 2 "general_operand" "di"))
+ (const_int -1))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"bfset %0{%b2:%b1}\";
+ }")
+
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d")
+ (match_operand:SI 1 "general_operand" "di")
+ (match_operand:SI 2 "general_operand" "di"))
+ (match_operand:SI 3 "general_operand" "d"))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "*
+ {
+ #if 0
+ /* These special cases are now recognized by a specific pattern. */
+ if (GET_CODE (operands[1]) == CONST_INT && GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[1]) == 16 && INTVAL (operands[2]) == 16)
+ return \"move%.w %3,%0\";
+ if (GET_CODE (operands[1]) == CONST_INT && GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[1]) == 24 && INTVAL (operands[2]) == 8)
+ return \"move%.b %3,%0\";
+ #endif
+ return \"bfins %3,%0{%b2:%b1}\";
+ }")
+
+ ;; Special patterns for optimizing bit-field instructions.
+
+ (define_insn ""
+ [(set (cc0)
+ (zero_extract:SI (match_operand:QI 0 "memory_operand" "o")
+ (match_operand:SI 1 "general_operand" "di")
+ (match_operand:SI 2 "general_operand" "di")))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[1]) == CONST_INT"
+ "*
+ {
+ if (operands[1] == const1_rtx
+ && GET_CODE (operands[2]) == CONST_INT)
+ {
+ int width = GET_CODE (operands[0]) == REG ? 31 : 7;
+ return output_btst (operands,
+ gen_rtx (CONST_INT, VOIDmode,
+ width - INTVAL (operands[2])),
+ operands[0],
+ insn, 1000);
+ /* Pass 1000 as SIGNPOS argument so that btst will
+ not think we are testing the sign bit for an `and'
+ and assume that nonzero implies a negative result. */
+ }
+ if (INTVAL (operands[1]) != 32)
+ cc_status.flags = CC_NOT_NEGATIVE;
+ return \"bftst %0{%b2:%b1}\";
+ }")
+
+
+ ;;; now handle the register cases
+ (define_insn ""
+ [(set (cc0)
+ (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "d")
+ (match_operand:SI 1 "general_operand" "di")
+ (match_operand:SI 2 "general_operand" "di")))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[1]) == CONST_INT"
+ "*
+ {
+ if (operands[1] == const1_rtx
+ && GET_CODE (operands[2]) == CONST_INT)
+ {
+ int width = GET_CODE (operands[0]) == REG ? 31 : 7;
+ return output_btst (operands,
+ gen_rtx (CONST_INT, VOIDmode,
+ width - INTVAL (operands[2])),
+ operands[0],
+ insn, 1000);
+ /* Pass 1000 as SIGNPOS argument so that btst will
+ not think we are testing the sign bit for an `and'
+ and assume that nonzero implies a negative result. */
+ }
+ if (INTVAL (operands[1]) != 32)
+ cc_status.flags = CC_NOT_NEGATIVE;
+ return \"bftst %0{%b2:%b1}\";
+ }")
+
+ (define_insn "seq"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (eq:QI (cc0) (const_int 0)))]
+ ""
+ "*
+ cc_status = cc_prev_status;
+ OUTPUT_JUMP (\"seq %0\", \"fseq %0\", \"seq %0\");
+ ")
+
+ (define_insn "sne"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (ne:QI (cc0) (const_int 0)))]
+ ""
+ "*
+ cc_status = cc_prev_status;
+ OUTPUT_JUMP (\"sne %0\", \"fsne %0\", \"sne %0\");
+ ")
+
+ (define_insn "sgt"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (gt:QI (cc0) (const_int 0)))]
+ ""
+ "*
+ cc_status = cc_prev_status;
+ OUTPUT_JUMP (\"sgt %0\", \"fsgt %0\", 0);
+ ")
+
+ (define_insn "sgtu"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (gtu:QI (cc0) (const_int 0)))]
+ ""
+ "* cc_status = cc_prev_status;
+ return \"shi %0\"; ")
+
+ (define_insn "slt"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (lt:QI (cc0) (const_int 0)))]
+ ""
+ "* cc_status = cc_prev_status;
+ OUTPUT_JUMP (\"slt %0\", \"fslt %0\", \"smi %0\"); ")
+
+ (define_insn "sltu"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (ltu:QI (cc0) (const_int 0)))]
+ ""
+ "* cc_status = cc_prev_status;
+ return \"scs %0\"; ")
+
+ (define_insn "sge"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (ge:QI (cc0) (const_int 0)))]
+ ""
+ "* cc_status = cc_prev_status;
+ OUTPUT_JUMP (\"sge %0\", \"fsge %0\", \"spl %0\"); ")
+
+ (define_insn "sgeu"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (geu:QI (cc0) (const_int 0)))]
+ ""
+ "* cc_status = cc_prev_status;
+ return \"scc %0\"; ")
+
+ (define_insn "sle"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (le:QI (cc0) (const_int 0)))]
+ ""
+ "*
+ cc_status = cc_prev_status;
+ OUTPUT_JUMP (\"sle %0\", \"fsle %0\", 0);
+ ")
+
+ (define_insn "sleu"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (leu:QI (cc0) (const_int 0)))]
+ ""
+ "* cc_status = cc_prev_status;
+ return \"sls %0\"; ")
+
+ ;; Basic conditional jump instructions.
+
+ (define_insn "beq"
+ [(set (pc)
+ (if_then_else (eq (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ {
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbeq %l0\", \"fbeq %l0\", \"jbeq %l0\");
+ #else
+ OUTPUT_JUMP (\"jeq %l0\", \"fjeq %l0\", \"jeq %l0\");
+ #endif
+ }")
+
+ (define_insn "bne"
+ [(set (pc)
+ (if_then_else (ne (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ {
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbne %l0\", \"fbne %l0\", \"jbne %l0\");
+ #else
+ OUTPUT_JUMP (\"jne %l0\", \"fjne %l0\", \"jne %l0\");
+ #endif
+ }")
+
+ (define_insn "bgt"
+ [(set (pc)
+ (if_then_else (gt (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbgt %l0\", \"fbgt %l0\", 0);
+ #else
+ OUTPUT_JUMP (\"jgt %l0\", \"fjgt %l0\", 0);
+ #endif
+ ")
+
+ (define_insn "bgtu"
+ [(set (pc)
+ (if_then_else (gtu (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbhi %l0\";
+ #else
+ return \"jhi %l0\";
+ #endif
+ ")
+
+ (define_insn "blt"
+ [(set (pc)
+ (if_then_else (lt (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jblt %l0\", \"fblt %l0\", \"jbmi %l0\");
+ #else
+ OUTPUT_JUMP (\"jlt %l0\", \"fjlt %l0\", \"jmi %l0\");
+ #endif
+ ")
+
+ (define_insn "bltu"
+ [(set (pc)
+ (if_then_else (ltu (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbcs %l0\";
+ #else
+ return \"jcs %l0\";
+ #endif
+ ")
+
+ (define_insn "bge"
+ [(set (pc)
+ (if_then_else (ge (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbge %l0\", \"fbge %l0\", \"jbpl %l0\");
+ #else
+ OUTPUT_JUMP (\"jge %l0\", \"fjge %l0\", \"jpl %l0\");
+ #endif
+ ")
+
+ (define_insn "bgeu"
+ [(set (pc)
+ (if_then_else (geu (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbcc %l0\";
+ #else
+ return \"jcc %l0\";
+ #endif
+ ")
+
+ (define_insn "ble"
+ [(set (pc)
+ (if_then_else (le (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jble %l0\", \"fble %l0\", 0);
+ #else
+ OUTPUT_JUMP (\"jle %l0\", \"fjle %l0\", 0);
+ #endif
+ ")
+
+ (define_insn "bleu"
+ [(set (pc)
+ (if_then_else (leu (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbls %l0\";
+ #else
+ return \"jls %l0\";
+ #endif
+ ")
+
+ ;; Negated conditional jump instructions.
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (eq (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ {
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbne %l0\", \"fbne %l0\", \"jbne %l0\");
+ #else
+ OUTPUT_JUMP (\"jne %l0\", \"fjne %l0\", \"jne %l0\");
+ #endif
+ }")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (ne (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ {
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbeq %l0\", \"fbeq %l0\", \"jbeq %l0\");
+ #else
+ OUTPUT_JUMP (\"jeq %l0\", \"fjeq %l0\", \"jeq %l0\");
+ #endif
+ }")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (gt (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jble %l0\", \"fbngt %l0\", 0);
+ #else
+ OUTPUT_JUMP (\"jle %l0\", \"fjngt %l0\", 0);
+ #endif
+ ")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (gtu (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbls %l0\";
+ #else
+ return \"jls %l0\";
+ #endif
+ ")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (lt (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbge %l0\", \"fbnlt %l0\", \"jbpl %l0\");
+ #else
+ OUTPUT_JUMP (\"jge %l0\", \"fjnlt %l0\", \"jpl %l0\");
+ #endif
+ ")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (ltu (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbcc %l0\";
+ #else
+ return \"jcc %l0\";
+ #endif
+ ")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (ge (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jblt %l0\", \"fbnge %l0\", \"jbmi %l0\");
+ #else
+ OUTPUT_JUMP (\"jlt %l0\", \"fjnge %l0\", \"jmi %l0\");
+ #endif
+ ")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (geu (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbcs %l0\";
+ #else
+ return \"jcs %l0\";
+ #endif
+ ")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (le (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbgt %l0\", \"fbnle %l0\", 0);
+ #else
+ OUTPUT_JUMP (\"jgt %l0\", \"fjnle %l0\", 0);
+ #endif
+ ")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (leu (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbhi %l0\";
+ #else
+ return \"jhi %l0\";
+ #endif
+ ")
+
+ ;; Unconditional and other jump instructions
+ (define_insn "jump"
+ [(set (pc)
+ (label_ref (match_operand 0 "" "")))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbra %l0\";
+ #else
+ return \"jra %l0\";
+ #endif
+ ")
+
+ ;; We support two different ways of handling dispatch tables.
+ ;; The NeXT uses absolute tables, and other machines use relative.
+ ;; This define_expand can generate either kind.
+ (define_expand "tablejump"
+ [(parallel [(set (pc) (match_operand 0 "" ""))
+ (use (label_ref (match_operand 1 "" "")))])]
+ ""
+ "
+ {
+ #ifdef CASE_VECTOR_PC_RELATIVE
+ operands[0] = gen_rtx (PLUS, SImode, pc_rtx, operands[0]);
+ #endif
+ }")
+
+ ;; Jump to variable address from dispatch table of absolute addresses.
+ (define_insn ""
+ [(set (pc) (match_operand:SI 0 "register_operand" "a"))
+ (use (label_ref (match_operand 1 "" "")))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jmp (%0)\";
+ #else
+ return \"jmp %0@\";
+ #endif
+ ")
+
+ ;; Jump to variable address from dispatch table of relative addresses.
+ (define_insn ""
+ [(set (pc)
+ (plus:SI (pc) (match_operand:HI 0 "register_operand" "r")))
+ (use (label_ref (match_operand 1 "" "")))]
+ ""
+ "*
+ #ifdef ASM_RETURN_CASE_JUMP
+ ASM_RETURN_CASE_JUMP;
+ #else
+ #ifdef SGS
+ #ifdef ASM_OUTPUT_CASE_LABEL
+ return \"jmp 6(%%pc,%0.w)\";
+ #else
+ #ifdef CRDS
+ return \"jmp 2(pc,%0.w)\";
+ #else
+ return \"jmp 2(%%pc,%0.w)\";
+ #endif /* end !CRDS */
+ #endif
+ #else /* not SGS */
+ #ifdef MOTOROLA
+ return \"jmp (2,pc,%0.w)\";
+ #else
+ return \"jmp pc@(2,%0:w)\";
+ #endif
+ #endif
+ #endif
+ ")
+
+ ;; Decrement-and-branch insns.
+ (define_insn ""
+ [(set (pc)
+ (if_then_else
+ (ne (match_operand:HI 0 "general_operand" "+g")
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))
+ (set (match_dup 0)
+ (plus:HI (match_dup 0)
+ (const_int -1)))]
+ ""
+ "*
+ {
+ CC_STATUS_INIT;
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ {
+ #ifdef MOTOROLA
+ #ifdef NO_ADDSUB_Q
+ return \"sub%.w %#1,%0\;jbcc %l1\";
+ #else
+ return \"subq%.w %#1,%0\;jbcc %l1\";
+ #endif
+ #else /* not MOTOROLA */
+ return \"subqw %#1,%0\;jcc %l1\";
+ #endif
+ }
+ #ifdef MOTOROLA
+ #ifdef SGS_CMP_ORDER
+ #ifdef NO_ADDSUB_Q
+ return \"sub%.w %#1,%0\;cmp%.w %0,%#-1\;jbne %l1\";
+ #else
+ return \"subq%.w %#1,%0\;cmp%.w %0,%#-1\;jbne %l1\";
+ #endif
+ #else /* not SGS_CMP_ORDER */
+ return \"subq%.w %#1,%0\;cmp%.w %#-1,%0\;jbne %l1\";
+ #endif
+ #else /* not MOTOROLA */
+ return \"subqw %#1,%0\;cmpw %#-1,%0\;jne %l1\";
+ #endif
+ }")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else
+ (ne (match_operand:SI 0 "general_operand" "+g")
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))
+ (set (match_dup 0)
+ (plus:SI (match_dup 0)
+ (const_int -1)))]
+ ""
+ "*
+ {
+ CC_STATUS_INIT;
+ #ifdef MOTOROLA
+ #ifdef NO_ADDSUB_Q
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\;clr%.w %0\;sub%.l %#1,%0\;jbcc %l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"sub%.l %#1,%0\;jbcc %l1\";
+ #else
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\;clr%.w %0\;subq%.l %#1,%0\;jbcc %l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"subq%.l %#1,%0\;jbcc %l1\";
+ #endif /* NO_ADDSUB_Q */
+ #ifdef SGS_CMP_ORDER
+ #ifdef NO_ADDSUB_Q
+ return \"sub.l %#1,%0\;cmp.l %0,%#-1\;jbne %l1\";
+ #else
+ return \"subq.l %#1,%0\;cmp.l %0,%#-1\;jbne %l1\";
+ #endif
+ #else /* not SGS_CMP_ORDER */
+ return \"subq.l %#1,%0\;cmp.l %#-1,%0\;jbne %l1\";
+ #endif /* not SGS_CMP_ORDER */
+ #else /* not MOTOROLA */
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\;clr%.w %0\;subql %#1,%0\;jcc %l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"subql %#1,%0\;jcc %l1\";
+ return \"subql %#1,%0\;cmpl %#-1,%0\;jne %l1\";
+ #endif /* not MOTOROLA */
+ }")
+
+ ;; Two dbra patterns that use REG_NOTES info generated by strength_reduce.
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else
+ (ge (plus:HI (match_operand:HI 0 "general_operand" "+g")
+ (const_int -1))
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))
+ (set (match_dup 0)
+ (plus:HI (match_dup 0)
+ (const_int -1)))]
+ "find_reg_note (insn, REG_NONNEG, 0)"
+ "*
+ {
+ CC_STATUS_INIT;
+ #ifdef MOTOROLA
+ #ifdef NO_ADDSUB_Q
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"sub%.w %#1,%0\;jbcc %l1\";
+ #else
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"subq%.w %#1,%0\;jbcc %l1\";
+ #endif
+ #ifdef SGS_CMP_ORDER
+ #ifdef NO_ADDSUB_Q
+ return \"sub.w %#1,%0\;cmp.w %0,%#-1\;jbne %l1\";
+ #else
+ return \"subq.w %#1,%0\;cmp.w %0,%#-1\;jbne %l1\";
+ #endif
+ #else /* not SGS_CMP_ORDER */
+ return \"subq.w %#1,%0\;cmp.w %#-1,%0\;jbne %l1\";
+ #endif /* not SGS_CMP_ORDER */
+ #else /* not MOTOROLA */
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"subqw %#1,%0\;jcc %l1\";
+ return \"subqw %#1,%0\;cmpw %#-1,%0\;jne %l1\";
+ #endif /* not MOTOROLA */
+ }")
+
+ (define_insn "decrement_and_branch_until_zero"
+ [(set (pc)
+ (if_then_else
+ (ge (plus:SI (match_operand:SI 0 "general_operand" "+g")
+ (const_int -1))
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))
+ (set (match_dup 0)
+ (plus:SI (match_dup 0)
+ (const_int -1)))]
+ "find_reg_note (insn, REG_NONNEG, 0)"
+ "*
+ {
+ CC_STATUS_INIT;
+ #ifdef MOTOROLA
+ #ifdef NO_ADDSUB_Q
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\;clr%.w %0\;sub%.l %#1,%0\;jbcc %l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"sub%.l %#1,%0\;jbcc %l1\";
+ #else
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\;clr%.w %0\;subq%.l %#1,%0\;jbcc %l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"subq%.l %#1,%0\;jbcc %l1\";
+ #endif
+ #ifdef SGS_CMP_ORDER
+ #ifdef NO_ADDSUB_Q
+ return \"sub.l %#1,%0\;cmp.l %0,%#-1\;jbne %l1\";
+ #else
+ return \"subq.l %#1,%0\;cmp.l %0,%#-1\;jbne %l1\";
+ #endif
+ #else /* not SGS_CMP_ORDER */
+ return \"subq.l %#1,%0\;cmp.l %#-1,%0\;jbne %l1\";
+ #endif /* not SGS_CMP_ORDER */
+ #else /* not MOTOROLA */
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\;clr%.w %0\;subql %#1,%0\;jcc %l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"subql %#1,%0\;jcc %l1\";
+ return \"subql %#1,%0\;cmpl %#-1,%0\;jne %l1\";
+ #endif /* not MOTOROLA */
+ }")
+
+
+ ;; PIC calls are handled by loading the address of the function into a
+ ;; register (via movsi), then emitting a register indirect call using
+ ;; the "jsr" function call syntax.
+ ;;
+ ;; It is important to note that the "jsr" syntax is always used for
+ ;; PIC calls, even on machines in which GCC normally uses the "jbsr"
+ ;; syntax for non-PIC calls. This keeps at least 1 assembler (Sun)
+ ;; from emitting incorrect code for a PIC call.
+ ;;
+ ;; We have different patterns for PIC calls and non-PIC calls. The
+ ;; different patterns are only used to choose the right syntax
+ ;; ("jsr" vs "jbsr").
+ ;;
+ ;; On svr4 m68k, PIC stuff is done differently. To be able to support
+ ;; dynamic linker LAZY BINDING, all the procedure calls need to go
+ ;; through the PLT (Procedure Linkage Table) section in PIC mode. The
+ ;; svr4 m68k assembler recognizes this syntax: `bsr FUNC@PLTPC' and it
+ ;; will create the correct relocation entry (R_68K_PLT32) for `FUNC',
+ ;; that tells the linker editor to create an entry for `FUNC' in PLT
+ ;; section at link time. However, all global objects reference are still
+ ;; done by using `OBJ@GOT'. So, the goal here is to output the function
+ ;; call operand as `FUNC@PLTPC', but output object operand as `OBJ@GOT'.
+ ;; We need to have a way to differentiate these two different operands.
+ ;;
+ ;; The strategy I use here is to use SYMBOL_REF_FLAG to differentiate
+ ;; these two different operands. The macro LEGITIMATE_PIC_OPERAND_P needs
+ ;; to be changed to recognize function calls symbol_ref operand as a legal
+ ;; PIC operand (by checking whether SYMBOL_REF_FLAG is set). This will
+ ;; avoid the compiler to load this symbol_ref operand into a register.
+ ;; Remember, the operand "foo@PLTPC" cannot be called via jsr directly
+ ;; since the value is a PC relative offset, not a real address.
+ ;;
+ ;; All global objects are treated in the similar way as in SUN3. The only
+ ;; difference is: on m68k svr4, the reference of such global object needs
+ ;; to end with a suffix "@GOT" so the assembler and linker know to create
+ ;; an entry for it in GOT (Global Offset Table) section. This is done in
+ ;; m68k.c.
+
+ ;; Call subroutine with no return value.
+ (define_expand "call"
+ [(call (match_operand:QI 0 "memory_operand" "")
+ (match_operand:SI 1 "general_operand" ""))]
+ ;; Operand 1 not really used on the m68000.
+
+ ""
+ "
+ {
+ if (flag_pic && flag_pic < 3 && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
+ #ifdef MOTOROLA
+ SYMBOL_REF_FLAG (XEXP (operands[0], 0)) = 1;
+ #else
+ operands[0] = gen_rtx (MEM, GET_MODE (operands[0]),
+ force_reg (Pmode, XEXP (operands[0], 0)));
+ #endif
+ }")
+
+ ;; This is a normal call sequence.
+ (define_insn ""
+ [(call (match_operand:QI 0 "memory_operand" "o")
+ (match_operand:SI 1 "general_operand" "g"))]
+ ;; Operand 1 not really used on the m68000.
+
+ "(! flag_pic || flag_pic >= 3)"
+ "*
+ #ifdef MOTOROLA
+ return \"jsr %0\";
+ #else
+ return \"jbsr %0\";
+ #endif
+ ")
+
+ ;; This is a PIC call sequence.
+ (define_insn ""
+ [(call (match_operand:QI 0 "memory_operand" "o")
+ (match_operand:SI 1 "general_operand" "g"))]
+ ;; Operand 1 not really used on the m68000.
+
+ "(flag_pic && flag_pic < 3)"
+ "*
+ #ifdef HPUX_ASM
+ return \"bsr %0\";
+ #else
+ #ifdef MOTOROLA
+ if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
+ return \"bsr %0@PLTPC\";
+ #endif
+ return \"jsr %0\";
+ #endif
+ ")
+
+ ;; Call subroutine, returning value in operand 0
+ ;; (which must be a hard register).
+ ;; See comments before "call" regarding PIC calls.
+ (define_expand "call_value"
+ [(set (match_operand 0 "" "")
+ (call (match_operand:QI 1 "memory_operand" "")
+ (match_operand:SI 2 "general_operand" "")))]
+ ;; Operand 2 not really used on the m68000.
+ ""
+ "
+ {
+ if (flag_pic && flag_pic < 3 && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
+ #ifdef MOTOROLA
+ SYMBOL_REF_FLAG (XEXP (operands[1], 0)) = 1;
+ #else
+ operands[1] = gen_rtx (MEM, GET_MODE (operands[1]),
+ force_reg (Pmode, XEXP (operands[1], 0)));
+ #endif
+ }")
+
+ ;; This is a normal call_value
+ (define_insn ""
+ [(set (match_operand 0 "" "=rf")
+ (call (match_operand:QI 1 "memory_operand" "o")
+ (match_operand:SI 2 "general_operand" "g")))]
+ ;; Operand 2 not really used on the m68000.
+ "(! flag_pic || flag_pic >= 3)"
+ "*
+ #ifdef MOTOROLA
+ return \"jsr %1\";
+ #else
+ return \"jbsr %1\";
+ #endif
+ ")
+
+ ;; This is a PIC call_value
+ (define_insn ""
+ [(set (match_operand 0 "" "=rf")
+ (call (match_operand:QI 1 "memory_operand" "o")
+ (match_operand:SI 2 "general_operand" "g")))]
+ ;; Operand 2 not really used on the m68000.
+ "(flag_pic && flag_pic < 3)"
+ "*
+ #ifdef HPUX_ASM
+ return \"bsr %1\";
+ #else
+ #ifdef MOTOROLA
+ if (GET_CODE (operands[1]) == MEM
+ && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
+ return \"bsr %1@PLTPC\";
+ #endif
+ return \"jsr %1\";
+ #endif
+ ")
+
+ ;; Call subroutine returning any type.
+
+ (define_expand "untyped_call"
+ [(parallel [(call (match_operand 0 "" "")
+ (const_int 0))
+ (match_operand 1 "" "")
+ (match_operand 2 "" "")])]
+ "NEEDS_UNTYPED_CALL"
+ "
+ {
+ int i;
+
+ emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx));
+
+ 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));
+ }
+
+ /* 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;
+ }")
+
+ ;; 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)]
+ ""
+ "")
+
+ (define_insn "nop"
+ [(const_int 0)]
+ ""
+ "nop")
+
+ (define_insn "probe"
+ [(reg:SI 15)]
+ "NEED_PROBE"
+ "*
+ {
+ operands[0] = gen_rtx (PLUS, SImode, stack_pointer_rtx,
+ gen_rtx (CONST_INT, VOIDmode, NEED_PROBE));
+ return \"tstl %a0\";
+ }")
+
+ ;; Used for frameless functions which save no regs and allocate no locals.
+ (define_insn "return"
+ [(return)]
+ "USE_RETURN_INSN"
+ "*
+ {
+ if (current_function_pops_args == 0)
+ return \"rts\";
+ operands[0] = gen_rtx (CONST_INT, VOIDmode, current_function_pops_args);
+ return \"rtd %0\";
+ }")
+
+ (define_insn "indirect_jump"
+ [(set (pc) (match_operand:SI 0 "address_operand" "p"))]
+ ""
+ "jmp %a0")
+
+ ;; This should not be used unless the add/sub insns can't be.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=a")
+ (match_operand:QI 1 "address_operand" "p"))]
+ ""
+ "lea %a1,%0")
+
+ ;; This is the first machine-dependent peephole optimization.
+ ;; It is useful when a floating value is returned from a function call
+ ;; and then is moved into an FP register.
+ ;; But it is mainly intended to test the support for these optimizations.
+
+ (define_peephole
+ [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4)))
+ (set (match_operand:DF 0 "register_operand" "=f")
+ (match_operand:DF 1 "register_operand" "ad"))]
+ "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])"
+ "*
+ {
+ rtx xoperands[2];
+ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
+ output_asm_insn (\"move%.l %1,%@\", xoperands);
+ output_asm_insn (\"move%.l %1,%-\", operands);
+ return \"fmove%.d %+,%0\";
+ }
+ ")
+
+ ;; Optimize a stack-adjust followed by a push of an argument.
+ ;; This is said to happen frequently with -msoft-float
+ ;; when there are consecutive library calls.
+
+ (define_peephole
+ [(set (reg:SI 15) (plus:SI (reg:SI 15)
+ (match_operand:SI 0 "immediate_operand" "n")))
+ (set (match_operand:SF 1 "push_operand" "=m")
+ (match_operand:SF 2 "general_operand" "rmfF"))]
+ "GET_CODE (operands[0]) == CONST_INT && INTVAL (operands[0]) >= 4
+ && ! reg_mentioned_p (stack_pointer_rtx, operands[2])"
+ "*
+ {
+ if (INTVAL (operands[0]) > 4)
+ {
+ rtx xoperands[2];
+ xoperands[0] = stack_pointer_rtx;
+ xoperands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[0]) - 4);
+ #ifndef NO_ADDSUB_Q
+ if (INTVAL (xoperands[1]) <= 8)
+ output_asm_insn (\"addq%.w %1,%0\", xoperands);
+ else if (INTVAL (xoperands[1]) <= 16 && TARGET_68020)
+ {
+ xoperands[1] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (xoperands[1]) - 8);
+ output_asm_insn (\"addq%.w %#8,%0\;addq%.w %1,%0\", xoperands);
+ }
+ else
+ #endif
+ if (INTVAL (xoperands[1]) <= 0x7FFF)
+ output_asm_insn (\"add%.w %1,%0\", xoperands);
+ else
+ output_asm_insn (\"add%.l %1,%0\", xoperands);
+ }
+ if (FP_REG_P (operands[2]))
+ return \"fmove%.s %2,%@\";
+ return \"move%.l %2,%@\";
+ }")
+
+ ;; Speed up stack adjust followed by a fullword fixedpoint push.
+
+ (define_peephole
+ [(set (reg:SI 15) (plus:SI (reg:SI 15)
+ (match_operand:SI 0 "immediate_operand" "n")))
+ (set (match_operand:SI 1 "push_operand" "=m")
+ (match_operand:SI 2 "general_operand" "g"))]
+ "GET_CODE (operands[0]) == CONST_INT && INTVAL (operands[0]) >= 4
+ && ! reg_mentioned_p (stack_pointer_rtx, operands[2])"
+ "*
+ {
+ if (INTVAL (operands[0]) > 4)
+ {
+ rtx xoperands[2];
+ xoperands[0] = stack_pointer_rtx;
+ xoperands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[0]) - 4);
+ #ifndef NO_ADDSUB_Q
+ if (INTVAL (xoperands[1]) <= 8)
+ output_asm_insn (\"addq%.w %1,%0\", xoperands);
+ else if (INTVAL (xoperands[1]) <= 16 && TARGET_68020)
+ {
+ xoperands[1] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (xoperands[1]) - 8);
+ output_asm_insn (\"addq%.w %#8,%0\;addq%.w %1,%0\", xoperands);
+ }
+ else
+ #endif
+ if (INTVAL (xoperands[1]) <= 0x7FFF)
+ output_asm_insn (\"add%.w %1,%0\", xoperands);
+ else
+ output_asm_insn (\"add%.l %1,%0\", xoperands);
+ }
+ if (operands[2] == const0_rtx)
+ return \"clr%.l %@\";
+ return \"move%.l %2,%@\";
+ }")
+
+ ;; Speed up pushing a single byte but leaving four bytes of space.
+
+ (define_peephole
+ [(set (mem:QI (pre_dec:SI (reg:SI 15)))
+ (match_operand:QI 1 "general_operand" "dami"))
+ (set (reg:SI 15) (minus:SI (reg:SI 15) (const_int 2)))]
+ "! reg_mentioned_p (stack_pointer_rtx, operands[1])"
+ "*
+ {
+ rtx xoperands[4];
+
+ if (GET_CODE (operands[1]) == REG)
+ return \"move%.l %1,%-\";
+
+ xoperands[1] = operands[1];
+ xoperands[2]
+ = gen_rtx (MEM, QImode,
+ gen_rtx (PLUS, VOIDmode, stack_pointer_rtx,
+ gen_rtx (CONST_INT, VOIDmode, 3)));
+ xoperands[3] = stack_pointer_rtx;
+ output_asm_insn (\"subq%.w %#4,%3\;move%.b %1,%2\", xoperands);
+ return \"\";
+ }")
+
+ (define_peephole
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (const_int 0))
+ (set (strict_low_part (subreg:HI (match_dup 0) 0))
+ (match_operand:HI 1 "general_operand" "rmn"))]
+ "strict_low_part_peephole_ok (HImode, prev_nonnote_insn (insn), operands[0])"
+ "*
+ {
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ if (operands[1] == const0_rtx
+ && (DATA_REG_P (operands[0])
+ || GET_CODE (operands[0]) == MEM)
+ /* clr insns on 68000 read before writing.
+ This isn't so on the 68010, but we have no alternative for it. */
+ && (TARGET_68020
+ || !(GET_CODE (operands[0]) == MEM
+ && MEM_VOLATILE_P (operands[0]))))
+ return \"clr%.w %0\";
+ }
+ return \"move%.w %1,%0\";
+ }")
+
+ ;; dbCC peepholes
+ ;;
+ ;; Turns
+ ;; loop:
+ ;; [ ... ]
+ ;; jCC label ; abnormal loop termination
+ ;; dbra dN, loop ; normal loop termination
+ ;;
+ ;; Into
+ ;; loop:
+ ;; [ ... ]
+ ;; dbCC dN, loop
+ ;; jCC label
+ ;;
+ ;; Which moves the jCC condition outside the inner loop for free.
+ ;;
+ (define_peephole
+ [(set (pc) (if_then_else (match_operator 3 "valid_dbcc_comparison_p"
+ [(cc0) (const_int 0)])
+ (label_ref (match_operand 2 "" ""))
+ (pc)))
+ (parallel
+ [(set (pc)
+ (if_then_else
+ (ge (plus:HI (match_operand:HI 0 "register_operand" "+d")
+ (const_int -1))
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))
+ (set (match_dup 0)
+ (plus:HI (match_dup 0)
+ (const_int -1)))])]
+ "DATA_REG_P (operands[0])"
+ "*
+ {
+ CC_STATUS_INIT;
+ output_dbcc_and_branch (operands);
+ return \"\";
+ }")
+
+ (define_peephole
+ [(set (pc) (if_then_else (match_operator 3 "valid_dbcc_comparison_p"
+ [(cc0) (const_int 0)])
+ (label_ref (match_operand 2 "" ""))
+ (pc)))
+ (parallel
+ [(set (pc)
+ (if_then_else
+ (ge (plus:SI (match_operand:SI 0 "register_operand" "+d")
+ (const_int -1))
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))
+ (set (match_dup 0)
+ (plus:SI (match_dup 0)
+ (const_int -1)))])]
+ "DATA_REG_P (operands[0])"
+ "*
+ {
+ CC_STATUS_INIT;
+ output_dbcc_and_branch (operands);
+ return \"\";
+ }")
+
+
+ ;; FPA multiply and add.
+ (define_insn ""
+ [(set (match_operand:DF 0 "register_operand" "=x,y,y")
+ (plus:DF (mult:DF (match_operand:DF 1 "general_operand" "%x,dmF,y")
+ (match_operand:DF 2 "general_operand" "xH,y,y"))
+ (match_operand:DF 3 "general_operand" "xH,y,dmF")))]
+ "TARGET_FPA"
+ "@
+ fpma%.d %1,%w2,%w3,%0
+ fpma%.d %x1,%x2,%x3,%0
+ fpma%.d %x1,%x2,%x3,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "register_operand" "=x,y,y")
+ (plus:SF (mult:SF (match_operand:SF 1 "general_operand" "%x,ydmF,y")
+ (match_operand:SF 2 "general_operand" "xH,y,ydmF"))
+ (match_operand:SF 3 "general_operand" "xH,ydmF,ydmF")))]
+ "TARGET_FPA"
+ "@
+ fpma%.s %1,%w2,%w3,%0
+ fpma%.s %1,%2,%3,%0
+ fpma%.s %1,%2,%3,%0")
+
+ ;; FPA Multiply and subtract
+ (define_insn ""
+ [(set (match_operand:DF 0 "register_operand" "=x,y,y")
+ (minus:DF (match_operand:DF 1 "general_operand" "xH,rmF,y")
+ (mult:DF (match_operand:DF 2 "general_operand" "%xH,y,y")
+ (match_operand:DF 3 "general_operand" "x,y,rmF"))))]
+ "TARGET_FPA"
+ "@
+ fpms%.d %3,%w2,%w1,%0
+ fpms%.d %x3,%2,%x1,%0
+ fpms%.d %x3,%2,%x1,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "register_operand" "=x,y,y")
+ (minus:SF (match_operand:SF 1 "general_operand" "xH,rmF,yrmF")
+ (mult:SF (match_operand:SF 2 "general_operand" "%xH,rmF,y")
+ (match_operand:SF 3 "general_operand" "x,y,yrmF"))))]
+ "TARGET_FPA"
+ "@
+ fpms%.s %3,%w2,%w1,%0
+ fpms%.s %3,%2,%1,%0
+ fpms%.s %3,%2,%1,%0")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "register_operand" "=x,y,y")
+ (minus:DF (mult:DF (match_operand:DF 1 "general_operand" "%xH,y,y")
+ (match_operand:DF 2 "general_operand" "x,y,rmF"))
+ (match_operand:DF 3 "general_operand" "xH,rmF,y")))]
+ "TARGET_FPA"
+ "@
+ fpmr%.d %2,%w1,%w3,%0
+ fpmr%.d %x2,%1,%x3,%0
+ fpmr%.d %x2,%1,%x3,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "register_operand" "=x,y,y")
+ (minus:SF (mult:SF (match_operand:SF 1 "general_operand" "%xH,rmF,y")
+ (match_operand:SF 2 "general_operand" "x,y,yrmF"))
+ (match_operand:SF 3 "general_operand" "xH,rmF,yrmF")))]
+ "TARGET_FPA"
+ "@
+ fpmr%.s %2,%w1,%w3,%0
+ fpmr%.s %x2,%1,%x3,%0
+ fpmr%.s %x2,%1,%x3,%0")
+
+ ;; FPA Add and multiply
+ (define_insn ""
+ [(set (match_operand:DF 0 "register_operand" "=x,y,y")
+ (mult:DF (plus:DF (match_operand:DF 1 "general_operand" "%xH,y,y")
+ (match_operand:DF 2 "general_operand" "x,y,rmF"))
+ (match_operand:DF 3 "general_operand" "xH,rmF,y")))]
+ "TARGET_FPA"
+ "@
+ fpam%.d %2,%w1,%w3,%0
+ fpam%.d %x2,%1,%x3,%0
+ fpam%.d %x2,%1,%x3,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "register_operand" "=x,y,y")
+ (mult:SF (plus:SF (match_operand:SF 1 "general_operand" "%xH,rmF,y")
+ (match_operand:SF 2 "general_operand" "x,y,yrmF"))
+ (match_operand:SF 3 "general_operand" "xH,rmF,yrmF")))]
+ "TARGET_FPA"
+ "@
+ fpam%.s %2,%w1,%w3,%0
+ fpam%.s %x2,%1,%x3,%0
+ fpam%.s %x2,%1,%x3,%0")
+
+ ;;FPA Subtract and multiply
+ (define_insn ""
+ [(set (match_operand:DF 0 "register_operand" "=x,y,y")
+ (mult:DF (minus:DF (match_operand:DF 1 "general_operand" "xH,y,y")
+ (match_operand:DF 2 "general_operand" "x,y,rmF"))
+ (match_operand:DF 3 "general_operand" "xH,rmF,y")))]
+ "TARGET_FPA"
+ "@
+ fpsm%.d %2,%w1,%w3,%0
+ fpsm%.d %x2,%1,%x3,%0
+ fpsm%.d %x2,%1,%x3,%0")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "register_operand" "=x,y,y")
+ (mult:DF (match_operand:DF 1 "general_operand" "xH,rmF,y")
+ (minus:DF (match_operand:DF 2 "general_operand" "xH,y,y")
+ (match_operand:DF 3 "general_operand" "x,y,rmF"))))]
+ "TARGET_FPA"
+ "@
+ fpsm%.d %3,%w2,%w1,%0
+ fpsm%.d %x3,%2,%x1,%0
+ fpsm%.d %x3,%2,%x1,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "register_operand" "=x,y,y")
+ (mult:SF (minus:SF (match_operand:SF 1 "general_operand" "xH,rmF,y")
+ (match_operand:SF 2 "general_operand" "x,y,yrmF"))
+ (match_operand:SF 3 "general_operand" "xH,rmF,yrmF")))]
+ "TARGET_FPA"
+ "@
+ fpsm%.s %2,%w1,%w3,%0
+ fpsm%.s %x2,%1,%x3,%0
+ fpsm%.s %x2,%1,%x3,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "register_operand" "=x,y,y")
+ (mult:SF (match_operand:SF 1 "general_operand" "xH,rmF,yrmF")
+ (minus:SF (match_operand:SF 2 "general_operand" "xH,rmF,y")
+ (match_operand:SF 3 "general_operand" "x,y,yrmF"))))]
+ "TARGET_FPA"
+ "@
+ fpsm%.s %3,%w2,%w1,%0
+ fpsm%.s %x3,%2,%x1,%0
+ fpsm%.s %x3,%2,%x1,%0")
+
+ (define_insn "tstxf"
+ [(set (cc0)
+ (match_operand:XF 0 "nonimmediate_operand" "fm"))]
+ "TARGET_68881"
+ "*
+ {
+ cc_status.flags = CC_IN_68881;
+ return \"ftst%.x %0\";
+ }")
+
+
+ (define_expand "cmpxf"
+ [(set (cc0)
+ (compare (match_operand:XF 0 "general_operand" "f,mG")
+ (match_operand:XF 1 "general_operand" "fmG,f")))]
+ "TARGET_68881"
+ "
+ {
+ if (CONSTANT_P (operands[0]))
+ operands[0] = force_const_mem (XFmode, operands[0]);
+ if (CONSTANT_P (operands[1]))
+ operands[1] = force_const_mem (XFmode, operands[1]);
+ }")
+
+ (define_insn ""
+ [(set (cc0)
+ (compare (match_operand:XF 0 "nonimmediate_operand" "f,mG")
+ (match_operand:XF 1 "nonimmediate_operand" "fmG,f")))]
+ "TARGET_68881"
+ "*
+ {
+ cc_status.flags = CC_IN_68881;
+ #ifdef SGS_CMP_ORDER
+ if (REG_P (operands[0]))
+ {
+ if (REG_P (operands[1]))
+ return \"fcmp%.x %0,%1\";
+ else
+ return \"fcmp%.x %0,%f1\";
+ }
+ cc_status.flags |= CC_REVERSED;
+ return \"fcmp%.x %1,%f0\";
+ #else
+ if (REG_P (operands[0]))
+ {
+ if (REG_P (operands[1]))
+ return \"fcmp%.x %1,%0\";
+ else
+ return \"fcmp%.x %f1,%0\";
+ }
+ cc_status.flags |= CC_REVERSED;
+ return \"fcmp%.x %f0,%1\";
+ #endif
+ }")
+
+ (define_insn "extendsfxf2"
+ [(set (match_operand:XF 0 "general_operand" "=fm,f")
+ (float_extend:XF (match_operand:SF 1 "general_operand" "f,m")))]
+ "TARGET_68881"
+ "*
+ {
+ if (FP_REG_P (operands[0]) && FP_REG_P (operands[1]))
+ {
+ if (REGNO (operands[0]) == REGNO (operands[1]))
+ {
+ /* Extending float to double in an fp-reg is a no-op.
+ NOTICE_UPDATE_CC has already assumed that the
+ cc will be set. So cancel what it did. */
+ cc_status = cc_prev_status;
+ return \"\";
+ }
+ return \"f%$move%.x %1,%0\";
+ }
+ if (FP_REG_P (operands[0]))
+ return \"f%$move%.s %f1,%0\";
+ return \"fmove%.x %f1,%0\";
+ }")
+
+
+ (define_insn "extenddfxf2"
+ [(set (match_operand:XF 0 "general_operand" "=fm,f")
+ (float_extend:XF
+ (match_operand:DF 1 "general_operand" "f,m")))]
+ "TARGET_68881"
+ "*
+ {
+ if (FP_REG_P (operands[0]) && FP_REG_P (operands[1]))
+ {
+ if (REGNO (operands[0]) == REGNO (operands[1]))
+ {
+ /* Extending float to double in an fp-reg is a no-op.
+ NOTICE_UPDATE_CC has already assumed that the
+ cc will be set. So cancel what it did. */
+ cc_status = cc_prev_status;
+ return \"\";
+ }
+ return \"fmove%.x %1,%0\";
+ }
+ if (FP_REG_P (operands[0]))
+ return \"f%&move%.d %f1,%0\";
+ return \"fmove%.x %f1,%0\";
+ }")
+
+ (define_insn "truncxfdf2"
+ [(set (match_operand:DF 0 "general_operand" "=m,!r")
+ (float_truncate:DF
+ (match_operand:XF 1 "general_operand" "f,f")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[0]))
+ {
+ output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ return \"move%.l %+,%0\";
+ }
+ return \"fmove%.d %f1,%0\";
+ }")
+
+ (define_insn "truncxfsf2"
+ [(set (match_operand:SF 0 "general_operand" "=dm")
+ (float_truncate:SF
+ (match_operand:XF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.s %f1,%0")
+
+ (define_insn "floatsixf2"
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (float:XF (match_operand:SI 1 "general_operand" "dmi")))]
+ "TARGET_68881"
+ "fmove%.l %1,%0")
+
+ (define_insn "floathixf2"
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (float:XF (match_operand:HI 1 "general_operand" "dmn")))]
+ "TARGET_68881"
+ "fmove%.w %1,%0")
+
+ (define_insn "floatqixf2"
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (float:XF (match_operand:QI 1 "general_operand" "dmn")))]
+ "TARGET_68881"
+ "fmove%.b %1,%0")
+
+ (define_insn "ftruncxf2"
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (fix:XF (match_operand:XF 1 "general_operand" "fFm")))]
+ "TARGET_68881"
+ "*
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fintrz%.x %f1,%0\";
+ return \"fintrz%.x %f1,%0\";
+ }")
+
+ (define_insn "fixxfqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm")
+ (fix:QI (match_operand:XF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.b %1,%0")
+
+ (define_insn "fixxfhi2"
+ [(set (match_operand:HI 0 "general_operand" "=dm")
+ (fix:HI (match_operand:XF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.w %1,%0")
+
+ (define_insn "fixxfsi2"
+ [(set (match_operand:SI 0 "general_operand" "=dm")
+ (fix:SI (match_operand:XF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.l %1,%0")
+
+ (define_expand "addxf3"
+ [(set (match_operand:XF 0 "general_operand" "")
+ (plus:XF (match_operand:XF 1 "general_operand" "")
+ (match_operand:XF 2 "general_operand" "")))]
+ "TARGET_68881"
+ "
+ {
+ if (CONSTANT_P (operands[1]))
+ operands[1] = force_const_mem (XFmode, operands[1]);
+ if (CONSTANT_P (operands[2]))
+ operands[2] = force_const_mem (XFmode, operands[2]);
+ }")
+
+ (define_insn ""
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (plus:XF (match_operand:XF 1 "nonimmediate_operand" "%0")
+ (match_operand:XF 2 "nonimmediate_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]))
+ return \"fadd%.x %2,%0\";
+ return \"fadd%.x %f2,%0\";
+ }")
+
+ (define_expand "subxf3"
+ [(set (match_operand:XF 0 "general_operand" "")
+ (minus:XF (match_operand:XF 1 "general_operand" "")
+ (match_operand:XF 2 "general_operand" "")))]
+ "TARGET_68881"
+ "
+ {
+ if (CONSTANT_P (operands[1]))
+ operands[1] = force_const_mem (XFmode, operands[1]);
+ if (CONSTANT_P (operands[2]))
+ operands[2] = force_const_mem (XFmode, operands[2]);
+ }")
+
+ (define_insn ""
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (minus:XF (match_operand:XF 1 "nonimmediate_operand" "0")
+ (match_operand:XF 2 "nonimmediate_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]))
+ return \"fsub%.x %2,%0\";
+ return \"fsub%.x %f2,%0\";
+ }")
+
+ (define_expand "mulxf3"
+ [(set (match_operand:XF 0 "general_operand" "")
+ (mult:XF (match_operand:XF 1 "general_operand" "")
+ (match_operand:XF 2 "general_operand" "")))]
+ "TARGET_68881"
+ "
+ {
+ if (CONSTANT_P (operands[1]))
+ operands[1] = force_const_mem (XFmode, operands[1]);
+ if (CONSTANT_P (operands[2]))
+ operands[2] = force_const_mem (XFmode, operands[2]);
+ }")
+
+ (define_insn ""
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (mult:XF (match_operand:XF 1 "nonimmediate_operand" "%0")
+ (match_operand:XF 2 "nonimmediate_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]))
+ return \"fmul%.x %2,%0\";
+ return \"fmul%.x %f2,%0\";
+ }")
+
+ (define_expand "divxf3"
+ [(set (match_operand:XF 0 "general_operand" "")
+ (div:XF (match_operand:XF 1 "general_operand" "")
+ (match_operand:XF 2 "general_operand" "")))]
+ "TARGET_68881"
+ "
+ {
+ if (CONSTANT_P (operands[1]))
+ operands[1] = force_const_mem (XFmode, operands[1]);
+ if (CONSTANT_P (operands[2]))
+ operands[2] = force_const_mem (XFmode, operands[2]);
+ }")
+
+ (define_insn ""
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (div:XF (match_operand:XF 1 "nonimmediate_operand" "0")
+ (match_operand:XF 2 "nonimmediate_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]))
+ return \"fdiv%.x %2,%0\";
+ return \"fdiv%.x %f2,%0\";
+ }")
+
+ (define_insn "negxf2"
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (neg:XF (match_operand:XF 1 "nonimmediate_operand" "fmF")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
+ return \"fneg%.x %1,%0\";
+ return \"fneg%.x %f1,%0\";
+ }")
+
+ (define_insn "absxf2"
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (abs:XF (match_operand:XF 1 "nonimmediate_operand" "fmF")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
+ return \"fabs%.x %1,%0\";
+ return \"fabs%.x %f1,%0\";
+ }")
+
+ (define_insn "sqrtxf2"
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (sqrt:XF (match_operand:DF 1 "nonimmediate_operand" "fm")))]
+ "TARGET_68881"
+ "*
+ {
+ return \"fsqrt%.x %1,%0\";
+ }")
diff -rc --new-file /src/baseline/gnat-1.80/amiga/corrections/m68k.md.orig gnat-1.80/amiga/corrections/m68k.md.orig
*** /src/baseline/gnat-1.80/amiga/corrections/m68k.md.orig Thu Jan 1 00:00:00 1970
--- gnat-1.80/amiga/corrections/m68k.md.orig Thu Jun 23 13:13:13 1994
***************
*** 0 ****
--- 1,5689 ----
+ ;;- Machine description for GNU compiler
+ ;;- Motorola 68000 Version
+ ;; Copyright (C) 1987, 1988, 1993 Free Software Foundation, Inc.
+
+ ;; This file is part of GNU CC.
+
+ ;; GNU CC is free software; you can redistribute it and/or modify
+ ;; it under the terms of the GNU General Public License as published by
+ ;; the Free Software Foundation; either version 2, or (at your option)
+ ;; any later version.
+
+ ;; GNU CC is distributed in the hope that it will be useful,
+ ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ ;; GNU General Public License for more details.
+
+ ;; You should have received a copy of the GNU General Public License
+ ;; along with GNU CC; see the file COPYING. If not, write to
+ ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+ ;;- instruction definitions
+
+ ;;- @@The original PO technology requires these to be ordered by speed,
+ ;;- @@ so that assigner will pick the fastest.
+
+ ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
+
+ ;;- When naming insn's (operand 0 of define_insn) be careful about using
+ ;;- names from other targets machine descriptions.
+
+ ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
+ ;;- updates for most instructions.
+
+ ;;- Operand classes for the register allocator:
+ ;;- 'a' one of the address registers can be used.
+ ;;- 'd' one of the data registers can be used.
+ ;;- 'f' one of the m68881 registers can be used
+ ;;- 'r' either a data or an address register can be used.
+ ;;- 'x' if one of the Sun FPA registers
+ ;;- 'y' if one of the Low Sun FPA registers (fpa0-fpa15).
+
+ ;;- Immediate Floating point operator constraints
+ ;;- 'G' a floating point constant that is *NOT* one of the standard
+ ;; 68881 constant values (to force calling output_move_const_double
+ ;; to get it from rom if it is a 68881 constant).
+ ;;- 'H' one of the standard FPA constant values
+ ;;
+ ;; See the functions standard_XXX_constant_p in output-m68k.c for more
+ ;; info.
+
+ ;;- Immediate integer operand constraints:
+ ;;- 'I' 1 .. 8
+ ;;- 'J' -32768 .. 32767
+ ;;- 'K' all integers EXCEPT -128 .. 127
+ ;;- 'L' -8 .. -1
+
+ ;;- Assembler specs:
+ ;;- "%." size separator ("." or "") move%.l d0,d1
+ ;;- "%#" immediate separator ("#" or "") move%.l %#0,d0
+ ;;- "%-" push operand "sp@-" move%.l d0,%-
+ ;;- "%+" pop operand "sp@+" move%.l d0,%+
+ ;;- "%@" top of stack "sp@" move%.l d0,%@
+ ;;- "%!" fpcr register
+ ;;- "%$" single-precision fp specifier ("s" or "") f%$add.x fp0,fp1
+ ;;- "%&" double-precision fp specifier ("d" or "") f%&add.x fp0,fp1
+
+ ;;- Information about 68040 port.
+
+ ;;- The 68040 executes all 68030 and 68881/2 instructions, but some must
+ ;;- be emulated in software by the OS. It is faster to avoid these
+ ;;- instructions and issue a library call rather than trapping into
+ ;;- the kernel. The affected instructions are fintrz and fscale. The
+ ;;- TARGET_68040 flag turns the use of the opcodes off.
+
+ ;;- The '040 also implements a set of new floating-point instructions
+ ;;- which specify the rounding precision in the opcode. This finally
+ ;;- permit the 68k series to be truly IEEE compliant, and solves all
+ ;;- issues of excess precision accumulating in the extended registers.
+ ;;- By default, GCC does not use these instructions, since such code will
+ ;;- not run on an '030. To use these instructions, use the -m68040-only
+ ;;- switch. By changing TARGET_DEFAULT to include TARGET_68040_ONLY,
+ ;;- you can make these instructions the default.
+
+ ;;- These new instructions aren't directly in the md. They are brought
+ ;;- into play by defining "%$" and "%&" to expand to "s" and "d" rather
+ ;;- than "".
+
+
+ ;;- FPA port explanation:
+
+ ;;- Usage of the Sun FPA and the 68881 together
+
+ ;;- The current port of gcc to the sun fpa disallows use of the m68881
+ ;;- instructions completely if code is targeted for the fpa. This is
+ ;;- for the following reasons:
+
+ ;;- 1) Expressing the preference hierarchy (ie. use the fpa if you
+ ;;- can, the 68881 otherwise, and data registers only if you are
+ ;;- forced to it) is a bitch with the current constraint scheme,
+ ;;- especially since it would have to work for any combination of
+ ;;- -mfpa, -m68881.
+
+ ;;- 2) There are no instructions to move between the two types of
+ ;;- registers; the stack must be used as an intermediary.
+
+ ;;- It could indeed be done; I think the best way would be to have
+ ;;- separate patterns for TARGET_FPA (which implies a 68881),
+ ;;- TARGET_68881, and no floating point co-processor. Use
+ ;;- define_expands for all of the named instruction patterns, and
+ ;;- include code in the FPA instruction to deal with the 68881 with
+ ;;- preferences specifically set to favor the fpa. Some of this has
+ ;;- already been done:
+ ;;-
+ ;;- 1) Separation of most of the patterns out into a TARGET_FPA
+ ;;- case and a TARGET_68881 case (the exceptions are the patterns
+ ;;- which would need one define_expand and three define_insn's under
+ ;;- it (with a lot of duplicate code between them) to replace the
+ ;;- current single define_insn. These are mov{[ds]f,[ds]i} and the
+ ;;- first two patterns in the md.
+ ;;-
+ ;;- Some would still have to be done:
+ ;;-
+ ;;- 1) Add code to the fpa patterns which correspond to 68881
+ ;;- patterns to deal with the 68881 case (including preferences!).
+ ;;- What you might actually do here is combine the fpa and 68881 code
+ ;;- back together into one pattern for those instructions where it's
+ ;;- absolutely necessary and save yourself some duplicate code. I'm
+ ;;- not completely sure as to whether you could get away with doing
+ ;;- this only for the mov* insns, or if you'd have to do it for all
+ ;;- named insns.
+ ;;- 2) Add code to the mov{[ds]f,[ds]i} instructions to handle
+ ;;- moving between fpa regs and 68881 regs.
+
+ ;;- Since the fpa is more powerful than the 68881 and also has more
+ ;;- registers, and since I think the resultant md would be medium ugly
+ ;;- (lot's of duplicate code, ugly constraint strings), I elected not
+ ;;- to do this change.
+
+ ;;- Another reason why someone *might* want to do the change is to
+ ;;- control which register classes are accessed in a slightly cleaner
+ ;;- way than I have. See the blurb on CONDITIONAL_REGISTER_USAGE in
+ ;;- the internals manual.
+
+ ;;- Yet another reason why someone might want to do this change is to
+ ;;- allow use of some of the 68881 insns which have no equivalent on
+ ;;- the fpa. The sqrt instruction comes fairly quickly to mind.
+
+ ;;- If this is ever done, don't forget to change sun3.h so that
+ ;;- it *will* define __HAVE_68881__ when the FPA is in use.
+
+ ;;- Condition code hack
+
+ ;;- When a floating point compare is done in the fpa, the resulting
+ ;;- condition codes are left in the fpastatus register. The values in
+ ;;- this register must be moved into the 68000 cc register before any
+ ;;- jump is executed. Once this has been done, regular jump
+ ;;- instructions are fine (ie. floating point jumps are not necessary.
+ ;;- They are only done if the cc is in the 68881).
+
+ ;;- The instructions that move the fpastatus register to the 68000
+ ;;- register clobber a data register (the move cannot be done direct).
+ ;;- These instructions might be bundled either with the compare
+ ;;- instruction, or the branch instruction. If we were using both the
+ ;;- fpa and the 68881 together, we would wish to only mark the
+ ;;- register clobbered if we were doing the compare in the fpa, but I
+ ;;- think that that decision (whether to clobber the register or not)
+ ;;- must be done before register allocation (makes sense) and hence we
+ ;;- can't know if the floating point compare will be done in the fpa
+ ;;- or the fp. So whenever we are asked for code that uses the fpa,
+ ;;- we will mark a data register as clobbered. This is reasonable, as
+ ;;- almost all floating point compare operations done with fpa code
+ ;;- enabled will be done in the fpa. It's even more reasonable since
+ ;;- we decided to make the 68881 and the fpa mutually exclusive.
+
+ ;;- We place to code to move the fpastatus register inside of a
+ ;;- define_expand so that we can do it conditionally based on whether
+ ;;- we are targeting an fpa or not.
+
+ ;;- This still leaves us with the question of where we wish to put the
+ ;;- code to move the fpastatus reg. If we put it in the compare
+ ;;- instruction, we can restrict the clobbering of the register to
+ ;;- floating point compares, but we can't take advantage of floating
+ ;;- point subtracts & etc. that alter the fpastatus register. If we
+ ;;- put it in the branch instruction, all branches compiled with fpa
+ ;;- code enabled will clobber a data register, but we will be able to
+ ;;- take advantage of fpa subtracts. This balance favors putting the
+ ;;- code in with the compare instruction.
+
+ ;;- Note that if some enterprising hacker should decide to switch
+ ;;- this, he'll need to modify the code in NOTICE_UPDATE_CC.
+
+ ;;- Usage of the top 16 fpa registers
+
+ ;;- The only locations which we may transfer fpa registers 16-31 from
+ ;;- or to are the fpa registers 0-15. (68000 registers and memory
+ ;;- locations are impossible). This causes problems in gcc, which
+ ;;- assumes that mov?? instructions require no additional registers
+ ;;- (see section 11.7) and since floating point moves *must* be
+ ;;- supported into general registers (see section 12.3 under
+ ;;- HARD_REGNO_OK_FOR_MODE_P) from anywhere.
+
+ ;;- My solution was to reserve fpa0 for moves into or out of these top
+ ;;- 16 registers and to disparage the choice to reload into or out of
+ ;;- these registers as much as I could. That alternative is always
+ ;;- last in the list, so it will not be used unless all else fails. I
+ ;;- will note that according to my current information, sun's compiler
+ ;;- doesn't use these top 16 registers at all.
+
+ ;;- There is another possible way to do it. I *believe* that if you
+ ;;- make absolutely sure that the code will not be executed in the
+ ;;- reload pass, you can support the mov?? names with define_expands
+ ;;- which require new registers. This may be possible by the
+ ;;- appropriate juggling of constraints. I may come back to this later.
+
+ ;;- Usage of constant RAM
+
+ ;;- This has been handled correctly (I believe) but the way I've done
+ ;;- it could use a little explanation. The constant RAM can only be
+ ;;- accessed when the instruction is in "command register" mode.
+ ;;- "command register" mode means that no accessing of memory or the
+ ;;- 68000 registers is being done. This can be expressed easily in
+ ;;- constraints, so generally the mode of the instruction is
+ ;;- determined by a branch off of which_alternative. In outputting
+ ;;- instructions, a 'w' means to output an access to the constant ram
+ ;;- (if the arg is CONST_DOUBLE and is one of the available
+ ;;- constants), and 'x' means to output a register pair (if the arg is
+ ;;- a 68000 register) and a 'y' is the combination of the above two
+ ;;- processes. You use a 'y' in two operand DF instructions where you
+ ;;- *know* the other operand is an fpa register, you use an 'x' in DF
+ ;;- instructions where the arg might be a 68000 register and the
+ ;;- instruction is *not* in "command register" mode, and you use a 'w'
+ ;;- in two situations: 1) The instruction *is* in command register
+ ;;- mode (and hence won't be accessing 68000 registers), or 2) The
+ ;;- instruction is a two operand SF instruction where you know the
+ ;;- other operand is an fpa register.
+
+ ;;- Optimization issues
+
+ ;;- I actually think that I've included all of the fpa instructions
+ ;;- that should be included. Note that if someone is interested in
+ ;;- doing serious floating point work on the sun fpa, I would advise
+ ;;- the use of the "asm" instruction in gcc to allow you to use the
+ ;;- sin, cos, and exponential functions on the fpa board.
+
+ ;;- END FPA Explanation Section.
+
+
+ ;;- Some of these insn's are composites of several m68000 op codes.
+ ;;- The assembler (or final @@??) insures that the appropriate one is
+ ;;- selected.
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "push_operand" "=m")
+ (match_operand:DF 1 "general_operand" "ro<>fyE"))]
+ ""
+ "*
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fmove%.d %f1,%0\";
+ if (FPA_REG_P (operands[1]))
+ return \"fpmove%.d %1, %x0\";
+ return output_move_double (operands);
+ }")
+
+ (define_insn ""
+ [(set (match_operand:DI 0 "push_operand" "=m")
+ (match_operand:DI 1 "general_operand" "ro<>Fy"))]
+ ""
+ "*
+ {
+ return output_move_double (operands);
+ }")
+
+ ;; We don't want to allow a constant operand for test insns because
+ ;; (set (cc0) (const_int foo)) has no mode information. Such insns will
+ ;; be folded while optimizing anyway.
+ (define_insn "tstsi"
+ [(set (cc0)
+ (match_operand:SI 0 "nonimmediate_operand" "rm"))]
+ ""
+ "*
+ {
+ #ifdef ISI_OV
+ /* ISI's assembler fails to handle tstl a0. */
+ if (! ADDRESS_REG_P (operands[0]))
+ #else
+ if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
+ #endif
+ return \"tst%.l %0\";
+ /* If you think that the 68020 does not support tstl a0,
+ reread page B-167 of the 68020 manual more carefully. */
+ /* On an address reg, cmpw may replace cmpl. */
+ #ifdef SGS_CMP_ORDER
+ return \"cmp%.w %0,%#0\";
+ #else
+ return \"cmp%.w %#0,%0\";
+ #endif
+ }")
+
+ ;; This can't use an address register, because comparisons
+ ;; with address registers as second operand always test the whole word.
+ (define_insn "tsthi"
+ [(set (cc0)
+ (match_operand:HI 0 "nonimmediate_operand" "dm"))]
+ ""
+ "tst%.w %0")
+
+ (define_insn "tstqi"
+ [(set (cc0)
+ (match_operand:QI 0 "nonimmediate_operand" "dm"))]
+ ""
+ "tst%.b %0")
+
+ (define_expand "tstsf"
+ [(set (cc0)
+ (match_operand:SF 0 "general_operand" ""))]
+ "TARGET_68881 || TARGET_FPA"
+ "
+ {
+ if (TARGET_FPA)
+ {
+ emit_insn (gen_tstsf_fpa (operands[0]));
+ DONE;
+ }
+ }")
+
+ (define_insn "tstsf_fpa"
+ [(set (cc0)
+ (match_operand:SF 0 "general_operand" "xmdF"))
+ (clobber (match_scratch:SI 1 "=d"))]
+ "TARGET_FPA"
+ "fptst%.s %x0\;fpmove fpastatus,%1\;movw %1,cc")
+
+ (define_insn ""
+ [(set (cc0)
+ (match_operand:SF 0 "general_operand" "fdm"))]
+ "TARGET_68881"
+ "*
+ {
+ cc_status.flags = CC_IN_68881;
+ if (FP_REG_P (operands[0]))
+ return \"ftst%.x %0\";
+ return \"ftst%.s %0\";
+ }")
+
+ (define_expand "tstdf"
+ [(set (cc0)
+ (match_operand:DF 0 "general_operand" ""))]
+ "TARGET_68881 || TARGET_FPA"
+ "
+ {
+ if (TARGET_FPA)
+ {
+ emit_insn (gen_tstsf_fpa (operands[0]));
+ DONE;
+ }
+ }")
+
+ (define_insn "tstdf_fpa"
+ [(set (cc0)
+ (match_operand:DF 0 "general_operand" "xrmF"))
+ (clobber (match_scratch:SI 1 "=d"))]
+ "TARGET_FPA"
+ "fptst%.d %x0\;fpmove fpastatus,%1\;movw %1,cc")
+
+ (define_insn ""
+ [(set (cc0)
+ (match_operand:DF 0 "general_operand" "fm"))]
+ "TARGET_68881"
+ "*
+ {
+ cc_status.flags = CC_IN_68881;
+ if (FP_REG_P (operands[0]))
+ return \"ftst%.x %0\";
+ return \"ftst%.d %0\";
+ }")
+
+ ;; compare instructions.
+
+ ;; A composite of the cmp, cmpa, & cmpi m68000 op codes.
+ (define_insn "cmpsi"
+ [(set (cc0)
+ (compare (match_operand:SI 0 "nonimmediate_operand" "rKs,mr,>")
+ (match_operand:SI 1 "general_operand" "mr,Ksr,>")))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
+ #ifdef SGS_CMP_ORDER
+ return \"cmpm%.l %0,%1\";
+ #else
+ return \"cmpm%.l %1,%0\";
+ #endif
+ if (REG_P (operands[1])
+ || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM))
+ { cc_status.flags |= CC_REVERSED;
+ #ifdef SGS_CMP_ORDER
+ return \"cmp%.l %d1,%d0\";
+ #else
+ return \"cmp%.l %d0,%d1\";
+ #endif
+ }
+ #ifdef SGS_CMP_ORDER
+ return \"cmp%.l %d0,%d1\";
+ #else
+ return \"cmp%.l %d1,%d0\";
+ #endif
+ }")
+
+ (define_insn "cmphi"
+ [(set (cc0)
+ (compare (match_operand:HI 0 "nonimmediate_operand" "rnm,d,n,m,>")
+ (match_operand:HI 1 "general_operand" "d,rnm,m,n,>")))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
+ #ifdef SGS_CMP_ORDER
+ return \"cmpm%.w %0,%1\";
+ #else
+ return \"cmpm%.w %1,%0\";
+ #endif
+ if ((REG_P (operands[1]) && !ADDRESS_REG_P (operands[1]))
+ || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM))
+ { cc_status.flags |= CC_REVERSED;
+ #ifdef SGS_CMP_ORDER
+ return \"cmp%.w %d1,%d0\";
+ #else
+ return \"cmp%.w %d0,%d1\";
+ #endif
+ }
+ #ifdef SGS_CMP_ORDER
+ return \"cmp%.w %d0,%d1\";
+ #else
+ return \"cmp%.w %d1,%d0\";
+ #endif
+ }")
+
+ (define_insn "cmpqi"
+ [(set (cc0)
+ (compare (match_operand:QI 0 "nonimmediate_operand" "dn,md,>")
+ (match_operand:QI 1 "general_operand" "dm,nd,>")))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM)
+ #ifdef SGS_CMP_ORDER
+ return \"cmpm%.b %0,%1\";
+ #else
+ return \"cmpm%.b %1,%0\";
+ #endif
+ if (REG_P (operands[1])
+ || (!REG_P (operands[0]) && GET_CODE (operands[0]) != MEM))
+ { cc_status.flags |= CC_REVERSED;
+ #ifdef SGS_CMP_ORDER
+ return \"cmp%.b %d1,%d0\";
+ #else
+ return \"cmp%.b %d0,%d1\";
+ #endif
+ }
+ #ifdef SGS_CMP_ORDER
+ return \"cmp%.b %d0,%d1\";
+ #else
+ return \"cmp%.b %d1,%d0\";
+ #endif
+ }")
+
+ (define_expand "cmpdf"
+ [(set (cc0)
+ (compare (match_operand:DF 0 "general_operand" "")
+ (match_operand:DF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "
+ {
+ if (TARGET_FPA)
+ {
+ emit_insn (gen_cmpdf_fpa (operands[0], operands[1]));
+ DONE;
+ }
+ }")
+
+ (define_insn "cmpdf_fpa"
+ [(set (cc0)
+ (compare (match_operand:DF 0 "general_operand" "x,y")
+ (match_operand:DF 1 "general_operand" "xH,rmF")))
+ (clobber (match_scratch:SI 2 "=d,d"))]
+ "TARGET_FPA"
+ "fpcmp%.d %y1,%0\;fpmove fpastatus,%2\;movw %2,cc")
+
+ (define_insn ""
+ [(set (cc0)
+ (compare (match_operand:DF 0 "general_operand" "f,mG")
+ (match_operand:DF 1 "general_operand" "fmG,f")))]
+ "TARGET_68881"
+ "*
+ {
+ cc_status.flags = CC_IN_68881;
+ #ifdef SGS_CMP_ORDER
+ if (REG_P (operands[0]))
+ {
+ if (REG_P (operands[1]))
+ return \"fcmp%.x %0,%1\";
+ else
+ return \"fcmp%.d %0,%f1\";
+ }
+ cc_status.flags |= CC_REVERSED;
+ return \"fcmp%.d %1,%f0\";
+ #else
+ if (REG_P (operands[0]))
+ {
+ if (REG_P (operands[1]))
+ return \"fcmp%.x %1,%0\";
+ else
+ return \"fcmp%.d %f1,%0\";
+ }
+ cc_status.flags |= CC_REVERSED;
+ return \"fcmp%.d %f0,%1\";
+ #endif
+ }")
+
+ (define_expand "cmpsf"
+ [(set (cc0)
+ (compare (match_operand:SF 0 "general_operand" "")
+ (match_operand:SF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "
+ {
+ if (TARGET_FPA)
+ {
+ emit_insn (gen_cmpsf_fpa (operands[0], operands[1]));
+ DONE;
+ }
+ }")
+
+ (define_insn "cmpsf_fpa"
+ [(set (cc0)
+ (compare (match_operand:SF 0 "general_operand" "x,y")
+ (match_operand:SF 1 "general_operand" "xH,rmF")))
+ (clobber (match_scratch:SI 2 "=d,d"))]
+ "TARGET_FPA"
+ "fpcmp%.s %w1,%x0\;fpmove fpastatus,%2\;movw %2,cc")
+
+ (define_insn ""
+ [(set (cc0)
+ (compare (match_operand:SF 0 "general_operand" "f,mdG")
+ (match_operand:SF 1 "general_operand" "fmdG,f")))]
+ "TARGET_68881"
+ "*
+ {
+ cc_status.flags = CC_IN_68881;
+ #ifdef SGS_CMP_ORDER
+ if (FP_REG_P (operands[0]))
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fcmp%.x %0,%1\";
+ else
+ return \"fcmp%.s %0,%f1\";
+ }
+ cc_status.flags |= CC_REVERSED;
+ return \"fcmp%.s %1,%f0\";
+ #else
+ if (FP_REG_P (operands[0]))
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fcmp%.x %1,%0\";
+ else
+ return \"fcmp%.s %f1,%0\";
+ }
+ cc_status.flags |= CC_REVERSED;
+ return \"fcmp%.s %f0,%1\";
+ #endif
+ }")
+
+ ;; Recognizers for btst instructions.
+
+ (define_insn ""
+ [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "do")
+ (const_int 1)
+ (minus:SI (const_int 7)
+ (match_operand:SI 1 "general_operand" "di"))))]
+ ""
+ "* { return output_btst (operands, operands[1], operands[0], insn, 7); }")
+
+ (define_insn ""
+ [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "d")
+ (const_int 1)
+ (minus:SI (const_int 31)
+ (match_operand:SI 1 "general_operand" "di"))))]
+ ""
+ "* { return output_btst (operands, operands[1], operands[0], insn, 31); }")
+
+ ;; The following two patterns are like the previous two
+ ;; except that they use the fact that bit-number operands
+ ;; are automatically masked to 3 or 5 bits.
+
+ (define_insn ""
+ [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "do")
+ (const_int 1)
+ (minus:SI (const_int 7)
+ (and:SI
+ (match_operand:SI 1 "general_operand" "d")
+ (const_int 7)))))]
+ ""
+ "* { return output_btst (operands, operands[1], operands[0], insn, 7); }")
+
+ (define_insn ""
+ [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "d")
+ (const_int 1)
+ (minus:SI (const_int 31)
+ (and:SI
+ (match_operand:SI 1 "general_operand" "d")
+ (const_int 31)))))]
+ ""
+ "* { return output_btst (operands, operands[1], operands[0], insn, 31); }")
+
+ ;; Nonoffsettable mem refs are ok in this one pattern
+ ;; since we don't try to adjust them.
+ (define_insn ""
+ [(set (cc0) (zero_extract (match_operand:QI 0 "nonimmediate_operand" "md")
+ (const_int 1)
+ (match_operand:SI 1 "general_operand" "i")))]
+ "GET_CODE (operands[1]) == CONST_INT
+ && (unsigned) INTVAL (operands[1]) < 8"
+ "*
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, 7 - INTVAL (operands[1]));
+ return output_btst (operands, operands[1], operands[0], insn, 7);
+ }")
+
+ (define_insn ""
+ [(set (cc0) (zero_extract (match_operand:SI 0 "nonimmediate_operand" "do")
+ (const_int 1)
+ (match_operand:SI 1 "general_operand" "i")))]
+ "GET_CODE (operands[1]) == CONST_INT"
+ "*
+ {
+ if (GET_CODE (operands[0]) == MEM)
+ {
+ operands[0] = adj_offsettable_operand (operands[0],
+ INTVAL (operands[1]) / 8);
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ 7 - INTVAL (operands[1]) % 8);
+ return output_btst (operands, operands[1], operands[0], insn, 7);
+ }
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ 31 - INTVAL (operands[1]));
+ return output_btst (operands, operands[1], operands[0], insn, 31);
+ }")
+
+
+ ;; move instructions
+
+ ;; A special case in which it is not desirable
+ ;; to reload the constant into a data register.
+ (define_insn ""
+ [(set (match_operand:SI 0 "push_operand" "=m")
+ (match_operand:SI 1 "general_operand" "J"))]
+ "GET_CODE (operands[1]) == CONST_INT
+ && INTVAL (operands[1]) >= -0x8000
+ && INTVAL (operands[1]) < 0x8000"
+ "*
+ {
+ if (operands[1] == const0_rtx)
+ return \"clr%.l %0\";
+ return \"pea %a1\";
+ }")
+
+ ;This is never used.
+ ;(define_insn "swapsi"
+ ; [(set (match_operand:SI 0 "general_operand" "+r")
+ ; (match_operand:SI 1 "general_operand" "+r"))
+ ; (set (match_dup 1) (match_dup 0))]
+ ; ""
+ ; "exg %1,%0")
+
+ ;; Special case of fullword move when source is zero.
+ ;; The reason this is special is to avoid loading a zero
+ ;; into a data reg with moveq in order to store it elsewhere.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=g")
+ (const_int 0))]
+ ;; clr insns on 68000 read before writing.
+ ;; This isn't so on the 68010, but we have no alternative for it.
+ "(TARGET_68020
+ || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))"
+ "*
+ {
+ if (ADDRESS_REG_P (operands[0]))
+ return \"sub%.l %0,%0\";
+ /* moveq is faster on the 68000. */
+ if (DATA_REG_P (operands[0]) && !TARGET_68020)
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"moveq%.l %#0,%0\";
+ #else
+ return \"moveq %#0,%0\";
+ #endif
+ return \"clr%.l %0\";
+ }")
+
+ ;; General case of fullword move.
+ ;;
+ ;; This is the main "hook" for PIC code. When generating
+ ;; PIC, movsi is responsible for determining when the source address
+ ;; needs PIC relocation and appropriately calling legitimize_pic_address
+ ;; to perform the actual relocation.
+ ;;
+ ;; In both the PIC and non-PIC cases the patterns generated will
+ ;; matched by the next define_insn.
+ (define_expand "movsi"
+ [(set (match_operand:SI 0 "general_operand" "")
+ (match_operand:SI 1 "general_operand" ""))]
+ ""
+ "
+ {
+ if (flag_pic && symbolic_operand (operands[1], SImode))
+ {
+ #ifdef LEGITIMATE_BASEREL_OPERAND_P
+ if (flag_pic < 3 || !LEGITIMATE_BASEREL_OPERAND_P (operands[1]))
+ #endif
+ {
+ /* The source is an address which requires PIC relocation.
+ Call legitimize_pic_address with the source, mode, and a relocation
+ register (a new pseudo, or the final destination if reload_in_progress
+ is set). Then fall through normally */
+ extern rtx legitimize_pic_address();
+ rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode);
+ operands[1] = legitimize_pic_address (operands[1], SImode, temp);
+ }
+ }
+ }")
+
+ ;; General case of fullword move. The register constraints
+ ;; force integer constants in range for a moveq to be reloaded
+ ;; if they are headed for memory.
+ (define_insn ""
+ ;; Notes: make sure no alternative allows g vs g.
+ ;; We don't allow f-regs since fixed point cannot go in them.
+ ;; We do allow y and x regs since fixed point is allowed in them.
+ [(set (match_operand:SI 0 "general_operand" "=g,da,y,!*x*r*m")
+ (match_operand:SI 1 "general_operand" "daymKs,i,g,*x*r*m"))]
+ ""
+ "*
+ {
+ if (which_alternative == 3)
+ return \"fpmove%.l %x1,fpa0\;fpmove%.l fpa0,%x0\";
+ if (FPA_REG_P (operands[1]) || FPA_REG_P (operands[0]))
+ return \"fpmove%.l %x1,%x0\";
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ if (operands[1] == const0_rtx
+ && (DATA_REG_P (operands[0])
+ || GET_CODE (operands[0]) == MEM)
+ /* clr insns on 68000 read before writing.
+ This isn't so on the 68010, but we have no alternative for it. */
+ && (TARGET_68020
+ || !(GET_CODE (operands[0]) == MEM
+ && MEM_VOLATILE_P (operands[0]))))
+ return \"clr%.l %0\";
+ else if (DATA_REG_P (operands[0])
+ && INTVAL (operands[1]) < 128
+ && INTVAL (operands[1]) >= -128)
+ {
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"moveq%.l %1,%0\";
+ #else
+ return \"moveq %1,%0\";
+ #endif
+ }
+ #ifndef NO_ADDSUB_Q
+ else if (DATA_REG_P (operands[0])
+ /* Do this with a moveq #N-8, dreg; addq #8,dreg */
+ && INTVAL (operands[1]) < 136
+ && INTVAL (operands[1]) >= 128)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) - 8);
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"moveq%.l %1,%0\;addq%.w %#8,%0\";
+ #else
+ return \"moveq %1,%0\;addq%.w %#8,%0\";
+ #endif
+ }
+ else if (DATA_REG_P (operands[0])
+ /* Do this with a moveq #N+8, dreg; subq #8,dreg */
+ && INTVAL (operands[1]) < -128
+ && INTVAL (operands[1]) >= -136)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) + 8);
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"moveq%.l %1,%0;subq%.w %#8,%0\";
+ #else
+ return \"moveq %1,%0;subq%.w %#8,%0\";
+ #endif
+ }
+ #endif
+ else if (DATA_REG_P (operands[0])
+ /* If N is in the right range and is even, then use
+ moveq #N/2, dreg; addl dreg,dreg */
+ && INTVAL (operands[1]) > 127
+ && INTVAL (operands[1]) <= 254
+ && INTVAL (operands[1]) % 2 == 0)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) / 2);
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"moveq%.l %1,%0\;add%.w %0,%0\";
+ #else
+ return \"moveq %1,%0\;add%.w %0,%0\";
+ #endif
+ }
+ else if (ADDRESS_REG_P (operands[0])
+ && INTVAL (operands[1]) < 0x8000
+ && INTVAL (operands[1]) >= -0x8000)
+ return \"move%.w %1,%0\";
+ else if (push_operand (operands[0], SImode)
+ && INTVAL (operands[1]) < 0x8000
+ && INTVAL (operands[1]) >= -0x8000)
+ return \"pea %a1\";
+ }
+ else if ((GET_CODE (operands[1]) == SYMBOL_REF
+ || GET_CODE (operands[1]) == CONST)
+ && push_operand (operands[0], SImode))
+ return \"pea %a1\";
+ else if ((GET_CODE (operands[1]) == SYMBOL_REF
+ || GET_CODE (operands[1]) == CONST)
+ && ADDRESS_REG_P (operands[0]))
+ return \"lea %a1,%0\";
+ return \"move%.l %1,%0\";
+ }")
+
+ (define_insn "movhi"
+ [(set (match_operand:HI 0 "general_operand" "=g")
+ (match_operand:HI 1 "general_operand" "g"))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ if (operands[1] == const0_rtx
+ && (DATA_REG_P (operands[0])
+ || GET_CODE (operands[0]) == MEM)
+ /* clr insns on 68000 read before writing.
+ This isn't so on the 68010, but we have no alternative for it. */
+ && (TARGET_68020
+ || !(GET_CODE (operands[0]) == MEM
+ && MEM_VOLATILE_P (operands[0]))))
+ return \"clr%.w %0\";
+ else if (DATA_REG_P (operands[0])
+ && INTVAL (operands[1]) < 128
+ && INTVAL (operands[1]) >= -128)
+ {
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"moveq%.l %1,%0\";
+ #else
+ return \"moveq %1,%0\";
+ #endif
+ }
+ else if (INTVAL (operands[1]) < 0x8000
+ && INTVAL (operands[1]) >= -0x8000)
+ return \"move%.w %1,%0\";
+ }
+ else if (CONSTANT_P (operands[1]))
+ return \"move%.l %1,%0\";
+ #ifndef SGS_NO_LI
+ /* Recognize the insn before a tablejump, one that refers
+ to a table of offsets. Such an insn will need to refer
+ to a label on the insn. So output one. Use the label-number
+ of the table of offsets to generate this label. */
+ if (GET_CODE (operands[1]) == MEM
+ && GET_CODE (XEXP (operands[1], 0)) == PLUS
+ && (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF
+ || GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == LABEL_REF)
+ && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) != PLUS
+ && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) != PLUS)
+ {
+ rtx labelref;
+ if (GET_CODE (XEXP (XEXP (operands[1], 0), 0)) == LABEL_REF)
+ labelref = XEXP (XEXP (operands[1], 0), 0);
+ else
+ labelref = XEXP (XEXP (operands[1], 0), 1);
+ #if defined (MOTOROLA) && !defined (SGS_SWITCH_TABLES)
+ #ifdef SGS
+ asm_fprintf (asm_out_file, \"\\tset %LLI%d,.+2\\n\",
+ CODE_LABEL_NUMBER (XEXP (labelref, 0)));
+ #else /* not SGS */
+ asm_fprintf (asm_out_file, \"\\t.set %LLI%d,.+2\\n\",
+ CODE_LABEL_NUMBER (XEXP (labelref, 0)));
+ #endif /* not SGS */
+ #else /* SGS_SWITCH_TABLES or not MOTOROLA */
+ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"LI\",
+ CODE_LABEL_NUMBER (XEXP (labelref, 0)));
+ #ifdef SGS_SWITCH_TABLES
+ /* Set flag saying we need to define the symbol
+ LD%n (with value L%n-LI%n) at the end of the switch table. */
+ switch_table_difference_label_flag = 1;
+ #endif /* SGS_SWITCH_TABLES */
+ #endif /* SGS_SWITCH_TABLES or not MOTOROLA */
+ }
+ #endif /* SGS_NO_LI */
+ return \"move%.w %1,%0\";
+ }")
+
+ (define_insn "movstricthi"
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm"))
+ (match_operand:HI 1 "general_operand" "rmn"))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ if (operands[1] == const0_rtx
+ && (DATA_REG_P (operands[0])
+ || GET_CODE (operands[0]) == MEM)
+ /* clr insns on 68000 read before writing.
+ This isn't so on the 68010, but we have no alternative for it. */
+ && (TARGET_68020
+ || !(GET_CODE (operands[0]) == MEM
+ && MEM_VOLATILE_P (operands[0]))))
+ return \"clr%.w %0\";
+ }
+ return \"move%.w %1,%0\";
+ }")
+
+ (define_insn "movqi"
+ [(set (match_operand:QI 0 "general_operand" "=d,*a,m,m,?*a")
+ (match_operand:QI 1 "general_operand" "dmi*a,d*a,dmi,?*a,m"))]
+ ""
+ "*
+ {
+ rtx xoperands[4];
+
+ /* This is probably useless, since it loses for pushing a struct
+ of several bytes a byte at a time. */
+ if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC
+ && XEXP (XEXP (operands[0], 0), 0) == stack_pointer_rtx)
+ {
+ xoperands[1] = operands[1];
+ xoperands[2]
+ = gen_rtx (MEM, QImode,
+ gen_rtx (PLUS, VOIDmode, stack_pointer_rtx, const1_rtx));
+ /* Just pushing a byte puts it in the high byte of the halfword. */
+ /* We must put it in the low-order, high-numbered byte. */
+ output_asm_insn (\"move%.b %1,%-\;move%.b %@,%2\", xoperands);
+ return \"\";
+ }
+
+ /* Moving a byte into an address register is not possible. */
+ /* Use d0 as an intermediate, but don't clobber its contents. */
+ if (ADDRESS_REG_P (operands[0]) && GET_CODE (operands[1]) == MEM)
+ {
+ /* ??? For 2.5, don't allow this choice and use secondary reloads
+ instead.
+
+ See if the address register is used in the address. If it
+ is, we have to generate a more complex sequence than those below. */
+ if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
+ operands[1], NULL_RTX))
+ {
+ /* See if the stack pointer is used in the address. If it isn't,
+ we can push d0 or d1 (the insn can't use both of them) on
+ the stack, perform our move into d0/d1, copy the byte from d0/1,
+ and pop d0/1. */
+ if (! reg_mentioned_p (stack_pointer_rtx, operands[1]))
+ {
+ if (refers_to_regno_p (0, 1, operands[1], NULL_RTX))
+ return \"move%.l %/d0,%-\;move%.b %1,%/d0\;move%.l %/d0,%0\;move%.l %+,%/d0\";
+ else
+ return \"move%.l %/d1,%-\;move%.b %1,%/d1\;move%.l %/d1,%0\;move%.l %+,%/d1\";
+ }
+ else
+ {
+ /* Otherwise, we know that d0 cannot be used in the address
+ (since sp and one address register is). Assume that sp is
+ being used as a base register and replace the address
+ register that is our operand[0] with d0. */
+ rtx reg_map[FIRST_PSEUDO_REGISTER];
+ int i;
+
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+ reg_map[i] = 0;
+
+ reg_map[REGNO (operands[0])] = gen_rtx (REG, Pmode, 0);
+ operands[1] = copy_rtx (operands[1]);
+ replace_regs (operands[1], reg_map, FIRST_PSEUDO_REGISTER, 0);
+ return \"exg %/d0,%0\;move%.b %1,%/d0\;exg %/d0,%0\";
+ }
+ }
+
+ /* If the address of operand 1 uses d0, choose d1 as intermediate. */
+ if (refers_to_regno_p (0, 1, operands[1], NULL_RTX))
+ return \"exg %/d1,%0\;move%.b %1,%/d1\;exg %/d1,%0\";
+ /* Otherwise d0 is usable.
+ (An effective address on the 68k can't use two d-regs.) */
+ else
+ return \"exg %/d0,%0\;move%.b %1,%/d0\;exg %/d0,%0\";
+ }
+
+ /* Likewise for moving from an address reg. */
+ if (ADDRESS_REG_P (operands[1]) && GET_CODE (operands[0]) == MEM)
+ {
+ /* ??? For 2.5, don't allow this choice and use secondary reloads
+ instead.
+
+ See if the address register is used in the address. If it
+ is, we have to generate a more complex sequence than those below. */
+ if (refers_to_regno_p (REGNO (operands[1]), REGNO (operands[1]) + 1,
+ operands[0], NULL_RTX))
+ {
+ /* See if the stack pointer is used in the address. If it isn't,
+ we can push d0 or d1 (the insn can't use both of them) on
+ the stack, copy the byte to d0/1, perform our move from d0/d1,
+ and pop d0/1. */
+ if (! reg_mentioned_p (stack_pointer_rtx, operands[0]))
+ {
+ if (refers_to_regno_p (0, 1, operands[0], NULL_RTX))
+ return \"move%.l %/d0,%-\;move%.l %1,%/d0\;move%.b %/d0,%0\;move%.l %+,%/d0\";
+ else
+ return \"move%.l %/d1,%-\;move%.l %1,%/d1\;move%.b %/d1,%0\;move%.l %+,%/d1\";
+ }
+ else
+ {
+ /* Otherwise, we know that d0 cannot be used in the address
+ (since sp and one address register is). Assume that sp is
+ being used as a base register and replace the address
+ register that is our operand[1] with d0. */
+ rtx reg_map[FIRST_PSEUDO_REGISTER];
+ int i;
+
+ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+ reg_map[i] = 0;
+
+ reg_map[REGNO (operands[1])] = gen_rtx (REG, Pmode, 0);
+ operands[0] = copy_rtx (operands[0]);
+ replace_regs (operands[0], reg_map, FIRST_PSEUDO_REGISTER, 0);
+ return \"exg %/d0,%1\;move%.b %/d0,%0\;exg %/d0,%1\";
+ }
+ }
+
+ if (refers_to_regno_p (0, 1, operands[0], NULL_RTX))
+ return \"exg %/d1,%1\;move%.b %/d1,%0\;exg %/d1,%1\";
+ else
+ return \"exg %/d0,%1\;move%.b %/d0,%0\;exg %/d0,%1\";
+ }
+
+ /* clr and st insns on 68000 read before writing.
+ This isn't so on the 68010, but we have no alternative for it. */
+ if (TARGET_68020
+ || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0])))
+ {
+ if (operands[1] == const0_rtx)
+ return \"clr%.b %0\";
+ if (GET_CODE (operands[1]) == CONST_INT
+ && INTVAL (operands[1]) == -1)
+ {
+ CC_STATUS_INIT;
+ return \"st %0\";
+ }
+ }
+ if (GET_CODE (operands[1]) != CONST_INT && CONSTANT_P (operands[1]))
+ return \"move%.l %1,%0\";
+ if (ADDRESS_REG_P (operands[0]) || ADDRESS_REG_P (operands[1]))
+ return \"move%.w %1,%0\";
+ return \"move%.b %1,%0\";
+ }")
+
+ (define_insn "movstrictqi"
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm"))
+ (match_operand:QI 1 "general_operand" "dmn"))]
+ ""
+ "*
+ {
+ if (operands[1] == const0_rtx
+ /* clr insns on 68000 read before writing.
+ This isn't so on the 68010, but we have no alternative for it. */
+ && (TARGET_68020
+ || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))))
+ return \"clr%.b %0\";
+ return \"move%.b %1,%0\";
+ }")
+
+ (define_insn "movsf"
+ [(set (match_operand:SF 0 "general_operand" "=rmf,x,y,rm,!x,!rm")
+ (match_operand:SF 1 "general_operand" "rmfF,xH,rmF,y,rm,x"))]
+ ; [(set (match_operand:SF 0 "general_operand" "=rmf")
+ ; (match_operand:SF 1 "general_operand" "rmfF"))]
+ ""
+ "*
+ {
+ if (which_alternative >= 4)
+ return \"fpmove%.s %1,fpa0\;fpmove%.s fpa0,%0\";
+ if (FPA_REG_P (operands[0]))
+ {
+ if (FPA_REG_P (operands[1]))
+ return \"fpmove%.s %x1,%x0\";
+ else if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ return output_move_const_single (operands);
+ else if (FP_REG_P (operands[1]))
+ return \"fmove%.s %1,sp@-\;fpmove%.d sp@+, %0\";
+ return \"fpmove%.s %x1,%x0\";
+ }
+ if (FPA_REG_P (operands[1]))
+ {
+ if (FP_REG_P (operands[0]))
+ return \"fpmove%.s %x1,sp@-\;fmove%.s sp@+,%0\";
+ else
+ return \"fpmove%.s %x1,%x0\";
+ }
+ if (FP_REG_P (operands[0]))
+ {
+ if (FP_REG_P (operands[1]))
+ return \"f%$move%.x %1,%0\";
+ else if (ADDRESS_REG_P (operands[1]))
+ return \"move%.l %1,%-\;f%$move%.s %+,%0\";
+ else if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ return output_move_const_single (operands);
+ return \"f%$move%.s %f1,%0\";
+ }
+ if (FP_REG_P (operands[1]))
+ {
+ if (ADDRESS_REG_P (operands[0]))
+ return \"fmove%.s %1,%-\;move%.l %+,%0\";
+ return \"fmove%.s %f1,%0\";
+ }
+ return \"move%.l %1,%0\";
+ }")
+
+ (define_insn "movdf"
+ [(set (match_operand:DF 0 "general_operand" "=rm,rf,rf,&rof<>,y,rm,x,!x,!rm")
+ (match_operand:DF 1 "general_operand" "rf,m,0,rofE<>,rmE,y,xH,rm,x"))]
+ ; [(set (match_operand:DF 0 "general_operand" "=rm,&rf,&rof<>")
+ ; (match_operand:DF 1 "general_operand" "rf,m,rofF<>"))]
+ ""
+ "*
+ {
+ if (which_alternative == 7)
+ return \"fpmove%.d %x1,fpa0\;fpmove%.d fpa0,%x0\";
+ if (FPA_REG_P (operands[0]))
+ {
+ if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ return output_move_const_double (operands);
+ if (FP_REG_P (operands[1]))
+ return \"fmove%.d %1,sp@-\;fpmove%.d sp@+,%x0\";
+ return \"fpmove%.d %x1,%x0\";
+ }
+ else if (FPA_REG_P (operands[1]))
+ {
+ if (FP_REG_P(operands[0]))
+ return \"fpmove%.d %x1,sp@-\;fmoved sp@+,%0\";
+ else
+ return \"fpmove%.d %x1,%x0\";
+ }
+ if (FP_REG_P (operands[0]))
+ {
+ if (FP_REG_P (operands[1]))
+ return \"f%&move%.x %1,%0\";
+ if (REG_P (operands[1]))
+ {
+ rtx xoperands[2];
+ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
+ output_asm_insn (\"move%.l %1,%-\", xoperands);
+ output_asm_insn (\"move%.l %1,%-\", operands);
+ return \"f%&move%.d %+,%0\";
+ }
+ if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ return output_move_const_double (operands);
+ return \"f%&move%.d %f1,%0\";
+ }
+ else if (FP_REG_P (operands[1]))
+ {
+ if (REG_P (operands[0]))
+ {
+ output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ return \"move%.l %+,%0\";
+ }
+ else
+ return \"fmove%.d %f1,%0\";
+ }
+ return output_move_double (operands);
+ }
+ ")
+
+ (define_expand "movxf"
+ [(set (match_operand:XF 0 "nonimmediate_operand" "")
+ (match_operand:XF 1 "general_operand" ""))]
+ ""
+ "
+ {
+ if (CONSTANT_P (operands[1]))
+ {
+ operands[1] = force_const_mem (XFmode, operands[1]);
+ if (! memory_address_p (XFmode, XEXP (operands[1], 0))
+ && ! reload_in_progress)
+ operands[1] = change_address (operands[1], XFmode,
+ XEXP (operands[1], 0));
+ }
+ }")
+
+ (define_insn ""
+ [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,!r,!f")
+ (match_operand:XF 1 "nonimmediate_operand" "m,f,f,f,r"))]
+ "TARGET_68881"
+ "*
+ {
+ if (FP_REG_P (operands[0]))
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fmove%.x %1,%0\";
+ if (REG_P (operands[1]))
+ {
+ rtx xoperands[2];
+ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 2);
+ output_asm_insn (\"move%.l %1,%-\", xoperands);
+ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
+ output_asm_insn (\"move%.l %1,%-\", xoperands);
+ output_asm_insn (\"move%.l %1,%-\", operands);
+ return \"fmove%.x %+,%0\";
+ }
+ if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ return \"fmove%.x %1,%0\";
+ return \"fmove%.x %f1,%0\";
+ }
+ if (REG_P (operands[0]))
+ {
+ output_asm_insn (\"fmove%.x %f1,%-\;move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ output_asm_insn (\"move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ return \"move%.l %+,%0\";
+ }
+ return \"fmove%.x %f1,%0\";
+ }
+ ")
+
+ (define_insn ""
+ [(set (match_operand:XF 0 "nonimmediate_operand" "=rm,rf,&rof<>")
+ (match_operand:XF 1 "nonimmediate_operand" "rf,m,rof<>"))]
+ "! TARGET_68881"
+ "*
+ {
+ if (FP_REG_P (operands[0]))
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fmove%.x %1,%0\";
+ if (REG_P (operands[1]))
+ {
+ rtx xoperands[2];
+ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 2);
+ output_asm_insn (\"move%.l %1,%-\", xoperands);
+ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
+ output_asm_insn (\"move%.l %1,%-\", xoperands);
+ output_asm_insn (\"move%.l %1,%-\", operands);
+ return \"fmove%.x %+,%0\";
+ }
+ if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ return \"fmove%.x %1,%0\";
+ return \"fmove%.x %f1,%0\";
+ }
+ if (FP_REG_P (operands[1]))
+ {
+ if (REG_P (operands[0]))
+ {
+ output_asm_insn (\"fmove%.x %f1,%-\;move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ output_asm_insn (\"move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ return \"move%.l %+,%0\";
+ }
+ else
+ return \"fmove%.x %f1,%0\";
+ }
+ return output_move_double (operands);
+ }
+ ")
+
+ ;; movdi can apply to fp regs in some cases
+ (define_insn "movdi"
+ ;; Let's see if it really still needs to handle fp regs, and, if so, why.
+ [(set (match_operand:DI 0 "general_operand" "=rm,r,&ro<>,y,rm,!*x,!rm")
+ (match_operand:DI 1 "general_operand" "rF,m,roi<>F,rmiF,y,rmF,*x"))]
+ ; [(set (match_operand:DI 0 "general_operand" "=rm,&r,&ro<>,!&rm,!&f,y,rm,x,!x,!rm")
+ ; (match_operand:DI 1 "general_operand" "r,m,roi<>,fF,rfmF,rmi,y,rm,x"))]
+ ; [(set (match_operand:DI 0 "general_operand" "=rm,&rf,&ro<>,!&rm,!&f")
+ ; (match_operand:DI 1 "general_operand" "r,m,roi<>,fF,rfF"))]
+ ""
+ "*
+ {
+ if (which_alternative == 8)
+ return \"fpmove%.d %x1,fpa0\;fpmove%.d fpa0,%x0\";
+ if (FPA_REG_P (operands[0]) || FPA_REG_P (operands[1]))
+ return \"fpmove%.d %x1,%x0\";
+ if (FP_REG_P (operands[0]))
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fmove%.x %1,%0\";
+ if (REG_P (operands[1]))
+ {
+ rtx xoperands[2];
+ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
+ output_asm_insn (\"move%.l %1,%-\", xoperands);
+ output_asm_insn (\"move%.l %1,%-\", operands);
+ return \"fmove%.d %+,%0\";
+ }
+ if (GET_CODE (operands[1]) == CONST_DOUBLE)
+ return output_move_const_double (operands);
+ return \"fmove%.d %f1,%0\";
+ }
+ else if (FP_REG_P (operands[1]))
+ {
+ if (REG_P (operands[0]))
+ {
+ output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ return \"move%.l %+,%0\";
+ }
+ else
+ return \"fmove%.d %f1,%0\";
+ }
+ return output_move_double (operands);
+ }
+ ")
+
+ ;; Thus goes after the move instructions
+ ;; because the move instructions are better (require no spilling)
+ ;; when they can apply. It goes before the add/sub insns
+ ;; so we will prefer it to them.
+
+ (define_insn "pushasi"
+ [(set (match_operand:SI 0 "push_operand" "=m")
+ (match_operand:SI 1 "address_operand" "p"))]
+ ""
+ "pea %a1")
+
+ ;; truncation instructions
+ (define_insn "truncsiqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm,d")
+ (truncate:QI
+ (match_operand:SI 1 "general_operand" "doJ,i")))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[0]) == REG)
+ {
+ /* Must clear condition codes, since the move.l bases them on
+ the entire 32 bits, not just the desired 8 bits. */
+ CC_STATUS_INIT;
+ return \"move%.l %1,%0\";
+ }
+ if (GET_CODE (operands[1]) == MEM)
+ operands[1] = adj_offsettable_operand (operands[1], 3);
+ return \"move%.b %1,%0\";
+ }")
+
+ (define_insn "trunchiqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm,d")
+ (truncate:QI
+ (match_operand:HI 1 "general_operand" "doJ,i")))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[0]) == REG
+ && (GET_CODE (operands[1]) == MEM
+ || GET_CODE (operands[1]) == CONST_INT))
+ {
+ /* Must clear condition codes, since the move.w bases them on
+ the entire 16 bits, not just the desired 8 bits. */
+ CC_STATUS_INIT;
+ return \"move%.w %1,%0\";
+ }
+ if (GET_CODE (operands[0]) == REG)
+ {
+ /* Must clear condition codes, since the move.l bases them on
+ the entire 32 bits, not just the desired 8 bits. */
+ CC_STATUS_INIT;
+ return \"move%.l %1,%0\";
+ }
+ if (GET_CODE (operands[1]) == MEM)
+ operands[1] = adj_offsettable_operand (operands[1], 1);
+ return \"move%.b %1,%0\";
+ }")
+
+ (define_insn "truncsihi2"
+ [(set (match_operand:HI 0 "general_operand" "=dm,d")
+ (truncate:HI
+ (match_operand:SI 1 "general_operand" "roJ,i")))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[0]) == REG)
+ {
+ /* Must clear condition codes, since the move.l bases them on
+ the entire 32 bits, not just the desired 8 bits. */
+ CC_STATUS_INIT;
+ return \"move%.l %1,%0\";
+ }
+ if (GET_CODE (operands[1]) == MEM)
+ operands[1] = adj_offsettable_operand (operands[1], 2);
+ return \"move%.w %1,%0\";
+ }")
+
+ ;; zero extension instructions
+
+ (define_expand "zero_extendhisi2"
+ [(set (match_operand:SI 0 "register_operand" "")
+ (const_int 0))
+ (set (strict_low_part (match_dup 2))
+ (match_operand:HI 1 "general_operand" ""))]
+ ""
+ "
+ {
+ operands[1] = make_safe_from (operands[1], operands[0]);
+ if (GET_CODE (operands[0]) == SUBREG)
+ operands[2] = gen_rtx (SUBREG, HImode, SUBREG_REG (operands[0]),
+ SUBREG_WORD (operands[0]));
+ else
+ operands[2] = gen_rtx (SUBREG, HImode, operands[0], 0);
+ }")
+
+ (define_expand "zero_extendqihi2"
+ [(set (match_operand:HI 0 "register_operand" "")
+ (const_int 0))
+ (set (strict_low_part (match_dup 2))
+ (match_operand:QI 1 "general_operand" ""))]
+ ""
+ "
+ {
+ operands[1] = make_safe_from (operands[1], operands[0]);
+ if (GET_CODE (operands[0]) == SUBREG)
+ operands[2] = gen_rtx (SUBREG, QImode, SUBREG_REG (operands[0]),
+ SUBREG_WORD (operands[0]));
+ else
+ operands[2] = gen_rtx (SUBREG, QImode, operands[0], 0);
+ }")
+
+ (define_expand "zero_extendqisi2"
+ [(set (match_operand:SI 0 "register_operand" "")
+ (const_int 0))
+ (set (strict_low_part (match_dup 2))
+ (match_operand:QI 1 "general_operand" ""))]
+ ""
+ "
+ {
+ operands[1] = make_safe_from (operands[1], operands[0]);
+ if (GET_CODE (operands[0]) == SUBREG)
+ operands[2] = gen_rtx (SUBREG, QImode, SUBREG_REG (operands[0]),
+ SUBREG_WORD (operands[0]));
+ else
+ operands[2] = gen_rtx (SUBREG, QImode, operands[0], 0);
+ }")
+
+ ;; Patterns to recognize zero-extend insns produced by the combiner.
+ ;; We don't allow both operands in memory, because of aliasing problems.
+ ;; Explicitly disallow two memory operands via the condition since reloading
+ ;; of this case will result in worse code than the uncombined patterns.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=do<>,d<")
+ (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
+ "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM"
+ "*
+ {
+ if (DATA_REG_P (operands[0]))
+ {
+ if (GET_CODE (operands[1]) == REG
+ && REGNO (operands[0]) == REGNO (operands[1]))
+ return \"and%.l %#0xFFFF,%0\";
+ if (reg_mentioned_p (operands[0], operands[1]))
+ return \"move%.w %1,%0\;and%.l %#0xFFFF,%0\";
+ return \"clr%.l %0\;move%.w %1,%0\";
+ }
+ else if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
+ return \"move%.w %1,%0\;clr%.w %0\";
+ else if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == POST_INC)
+ return \"clr%.w %0\;move%.w %1,%0\";
+ else
+ {
+ output_asm_insn (\"clr%.w %0\", operands);
+ operands[0] = adj_offsettable_operand (operands[0], 2);
+ return \"move%.w %1,%0\";
+ }
+ }")
+
+ (define_insn ""
+ [(set (match_operand:HI 0 "general_operand" "=do<>,d")
+ (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "d,m")))]
+ "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM"
+ "*
+ {
+ if (DATA_REG_P (operands[0]))
+ {
+ if (GET_CODE (operands[1]) == REG
+ && REGNO (operands[0]) == REGNO (operands[1]))
+ return \"and%.w %#0xFF,%0\";
+ if (reg_mentioned_p (operands[0], operands[1]))
+ return \"move%.b %1,%0\;and%.w %#0xFF,%0\";
+ return \"clr%.w %0\;move%.b %1,%0\";
+ }
+ else if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
+ {
+ if (REGNO (XEXP (XEXP (operands[0], 0), 0))
+ == STACK_POINTER_REGNUM)
+ {
+ output_asm_insn (\"clr%.w %-\", operands);
+ operands[0] = gen_rtx (MEM, GET_MODE (operands[0]),
+ plus_constant (stack_pointer_rtx, 1));
+ return \"move%.b %1,%0\";
+ }
+ else
+ return \"move%.b %1,%0\;clr%.b %0\";
+ }
+ else if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == POST_INC)
+ return \"clr%.b %0\;move%.b %1,%0\";
+ else
+ {
+ output_asm_insn (\"clr%.b %0\", operands);
+ operands[0] = adj_offsettable_operand (operands[0], 1);
+ return \"move%.b %1,%0\";
+ }
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=do<>,d")
+ (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "d,m")))]
+ "GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM"
+ "*
+ {
+ if (DATA_REG_P (operands[0]))
+ {
+ if (GET_CODE (operands[1]) == REG
+ && REGNO (operands[0]) == REGNO (operands[1]))
+ return \"and%.l %#0xFF,%0\";
+ if (reg_mentioned_p (operands[0], operands[1]))
+ return \"move%.b %1,%0\;and%.l %#0xFF,%0\";
+ return \"clr%.l %0\;move%.b %1,%0\";
+ }
+ else if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
+ {
+ operands[0] = XEXP (XEXP (operands[0], 0), 0);
+ #ifdef MOTOROLA
+ #ifdef SGS
+ return \"clr%.l -(%0)\;move%.b %1,3(%0)\";
+ #else
+ return \"clr%.l -(%0)\;move%.b %1,(3,%0)\";
+ #endif
+ #else
+ return \"clrl %0@-\;moveb %1,%0@(3)\";
+ #endif
+ }
+ else if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == POST_INC)
+ {
+ operands[0] = XEXP (XEXP (operands[0], 0), 0);
+ #ifdef MOTOROLA
+ #ifdef SGS
+ return \"clr%.l (%0)+\;move%.b %1,-1(%0)\";
+ #else
+ return \"clr%.l (%0)+\;move%.b %1,(-1,%0)\";
+ #endif
+ #else
+ return \"clrl %0@+\;moveb %1,%0@(-1)\";
+ #endif
+ }
+ else
+ {
+ output_asm_insn (\"clr%.l %0\", operands);
+ operands[0] = adj_offsettable_operand (operands[0], 3);
+ return \"move%.b %1,%0\";
+ }
+ }")
+
+ ;; sign extension instructions
+
+ (define_insn "extendhisi2"
+ [(set (match_operand:SI 0 "general_operand" "=*d,a")
+ (sign_extend:SI
+ (match_operand:HI 1 "nonimmediate_operand" "0,rm")))]
+ ""
+ "*
+ {
+ if (ADDRESS_REG_P (operands[0]))
+ return \"move%.w %1,%0\";
+ return \"ext%.l %0\";
+ }")
+
+ (define_insn "extendqihi2"
+ [(set (match_operand:HI 0 "general_operand" "=d")
+ (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "0")))]
+ ""
+ "ext%.w %0")
+
+ (define_insn "extendqisi2"
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "0")))]
+ "TARGET_68020"
+ "extb%.l %0")
+
+ ;; Conversions between float and double.
+
+ (define_expand "extendsfdf2"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (float_extend:DF
+ (match_operand:SF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=x,y")
+ (float_extend:DF
+ (match_operand:SF 1 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "fpstod %w1,%0")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=*fdm,f")
+ (float_extend:DF
+ (match_operand:SF 1 "general_operand" "f,dmF")))]
+ "TARGET_68881"
+ "*
+ {
+ if (FP_REG_P (operands[0]) && FP_REG_P (operands[1]))
+ {
+ if (REGNO (operands[0]) == REGNO (operands[1]))
+ {
+ /* Extending float to double in an fp-reg is a no-op.
+ NOTICE_UPDATE_CC has already assumed that the
+ cc will be set. So cancel what it did. */
+ cc_status = cc_prev_status;
+ return \"\";
+ }
+ return \"f%&move%.x %1,%0\";
+ }
+ if (FP_REG_P (operands[0]))
+ return \"f%&move%.s %f1,%0\";
+ if (DATA_REG_P (operands[0]) && FP_REG_P (operands[1]))
+ {
+ output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ return \"move%.l %+,%0\";
+ }
+ return \"fmove%.d %f1,%0\";
+ }")
+
+ ;; This cannot output into an f-reg because there is no way to be
+ ;; sure of truncating in that case.
+ ;; But on the Sun FPA, we can be sure.
+ (define_expand "truncdfsf2"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (float_truncate:SF
+ (match_operand:DF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=x,y")
+ (float_truncate:SF
+ (match_operand:DF 1 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "fpdtos %y1,%0")
+
+ ;; On the '040 we can truncate in a register accurately and easily.
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (float_truncate:SF
+ (match_operand:DF 1 "general_operand" "fmG")))]
+ "TARGET_68040_ONLY"
+ "*
+ {
+ if (FP_REG_P (operands[1]))
+ return \"f%$move%.x %1,%0\";
+ return \"f%$move%.d %f1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=dm")
+ (float_truncate:SF
+ (match_operand:DF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.s %f1,%0")
+
+ ;; Conversion between fixed point and floating point.
+ ;; Note that among the fix-to-float insns
+ ;; the ones that start with SImode come first.
+ ;; That is so that an operand that is a CONST_INT
+ ;; (and therefore lacks a specific machine mode).
+ ;; will be recognized as SImode (which is always valid)
+ ;; rather than as QImode or HImode.
+
+ (define_expand "floatsisf2"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (float:SF (match_operand:SI 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=y,x")
+ (float:SF (match_operand:SI 1 "general_operand" "rmi,x")))]
+ "TARGET_FPA"
+ "fpltos %1,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (float:SF (match_operand:SI 1 "general_operand" "dmi")))]
+ "TARGET_68881"
+ "f%$move%.l %1,%0")
+
+ (define_expand "floatsidf2"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (float:DF (match_operand:SI 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=y,x")
+ (float:DF (match_operand:SI 1 "general_operand" "rmi,x")))]
+ "TARGET_FPA"
+ "fpltod %1,%0")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (float:DF (match_operand:SI 1 "general_operand" "dmi")))]
+ "TARGET_68881"
+ "f%&move%.l %1,%0")
+
+ (define_insn "floathisf2"
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (float:SF (match_operand:HI 1 "general_operand" "dmn")))]
+ "TARGET_68881"
+ "f%$move%.w %1,%0")
+
+ (define_insn "floathidf2"
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (float:DF (match_operand:HI 1 "general_operand" "dmn")))]
+ "TARGET_68881"
+ "fmove%.w %1,%0")
+
+ (define_insn "floatqisf2"
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (float:SF (match_operand:QI 1 "general_operand" "dmn")))]
+ "TARGET_68881"
+ "fmove%.b %1,%0")
+
+ (define_insn "floatqidf2"
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (float:DF (match_operand:QI 1 "general_operand" "dmn")))]
+ "TARGET_68881"
+ "f%&move%.b %1,%0")
+
+ ;; New routines to convert floating-point values to integers
+ ;; to be used on the '040. These should be faster than trapping
+ ;; into the kernel to emulate fintrz. They should also be faster
+ ;; than calling the subroutines fixsfsi or fixdfsi.
+
+ (define_insn "fix_truncdfsi2"
+ [(set (match_operand:SI 0 "general_operand" "=dm")
+ (fix:SI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
+ (clobber (match_scratch:SI 2 "=d"))
+ (clobber (match_scratch:SI 3 "=d"))]
+ "TARGET_68881 && TARGET_68040"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"fmovem%.l %!,%2\;moveq %#16,%3\;or%.l %2,%3\;and%.w %#-33,%3\;fmovem%.l %3,%!\;fmove%.l %1,%0\;fmovem%.l %2,%!\";
+ }")
+
+ (define_insn "fix_truncdfhi2"
+ [(set (match_operand:HI 0 "general_operand" "=dm")
+ (fix:HI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
+ (clobber (match_scratch:SI 2 "=d"))
+ (clobber (match_scratch:SI 3 "=d"))]
+ "TARGET_68881 && TARGET_68040"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"fmovem%.l %!,%2\;moveq %#16,%3\;or%.l %2,%3\;and%.w %#-33,%3\;fmovem%.l %3,%!\;fmove%.w %1,%0\;fmovem%.l %2,%!\";
+ }")
+
+ (define_insn "fix_truncdfqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm")
+ (fix:QI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
+ (clobber (match_scratch:SI 2 "=d"))
+ (clobber (match_scratch:SI 3 "=d"))]
+ "TARGET_68881 && TARGET_68040"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"fmovem%.l %!,%2\;moveq %#16,%3\;or%.l %2,%3\;and%.w %#-33,%3\;fmovem%.l %3,%!\;fmove%.b %1,%0\;fmovem%.l %2,%!\";
+ }")
+
+ ;; Convert a float to a float whose value is an integer.
+ ;; This is the first stage of converting it to an integer type.
+
+ (define_insn "ftruncdf2"
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (fix:DF (match_operand:DF 1 "general_operand" "fFm")))]
+ "TARGET_68881 && !TARGET_68040"
+ "*
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fintrz%.x %f1,%0\";
+ return \"fintrz%.d %f1,%0\";
+ }")
+
+ (define_insn "ftruncsf2"
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (fix:SF (match_operand:SF 1 "general_operand" "dfFm")))]
+ "TARGET_68881 && !TARGET_68040"
+ "*
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fintrz%.x %f1,%0\";
+ return \"fintrz%.s %f1,%0\";
+ }")
+
+ ;; Convert a float whose value is an integer
+ ;; to an actual integer. Second stage of converting float to integer type.
+ (define_insn "fixsfqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm")
+ (fix:QI (match_operand:SF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.b %1,%0")
+
+ (define_insn "fixsfhi2"
+ [(set (match_operand:HI 0 "general_operand" "=dm")
+ (fix:HI (match_operand:SF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.w %1,%0")
+
+ (define_insn "fixsfsi2"
+ [(set (match_operand:SI 0 "general_operand" "=dm")
+ (fix:SI (match_operand:SF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.l %1,%0")
+
+ (define_insn "fixdfqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm")
+ (fix:QI (match_operand:DF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.b %1,%0")
+
+ (define_insn "fixdfhi2"
+ [(set (match_operand:HI 0 "general_operand" "=dm")
+ (fix:HI (match_operand:DF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.w %1,%0")
+
+ (define_insn "fixdfsi2"
+ [(set (match_operand:SI 0 "general_operand" "=dm")
+ (fix:SI (match_operand:DF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.l %1,%0")
+
+ ;; Convert a float to an integer.
+ ;; On the Sun FPA, this is done in one step.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=x,y")
+ (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "xH,rmF"))))]
+ "TARGET_FPA"
+ "fpstol %w1,%0")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=x,y")
+ (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "xH,rmF"))))]
+ "TARGET_FPA"
+ "fpdtol %y1,%0")
+
+ ;; add instructions
+
+ ;; Note that the middle two alternatives are near-duplicates
+ ;; in order to handle insns generated by reload.
+ ;; This is needed since they are not themselves reloaded,
+ ;; so commutativity won't apply to them.
+ (define_insn "addsi3"
+ [(set (match_operand:SI 0 "general_operand" "=m,?a,?a,r")
+ (plus:SI (match_operand:SI 1 "general_operand" "%0,a,rJK,0")
+ (match_operand:SI 2 "general_operand" "dIKLs,rJK,a,mrIKLs")))]
+ ""
+ "*
+ {
+ if (! operands_match_p (operands[0], operands[1]))
+ {
+ if (!ADDRESS_REG_P (operands[1]))
+ {
+ rtx tmp = operands[1];
+
+ operands[1] = operands[2];
+ operands[2] = tmp;
+ }
+
+ /* These insns can result from reloads to access
+ stack slots over 64k from the frame pointer. */
+ if (((GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) + 0x8000 >= (unsigned) 0x10000))
+ || (flag_pic == 4 && operands[1] == pic_offset_table_rtx))
+ return \"move%.l %2,%0\;add%.l %1,%0\";
+ #ifdef SGS
+ if (GET_CODE (operands[2]) == REG)
+ return \"lea 0(%1,%2.l),%0\";
+ else
+ return \"lea %c2(%1),%0\";
+ #else /* not SGS */
+ #ifdef MOTOROLA
+ if (GET_CODE (operands[2]) == REG)
+ return \"lea (%1,%2.l),%0\";
+ else
+ return \"lea (%c2,%1),%0\";
+ #else /* not MOTOROLA (MIT syntax) */
+ if (GET_CODE (operands[2]) == REG)
+ return \"lea %1@(0,%2:l),%0\";
+ else
+ return \"lea %1@(%c2),%0\";
+ #endif /* not MOTOROLA */
+ #endif /* not SGS */
+ }
+ if (GET_CODE (operands[2]) == CONST_INT)
+ {
+ #ifndef NO_ADDSUB_Q
+ if (INTVAL (operands[2]) > 0
+ && INTVAL (operands[2]) <= 8)
+ return (ADDRESS_REG_P (operands[0])
+ ? \"addq%.w %2,%0\"
+ : \"addq%.l %2,%0\");
+ if (INTVAL (operands[2]) < 0
+ && INTVAL (operands[2]) >= -8)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[2]));
+ return (ADDRESS_REG_P (operands[0])
+ ? \"subq%.w %2,%0\"
+ : \"subq%.l %2,%0\");
+ }
+ /* On everything except the 68000 it is faster to use two
+ addqw instructions to add a small integer (8 < N <= 16)
+ to an address register. Likewise for subqw.*/
+ if (INTVAL (operands[2]) > 8
+ && INTVAL (operands[2]) <= 16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 8);
+ return \"addq%.w %#8,%0\;addq%.w %2,%0\";
+ }
+ if (INTVAL (operands[2]) < -8
+ && INTVAL (operands[2]) >= -16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[2]) - 8);
+ return \"subq%.w %#8,%0\;subq%.w %2,%0\";
+ }
+ #endif
+ if (ADDRESS_REG_P (operands[0])
+ && INTVAL (operands[2]) >= -0x8000
+ && INTVAL (operands[2]) < 0x8000)
+ return \"add%.w %2,%0\";
+ }
+ return \"add%.l %2,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=a")
+ (plus:SI (match_operand:SI 1 "general_operand" "0")
+ (sign_extend:SI
+ (match_operand:HI 2 "nonimmediate_operand" "rm"))))]
+ ""
+ "add%.w %2,%0")
+
+ (define_insn "addhi3"
+ [(set (match_operand:HI 0 "general_operand" "=m,r")
+ (plus:HI (match_operand:HI 1 "general_operand" "%0,0")
+ (match_operand:HI 2 "general_operand" "dn,rmn")))]
+ ""
+ "*
+ {
+ #ifndef NO_ADDSUB_Q
+ if (GET_CODE (operands[2]) == CONST_INT)
+ {
+ /* If the constant would be a negative number when interpreted as
+ HImode, make it negative. This is usually, but not always, done
+ elsewhere in the compiler. First check for constants out of range,
+ which could confuse us. */
+
+ if (INTVAL (operands[2]) >= 32768)
+ operands[2] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (operands[2]) - 65536);
+
+ if (INTVAL (operands[2]) > 0
+ && INTVAL (operands[2]) <= 8)
+ return \"addq%.w %2,%0\";
+ if (INTVAL (operands[2]) < 0
+ && INTVAL (operands[2]) >= -8)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[2]));
+ return \"subq%.w %2,%0\";
+ }
+ /* On everything except the 68000 it is faster to use two
+ addqw instructions to add a small integer (8 < N <= 16)
+ to an address register. Likewise for subqw. */
+ if (INTVAL (operands[2]) > 8
+ && INTVAL (operands[2]) <= 16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 8);
+ return \"addq%.w %#8,%0\;addq%.w %2,%0\";
+ }
+ if (INTVAL (operands[2]) < -8
+ && INTVAL (operands[2]) >= -16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[2]) - 8);
+ return \"subq%.w %#8,%0\;subq%.w %2,%0\";
+ }
+ }
+ #endif
+ return \"add%.w %2,%0\";
+ }")
+
+ ;; These insns must use MATCH_DUP instead of the more expected
+ ;; use of a matching constraint because the "output" here is also
+ ;; an input, so you can't use the matching constraint. That also means
+ ;; that you can't use the "%", so you need patterns with the matched
+ ;; operand in both positions.
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
+ (plus:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dn,rmn")))]
+ ""
+ "*
+ {
+ #ifndef NO_ADDSUB_Q
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ /* If the constant would be a negative number when interpreted as
+ HImode, make it negative. This is usually, but not always, done
+ elsewhere in the compiler. First check for constants out of range,
+ which could confuse us. */
+
+ if (INTVAL (operands[1]) >= 32768)
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (operands[1]) - 65536);
+
+ if (INTVAL (operands[1]) > 0
+ && INTVAL (operands[1]) <= 8)
+ return \"addq%.w %1,%0\";
+ if (INTVAL (operands[1]) < 0
+ && INTVAL (operands[1]) >= -8)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[1]));
+ return \"subq%.w %1,%0\";
+ }
+ /* On everything except the 68000 it is faster to use two
+ addqw instructions to add a small integer (8 < N <= 16)
+ to an address register. Likewise for subqw. */
+ if (INTVAL (operands[1]) > 8
+ && INTVAL (operands[1]) <= 16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) - 8);
+ return \"addq%.w %#8,%0\;addq%.w %1,%0\";
+ }
+ if (INTVAL (operands[1]) < -8
+ && INTVAL (operands[1]) >= -16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[1]) - 8);
+ return \"subq%.w %#8,%0\;subq%.w %1,%0\";
+ }
+ }
+ #endif
+ return \"add%.w %1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
+ (plus:HI (match_operand:HI 1 "general_operand" "dn,rmn")
+ (match_dup 0)))]
+ ""
+ "*
+ {
+ #ifndef NO_ADDSUB_Q
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ /* If the constant would be a negative number when interpreted as
+ HImode, make it negative. This is usually, but not always, done
+ elsewhere in the compiler. First check for constants out of range,
+ which could confuse us. */
+
+ if (INTVAL (operands[1]) >= 32768)
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (operands[1]) - 65536);
+
+ if (INTVAL (operands[1]) > 0
+ && INTVAL (operands[1]) <= 8)
+ return \"addq%.w %1,%0\";
+ if (INTVAL (operands[1]) < 0
+ && INTVAL (operands[1]) >= -8)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[1]));
+ return \"subq%.w %1,%0\";
+ }
+ /* On everything except the 68000 it is faster to use two
+ addqw instructions to add a small integer (8 < N <= 16)
+ to an address register. Likewise for subqw. */
+ if (INTVAL (operands[1]) > 8
+ && INTVAL (operands[1]) <= 16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) - 8);
+ return \"addq%.w %#8,%0\;addq%.w %1,%0\";
+ }
+ if (INTVAL (operands[1]) < -8
+ && INTVAL (operands[1]) >= -16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ - INTVAL (operands[1]) - 8);
+ return \"subq%.w %#8,%0\;subq%.w %1,%0\";
+ }
+ }
+ #endif
+ return \"add%.w %1,%0\";
+ }")
+
+ (define_insn "addqi3"
+ [(set (match_operand:QI 0 "general_operand" "=m,d")
+ (plus:QI (match_operand:QI 1 "general_operand" "%0,0")
+ (match_operand:QI 2 "general_operand" "dn,dmn")))]
+ ""
+ "*
+ {
+ #ifndef NO_ADDSUB_Q
+ if (GET_CODE (operands[2]) == CONST_INT)
+ {
+ if (INTVAL (operands[2]) >= 128)
+ operands[2] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (operands[2]) - 256);
+
+ if (INTVAL (operands[2]) > 0
+ && INTVAL (operands[2]) <= 8)
+ return \"addq%.b %2,%0\";
+ if (INTVAL (operands[2]) < 0 && INTVAL (operands[2]) >= -8)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[2]));
+ return \"subq%.b %2,%0\";
+ }
+ }
+ #endif
+ return \"add%.b %2,%0\";
+ }")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
+ (plus:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dn,dmn")))]
+ ""
+ "*
+ {
+ #ifndef NO_ADDSUB_Q
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ if (INTVAL (operands[1]) >= 128)
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (operands[1]) - 256);
+
+ if (INTVAL (operands[1]) > 0
+ && INTVAL (operands[1]) <= 8)
+ return \"addq%.b %1,%0\";
+ if (INTVAL (operands[1]) < 0 && INTVAL (operands[1]) >= -8)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[1]));
+ return \"subq%.b %1,%0\";
+ }
+ }
+ #endif
+ return \"add%.b %1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
+ (plus:QI (match_operand:QI 1 "general_operand" "dn,dmn")
+ (match_dup 0)))]
+ ""
+ "*
+ {
+ #ifndef NO_ADDSUB_Q
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ if (INTVAL (operands[1]) >= 128)
+ operands[1] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (operands[1]) - 256);
+
+ if (INTVAL (operands[1]) > 0
+ && INTVAL (operands[1]) <= 8)
+ return \"addq%.b %1,%0\";
+ if (INTVAL (operands[1]) < 0 && INTVAL (operands[1]) >= -8)
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, - INTVAL (operands[1]));
+ return \"subq%.b %1,%0\";
+ }
+ }
+ #endif
+ return \"add%.b %1,%0\";
+ }")
+
+ (define_expand "adddf3"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (plus:DF (match_operand:DF 1 "general_operand" "")
+ (match_operand:DF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=x,y")
+ (plus:DF (match_operand:DF 1 "general_operand" "%xH,y")
+ (match_operand:DF 2 "general_operand" "xH,dmF")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpadd%.d %y2,%0\";
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fpadd%.d %y1,%0\";
+ if (which_alternative == 0)
+ return \"fpadd3%.d %w2,%w1,%0\";
+ return \"fpadd3%.d %x2,%x1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (plus:DF (match_operand:DF 1 "general_operand" "%0")
+ (match_operand:DF 2 "general_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]))
+ return \"f%&add%.x %2,%0\";
+ return \"f%&add%.d %f2,%0\";
+ }")
+
+ (define_expand "addsf3"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (plus:SF (match_operand:SF 1 "general_operand" "")
+ (match_operand:SF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=x,y")
+ (plus:SF (match_operand:SF 1 "general_operand" "%xH,y")
+ (match_operand:SF 2 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpadd%.s %w2,%0\";
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fpadd%.s %w1,%0\";
+ if (which_alternative == 0)
+ return \"fpadd3%.s %w2,%w1,%0\";
+ return \"fpadd3%.s %2,%1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (plus:SF (match_operand:SF 1 "general_operand" "%0")
+ (match_operand:SF 2 "general_operand" "fdmF")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
+ return \"f%$add%.x %2,%0\";
+ return \"f%$add%.s %f2,%0\";
+ }")
+
+ ;; subtract instructions
+
+ (define_insn "subsi3"
+ [(set (match_operand:SI 0 "general_operand" "=m,r,!a,?d")
+ (minus:SI (match_operand:SI 1 "general_operand" "0,0,a,mrIKs")
+ (match_operand:SI 2 "general_operand" "dIKs,mrIKs,J,0")))]
+ ""
+ "*
+ {
+ if (! operands_match_p (operands[0], operands[1]))
+ {
+ if (operands_match_p (operands[0], operands[2]))
+ {
+ #ifndef NO_ADDSUB_Q
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ if (INTVAL (operands[1]) > 0
+ && INTVAL (operands[1]) <= 8)
+ return \"subq%.l %1,%0\;neg%.l %0\";
+ }
+ #endif
+ return \"sub%.l %1,%0\;neg%.l %0\";
+ }
+ /* This case is matched by J, but negating -0x8000
+ in an lea would give an invalid displacement.
+ So do this specially. */
+ if (INTVAL (operands[2]) == -0x8000)
+ return \"move%.l %1,%0\;sub%.l %2,%0\";
+ #ifdef SGS
+ return \"lea %n2(%1),%0\";
+ #else
+ #ifdef MOTOROLA
+ return \"lea (%n2,%1),%0\";
+ #else /* not MOTOROLA (MIT syntax) */
+ return \"lea %1@(%n2),%0\";
+ #endif /* not MOTOROLA */
+ #endif /* not SGS */
+ }
+ if (GET_CODE (operands[2]) == CONST_INT)
+ {
+ #ifndef NO_ADDSUB_Q
+ if (INTVAL (operands[2]) > 0
+ && INTVAL (operands[2]) <= 8)
+ return \"subq%.l %2,%0\";
+ /* Using two subqw for 8 < N <= 16 being subtracted from an
+ address register is faster on all but 68000 */
+ if (INTVAL (operands[2]) > 8
+ && INTVAL (operands[2]) <= 16
+ && ADDRESS_REG_P (operands[0])
+ && TARGET_68020)
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 8);
+ return \"subq%.w %#8,%0\;subq%.w %2,%0\";
+ }
+ #endif
+ if (ADDRESS_REG_P (operands[0])
+ && INTVAL (operands[2]) >= -0x8000
+ && INTVAL (operands[2]) < 0x8000)
+ return \"sub%.w %2,%0\";
+ }
+ return \"sub%.l %2,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=a")
+ (minus:SI (match_operand:SI 1 "general_operand" "0")
+ (sign_extend:SI
+ (match_operand:HI 2 "nonimmediate_operand" "rm"))))]
+ ""
+ "sub%.w %2,%0")
+
+ (define_insn "subhi3"
+ [(set (match_operand:HI 0 "general_operand" "=m,r")
+ (minus:HI (match_operand:HI 1 "general_operand" "0,0")
+ (match_operand:HI 2 "general_operand" "dn,rmn")))]
+ ""
+ "sub%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
+ (minus:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dn,rmn")))]
+ ""
+ "sub%.w %1,%0")
+
+ (define_insn "subqi3"
+ [(set (match_operand:QI 0 "general_operand" "=m,d")
+ (minus:QI (match_operand:QI 1 "general_operand" "0,0")
+ (match_operand:QI 2 "general_operand" "dn,dmn")))]
+ ""
+ "sub%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
+ (minus:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dn,dmn")))]
+ ""
+ "sub%.b %1,%0")
+
+ (define_expand "subdf3"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (minus:DF (match_operand:DF 1 "general_operand" "")
+ (match_operand:DF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=x,y,y")
+ (minus:DF (match_operand:DF 1 "general_operand" "xH,y,dmF")
+ (match_operand:DF 2 "general_operand" "xH,dmF,0")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fprsub%.d %y1,%0\";
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpsub%.d %y2,%0\";
+ if (which_alternative == 0)
+ return \"fpsub3%.d %w2,%w1,%0\";
+ return \"fpsub3%.d %x2,%x1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (minus:DF (match_operand:DF 1 "general_operand" "0")
+ (match_operand:DF 2 "general_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]))
+ return \"f%&sub%.x %2,%0\";
+ return \"f%&sub%.d %f2,%0\";
+ }")
+
+ (define_expand "subsf3"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (minus:SF (match_operand:SF 1 "general_operand" "")
+ (match_operand:SF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=x,y,y")
+ (minus:SF (match_operand:SF 1 "general_operand" "xH,y,rmF")
+ (match_operand:SF 2 "general_operand" "xH,rmF,0")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fprsub%.s %w1,%0\";
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpsub%.s %w2,%0\";
+ if (which_alternative == 0)
+ return \"fpsub3%.s %w2,%w1,%0\";
+ return \"fpsub3%.s %2,%1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (minus:SF (match_operand:SF 1 "general_operand" "0")
+ (match_operand:SF 2 "general_operand" "fdmF")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
+ return \"f%$sub%.x %2,%0\";
+ return \"f%$sub%.s %f2,%0\";
+ }")
+
+ ;; multiply instructions
+
+ (define_insn "mulhi3"
+ [(set (match_operand:HI 0 "general_operand" "=d")
+ (mult:HI (match_operand:HI 1 "general_operand" "%0")
+ (match_operand:HI 2 "general_operand" "dmn")))]
+ ""
+ "*
+ {
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"muls%.w %2,%0\";
+ #else
+ return \"muls %2,%0\";
+ #endif
+ }")
+
+ (define_insn "mulhisi3"
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (mult:SI (sign_extend:SI
+ (match_operand:HI 1 "nonimmediate_operand" "%0"))
+ (sign_extend:SI
+ (match_operand:HI 2 "nonimmediate_operand" "dm"))))]
+ ""
+ "*
+ {
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"muls%.w %2,%0\";
+ #else
+ return \"muls %2,%0\";
+ #endif
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (mult:SI (sign_extend:SI
+ (match_operand:HI 1 "nonimmediate_operand" "%0"))
+ (match_operand:SI 2 "const_int_operand" "n")))]
+ "INTVAL (operands[2]) >= -0x8000 && INTVAL (operands[2]) <= 0x7fff"
+ "*
+ {
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"muls%.w %2,%0\";
+ #else
+ return \"muls %2,%0\";
+ #endif
+ }")
+
+ (define_insn "mulsi3"
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (mult:SI (match_operand:SI 1 "general_operand" "%0")
+ (match_operand:SI 2 "general_operand" "dmsK")))]
+ "TARGET_68020"
+ "muls%.l %2,%0")
+
+ (define_insn "umulhisi3"
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (mult:SI (zero_extend:SI
+ (match_operand:HI 1 "nonimmediate_operand" "%0"))
+ (zero_extend:SI
+ (match_operand:HI 2 "nonimmediate_operand" "dm"))))]
+ ""
+ "*
+ {
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"mulu%.w %2,%0\";
+ #else
+ return \"mulu %2,%0\";
+ #endif
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (mult:SI (zero_extend:SI
+ (match_operand:HI 1 "nonimmediate_operand" "%0"))
+ (match_operand:SI 2 "const_int_operand" "n")))]
+ "INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 0xffff"
+ "*
+ {
+ #if defined(MOTOROLA) && !defined(CRDS)
+ return \"mulu%.w %2,%0\";
+ #else
+ return \"mulu %2,%0\";
+ #endif
+ }")
+
+ ;; We need a separate DEFINE_EXPAND for u?mulsidi3 to be able to use the
+ ;; proper matching constraint. This is because the matching is between
+ ;; the high-numbered word of the DImode operand[0] and operand[1].
+ (define_expand "umulsidi3"
+ [(parallel
+ [(set (subreg:SI (match_operand:DI 0 "register_operand" "") 1)
+ (mult:SI (match_operand:SI 1 "register_operand" "")
+ (match_operand:SI 2 "nonimmediate_operand" "")))
+ (set (subreg:SI (match_dup 0) 0)
+ (truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1))
+ (zero_extend:DI (match_dup 2)))
+ (const_int 32))))])]
+ "TARGET_68020"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (mult:SI (match_operand:SI 1 "register_operand" "%0")
+ (match_operand:SI 2 "nonimmediate_operand" "dm")))
+ (set (match_operand:SI 3 "register_operand" "=d")
+ (truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1))
+ (zero_extend:DI (match_dup 2)))
+ (const_int 32))))]
+ "TARGET_68020"
+ "mulu%.l %2,%3:%0")
+
+ ; Match immediate case. For 2.4 only match things < 2^31.
+ ; It's tricky with larger values in these patterns since we need to match
+ ; values between the two parallel multiplies, between a CONST_DOUBLE and
+ ; a CONST_INT.
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (mult:SI (match_operand:SI 1 "register_operand" "%0")
+ (match_operand:SI 2 "const_int_operand" "n")))
+ (set (match_operand:SI 3 "register_operand" "=d")
+ (truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1))
+ (match_dup 2))
+ (const_int 32))))]
+ "TARGET_68020
+ && (unsigned) INTVAL (operands[2]) <= 0x7fffffff"
+ "mulu%.l %2,%3:%0")
+
+ (define_expand "mulsidi3"
+ [(parallel
+ [(set (subreg:SI (match_operand:DI 0 "register_operand" "") 1)
+ (mult:SI (match_operand:SI 1 "register_operand" "")
+ (match_operand:SI 2 "nonimmediate_operand" "")))
+ (set (subreg:SI (match_dup 0) 0)
+ (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_dup 1))
+ (sign_extend:DI (match_dup 2)))
+ (const_int 32))))])]
+ "TARGET_68020"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (mult:SI (match_operand:SI 1 "register_operand" "%0")
+ (match_operand:SI 2 "nonimmediate_operand" "dm")))
+ (set (match_operand:SI 3 "register_operand" "=d")
+ (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_dup 1))
+ (sign_extend:DI (match_dup 2)))
+ (const_int 32))))]
+ "TARGET_68020"
+ "muls%.l %2,%3:%0")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (mult:SI (match_operand:SI 1 "register_operand" "%0")
+ (match_operand:SI 2 "const_int_operand" "n")))
+ (set (match_operand:SI 3 "register_operand" "=d")
+ (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_dup 1))
+ (match_dup 2))
+ (const_int 32))))]
+ "TARGET_68020
+ /* This test is a noop on 32 bit machines,
+ but important for a cross-compiler hosted on 64-bit machines. */
+ && INTVAL (operands[2]) <= 0x7fffffff
+ && INTVAL (operands[2]) >= -0x80000000"
+ "muls%.l %2,%3:%0")
+
+ (define_expand "muldf3"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (mult:DF (match_operand:DF 1 "general_operand" "")
+ (match_operand:DF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=x,y")
+ (mult:DF (match_operand:DF 1 "general_operand" "%xH,y")
+ (match_operand:DF 2 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[1], operands[2]))
+ return \"fpsqr%.d %y1,%0\";
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpmul%.d %y2,%0\";
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fpmul%.d %y1,%0\";
+ if (which_alternative == 0)
+ return \"fpmul3%.d %w2,%w1,%0\";
+ return \"fpmul3%.d %x2,%x1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (mult:DF (match_operand:DF 1 "general_operand" "%0")
+ (match_operand:DF 2 "general_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (GET_CODE (operands[2]) == CONST_DOUBLE
+ && floating_exact_log2 (operands[2]) && !TARGET_68040)
+ {
+ int i = floating_exact_log2 (operands[2]);
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, i);
+ return \"fscale%.l %2,%0\";
+ }
+ if (REG_P (operands[2]))
+ return \"f%&mul%.x %2,%0\";
+ return \"f%&mul%.d %f2,%0\";
+ }")
+
+ (define_expand "mulsf3"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (mult:SF (match_operand:SF 1 "general_operand" "")
+ (match_operand:SF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=x,y")
+ (mult:SF (match_operand:SF 1 "general_operand" "%xH,y")
+ (match_operand:SF 2 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[1], operands[2]))
+ return \"fpsqr%.s %w1,%0\";
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpmul%.s %w2,%0\";
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fpmul%.s %w1,%0\";
+ if (which_alternative == 0)
+ return \"fpmul3%.s %w2,%w1,%0\";
+ return \"fpmul3%.s %2,%1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (mult:SF (match_operand:SF 1 "general_operand" "%0")
+ (match_operand:SF 2 "general_operand" "fdmF")))]
+ "TARGET_68881"
+ "*
+ {
+ #ifdef FSGLMUL_USE_S
+ if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
+ return (TARGET_68040_ONLY
+ ? \"fsmul%.s %2,%0\"
+ : \"fsglmul%.s %2,%0\");
+ #else
+ if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
+ return (TARGET_68040_ONLY
+ ? \"fsmul%.x %2,%0\"
+ : \"fsglmul%.x %2,%0\");
+ #endif
+ return (TARGET_68040_ONLY
+ ? \"fsmul%.s %f2,%0\"
+ : \"fsglmul%.s %f2,%0\");
+ }")
+
+ ;; divide instructions
+
+ (define_insn "divhi3"
+ [(set (match_operand:HI 0 "general_operand" "=d")
+ (div:HI (match_operand:HI 1 "general_operand" "0")
+ (match_operand:HI 2 "general_operand" "dmn")))]
+ ""
+ "*
+ {
+ #ifdef MOTOROLA
+ return \"ext%.l %0\;divs%.w %2,%0\";
+ #else
+ return \"extl %0\;divs %2,%0\";
+ #endif
+ }")
+
+ ;; These patterns don't work because the divs instruction is undefined if
+ ;; the quotient is more than 16 bits. This valid C would be miscompiled:
+ ;; int n; short d; unsigned short q; ... q = (unsigned int) (n / d);
+ ;; Imagine what happens when n = 100000 and d = 1.
+ ;;(define_insn "divhisi3"
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI
+ ;; (div:SI
+ ;; (match_operand:SI 1 "general_operand" "0")
+ ;; (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;;#ifdef MOTOROLA
+ ;; return \"divs%.w %2,%0\";
+ ;;#else
+ ;; return \"divs %2,%0\";
+ ;;#endif
+ ;;}")
+
+ ;;(define_insn ""
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI (div:SI (match_operand:SI 1 "general_operand" "0")
+ ;; (match_operand:SI 2 "const_int_operand" "n"))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;;#ifdef MOTOROLA
+ ;; return \"divs%.w %2,%0\";
+ ;;#else
+ ;; return \"divs %2,%0\";
+ ;;#endif
+ ;;}")
+
+ (define_insn "udivhi3"
+ [(set (match_operand:HI 0 "general_operand" "=d")
+ (udiv:HI (match_operand:HI 1 "general_operand" "0")
+ (match_operand:HI 2 "general_operand" "dmn")))]
+ ""
+ "*
+ {
+ #ifdef MOTOROLA
+ return \"and%.l %#0xFFFF,%0\;divu%.w %2,%0\";
+ #else
+ return \"andl %#0xFFFF,%0\;divu %2,%0\";
+ #endif
+ }")
+
+ ;; See comment before divhisi3 why these are commented out.
+ ;;(define_insn "udivhisi3"
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI
+ ;; (udiv:SI
+ ;; (match_operand:SI 1 "general_operand" "0")
+ ;; (zero_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;;#ifdef MOTOROLA
+ ;; return \"divu%.w %2,%0\";
+ ;;#else
+ ;; return \"divu %2,%0\";
+ ;;#endif
+ ;;}")
+
+ ;;(define_insn ""
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI (udiv:SI (match_operand:SI 1 "general_operand" "0")
+ ;; (match_operand:SI 2 "const_int_operand" "n"))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;;#ifdef MOTOROLA
+ ;; return \"divu%.w %2,%0\";
+ ;;#else
+ ;; return \"divu %2,%0\";
+ ;;#endif
+ ;;}")
+
+ (define_expand "divdf3"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (div:DF (match_operand:DF 1 "general_operand" "")
+ (match_operand:DF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=x,y,y")
+ (div:DF (match_operand:DF 1 "general_operand" "xH,y,rmF")
+ (match_operand:DF 2 "general_operand" "xH,rmF,0")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fprdiv%.d %y1,%0\";
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpdiv%.d %y2,%0\";
+ if (which_alternative == 0)
+ return \"fpdiv3%.d %w2,%w1,%0\";
+ return \"fpdiv3%.d %x2,%x1,%x0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (div:DF (match_operand:DF 1 "general_operand" "0")
+ (match_operand:DF 2 "general_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]))
+ return \"f%&div%.x %2,%0\";
+ return \"f%&div%.d %f2,%0\";
+ }")
+
+ (define_expand "divsf3"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (div:SF (match_operand:SF 1 "general_operand" "")
+ (match_operand:SF 2 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=x,y,y")
+ (div:SF (match_operand:SF 1 "general_operand" "xH,y,rmF")
+ (match_operand:SF 2 "general_operand" "xH,rmF,0")))]
+ "TARGET_FPA"
+ "*
+ {
+ if (rtx_equal_p (operands[0], operands[1]))
+ return \"fpdiv%.s %w2,%0\";
+ if (rtx_equal_p (operands[0], operands[2]))
+ return \"fprdiv%.s %w1,%0\";
+ if (which_alternative == 0)
+ return \"fpdiv3%.s %w2,%w1,%0\";
+ return \"fpdiv3%.s %2,%1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (div:SF (match_operand:SF 1 "general_operand" "0")
+ (match_operand:SF 2 "general_operand" "fdmF")))]
+ "TARGET_68881"
+ "*
+ {
+ #ifdef FSGLDIV_USE_S
+ if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
+ return (TARGET_68040_ONLY
+ ? \"fsdiv%.s %2,%0\"
+ : \"fsgldiv%.s %2,%0\");
+ #else
+ if (REG_P (operands[2]) && ! DATA_REG_P (operands[2]))
+ return (TARGET_68040_ONLY
+ ? \"fsdiv%.x %2,%0\"
+ : \"fsgldiv%.x %2,%0\");
+ #endif
+ return (TARGET_68040_ONLY
+ ? \"fsdiv%.s %f2,%0\"
+ : \"fsgldiv%.s %f2,%0\");
+ }")
+
+ ;; Remainder instructions.
+
+ (define_insn "modhi3"
+ [(set (match_operand:HI 0 "general_operand" "=d")
+ (mod:HI (match_operand:HI 1 "general_operand" "0")
+ (match_operand:HI 2 "general_operand" "dmn")))]
+ ""
+ "*
+ {
+ /* The swap insn produces cc's that don't correspond to the result. */
+ CC_STATUS_INIT;
+ #ifdef MOTOROLA
+ return \"ext%.l %0\;divs%.w %2,%0\;swap %0\";
+ #else
+ return \"extl %0\;divs %2,%0\;swap %0\";
+ #endif
+ }")
+
+ ;; See comment before divhisi3 why these are commented out.
+ ;;(define_insn "modhisi3"
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI
+ ;; (mod:SI
+ ;; (match_operand:SI 1 "general_operand" "0")
+ ;; (sign_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;; /* The swap insn produces cc's that don't correspond to the result. */
+ ;; CC_STATUS_INIT;
+ ;;#ifdef MOTOROLA
+ ;; return \"divs%.w %2,%0\;swap %0\";
+ ;;#else
+ ;; return \"divs %2,%0\;swap %0\";
+ ;;#endif
+ ;;}")
+
+ ;;(define_insn ""
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI (mod:SI (match_operand:SI 1 "general_operand" "0")
+ ;; (match_operand:SI 2 "const_int_operand" "n"))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;; /* The swap insn produces cc's that don't correspond to the result. */
+ ;; CC_STATUS_INIT;
+ ;;#ifdef MOTOROLA
+ ;; return \"divs%.w %2,%0\;swap %0\";
+ ;;#else
+ ;; return \"divs %2,%0\;swap %0\";
+ ;;#endif
+ ;;}")
+
+ (define_insn "umodhi3"
+ [(set (match_operand:HI 0 "general_operand" "=d")
+ (umod:HI (match_operand:HI 1 "general_operand" "0")
+ (match_operand:HI 2 "general_operand" "dmn")))]
+ ""
+ "*
+ {
+ /* The swap insn produces cc's that don't correspond to the result. */
+ CC_STATUS_INIT;
+ #ifdef MOTOROLA
+ return \"and%.l %#0xFFFF,%0\;divu%.w %2,%0\;swap %0\";
+ #else
+ return \"andl %#0xFFFF,%0\;divu %2,%0\;swap %0\";
+ #endif
+ }")
+
+ ;; See comment before divhisi3 why these are commented out.
+ ;;(define_insn "umodhisi3"
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI
+ ;; (umod:SI
+ ;; (match_operand:SI 1 "general_operand" "0")
+ ;; (zero_extend:SI (match_operand:HI 2 "nonimmediate_operand" "dm")))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;; /* The swap insn produces cc's that don't correspond to the result. */
+ ;; CC_STATUS_INIT;
+ ;;#ifdef MOTOROLA
+ ;; return \"divu%.w %2,%0\;swap %0\";
+ ;;#else
+ ;; return \"divu %2,%0\;swap %0\";
+ ;;#endif
+ ;;}")
+
+ ;;(define_insn ""
+ ;; [(set (match_operand:HI 0 "general_operand" "=d")
+ ;; (truncate:HI (umod:SI (match_operand:SI 1 "general_operand" "0")
+ ;; (match_operand:SI 2 "const_int_operand" "n"))))]
+ ;; ""
+ ;; "*
+ ;;{
+ ;; /* The swap insn produces cc's that don't correspond to the result. */
+ ;; CC_STATUS_INIT;
+ ;;#ifdef MOTOROLA
+ ;; return \"divu%.w %2,%0\;swap %0\";
+ ;;#else
+ ;; return \"divu %2,%0\;swap %0\";
+ ;;#endif
+ ;;}")
+
+ (define_insn "divmodsi4"
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (div:SI (match_operand:SI 1 "general_operand" "0")
+ (match_operand:SI 2 "general_operand" "dmsK")))
+ (set (match_operand:SI 3 "general_operand" "=d")
+ (mod:SI (match_dup 1) (match_dup 2)))]
+ "TARGET_68020"
+ "*
+ {
+ if (find_reg_note (insn, REG_UNUSED, operands[3]))
+ return \"divs%.l %2,%0\";
+ else
+ return \"divsl%.l %2,%3:%0\";
+ }")
+
+ (define_insn "udivmodsi4"
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (udiv:SI (match_operand:SI 1 "general_operand" "0")
+ (match_operand:SI 2 "general_operand" "dmsK")))
+ (set (match_operand:SI 3 "general_operand" "=d")
+ (umod:SI (match_dup 1) (match_dup 2)))]
+ "TARGET_68020"
+ "*
+ {
+ if (find_reg_note (insn, REG_UNUSED, operands[3]))
+ return \"divu%.l %2,%0\";
+ else
+ return \"divul%.l %2,%3:%0\";
+ }")
+
+ ;; logical-and instructions
+
+ ;; Prevent AND from being made with sp. This doesn't exist in the machine
+ ;; and reload will cause inefficient code. Since sp is a FIXED_REG, we
+ ;; can't allocate pseudos into it.
+ (define_insn "andsi3"
+ [(set (match_operand:SI 0 "not_sp_operand" "=m,d")
+ (and:SI (match_operand:SI 1 "general_operand" "%0,0")
+ (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
+ ""
+ "*
+ {
+ int logval;
+ if (GET_CODE (operands[2]) == CONST_INT
+ && (INTVAL (operands[2]) | 0xffff) == 0xffffffff
+ && (DATA_REG_P (operands[0])
+ || offsettable_memref_p (operands[0])))
+ {
+ if (GET_CODE (operands[0]) != REG)
+ operands[0] = adj_offsettable_operand (operands[0], 2);
+ operands[2] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (operands[2]) & 0xffff);
+ /* Do not delete a following tstl %0 insn; that would be incorrect. */
+ CC_STATUS_INIT;
+ if (operands[2] == const0_rtx)
+ return \"clr%.w %0\";
+ return \"and%.w %2,%0\";
+ }
+ if (GET_CODE (operands[2]) == CONST_INT
+ && (logval = exact_log2 (~ INTVAL (operands[2]))) >= 0
+ && (DATA_REG_P (operands[0])
+ || offsettable_memref_p (operands[0])))
+ {
+ if (DATA_REG_P (operands[0]))
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, logval);
+ }
+ else
+ {
+ operands[0] = adj_offsettable_operand (operands[0], 3 - (logval / 8)); operands[1] = gen_rtx (CONST_INT, VOIDmode, logval % 8);
+ }
+ /* This does not set condition codes in a standard way. */
+ CC_STATUS_INIT;
+ return \"bclr %1,%0\";
+ }
+ return \"and%.l %2,%0\";
+ }")
+
+ (define_insn "andhi3"
+ [(set (match_operand:HI 0 "general_operand" "=m,d")
+ (and:HI (match_operand:HI 1 "general_operand" "%0,0")
+ (match_operand:HI 2 "general_operand" "dn,dmn")))]
+ ""
+ "and%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
+ (and:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dn,dmn")))]
+ ""
+ "and%.w %1,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
+ (and:HI (match_operand:HI 1 "general_operand" "dn,dmn")
+ (match_dup 0)))]
+ ""
+ "and%.w %1,%0")
+
+ (define_insn "andqi3"
+ [(set (match_operand:QI 0 "general_operand" "=m,d")
+ (and:QI (match_operand:QI 1 "general_operand" "%0,0")
+ (match_operand:QI 2 "general_operand" "dn,dmn")))]
+ ""
+ "and%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
+ (and:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dn,dmn")))]
+ ""
+ "and%.b %1,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
+ (and:QI (match_operand:QI 1 "general_operand" "dn,dmn")
+ (match_dup 0)))]
+ ""
+ "and%.b %1,%0")
+
+ ;; inclusive-or instructions
+
+ (define_insn "iorsi3"
+ [(set (match_operand:SI 0 "general_operand" "=m,d")
+ (ior:SI (match_operand:SI 1 "general_operand" "%0,0")
+ (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
+ ""
+ "*
+ {
+ register int logval;
+ if (GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) >> 16 == 0
+ && (DATA_REG_P (operands[0])
+ || offsettable_memref_p (operands[0])))
+ {
+ if (GET_CODE (operands[0]) != REG)
+ operands[0] = adj_offsettable_operand (operands[0], 2);
+ /* Do not delete a following tstl %0 insn; that would be incorrect. */
+ CC_STATUS_INIT;
+ return \"or%.w %2,%0\";
+ }
+ if (GET_CODE (operands[2]) == CONST_INT
+ && (logval = exact_log2 (INTVAL (operands[2]))) >= 0
+ && (DATA_REG_P (operands[0])
+ || offsettable_memref_p (operands[0])))
+ {
+ if (DATA_REG_P (operands[0]))
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, logval);
+ }
+ else
+ {
+ operands[0] = adj_offsettable_operand (operands[0], 3 - (logval / 8));
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, logval % 8);
+ }
+ CC_STATUS_INIT;
+ return \"bset %1,%0\";
+ }
+ return \"or%.l %2,%0\";
+ }")
+
+ (define_insn "iorhi3"
+ [(set (match_operand:HI 0 "general_operand" "=m,d")
+ (ior:HI (match_operand:HI 1 "general_operand" "%0,0")
+ (match_operand:HI 2 "general_operand" "dn,dmn")))]
+ ""
+ "or%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
+ (ior:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dn,dmn")))]
+ ""
+ "or%.w %1,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+m,d"))
+ (ior:HI (match_operand:HI 1 "general_operand" "dn,dmn")
+ (match_dup 0)))]
+ ""
+ "or%.w %1,%0")
+
+ (define_insn "iorqi3"
+ [(set (match_operand:QI 0 "general_operand" "=m,d")
+ (ior:QI (match_operand:QI 1 "general_operand" "%0,0")
+ (match_operand:QI 2 "general_operand" "dn,dmn")))]
+ ""
+ "or%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
+ (ior:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dn,dmn")))]
+ ""
+ "or%.b %1,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+m,d"))
+ (ior:QI (match_operand:QI 1 "general_operand" "dn,dmn")
+ (match_dup 0)))]
+ ""
+ "or%.b %1,%0")
+
+ ;; xor instructions
+
+ (define_insn "xorsi3"
+ [(set (match_operand:SI 0 "general_operand" "=do,m")
+ (xor:SI (match_operand:SI 1 "general_operand" "%0,0")
+ (match_operand:SI 2 "general_operand" "di,dKs")))]
+ ""
+ "*
+ {
+ if (GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) >> 16 == 0
+ && (offsettable_memref_p (operands[0]) || DATA_REG_P (operands[0])))
+ {
+ if (! DATA_REG_P (operands[0]))
+ operands[0] = adj_offsettable_operand (operands[0], 2);
+ /* Do not delete a following tstl %0 insn; that would be incorrect. */
+ CC_STATUS_INIT;
+ return \"eor%.w %2,%0\";
+ }
+ return \"eor%.l %2,%0\";
+ }")
+
+ (define_insn "xorhi3"
+ [(set (match_operand:HI 0 "general_operand" "=dm")
+ (xor:HI (match_operand:HI 1 "general_operand" "%0")
+ (match_operand:HI 2 "general_operand" "dn")))]
+ ""
+ "eor%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm"))
+ (xor:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dn")))]
+ ""
+ "eor%.w %1,%0")
+
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm"))
+ (xor:HI (match_operand:HI 1 "general_operand" "dn")
+ (match_dup 0)))]
+ ""
+ "eor%.w %1,%0")
+
+ (define_insn "xorqi3"
+ [(set (match_operand:QI 0 "general_operand" "=dm")
+ (xor:QI (match_operand:QI 1 "general_operand" "%0")
+ (match_operand:QI 2 "general_operand" "dn")))]
+ ""
+ "eor%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm"))
+ (xor:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dn")))]
+ ""
+ "eor%.b %1,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm"))
+ (xor:QI (match_operand:QI 1 "general_operand" "dn")
+ (match_dup 0)))]
+ ""
+ "eor%.b %1,%0")
+
+ ;; negation instructions
+
+ (define_insn "negsi2"
+ [(set (match_operand:SI 0 "general_operand" "=dm")
+ (neg:SI (match_operand:SI 1 "general_operand" "0")))]
+ ""
+ "neg%.l %0")
+
+ (define_insn "neghi2"
+ [(set (match_operand:HI 0 "general_operand" "=dm")
+ (neg:HI (match_operand:HI 1 "general_operand" "0")))]
+ ""
+ "neg%.w %0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm"))
+ (neg:HI (match_dup 0)))]
+ ""
+ "neg%.w %0")
+
+ (define_insn "negqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm")
+ (neg:QI (match_operand:QI 1 "general_operand" "0")))]
+ ""
+ "neg%.b %0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm"))
+ (neg:QI (match_dup 0)))]
+ ""
+ "neg%.b %0")
+
+ (define_expand "negsf2"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (neg:SF (match_operand:SF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=x,y")
+ (neg:SF (match_operand:SF 1 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "fpneg%.s %w1,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f,d")
+ (neg:SF (match_operand:SF 1 "general_operand" "fdmF,0")))]
+ "TARGET_68881"
+ "*
+ {
+ if (DATA_REG_P (operands[0]))
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, 31);
+ return \"bchg %1,%0\";
+ }
+ if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
+ return \"f%$neg%.x %1,%0\";
+ return \"f%$neg%.s %f1,%0\";
+ }")
+
+ (define_expand "negdf2"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (neg:DF (match_operand:DF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=x,y")
+ (neg:DF (match_operand:DF 1 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "fpneg%.d %y1, %0")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=f,d")
+ (neg:DF (match_operand:DF 1 "general_operand" "fmF,0")))]
+ "TARGET_68881"
+ "*
+ {
+ if (DATA_REG_P (operands[0]))
+ {
+ operands[1] = gen_rtx (CONST_INT, VOIDmode, 31);
+ return \"bchg %1,%0\";
+ }
+ if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
+ return \"f%&neg%.x %1,%0\";
+ return \"f%&neg%.d %f1,%0\";
+ }")
+
+ ;; Sqrt instruction for the 68881
+
+ (define_insn "sqrtdf2"
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (sqrt:DF (match_operand:DF 1 "general_operand" "fm")))]
+ "TARGET_68881"
+ "*
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fsqrt%.x %1,%0\";
+ else
+ return \"fsqrt%.d %1,%0\";
+ }")
+
+ ;; Absolute value instructions
+
+ (define_expand "abssf2"
+ [(set (match_operand:SF 0 "general_operand" "")
+ (abs:SF (match_operand:SF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=x,y")
+ (abs:SF (match_operand:SF 1 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "fpabs%.s %y1,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "general_operand" "=f")
+ (abs:SF (match_operand:SF 1 "general_operand" "fdmF")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
+ return \"f%$abs%.x %1,%0\";
+ return \"f%$abs%.s %f1,%0\";
+ }")
+
+ (define_expand "absdf2"
+ [(set (match_operand:DF 0 "general_operand" "")
+ (abs:DF (match_operand:DF 1 "general_operand" "")))]
+ "TARGET_68881 || TARGET_FPA"
+ "")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=x,y")
+ (abs:DF (match_operand:DF 1 "general_operand" "xH,rmF")))]
+ "TARGET_FPA"
+ "fpabs%.d %y1,%0")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "general_operand" "=f")
+ (abs:DF (match_operand:DF 1 "general_operand" "fmF")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
+ return \"f%&abs%.x %1,%0\";
+ return \"f%&abs%.d %f1,%0\";
+ }")
+
+ ;; one complement instructions
+
+ (define_insn "one_cmplsi2"
+ [(set (match_operand:SI 0 "general_operand" "=dm")
+ (not:SI (match_operand:SI 1 "general_operand" "0")))]
+ ""
+ "not%.l %0")
+
+ (define_insn "one_cmplhi2"
+ [(set (match_operand:HI 0 "general_operand" "=dm")
+ (not:HI (match_operand:HI 1 "general_operand" "0")))]
+ ""
+ "not%.w %0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "general_operand" "+dm"))
+ (not:HI (match_dup 0)))]
+ ""
+ "not%.w %0")
+
+ (define_insn "one_cmplqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm")
+ (not:QI (match_operand:QI 1 "general_operand" "0")))]
+ ""
+ "not%.b %0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "general_operand" "+dm"))
+ (not:QI (match_dup 0)))]
+ ""
+ "not%.b %0")
+
+ ;; arithmetic shift instructions
+ ;; We don't need the shift memory by 1 bit instruction
+
+ ;; On all 68k models, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (ashift:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 16)"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"swap %0\;clr%.w %0\";
+ }")
+
+ ;; On the 68000, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (ashift:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(! TARGET_68020 && GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 24)"
+ "*
+ {
+ CC_STATUS_INIT;
+
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 16);
+ return \"asl%.w %2,%0\;swap %0\;clr%.w %0\";
+ }")
+
+ (define_insn "ashlsi3"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (ashift:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "general_operand" "dI")))]
+ ""
+ "*
+ {
+ if (operands[2] == const1_rtx)
+ return \"add%.l %0,%0\";
+ return \"asl%.l %2,%0\";
+ }")
+
+ (define_insn "ashlhi3"
+ [(set (match_operand:HI 0 "register_operand" "=d")
+ (ashift:HI (match_operand:HI 1 "register_operand" "0")
+ (match_operand:HI 2 "general_operand" "dI")))]
+ ""
+ "asl%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d"))
+ (ashift:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dI")))]
+ ""
+ "asl%.w %1,%0")
+
+ (define_insn "ashlqi3"
+ [(set (match_operand:QI 0 "register_operand" "=d")
+ (ashift:QI (match_operand:QI 1 "register_operand" "0")
+ (match_operand:QI 2 "general_operand" "dI")))]
+ ""
+ "asl%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d"))
+ (ashift:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dI")))]
+ ""
+ "asl%.b %1,%0")
+
+ ;; On all 68k models, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (ashiftrt:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 16)"
+ "swap %0\;ext%.l %0")
+
+ ;; On the 68000, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (ashiftrt:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(! TARGET_68020 && GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 24)"
+ "*
+ {
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 16);
+ return \"swap %0\;asr%.w %2,%0\;ext%.l %0\";
+ }")
+
+ (define_insn "ashrsi3"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (ashiftrt:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "general_operand" "dI")))]
+ ""
+ "*
+ {
+ return \"asr%.l %2,%0\";
+ }")
+
+ (define_insn "ashrhi3"
+ [(set (match_operand:HI 0 "register_operand" "=d")
+ (ashiftrt:HI (match_operand:HI 1 "register_operand" "0")
+ (match_operand:HI 2 "general_operand" "dI")))]
+ ""
+ "asr%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d"))
+ (ashiftrt:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dI")))]
+ ""
+ "asr%.w %1,%0")
+
+ (define_insn "ashrqi3"
+ [(set (match_operand:QI 0 "register_operand" "=d")
+ (ashiftrt:QI (match_operand:QI 1 "register_operand" "0")
+ (match_operand:QI 2 "general_operand" "dI")))]
+ ""
+ "asr%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d"))
+ (ashiftrt:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dI")))]
+ ""
+ "asr%.b %1,%0")
+
+ ;; logical shift instructions
+
+ ;; On all 68k models, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (lshift:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 16)"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"swap %0\;clr%.w %0\";
+ }")
+
+ ;; On the 68000, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (lshift:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(! TARGET_68020 && GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 24)"
+ "*
+ {
+ CC_STATUS_INIT;
+
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 16);
+ return \"lsl%.w %2,%0\;swap %0\;clr%.w %0\";
+ }")
+
+ (define_insn "lshlsi3"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (lshift:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "general_operand" "dI")))]
+ ""
+ "*
+ {
+ if (operands[2] == const1_rtx)
+ return \"add%.l %0,%0\";
+ return \"lsl%.l %2,%0\";
+ }")
+
+ (define_insn "lshlhi3"
+ [(set (match_operand:HI 0 "register_operand" "=d")
+ (lshift:HI (match_operand:HI 1 "register_operand" "0")
+ (match_operand:HI 2 "general_operand" "dI")))]
+ ""
+ "lsl%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d"))
+ (lshift:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dI")))]
+ ""
+ "lsl%.w %1,%0")
+
+ (define_insn "lshlqi3"
+ [(set (match_operand:QI 0 "register_operand" "=d")
+ (lshift:QI (match_operand:QI 1 "register_operand" "0")
+ (match_operand:QI 2 "general_operand" "dI")))]
+ ""
+ "lsl%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d"))
+ (lshift:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dI")))]
+ ""
+ "lsl%.b %1,%0")
+
+ ;; On all 68k models, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (lshiftrt:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == 16)"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"clr%.w %0\;swap %0\";
+ }")
+
+ ;; On the 68000, this makes faster code in a special case.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (lshiftrt:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "immediate_operand" "i")))]
+ "(! TARGET_68020 && GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 24)"
+ "*
+ {
+ /* I think lsr%.w sets the CC properly. */
+ operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 16);
+ return \"clr%.w %0\;swap %0\;lsr%.w %2,%0\";
+ }")
+
+ (define_insn "lshrsi3"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (lshiftrt:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "general_operand" "dI")))]
+ ""
+ "*
+ {
+ return \"lsr%.l %2,%0\";
+ }")
+
+ (define_insn "lshrhi3"
+ [(set (match_operand:HI 0 "register_operand" "=d")
+ (lshiftrt:HI (match_operand:HI 1 "register_operand" "0")
+ (match_operand:HI 2 "general_operand" "dI")))]
+ ""
+ "lsr%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d"))
+ (lshiftrt:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dI")))]
+ ""
+ "lsr%.w %1,%0")
+
+ (define_insn "lshrqi3"
+ [(set (match_operand:QI 0 "register_operand" "=d")
+ (lshiftrt:QI (match_operand:QI 1 "register_operand" "0")
+ (match_operand:QI 2 "general_operand" "dI")))]
+ ""
+ "lsr%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d"))
+ (lshiftrt:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dI")))]
+ ""
+ "lsr%.b %1,%0")
+
+ ;; rotate instructions
+
+ (define_insn "rotlsi3"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (rotate:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "general_operand" "dI")))]
+ ""
+ "rol%.l %2,%0")
+
+ (define_insn "rotlhi3"
+ [(set (match_operand:HI 0 "register_operand" "=d")
+ (rotate:HI (match_operand:HI 1 "register_operand" "0")
+ (match_operand:HI 2 "general_operand" "dI")))]
+ ""
+ "rol%.w %2,%0")
+
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d"))
+ (rotate:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dI")))]
+ ""
+ "rol%.w %1,%0")
+
+ (define_insn "rotlqi3"
+ [(set (match_operand:QI 0 "register_operand" "=d")
+ (rotate:QI (match_operand:QI 1 "register_operand" "0")
+ (match_operand:QI 2 "general_operand" "dI")))]
+ ""
+ "rol%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d"))
+ (rotate:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dI")))]
+ ""
+ "rol%.b %1,%0")
+
+ (define_insn "rotrsi3"
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (rotatert:SI (match_operand:SI 1 "register_operand" "0")
+ (match_operand:SI 2 "general_operand" "dI")))]
+ ""
+ "ror%.l %2,%0")
+
+ (define_insn "rotrhi3"
+ [(set (match_operand:HI 0 "register_operand" "=d")
+ (rotatert:HI (match_operand:HI 1 "register_operand" "0")
+ (match_operand:HI 2 "general_operand" "dI")))]
+ ""
+ "ror%.w %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d"))
+ (rotatert:HI (match_dup 0)
+ (match_operand:HI 1 "general_operand" "dI")))]
+ ""
+ "ror%.w %1,%0")
+
+ (define_insn "rotrqi3"
+ [(set (match_operand:QI 0 "register_operand" "=d")
+ (rotatert:QI (match_operand:QI 1 "register_operand" "0")
+ (match_operand:QI 2 "general_operand" "dI")))]
+ ""
+ "ror%.b %2,%0")
+
+ (define_insn ""
+ [(set (strict_low_part (match_operand:QI 0 "register_operand" "+d"))
+ (rotatert:QI (match_dup 0)
+ (match_operand:QI 1 "general_operand" "dI")))]
+ ""
+ "ror%.b %1,%0")
+
+ ;; Special cases of bit-field insns which we should
+ ;; recognize in preference to the general case.
+ ;; These handle aligned 8-bit and 16-bit fields,
+ ;; which can usually be done with move instructions.
+
+ ;
+ ; Special case for 32-bit field in memory. This only occurs when 32-bit
+ ; alignment of structure members is specified.
+ ;
+ ; The move is allowed to be odd byte aligned, because that's still faster
+ ; than an odd byte aligned bit field instruction.
+ ;
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o")
+ (match_operand:SI 1 "immediate_operand" "i")
+ (match_operand:SI 2 "immediate_operand" "i"))
+ (match_operand:SI 3 "general_operand" "rmi"))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[1]) == CONST_INT
+ && (INTVAL (operands[1]) == 32)
+ && GET_CODE (operands[2]) == CONST_INT
+ && (INTVAL (operands[2]) % 8) == 0
+ && ! mode_dependent_address_p (XEXP (operands[0], 0))"
+ "*
+ {
+ operands[0]
+ = adj_offsettable_operand (operands[0], INTVAL (operands[2]) / 8);
+
+ return \"move%.l %3,%0\";
+ }")
+
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+do")
+ (match_operand:SI 1 "immediate_operand" "i")
+ (match_operand:SI 2 "immediate_operand" "i"))
+ (match_operand:SI 3 "general_operand" "d"))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[1]) == CONST_INT
+ && (INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16)
+ && GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[2]) % INTVAL (operands[1]) == 0
+ && (GET_CODE (operands[0]) == REG
+ || ! mode_dependent_address_p (XEXP (operands[0], 0)))"
+ "*
+ {
+ if (REG_P (operands[0]))
+ {
+ if (INTVAL (operands[1]) + INTVAL (operands[2]) != 32)
+ return \"bfins %3,%0{%b2:%b1}\";
+ }
+ else
+ operands[0]
+ = adj_offsettable_operand (operands[0], INTVAL (operands[2]) / 8);
+
+ if (GET_CODE (operands[3]) == MEM)
+ operands[3] = adj_offsettable_operand (operands[3],
+ (32 - INTVAL (operands[1])) / 8);
+ if (INTVAL (operands[1]) == 8)
+ return \"move%.b %3,%0\";
+ return \"move%.w %3,%0\";
+ }")
+
+
+ ;
+ ; Special case for 32-bit field in memory. This only occurs when 32-bit
+ ; alignment of structure members is specified.
+ ;
+ ; The move is allowed to be odd byte aligned, because that's still faster
+ ; than an odd byte aligned bit field instruction.
+ ;
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=rm")
+ (zero_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o")
+ (match_operand:SI 2 "immediate_operand" "i")
+ (match_operand:SI 3 "immediate_operand" "i")))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[2]) == CONST_INT
+ && (INTVAL (operands[2]) == 32)
+ && GET_CODE (operands[3]) == CONST_INT
+ && (INTVAL (operands[3]) % 8) == 0
+ && ! mode_dependent_address_p (XEXP (operands[1], 0))"
+ "*
+ {
+ operands[1]
+ = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
+
+ return \"move%.l %1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=&d")
+ (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "do")
+ (match_operand:SI 2 "immediate_operand" "i")
+ (match_operand:SI 3 "immediate_operand" "i")))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[2]) == CONST_INT
+ && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
+ && GET_CODE (operands[3]) == CONST_INT
+ && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
+ && (GET_CODE (operands[1]) == REG
+ || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
+ "*
+ {
+ cc_status.flags |= CC_NOT_NEGATIVE;
+ if (REG_P (operands[1]))
+ {
+ if (INTVAL (operands[2]) + INTVAL (operands[3]) != 32)
+ return \"bfextu %1{%b3:%b2},%0\";
+ }
+ else
+ operands[1]
+ = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
+
+ output_asm_insn (\"clr%.l %0\", operands);
+ if (GET_CODE (operands[0]) == MEM)
+ operands[0] = adj_offsettable_operand (operands[0],
+ (32 - INTVAL (operands[1])) / 8);
+ if (INTVAL (operands[2]) == 8)
+ return \"move%.b %1,%0\";
+ return \"move%.w %1,%0\";
+ }")
+
+ ;
+ ; Special case for 32-bit field in memory. This only occurs when 32-bit
+ ; alignment of structure members is specified.
+ ;
+ ; The move is allowed to be odd byte aligned, because that's still faster
+ ; than an odd byte aligned bit field instruction.
+ ;
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=rm")
+ (sign_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o")
+ (match_operand:SI 2 "immediate_operand" "i")
+ (match_operand:SI 3 "immediate_operand" "i")))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[2]) == CONST_INT
+ && (INTVAL (operands[2]) == 32)
+ && GET_CODE (operands[3]) == CONST_INT
+ && (INTVAL (operands[3]) % 8) == 0
+ && ! mode_dependent_address_p (XEXP (operands[1], 0))"
+ "*
+ {
+ operands[1]
+ = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
+
+ return \"move%.l %1,%0\";
+ }")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "do")
+ (match_operand:SI 2 "immediate_operand" "i")
+ (match_operand:SI 3 "immediate_operand" "i")))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[2]) == CONST_INT
+ && (INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16)
+ && GET_CODE (operands[3]) == CONST_INT
+ && INTVAL (operands[3]) % INTVAL (operands[2]) == 0
+ && (GET_CODE (operands[1]) == REG
+ || ! mode_dependent_address_p (XEXP (operands[1], 0)))"
+ "*
+ {
+ if (REG_P (operands[1]))
+ {
+ if (INTVAL (operands[2]) + INTVAL (operands[3]) != 32)
+ return \"bfexts %1{%b3:%b2},%0\";
+ }
+ else
+ operands[1]
+ = adj_offsettable_operand (operands[1], INTVAL (operands[3]) / 8);
+
+ if (INTVAL (operands[2]) == 8)
+ return \"move%.b %1,%0\;extb%.l %0\";
+ return \"move%.w %1,%0\;ext%.l %0\";
+ }")
+
+ ;; Bit field instructions, general cases.
+ ;; "o,d" constraint causes a nonoffsettable memref to match the "o"
+ ;; so that its address is reloaded.
+
+ (define_insn "extv"
+ [(set (match_operand:SI 0 "general_operand" "=d,d")
+ (sign_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o,d")
+ (match_operand:SI 2 "general_operand" "di,di")
+ (match_operand:SI 3 "general_operand" "di,di")))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "bfexts %1{%b3:%b2},%0")
+
+ (define_insn "extzv"
+ [(set (match_operand:SI 0 "general_operand" "=d,d")
+ (zero_extract:SI (match_operand:QI 1 "nonimmediate_operand" "o,d")
+ (match_operand:SI 2 "general_operand" "di,di")
+ (match_operand:SI 3 "general_operand" "di,di")))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "*
+ {
+ if (GET_CODE (operands[2]) == CONST_INT)
+ {
+ if (INTVAL (operands[2]) != 32)
+ cc_status.flags |= CC_NOT_NEGATIVE;
+ }
+ else
+ {
+ CC_STATUS_INIT;
+ }
+ return \"bfextu %1{%b3:%b2},%0\";
+ }")
+
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d")
+ (match_operand:SI 1 "general_operand" "di,di")
+ (match_operand:SI 2 "general_operand" "di,di"))
+ (xor:SI (zero_extract:SI (match_dup 0) (match_dup 1) (match_dup 2))
+ (match_operand 3 "immediate_operand" "i,i")))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[3]) == CONST_INT
+ && (INTVAL (operands[3]) == -1
+ || (GET_CODE (operands[1]) == CONST_INT
+ && (~ INTVAL (operands[3]) & ((1 << INTVAL (operands[1]))- 1)) == 0))"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"bfchg %0{%b2:%b1}\";
+ }")
+
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d")
+ (match_operand:SI 1 "general_operand" "di,di")
+ (match_operand:SI 2 "general_operand" "di,di"))
+ (const_int 0))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"bfclr %0{%b2:%b1}\";
+ }")
+
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d")
+ (match_operand:SI 1 "general_operand" "di,di")
+ (match_operand:SI 2 "general_operand" "di,di"))
+ (const_int -1))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"bfset %0{%b2:%b1}\";
+ }")
+
+ (define_insn "insv"
+ [(set (zero_extract:SI (match_operand:QI 0 "nonimmediate_operand" "+o,d")
+ (match_operand:SI 1 "general_operand" "di,di")
+ (match_operand:SI 2 "general_operand" "di,di"))
+ (match_operand:SI 3 "general_operand" "d,d"))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "bfins %3,%0{%b2:%b1}")
+
+ ;; Now recognize bit field insns that operate on registers
+ ;; (or at least were intended to do so).
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (sign_extract:SI (match_operand:SI 1 "nonimmediate_operand" "d")
+ (match_operand:SI 2 "general_operand" "di")
+ (match_operand:SI 3 "general_operand" "di")))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "bfexts %1{%b3:%b2},%0")
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=d")
+ (zero_extract:SI (match_operand:SI 1 "nonimmediate_operand" "d")
+ (match_operand:SI 2 "general_operand" "di")
+ (match_operand:SI 3 "general_operand" "di")))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "*
+ {
+ if (GET_CODE (operands[2]) == CONST_INT)
+ {
+ if (INTVAL (operands[2]) != 32)
+ cc_status.flags |= CC_NOT_NEGATIVE;
+ }
+ else
+ {
+ CC_STATUS_INIT;
+ }
+ return \"bfextu %1{%b3:%b2},%0\";
+ }")
+
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d")
+ (match_operand:SI 1 "general_operand" "di")
+ (match_operand:SI 2 "general_operand" "di"))
+ (const_int 0))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"bfclr %0{%b2:%b1}\";
+ }")
+
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d")
+ (match_operand:SI 1 "general_operand" "di")
+ (match_operand:SI 2 "general_operand" "di"))
+ (const_int -1))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "*
+ {
+ CC_STATUS_INIT;
+ return \"bfset %0{%b2:%b1}\";
+ }")
+
+ (define_insn ""
+ [(set (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "+d")
+ (match_operand:SI 1 "general_operand" "di")
+ (match_operand:SI 2 "general_operand" "di"))
+ (match_operand:SI 3 "general_operand" "d"))]
+ "TARGET_68020 && TARGET_BITFIELD"
+ "*
+ {
+ #if 0
+ /* These special cases are now recognized by a specific pattern. */
+ if (GET_CODE (operands[1]) == CONST_INT && GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[1]) == 16 && INTVAL (operands[2]) == 16)
+ return \"move%.w %3,%0\";
+ if (GET_CODE (operands[1]) == CONST_INT && GET_CODE (operands[2]) == CONST_INT
+ && INTVAL (operands[1]) == 24 && INTVAL (operands[2]) == 8)
+ return \"move%.b %3,%0\";
+ #endif
+ return \"bfins %3,%0{%b2:%b1}\";
+ }")
+
+ ;; Special patterns for optimizing bit-field instructions.
+
+ (define_insn ""
+ [(set (cc0)
+ (zero_extract:SI (match_operand:QI 0 "memory_operand" "o")
+ (match_operand:SI 1 "general_operand" "di")
+ (match_operand:SI 2 "general_operand" "di")))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[1]) == CONST_INT"
+ "*
+ {
+ if (operands[1] == const1_rtx
+ && GET_CODE (operands[2]) == CONST_INT)
+ {
+ int width = GET_CODE (operands[0]) == REG ? 31 : 7;
+ return output_btst (operands,
+ gen_rtx (CONST_INT, VOIDmode,
+ width - INTVAL (operands[2])),
+ operands[0],
+ insn, 1000);
+ /* Pass 1000 as SIGNPOS argument so that btst will
+ not think we are testing the sign bit for an `and'
+ and assume that nonzero implies a negative result. */
+ }
+ if (INTVAL (operands[1]) != 32)
+ cc_status.flags = CC_NOT_NEGATIVE;
+ return \"bftst %0{%b2:%b1}\";
+ }")
+
+
+ ;;; now handle the register cases
+ (define_insn ""
+ [(set (cc0)
+ (zero_extract:SI (match_operand:SI 0 "nonimmediate_operand" "d")
+ (match_operand:SI 1 "general_operand" "di")
+ (match_operand:SI 2 "general_operand" "di")))]
+ "TARGET_68020 && TARGET_BITFIELD
+ && GET_CODE (operands[1]) == CONST_INT"
+ "*
+ {
+ if (operands[1] == const1_rtx
+ && GET_CODE (operands[2]) == CONST_INT)
+ {
+ int width = GET_CODE (operands[0]) == REG ? 31 : 7;
+ return output_btst (operands,
+ gen_rtx (CONST_INT, VOIDmode,
+ width - INTVAL (operands[2])),
+ operands[0],
+ insn, 1000);
+ /* Pass 1000 as SIGNPOS argument so that btst will
+ not think we are testing the sign bit for an `and'
+ and assume that nonzero implies a negative result. */
+ }
+ if (INTVAL (operands[1]) != 32)
+ cc_status.flags = CC_NOT_NEGATIVE;
+ return \"bftst %0{%b2:%b1}\";
+ }")
+
+ (define_insn "seq"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (eq:QI (cc0) (const_int 0)))]
+ ""
+ "*
+ cc_status = cc_prev_status;
+ OUTPUT_JUMP (\"seq %0\", \"fseq %0\", \"seq %0\");
+ ")
+
+ (define_insn "sne"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (ne:QI (cc0) (const_int 0)))]
+ ""
+ "*
+ cc_status = cc_prev_status;
+ OUTPUT_JUMP (\"sne %0\", \"fsne %0\", \"sne %0\");
+ ")
+
+ (define_insn "sgt"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (gt:QI (cc0) (const_int 0)))]
+ ""
+ "*
+ cc_status = cc_prev_status;
+ OUTPUT_JUMP (\"sgt %0\", \"fsgt %0\", 0);
+ ")
+
+ (define_insn "sgtu"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (gtu:QI (cc0) (const_int 0)))]
+ ""
+ "* cc_status = cc_prev_status;
+ return \"shi %0\"; ")
+
+ (define_insn "slt"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (lt:QI (cc0) (const_int 0)))]
+ ""
+ "* cc_status = cc_prev_status;
+ OUTPUT_JUMP (\"slt %0\", \"fslt %0\", \"smi %0\"); ")
+
+ (define_insn "sltu"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (ltu:QI (cc0) (const_int 0)))]
+ ""
+ "* cc_status = cc_prev_status;
+ return \"scs %0\"; ")
+
+ (define_insn "sge"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (ge:QI (cc0) (const_int 0)))]
+ ""
+ "* cc_status = cc_prev_status;
+ OUTPUT_JUMP (\"sge %0\", \"fsge %0\", \"spl %0\"); ")
+
+ (define_insn "sgeu"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (geu:QI (cc0) (const_int 0)))]
+ ""
+ "* cc_status = cc_prev_status;
+ return \"scc %0\"; ")
+
+ (define_insn "sle"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (le:QI (cc0) (const_int 0)))]
+ ""
+ "*
+ cc_status = cc_prev_status;
+ OUTPUT_JUMP (\"sle %0\", \"fsle %0\", 0);
+ ")
+
+ (define_insn "sleu"
+ [(set (match_operand:QI 0 "general_operand" "=d")
+ (leu:QI (cc0) (const_int 0)))]
+ ""
+ "* cc_status = cc_prev_status;
+ return \"sls %0\"; ")
+
+ ;; Basic conditional jump instructions.
+
+ (define_insn "beq"
+ [(set (pc)
+ (if_then_else (eq (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ {
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbeq %l0\", \"fbeq %l0\", \"jbeq %l0\");
+ #else
+ OUTPUT_JUMP (\"jeq %l0\", \"fjeq %l0\", \"jeq %l0\");
+ #endif
+ }")
+
+ (define_insn "bne"
+ [(set (pc)
+ (if_then_else (ne (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ {
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbne %l0\", \"fbne %l0\", \"jbne %l0\");
+ #else
+ OUTPUT_JUMP (\"jne %l0\", \"fjne %l0\", \"jne %l0\");
+ #endif
+ }")
+
+ (define_insn "bgt"
+ [(set (pc)
+ (if_then_else (gt (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbgt %l0\", \"fbgt %l0\", 0);
+ #else
+ OUTPUT_JUMP (\"jgt %l0\", \"fjgt %l0\", 0);
+ #endif
+ ")
+
+ (define_insn "bgtu"
+ [(set (pc)
+ (if_then_else (gtu (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbhi %l0\";
+ #else
+ return \"jhi %l0\";
+ #endif
+ ")
+
+ (define_insn "blt"
+ [(set (pc)
+ (if_then_else (lt (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jblt %l0\", \"fblt %l0\", \"jbmi %l0\");
+ #else
+ OUTPUT_JUMP (\"jlt %l0\", \"fjlt %l0\", \"jmi %l0\");
+ #endif
+ ")
+
+ (define_insn "bltu"
+ [(set (pc)
+ (if_then_else (ltu (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbcs %l0\";
+ #else
+ return \"jcs %l0\";
+ #endif
+ ")
+
+ (define_insn "bge"
+ [(set (pc)
+ (if_then_else (ge (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbge %l0\", \"fbge %l0\", \"jbpl %l0\");
+ #else
+ OUTPUT_JUMP (\"jge %l0\", \"fjge %l0\", \"jpl %l0\");
+ #endif
+ ")
+
+ (define_insn "bgeu"
+ [(set (pc)
+ (if_then_else (geu (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbcc %l0\";
+ #else
+ return \"jcc %l0\";
+ #endif
+ ")
+
+ (define_insn "ble"
+ [(set (pc)
+ (if_then_else (le (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jble %l0\", \"fble %l0\", 0);
+ #else
+ OUTPUT_JUMP (\"jle %l0\", \"fjle %l0\", 0);
+ #endif
+ ")
+
+ (define_insn "bleu"
+ [(set (pc)
+ (if_then_else (leu (cc0)
+ (const_int 0))
+ (label_ref (match_operand 0 "" ""))
+ (pc)))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbls %l0\";
+ #else
+ return \"jls %l0\";
+ #endif
+ ")
+
+ ;; Negated conditional jump instructions.
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (eq (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ {
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbne %l0\", \"fbne %l0\", \"jbne %l0\");
+ #else
+ OUTPUT_JUMP (\"jne %l0\", \"fjne %l0\", \"jne %l0\");
+ #endif
+ }")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (ne (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ {
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbeq %l0\", \"fbeq %l0\", \"jbeq %l0\");
+ #else
+ OUTPUT_JUMP (\"jeq %l0\", \"fjeq %l0\", \"jeq %l0\");
+ #endif
+ }")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (gt (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jble %l0\", \"fbngt %l0\", 0);
+ #else
+ OUTPUT_JUMP (\"jle %l0\", \"fjngt %l0\", 0);
+ #endif
+ ")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (gtu (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbls %l0\";
+ #else
+ return \"jls %l0\";
+ #endif
+ ")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (lt (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbge %l0\", \"fbnlt %l0\", \"jbpl %l0\");
+ #else
+ OUTPUT_JUMP (\"jge %l0\", \"fjnlt %l0\", \"jpl %l0\");
+ #endif
+ ")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (ltu (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbcc %l0\";
+ #else
+ return \"jcc %l0\";
+ #endif
+ ")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (ge (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jblt %l0\", \"fbnge %l0\", \"jbmi %l0\");
+ #else
+ OUTPUT_JUMP (\"jlt %l0\", \"fjnge %l0\", \"jmi %l0\");
+ #endif
+ ")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (geu (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbcs %l0\";
+ #else
+ return \"jcs %l0\";
+ #endif
+ ")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (le (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ OUTPUT_JUMP (\"jbgt %l0\", \"fbnle %l0\", 0);
+ #else
+ OUTPUT_JUMP (\"jgt %l0\", \"fjnle %l0\", 0);
+ #endif
+ ")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else (leu (cc0)
+ (const_int 0))
+ (pc)
+ (label_ref (match_operand 0 "" ""))))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbhi %l0\";
+ #else
+ return \"jhi %l0\";
+ #endif
+ ")
+
+ ;; Unconditional and other jump instructions
+ (define_insn "jump"
+ [(set (pc)
+ (label_ref (match_operand 0 "" "")))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jbra %l0\";
+ #else
+ return \"jra %l0\";
+ #endif
+ ")
+
+ ;; We support two different ways of handling dispatch tables.
+ ;; The NeXT uses absolute tables, and other machines use relative.
+ ;; This define_expand can generate either kind.
+ (define_expand "tablejump"
+ [(parallel [(set (pc) (match_operand 0 "" ""))
+ (use (label_ref (match_operand 1 "" "")))])]
+ ""
+ "
+ {
+ #ifdef CASE_VECTOR_PC_RELATIVE
+ operands[0] = gen_rtx (PLUS, SImode, pc_rtx, operands[0]);
+ #endif
+ }")
+
+ ;; Jump to variable address from dispatch table of absolute addresses.
+ (define_insn ""
+ [(set (pc) (match_operand:SI 0 "register_operand" "a"))
+ (use (label_ref (match_operand 1 "" "")))]
+ ""
+ "*
+ #ifdef MOTOROLA
+ return \"jmp (%0)\";
+ #else
+ return \"jmp %0@\";
+ #endif
+ ")
+
+ ;; Jump to variable address from dispatch table of relative addresses.
+ (define_insn ""
+ [(set (pc)
+ (plus:SI (pc) (match_operand:HI 0 "register_operand" "r")))
+ (use (label_ref (match_operand 1 "" "")))]
+ ""
+ "*
+ #ifdef ASM_RETURN_CASE_JUMP
+ ASM_RETURN_CASE_JUMP;
+ #else
+ #ifdef SGS
+ #ifdef ASM_OUTPUT_CASE_LABEL
+ return \"jmp 6(%%pc,%0.w)\";
+ #else
+ #ifdef CRDS
+ return \"jmp 2(pc,%0.w)\";
+ #else
+ return \"jmp 2(%%pc,%0.w)\";
+ #endif /* end !CRDS */
+ #endif
+ #else /* not SGS */
+ #ifdef MOTOROLA
+ return \"jmp (2,pc,%0.w)\";
+ #else
+ return \"jmp pc@(2,%0:w)\";
+ #endif
+ #endif
+ #endif
+ ")
+
+ ;; Decrement-and-branch insns.
+ (define_insn ""
+ [(set (pc)
+ (if_then_else
+ (ne (match_operand:HI 0 "general_operand" "+g")
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))
+ (set (match_dup 0)
+ (plus:HI (match_dup 0)
+ (const_int -1)))]
+ ""
+ "*
+ {
+ CC_STATUS_INIT;
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ {
+ #ifdef MOTOROLA
+ #ifdef NO_ADDSUB_Q
+ return \"sub%.w %#1,%0\;jbcc %l1\";
+ #else
+ return \"subq%.w %#1,%0\;jbcc %l1\";
+ #endif
+ #else /* not MOTOROLA */
+ return \"subqw %#1,%0\;jcc %l1\";
+ #endif
+ }
+ #ifdef MOTOROLA
+ #ifdef SGS_CMP_ORDER
+ #ifdef NO_ADDSUB_Q
+ return \"sub%.w %#1,%0\;cmp%.w %0,%#-1\;jbne %l1\";
+ #else
+ return \"subq%.w %#1,%0\;cmp%.w %0,%#-1\;jbne %l1\";
+ #endif
+ #else /* not SGS_CMP_ORDER */
+ return \"subq%.w %#1,%0\;cmp%.w %#-1,%0\;jbne %l1\";
+ #endif
+ #else /* not MOTOROLA */
+ return \"subqw %#1,%0\;cmpw %#-1,%0\;jne %l1\";
+ #endif
+ }")
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else
+ (ne (match_operand:SI 0 "general_operand" "+g")
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))
+ (set (match_dup 0)
+ (plus:SI (match_dup 0)
+ (const_int -1)))]
+ ""
+ "*
+ {
+ CC_STATUS_INIT;
+ #ifdef MOTOROLA
+ #ifdef NO_ADDSUB_Q
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\;clr%.w %0\;sub%.l %#1,%0\;jbcc %l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"sub%.l %#1,%0\;jbcc %l1\";
+ #else
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\;clr%.w %0\;subq%.l %#1,%0\;jbcc %l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"subq%.l %#1,%0\;jbcc %l1\";
+ #endif /* NO_ADDSUB_Q */
+ #ifdef SGS_CMP_ORDER
+ #ifdef NO_ADDSUB_Q
+ return \"sub.l %#1,%0\;cmp.l %0,%#-1\;jbne %l1\";
+ #else
+ return \"subq.l %#1,%0\;cmp.l %0,%#-1\;jbne %l1\";
+ #endif
+ #else /* not SGS_CMP_ORDER */
+ return \"subq.l %#1,%0\;cmp.l %#-1,%0\;jbne %l1\";
+ #endif /* not SGS_CMP_ORDER */
+ #else /* not MOTOROLA */
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\;clr%.w %0\;subql %#1,%0\;jcc %l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"subql %#1,%0\;jcc %l1\";
+ return \"subql %#1,%0\;cmpl %#-1,%0\;jne %l1\";
+ #endif /* not MOTOROLA */
+ }")
+
+ ;; Two dbra patterns that use REG_NOTES info generated by strength_reduce.
+
+ (define_insn ""
+ [(set (pc)
+ (if_then_else
+ (ge (plus:HI (match_operand:HI 0 "general_operand" "+g")
+ (const_int -1))
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))
+ (set (match_dup 0)
+ (plus:HI (match_dup 0)
+ (const_int -1)))]
+ "find_reg_note (insn, REG_NONNEG, 0)"
+ "*
+ {
+ CC_STATUS_INIT;
+ #ifdef MOTOROLA
+ #ifdef NO_ADDSUB_Q
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"sub%.w %#1,%0\;jbcc %l1\";
+ #else
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"subq%.w %#1,%0\;jbcc %l1\";
+ #endif
+ #ifdef SGS_CMP_ORDER
+ #ifdef NO_ADDSUB_Q
+ return \"sub.w %#1,%0\;cmp.w %0,%#-1\;jbne %l1\";
+ #else
+ return \"subq.w %#1,%0\;cmp.w %0,%#-1\;jbne %l1\";
+ #endif
+ #else /* not SGS_CMP_ORDER */
+ return \"subq.w %#1,%0\;cmp.w %#-1,%0\;jbne %l1\";
+ #endif /* not SGS_CMP_ORDER */
+ #else /* not MOTOROLA */
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"subqw %#1,%0\;jcc %l1\";
+ return \"subqw %#1,%0\;cmpw %#-1,%0\;jne %l1\";
+ #endif /* not MOTOROLA */
+ }")
+
+ (define_insn "decrement_and_branch_until_zero"
+ [(set (pc)
+ (if_then_else
+ (ge (plus:SI (match_operand:SI 0 "general_operand" "+g")
+ (const_int -1))
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))
+ (set (match_dup 0)
+ (plus:SI (match_dup 0)
+ (const_int -1)))]
+ "find_reg_note (insn, REG_NONNEG, 0)"
+ "*
+ {
+ CC_STATUS_INIT;
+ #ifdef MOTOROLA
+ #ifdef NO_ADDSUB_Q
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\;clr%.w %0\;sub%.l %#1,%0\;jbcc %l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"sub%.l %#1,%0\;jbcc %l1\";
+ #else
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\;clr%.w %0\;subq%.l %#1,%0\;jbcc %l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"subq%.l %#1,%0\;jbcc %l1\";
+ #endif
+ #ifdef SGS_CMP_ORDER
+ #ifdef NO_ADDSUB_Q
+ return \"sub.l %#1,%0\;cmp.l %0,%#-1\;jbne %l1\";
+ #else
+ return \"subq.l %#1,%0\;cmp.l %0,%#-1\;jbne %l1\";
+ #endif
+ #else /* not SGS_CMP_ORDER */
+ return \"subq.l %#1,%0\;cmp.l %#-1,%0\;jbne %l1\";
+ #endif /* not SGS_CMP_ORDER */
+ #else /* not MOTOROLA */
+ if (DATA_REG_P (operands[0]))
+ return \"dbra %0,%l1\;clr%.w %0\;subql %#1,%0\;jcc %l1\";
+ if (GET_CODE (operands[0]) == MEM)
+ return \"subql %#1,%0\;jcc %l1\";
+ return \"subql %#1,%0\;cmpl %#-1,%0\;jne %l1\";
+ #endif /* not MOTOROLA */
+ }")
+
+
+ ;; PIC calls are handled by loading the address of the function into a
+ ;; register (via movsi), then emitting a register indirect call using
+ ;; the "jsr" function call syntax.
+ ;;
+ ;; It is important to note that the "jsr" syntax is always used for
+ ;; PIC calls, even on machines in which GCC normally uses the "jbsr"
+ ;; syntax for non-PIC calls. This keeps at least 1 assembler (Sun)
+ ;; from emitting incorrect code for a PIC call.
+ ;;
+ ;; We have different patterns for PIC calls and non-PIC calls. The
+ ;; different patterns are only used to choose the right syntax
+ ;; ("jsr" vs "jbsr").
+ ;;
+ ;; On svr4 m68k, PIC stuff is done differently. To be able to support
+ ;; dynamic linker LAZY BINDING, all the procedure calls need to go
+ ;; through the PLT (Procedure Linkage Table) section in PIC mode. The
+ ;; svr4 m68k assembler recognizes this syntax: `bsr FUNC@PLTPC' and it
+ ;; will create the correct relocation entry (R_68K_PLT32) for `FUNC',
+ ;; that tells the linker editor to create an entry for `FUNC' in PLT
+ ;; section at link time. However, all global objects reference are still
+ ;; done by using `OBJ@GOT'. So, the goal here is to output the function
+ ;; call operand as `FUNC@PLTPC', but output object operand as `OBJ@GOT'.
+ ;; We need to have a way to differentiate these two different operands.
+ ;;
+ ;; The strategy I use here is to use SYMBOL_REF_FLAG to differentiate
+ ;; these two different operands. The macro LEGITIMATE_PIC_OPERAND_P needs
+ ;; to be changed to recognize function calls symbol_ref operand as a legal
+ ;; PIC operand (by checking whether SYMBOL_REF_FLAG is set). This will
+ ;; avoid the compiler to load this symbol_ref operand into a register.
+ ;; Remember, the operand "foo@PLTPC" cannot be called via jsr directly
+ ;; since the value is a PC relative offset, not a real address.
+ ;;
+ ;; All global objects are treated in the similar way as in SUN3. The only
+ ;; difference is: on m68k svr4, the reference of such global object needs
+ ;; to end with a suffix "@GOT" so the assembler and linker know to create
+ ;; an entry for it in GOT (Global Offset Table) section. This is done in
+ ;; m68k.c.
+
+ ;; Call subroutine with no return value.
+ (define_expand "call"
+ [(call (match_operand:QI 0 "memory_operand" "")
+ (match_operand:SI 1 "general_operand" ""))]
+ ;; Operand 1 not really used on the m68000.
+
+ ""
+ "
+ {
+ if (flag_pic && flag_pic < 3 && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
+ #ifdef MOTOROLA
+ SYMBOL_REF_FLAG (XEXP (operands[0], 0)) = 1;
+ #else
+ operands[0] = gen_rtx (MEM, GET_MODE (operands[0]),
+ force_reg (Pmode, XEXP (operands[0], 0)));
+ #endif
+ }")
+
+ ;; This is a normal call sequence.
+ (define_insn ""
+ [(call (match_operand:QI 0 "memory_operand" "o")
+ (match_operand:SI 1 "general_operand" "g"))]
+ ;; Operand 1 not really used on the m68000.
+
+ "(! flag_pic || flag_pic >= 3)"
+ "*
+ #ifdef MOTOROLA
+ return \"jsr %0\";
+ #else
+ return \"jbsr %0\";
+ #endif
+ ")
+
+ ;; This is a PIC call sequence.
+ (define_insn ""
+ [(call (match_operand:QI 0 "memory_operand" "o")
+ (match_operand:SI 1 "general_operand" "g"))]
+ ;; Operand 1 not really used on the m68000.
+
+ "(flag_pic && flag_pic < 3)"
+ "*
+ #ifdef HPUX_ASM
+ return \"bsr %0\";
+ #else
+ #ifdef MOTOROLA
+ if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
+ return \"bsr %0@PLTPC\";
+ #endif
+ return \"jsr %0\";
+ #endif
+ ")
+
+ ;; Call subroutine, returning value in operand 0
+ ;; (which must be a hard register).
+ ;; See comments before "call" regarding PIC calls.
+ (define_expand "call_value"
+ [(set (match_operand 0 "" "")
+ (call (match_operand:QI 1 "memory_operand" "")
+ (match_operand:SI 2 "general_operand" "")))]
+ ;; Operand 2 not really used on the m68000.
+ ""
+ "
+ {
+ if (flag_pic && flag_pic < 3 && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
+ #ifdef MOTOROLA
+ SYMBOL_REF_FLAG (XEXP (operands[1], 0)) = 1;
+ #else
+ operands[1] = gen_rtx (MEM, GET_MODE (operands[1]),
+ force_reg (Pmode, XEXP (operands[1], 0)));
+ #endif
+ }")
+
+ ;; This is a normal call_value
+ (define_insn ""
+ [(set (match_operand 0 "" "=rf")
+ (call (match_operand:QI 1 "memory_operand" "o")
+ (match_operand:SI 2 "general_operand" "g")))]
+ ;; Operand 2 not really used on the m68000.
+ "(! flag_pic || flag_pic >= 3)"
+ "*
+ #ifdef MOTOROLA
+ return \"jsr %1\";
+ #else
+ return \"jbsr %1\";
+ #endif
+ ")
+
+ ;; This is a PIC call_value
+ (define_insn ""
+ [(set (match_operand 0 "" "=rf")
+ (call (match_operand:QI 1 "memory_operand" "o")
+ (match_operand:SI 2 "general_operand" "g")))]
+ ;; Operand 2 not really used on the m68000.
+ "(flag_pic && flag_pic < 3)"
+ "*
+ #ifdef HPUX_ASM
+ return \"bsr %1\";
+ #else
+ #ifdef MOTOROLA
+ if (GET_CODE (operands[1]) == MEM
+ && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
+ return \"bsr %1@PLTPC\";
+ #endif
+ return \"jsr %1\";
+ #endif
+ ")
+
+ ;; Call subroutine returning any type.
+
+ (define_expand "untyped_call"
+ [(parallel [(call (match_operand 0 "" "")
+ (const_int 0))
+ (match_operand 1 "" "")
+ (match_operand 2 "" "")])]
+ "NEEDS_UNTYPED_CALL"
+ "
+ {
+ int i;
+
+ emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx));
+
+ 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));
+ }
+
+ /* 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;
+ }")
+
+ ;; 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)]
+ ""
+ "")
+
+ (define_insn "nop"
+ [(const_int 0)]
+ ""
+ "nop")
+
+ (define_insn "probe"
+ [(reg:SI 15)]
+ "NEED_PROBE"
+ "*
+ {
+ operands[0] = gen_rtx (PLUS, SImode, stack_pointer_rtx,
+ gen_rtx (CONST_INT, VOIDmode, NEED_PROBE));
+ return \"tstl %a0\";
+ }")
+
+ ;; Used for frameless functions which save no regs and allocate no locals.
+ (define_insn "return"
+ [(return)]
+ "USE_RETURN_INSN"
+ "*
+ {
+ if (current_function_pops_args == 0)
+ return \"rts\";
+ operands[0] = gen_rtx (CONST_INT, VOIDmode, current_function_pops_args);
+ return \"rtd %0\";
+ }")
+
+ (define_insn "indirect_jump"
+ [(set (pc) (match_operand:SI 0 "address_operand" "p"))]
+ ""
+ "jmp %a0")
+
+ ;; This should not be used unless the add/sub insns can't be.
+
+ (define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=a")
+ (match_operand:QI 1 "address_operand" "p"))]
+ ""
+ "lea %a1,%0")
+
+ ;; This is the first machine-dependent peephole optimization.
+ ;; It is useful when a floating value is returned from a function call
+ ;; and then is moved into an FP register.
+ ;; But it is mainly intended to test the support for these optimizations.
+
+ (define_peephole
+ [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4)))
+ (set (match_operand:DF 0 "register_operand" "=f")
+ (match_operand:DF 1 "register_operand" "ad"))]
+ "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])"
+ "*
+ {
+ rtx xoperands[2];
+ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
+ output_asm_insn (\"move%.l %1,%@\", xoperands);
+ output_asm_insn (\"move%.l %1,%-\", operands);
+ return \"fmove%.d %+,%0\";
+ }
+ ")
+
+ ;; Optimize a stack-adjust followed by a push of an argument.
+ ;; This is said to happen frequently with -msoft-float
+ ;; when there are consecutive library calls.
+
+ (define_peephole
+ [(set (reg:SI 15) (plus:SI (reg:SI 15)
+ (match_operand:SI 0 "immediate_operand" "n")))
+ (set (match_operand:SF 1 "push_operand" "=m")
+ (match_operand:SF 2 "general_operand" "rmfF"))]
+ "GET_CODE (operands[0]) == CONST_INT && INTVAL (operands[0]) >= 4
+ && ! reg_mentioned_p (stack_pointer_rtx, operands[2])"
+ "*
+ {
+ if (INTVAL (operands[0]) > 4)
+ {
+ rtx xoperands[2];
+ xoperands[0] = stack_pointer_rtx;
+ xoperands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[0]) - 4);
+ #ifndef NO_ADDSUB_Q
+ if (INTVAL (xoperands[1]) <= 8)
+ output_asm_insn (\"addq%.w %1,%0\", xoperands);
+ else if (INTVAL (xoperands[1]) <= 16 && TARGET_68020)
+ {
+ xoperands[1] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (xoperands[1]) - 8);
+ output_asm_insn (\"addq%.w %#8,%0\;addq%.w %1,%0\", xoperands);
+ }
+ else
+ #endif
+ if (INTVAL (xoperands[1]) <= 0x7FFF)
+ output_asm_insn (\"add%.w %1,%0\", xoperands);
+ else
+ output_asm_insn (\"add%.l %1,%0\", xoperands);
+ }
+ if (FP_REG_P (operands[2]))
+ return \"fmove%.s %2,%@\";
+ return \"move%.l %2,%@\";
+ }")
+
+ ;; Speed up stack adjust followed by a fullword fixedpoint push.
+
+ (define_peephole
+ [(set (reg:SI 15) (plus:SI (reg:SI 15)
+ (match_operand:SI 0 "immediate_operand" "n")))
+ (set (match_operand:SI 1 "push_operand" "=m")
+ (match_operand:SI 2 "general_operand" "g"))]
+ "GET_CODE (operands[0]) == CONST_INT && INTVAL (operands[0]) >= 4
+ && ! reg_mentioned_p (stack_pointer_rtx, operands[2])"
+ "*
+ {
+ if (INTVAL (operands[0]) > 4)
+ {
+ rtx xoperands[2];
+ xoperands[0] = stack_pointer_rtx;
+ xoperands[1] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[0]) - 4);
+ #ifndef NO_ADDSUB_Q
+ if (INTVAL (xoperands[1]) <= 8)
+ output_asm_insn (\"addq%.w %1,%0\", xoperands);
+ else if (INTVAL (xoperands[1]) <= 16 && TARGET_68020)
+ {
+ xoperands[1] = gen_rtx (CONST_INT, VOIDmode,
+ INTVAL (xoperands[1]) - 8);
+ output_asm_insn (\"addq%.w %#8,%0\;addq%.w %1,%0\", xoperands);
+ }
+ else
+ #endif
+ if (INTVAL (xoperands[1]) <= 0x7FFF)
+ output_asm_insn (\"add%.w %1,%0\", xoperands);
+ else
+ output_asm_insn (\"add%.l %1,%0\", xoperands);
+ }
+ if (operands[2] == const0_rtx)
+ return \"clr%.l %@\";
+ return \"move%.l %2,%@\";
+ }")
+
+ ;; Speed up pushing a single byte but leaving four bytes of space.
+
+ (define_peephole
+ [(set (mem:QI (pre_dec:SI (reg:SI 15)))
+ (match_operand:QI 1 "general_operand" "dami"))
+ (set (reg:SI 15) (minus:SI (reg:SI 15) (const_int 2)))]
+ "! reg_mentioned_p (stack_pointer_rtx, operands[1])"
+ "*
+ {
+ rtx xoperands[4];
+
+ if (GET_CODE (operands[1]) == REG)
+ return \"move%.l %1,%-\";
+
+ xoperands[1] = operands[1];
+ xoperands[2]
+ = gen_rtx (MEM, QImode,
+ gen_rtx (PLUS, VOIDmode, stack_pointer_rtx,
+ gen_rtx (CONST_INT, VOIDmode, 3)));
+ xoperands[3] = stack_pointer_rtx;
+ output_asm_insn (\"subq%.w %#4,%3\;move%.b %1,%2\", xoperands);
+ return \"\";
+ }")
+
+ (define_peephole
+ [(set (match_operand:SI 0 "register_operand" "=d")
+ (const_int 0))
+ (set (strict_low_part (subreg:HI (match_dup 0) 0))
+ (match_operand:HI 1 "general_operand" "rmn"))]
+ "strict_low_part_peephole_ok (HImode, prev_nonnote_insn (insn), operands[0])"
+ "*
+ {
+ if (GET_CODE (operands[1]) == CONST_INT)
+ {
+ if (operands[1] == const0_rtx
+ && (DATA_REG_P (operands[0])
+ || GET_CODE (operands[0]) == MEM)
+ /* clr insns on 68000 read before writing.
+ This isn't so on the 68010, but we have no alternative for it. */
+ && (TARGET_68020
+ || !(GET_CODE (operands[0]) == MEM
+ && MEM_VOLATILE_P (operands[0]))))
+ return \"clr%.w %0\";
+ }
+ return \"move%.w %1,%0\";
+ }")
+
+ ;; dbCC peepholes
+ ;;
+ ;; Turns
+ ;; loop:
+ ;; [ ... ]
+ ;; jCC label ; abnormal loop termination
+ ;; dbra dN, loop ; normal loop termination
+ ;;
+ ;; Into
+ ;; loop:
+ ;; [ ... ]
+ ;; dbCC dN, loop
+ ;; jCC label
+ ;;
+ ;; Which moves the jCC condition outside the inner loop for free.
+ ;;
+ (define_peephole
+ [(set (pc) (if_then_else (match_operator 3 "valid_dbcc_comparison_p"
+ [(cc0) (const_int 0)])
+ (label_ref (match_operand 2 "" ""))
+ (pc)))
+ (parallel
+ [(set (pc)
+ (if_then_else
+ (ge (plus:HI (match_operand:HI 0 "register_operand" "+d")
+ (const_int -1))
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))
+ (set (match_dup 0)
+ (plus:HI (match_dup 0)
+ (const_int -1)))])]
+ "DATA_REG_P (operands[0])"
+ "*
+ {
+ CC_STATUS_INIT;
+ output_dbcc_and_branch (operands);
+ return \"\";
+ }")
+
+ (define_peephole
+ [(set (pc) (if_then_else (match_operator 3 "valid_dbcc_comparison_p"
+ [(cc0) (const_int 0)])
+ (label_ref (match_operand 2 "" ""))
+ (pc)))
+ (parallel
+ [(set (pc)
+ (if_then_else
+ (ge (plus:SI (match_operand:SI 0 "register_operand" "+d")
+ (const_int -1))
+ (const_int 0))
+ (label_ref (match_operand 1 "" ""))
+ (pc)))
+ (set (match_dup 0)
+ (plus:SI (match_dup 0)
+ (const_int -1)))])]
+ "DATA_REG_P (operands[0])"
+ "*
+ {
+ CC_STATUS_INIT;
+ output_dbcc_and_branch (operands);
+ return \"\";
+ }")
+
+
+ ;; FPA multiply and add.
+ (define_insn ""
+ [(set (match_operand:DF 0 "register_operand" "=x,y,y")
+ (plus:DF (mult:DF (match_operand:DF 1 "general_operand" "%x,dmF,y")
+ (match_operand:DF 2 "general_operand" "xH,y,y"))
+ (match_operand:DF 3 "general_operand" "xH,y,dmF")))]
+ "TARGET_FPA"
+ "@
+ fpma%.d %1,%w2,%w3,%0
+ fpma%.d %x1,%x2,%x3,%0
+ fpma%.d %x1,%x2,%x3,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "register_operand" "=x,y,y")
+ (plus:SF (mult:SF (match_operand:SF 1 "general_operand" "%x,ydmF,y")
+ (match_operand:SF 2 "general_operand" "xH,y,ydmF"))
+ (match_operand:SF 3 "general_operand" "xH,ydmF,ydmF")))]
+ "TARGET_FPA"
+ "@
+ fpma%.s %1,%w2,%w3,%0
+ fpma%.s %1,%2,%3,%0
+ fpma%.s %1,%2,%3,%0")
+
+ ;; FPA Multiply and subtract
+ (define_insn ""
+ [(set (match_operand:DF 0 "register_operand" "=x,y,y")
+ (minus:DF (match_operand:DF 1 "general_operand" "xH,rmF,y")
+ (mult:DF (match_operand:DF 2 "general_operand" "%xH,y,y")
+ (match_operand:DF 3 "general_operand" "x,y,rmF"))))]
+ "TARGET_FPA"
+ "@
+ fpms%.d %3,%w2,%w1,%0
+ fpms%.d %x3,%2,%x1,%0
+ fpms%.d %x3,%2,%x1,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "register_operand" "=x,y,y")
+ (minus:SF (match_operand:SF 1 "general_operand" "xH,rmF,yrmF")
+ (mult:SF (match_operand:SF 2 "general_operand" "%xH,rmF,y")
+ (match_operand:SF 3 "general_operand" "x,y,yrmF"))))]
+ "TARGET_FPA"
+ "@
+ fpms%.s %3,%w2,%w1,%0
+ fpms%.s %3,%2,%1,%0
+ fpms%.s %3,%2,%1,%0")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "register_operand" "=x,y,y")
+ (minus:DF (mult:DF (match_operand:DF 1 "general_operand" "%xH,y,y")
+ (match_operand:DF 2 "general_operand" "x,y,rmF"))
+ (match_operand:DF 3 "general_operand" "xH,rmF,y")))]
+ "TARGET_FPA"
+ "@
+ fpmr%.d %2,%w1,%w3,%0
+ fpmr%.d %x2,%1,%x3,%0
+ fpmr%.d %x2,%1,%x3,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "register_operand" "=x,y,y")
+ (minus:SF (mult:SF (match_operand:SF 1 "general_operand" "%xH,rmF,y")
+ (match_operand:SF 2 "general_operand" "x,y,yrmF"))
+ (match_operand:SF 3 "general_operand" "xH,rmF,yrmF")))]
+ "TARGET_FPA"
+ "@
+ fpmr%.s %2,%w1,%w3,%0
+ fpmr%.s %x2,%1,%x3,%0
+ fpmr%.s %x2,%1,%x3,%0")
+
+ ;; FPA Add and multiply
+ (define_insn ""
+ [(set (match_operand:DF 0 "register_operand" "=x,y,y")
+ (mult:DF (plus:DF (match_operand:DF 1 "general_operand" "%xH,y,y")
+ (match_operand:DF 2 "general_operand" "x,y,rmF"))
+ (match_operand:DF 3 "general_operand" "xH,rmF,y")))]
+ "TARGET_FPA"
+ "@
+ fpam%.d %2,%w1,%w3,%0
+ fpam%.d %x2,%1,%x3,%0
+ fpam%.d %x2,%1,%x3,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "register_operand" "=x,y,y")
+ (mult:SF (plus:SF (match_operand:SF 1 "general_operand" "%xH,rmF,y")
+ (match_operand:SF 2 "general_operand" "x,y,yrmF"))
+ (match_operand:SF 3 "general_operand" "xH,rmF,yrmF")))]
+ "TARGET_FPA"
+ "@
+ fpam%.s %2,%w1,%w3,%0
+ fpam%.s %x2,%1,%x3,%0
+ fpam%.s %x2,%1,%x3,%0")
+
+ ;;FPA Subtract and multiply
+ (define_insn ""
+ [(set (match_operand:DF 0 "register_operand" "=x,y,y")
+ (mult:DF (minus:DF (match_operand:DF 1 "general_operand" "xH,y,y")
+ (match_operand:DF 2 "general_operand" "x,y,rmF"))
+ (match_operand:DF 3 "general_operand" "xH,rmF,y")))]
+ "TARGET_FPA"
+ "@
+ fpsm%.d %2,%w1,%w3,%0
+ fpsm%.d %x2,%1,%x3,%0
+ fpsm%.d %x2,%1,%x3,%0")
+
+ (define_insn ""
+ [(set (match_operand:DF 0 "register_operand" "=x,y,y")
+ (mult:DF (match_operand:DF 1 "general_operand" "xH,rmF,y")
+ (minus:DF (match_operand:DF 2 "general_operand" "xH,y,y")
+ (match_operand:DF 3 "general_operand" "x,y,rmF"))))]
+ "TARGET_FPA"
+ "@
+ fpsm%.d %3,%w2,%w1,%0
+ fpsm%.d %x3,%2,%x1,%0
+ fpsm%.d %x3,%2,%x1,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "register_operand" "=x,y,y")
+ (mult:SF (minus:SF (match_operand:SF 1 "general_operand" "xH,rmF,y")
+ (match_operand:SF 2 "general_operand" "x,y,yrmF"))
+ (match_operand:SF 3 "general_operand" "xH,rmF,yrmF")))]
+ "TARGET_FPA"
+ "@
+ fpsm%.s %2,%w1,%w3,%0
+ fpsm%.s %x2,%1,%x3,%0
+ fpsm%.s %x2,%1,%x3,%0")
+
+ (define_insn ""
+ [(set (match_operand:SF 0 "register_operand" "=x,y,y")
+ (mult:SF (match_operand:SF 1 "general_operand" "xH,rmF,yrmF")
+ (minus:SF (match_operand:SF 2 "general_operand" "xH,rmF,y")
+ (match_operand:SF 3 "general_operand" "x,y,yrmF"))))]
+ "TARGET_FPA"
+ "@
+ fpsm%.s %3,%w2,%w1,%0
+ fpsm%.s %x3,%2,%x1,%0
+ fpsm%.s %x3,%2,%x1,%0")
+
+ (define_insn "tstxf"
+ [(set (cc0)
+ (match_operand:XF 0 "nonimmediate_operand" "fm"))]
+ "TARGET_68881"
+ "*
+ {
+ cc_status.flags = CC_IN_68881;
+ return \"ftst%.x %0\";
+ }")
+
+
+ (define_expand "cmpxf"
+ [(set (cc0)
+ (compare (match_operand:XF 0 "general_operand" "f,mG")
+ (match_operand:XF 1 "general_operand" "fmG,f")))]
+ "TARGET_68881"
+ "
+ {
+ if (CONSTANT_P (operands[0]))
+ operands[0] = force_const_mem (XFmode, operands[0]);
+ if (CONSTANT_P (operands[1]))
+ operands[1] = force_const_mem (XFmode, operands[1]);
+ }")
+
+ (define_insn ""
+ [(set (cc0)
+ (compare (match_operand:XF 0 "nonimmediate_operand" "f,mG")
+ (match_operand:XF 1 "nonimmediate_operand" "fmG,f")))]
+ "TARGET_68881"
+ "*
+ {
+ cc_status.flags = CC_IN_68881;
+ #ifdef SGS_CMP_ORDER
+ if (REG_P (operands[0]))
+ {
+ if (REG_P (operands[1]))
+ return \"fcmp%.x %0,%1\";
+ else
+ return \"fcmp%.x %0,%f1\";
+ }
+ cc_status.flags |= CC_REVERSED;
+ return \"fcmp%.x %1,%f0\";
+ #else
+ if (REG_P (operands[0]))
+ {
+ if (REG_P (operands[1]))
+ return \"fcmp%.x %1,%0\";
+ else
+ return \"fcmp%.x %f1,%0\";
+ }
+ cc_status.flags |= CC_REVERSED;
+ return \"fcmp%.x %f0,%1\";
+ #endif
+ }")
+
+ (define_insn "extendsfxf2"
+ [(set (match_operand:XF 0 "general_operand" "=fm,f")
+ (float_extend:XF (match_operand:SF 1 "general_operand" "f,m")))]
+ "TARGET_68881"
+ "*
+ {
+ if (FP_REG_P (operands[0]) && FP_REG_P (operands[1]))
+ {
+ if (REGNO (operands[0]) == REGNO (operands[1]))
+ {
+ /* Extending float to double in an fp-reg is a no-op.
+ NOTICE_UPDATE_CC has already assumed that the
+ cc will be set. So cancel what it did. */
+ cc_status = cc_prev_status;
+ return \"\";
+ }
+ return \"f%$move%.x %1,%0\";
+ }
+ if (FP_REG_P (operands[0]))
+ return \"f%$move%.s %f1,%0\";
+ return \"fmove%.x %f1,%0\";
+ }")
+
+
+ (define_insn "extenddfxf2"
+ [(set (match_operand:XF 0 "general_operand" "=fm,f")
+ (float_extend:XF
+ (match_operand:DF 1 "general_operand" "f,m")))]
+ "TARGET_68881"
+ "*
+ {
+ if (FP_REG_P (operands[0]) && FP_REG_P (operands[1]))
+ {
+ if (REGNO (operands[0]) == REGNO (operands[1]))
+ {
+ /* Extending float to double in an fp-reg is a no-op.
+ NOTICE_UPDATE_CC has already assumed that the
+ cc will be set. So cancel what it did. */
+ cc_status = cc_prev_status;
+ return \"\";
+ }
+ return \"fmove%.x %1,%0\";
+ }
+ if (FP_REG_P (operands[0]))
+ return \"f%&move%.d %f1,%0\";
+ return \"fmove%.x %f1,%0\";
+ }")
+
+ (define_insn "truncxfdf2"
+ [(set (match_operand:DF 0 "general_operand" "=m,!r")
+ (float_truncate:DF
+ (match_operand:XF 1 "general_operand" "f,f")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[0]))
+ {
+ output_asm_insn (\"fmove%.d %f1,%-\;move%.l %+,%0\", operands);
+ operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
+ return \"move%.l %+,%0\";
+ }
+ return \"fmove%.d %f1,%0\";
+ }")
+
+ (define_insn "truncxfsf2"
+ [(set (match_operand:SF 0 "general_operand" "=dm")
+ (float_truncate:SF
+ (match_operand:XF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.s %f1,%0")
+
+ (define_insn "floatsixf2"
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (float:XF (match_operand:SI 1 "general_operand" "dmi")))]
+ "TARGET_68881"
+ "fmove%.l %1,%0")
+
+ (define_insn "floathixf2"
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (float:XF (match_operand:HI 1 "general_operand" "dmn")))]
+ "TARGET_68881"
+ "fmove%.w %1,%0")
+
+ (define_insn "floatqixf2"
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (float:XF (match_operand:QI 1 "general_operand" "dmn")))]
+ "TARGET_68881"
+ "fmove%.b %1,%0")
+
+ (define_insn "ftruncxf2"
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (fix:XF (match_operand:XF 1 "general_operand" "fFm")))]
+ "TARGET_68881"
+ "*
+ {
+ if (FP_REG_P (operands[1]))
+ return \"fintrz%.x %f1,%0\";
+ return \"fintrz%.x %f1,%0\";
+ }")
+
+ (define_insn "fixxfqi2"
+ [(set (match_operand:QI 0 "general_operand" "=dm")
+ (fix:QI (match_operand:XF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.b %1,%0")
+
+ (define_insn "fixxfhi2"
+ [(set (match_operand:HI 0 "general_operand" "=dm")
+ (fix:HI (match_operand:XF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.w %1,%0")
+
+ (define_insn "fixxfsi2"
+ [(set (match_operand:SI 0 "general_operand" "=dm")
+ (fix:SI (match_operand:XF 1 "general_operand" "f")))]
+ "TARGET_68881"
+ "fmove%.l %1,%0")
+
+ (define_expand "addxf3"
+ [(set (match_operand:XF 0 "general_operand" "")
+ (plus:XF (match_operand:XF 1 "general_operand" "")
+ (match_operand:XF 2 "general_operand" "")))]
+ "TARGET_68881"
+ "
+ {
+ if (CONSTANT_P (operands[1]))
+ operands[1] = force_const_mem (XFmode, operands[1]);
+ if (CONSTANT_P (operands[2]))
+ operands[2] = force_const_mem (XFmode, operands[2]);
+ }")
+
+ (define_insn ""
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (plus:XF (match_operand:XF 1 "nonimmediate_operand" "%0")
+ (match_operand:XF 2 "nonimmediate_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]))
+ return \"fadd%.x %2,%0\";
+ return \"fadd%.x %f2,%0\";
+ }")
+
+ (define_expand "subxf3"
+ [(set (match_operand:XF 0 "general_operand" "")
+ (minus:XF (match_operand:XF 1 "general_operand" "")
+ (match_operand:XF 2 "general_operand" "")))]
+ "TARGET_68881"
+ "
+ {
+ if (CONSTANT_P (operands[1]))
+ operands[1] = force_const_mem (XFmode, operands[1]);
+ if (CONSTANT_P (operands[2]))
+ operands[2] = force_const_mem (XFmode, operands[2]);
+ }")
+
+ (define_insn ""
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (minus:XF (match_operand:XF 1 "nonimmediate_operand" "0")
+ (match_operand:XF 2 "nonimmediate_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]))
+ return \"fsub%.x %2,%0\";
+ return \"fsub%.x %f2,%0\";
+ }")
+
+ (define_expand "mulxf3"
+ [(set (match_operand:XF 0 "general_operand" "")
+ (mult:XF (match_operand:XF 1 "general_operand" "")
+ (match_operand:XF 2 "general_operand" "")))]
+ "TARGET_68881"
+ "
+ {
+ if (CONSTANT_P (operands[1]))
+ operands[1] = force_const_mem (XFmode, operands[1]);
+ if (CONSTANT_P (operands[2]))
+ operands[2] = force_const_mem (XFmode, operands[2]);
+ }")
+
+ (define_insn ""
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (mult:XF (match_operand:XF 1 "nonimmediate_operand" "%0")
+ (match_operand:XF 2 "nonimmediate_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]))
+ return \"fmul%.x %2,%0\";
+ return \"fmul%.x %f2,%0\";
+ }")
+
+ (define_expand "divxf3"
+ [(set (match_operand:XF 0 "general_operand" "")
+ (div:XF (match_operand:XF 1 "general_operand" "")
+ (match_operand:XF 2 "general_operand" "")))]
+ "TARGET_68881"
+ "
+ {
+ if (CONSTANT_P (operands[1]))
+ operands[1] = force_const_mem (XFmode, operands[1]);
+ if (CONSTANT_P (operands[2]))
+ operands[2] = force_const_mem (XFmode, operands[2]);
+ }")
+
+ (define_insn ""
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (div:XF (match_operand:XF 1 "nonimmediate_operand" "0")
+ (match_operand:XF 2 "nonimmediate_operand" "fmG")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[2]))
+ return \"fdiv%.x %2,%0\";
+ return \"fdiv%.x %f2,%0\";
+ }")
+
+ (define_insn "negxf2"
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (neg:XF (match_operand:XF 1 "nonimmediate_operand" "fmF")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
+ return \"fneg%.x %1,%0\";
+ return \"fneg%.x %f1,%0\";
+ }")
+
+ (define_insn "absxf2"
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (abs:XF (match_operand:XF 1 "nonimmediate_operand" "fmF")))]
+ "TARGET_68881"
+ "*
+ {
+ if (REG_P (operands[1]) && ! DATA_REG_P (operands[1]))
+ return \"fabs%.x %1,%0\";
+ return \"fabs%.x %f1,%0\";
+ }")
+
+ (define_insn "sqrtxf2"
+ [(set (match_operand:XF 0 "general_operand" "=f")
+ (sqrt:XF (match_operand:DF 1 "nonimmediate_operand" "fm")))]
+ "TARGET_68881"
+ "*
+ {
+ return \"fsqrt%.x %1,%0\";
+ }")
diff -rc --new-file /src/baseline/gnat-1.80/amiga/corrections/par.s.diff gnat-1.80/amiga/corrections/par.s.diff
*** /src/baseline/gnat-1.80/amiga/corrections/par.s.diff Thu Jan 1 00:00:00 1970
--- gnat-1.80/amiga/corrections/par.s.diff Thu Jun 23 13:13:16 1994
***************
*** 0 ****
--- 1,16 ----
+ *** par.s Sun Jun 19 00:42:42 1994
+ --- par.s! Sun Jun 19 00:30:21 1994
+ ***************
+ *** 11807,11812 ****
+ jbsr _system__task_specific_data__set_jmpbuf_address
+ addqw #4,sp
+ ! bfextu a5@(10){#7:#1},d0
+ ! tstb d0
+ jne L835
+ jra L834
+ --- 11807,11811 ----
+ jbsr _system__task_specific_data__set_jmpbuf_address
+ addqw #4,sp
+ ! tstb a5@(10)
+ jne L835
+ jra L834
diff -rc --new-file /src/baseline/gnat-1.80/amiga/corrections/uintp.adb.diff gnat-1.80/amiga/corrections/uintp.adb.diff
*** /src/baseline/gnat-1.80/amiga/corrections/uintp.adb.diff Thu Jan 1 00:00:00 1970
--- gnat-1.80/amiga/corrections/uintp.adb.diff Thu Jun 23 13:13:17 1994
***************
*** 0 ****
--- 1,47 ----
+ *** uintp.adb.orig Sun Jun 19 05:23:18 1994
+ --- uintp.adb Sun Jun 19 09:56:09 1994
+ ***************
+ *** 232,235 ****
+ --- 232,236 ----
+ procedure Init_Operand (UI : Uint; Vec : out UI_Vector) is
+ Loc : Int;
+ + tempa : Int;
+
+ begin
+ ***************
+ *** 240,244 ****
+
+ for J in 1 .. Uints.Table (UI).Length loop
+ ! Vec (J) := Udigits.Table (Loc + J - 1);
+ end loop;
+ end if;
+ --- 241,246 ----
+
+ for J in 1 .. Uints.Table (UI).Length loop
+ ! Tempa := Loc + J - 1;
+ ! Vec (J) := Udigits.Table (tempa);
+ end loop;
+ end if;
+ ***************
+ *** 694,697 ****
+ --- 696,700 ----
+ Length : Int := Uints.Table (Right).Length;
+ Loc : Int := Uints.Table (Right).Loc;
+ + tempa, tempb : Int;
+
+ begin
+ ***************
+ *** 705,709 ****
+ for Idx in 2 .. Length loop
+ Udigits.Increment_Last;
+ ! Udigits.Table (Udigits.Last) := Udigits.Table (Loc + Idx - 1);
+ end loop;
+
+ --- 708,714 ----
+ for Idx in 2 .. Length loop
+ Udigits.Increment_Last;
+ ! tempa := Udigits.Last;
+ ! tempb := Loc + Idx - 1;
+ ! Udigits.Table (tempa) := Udigits.Table (tempb);
+ end loop;
+
diff -rc --new-file /src/baseline/gnat-1.80/amiga/gcc-2.5.8.diffs gnat-1.80/amiga/gcc-2.5.8.diffs
*** /src/baseline/gnat-1.80/amiga/gcc-2.5.8.diffs Thu Jan 1 00:00:00 1970
--- gnat-1.80/amiga/gcc-2.5.8.diffs Sat Jul 9 08:50:19 1994
***************
*** 0 ****
--- 1,8981 ----
+ diff -rc --new-file gcc-2.5.8-fsf/INSTALL gcc-2.5.8/INSTALL
+ *** gcc-2.5.8-fsf/INSTALL Sat Nov 27 19:47:57 1993
+ --- gcc-2.5.8/INSTALL Tue Feb 22 11:26:44 1994
+ ***************
+ *** 518,536 ****
+ files do not exist, it means nothing needs to be added for a
+ given target or host.
+
+ ! 4. The standard directory for installing GNU CC is `/usr/local/lib'.
+ If you want to install its files somewhere else, specify
+ `--prefix=DIR' when you run `configure'. Here DIR is a directory
+ ! name to use instead of `/usr/local' for all purposes with one
+ ! exception: the directory `/usr/local/include' is searched for
+ header files no matter where you install the compiler.
+
+ 5. Specify `--local-prefix=DIR' if you want the compiler to search
+ directory `DIR/include' for header files *instead* of
+ ! `/usr/local/include'. (This is for systems that have different
+ conventions for where to put site-specific things.)
+
+ ! Unless you have a convention other than `/usr/local' for
+ site-specific files, it is a bad idea to specify `--local-prefix'.
+
+ 6. Make sure the Bison parser generator is installed. (This is
+ --- 518,536 ----
+ files do not exist, it means nothing needs to be added for a
+ given target or host.
+
+ ! 4. The standard directory for installing GNU CC is `/gnu/lib'.
+ If you want to install its files somewhere else, specify
+ `--prefix=DIR' when you run `configure'. Here DIR is a directory
+ ! name to use instead of `/gnu' for all purposes with one
+ ! exception: the directory `/gnu/include' is searched for
+ header files no matter where you install the compiler.
+
+ 5. Specify `--local-prefix=DIR' if you want the compiler to search
+ directory `DIR/include' for header files *instead* of
+ ! `/gnu/include'. (This is for systems that have different
+ conventions for where to put site-specific things.)
+
+ ! Unless you have a convention other than `/gnu' for
+ site-specific files, it is a bad idea to specify `--local-prefix'.
+
+ 6. Make sure the Bison parser generator is installed. (This is
+ ***************
+ *** 582,588 ****
+ If you are building with a previous GNU C compiler, do not use
+ `CC=gcc' on the make command or by editing the Makefile. Instead,
+ use a full pathname to specify the compiler, such as
+ ! `CC=/usr/local/bin/gcc'. This is because make might execute the
+ `gcc' in the current directory before all of the compiler
+ components have been built.
+
+ --- 582,588 ----
+ If you are building with a previous GNU C compiler, do not use
+ `CC=gcc' on the make command or by editing the Makefile. Instead,
+ use a full pathname to specify the compiler, such as
+ ! `CC=/gnu/bin/gcc'. This is because make might execute the
+ `gcc' in the current directory before all of the compiler
+ components have been built.
+
+ ***************
+ *** 707,720 ****
+
+ This copies the files `cc1', `cpp' and `libgcc.a' to files `cc1',
+ `cpp' and `libgcc.a' in the directory
+ ! `/usr/local/lib/gcc-lib/TARGET/VERSION', which is where the
+ compiler driver program looks for them. Here TARGET is the target
+ machine type specified when you ran `configure', and VERSION is
+ the version number of GNU CC. This naming scheme permits various
+ versions and/or cross-compilers to coexist.
+
+ This also copies the driver program `xgcc' into
+ ! `/usr/local/bin/gcc', so that it appears in typical execution
+ search paths.
+
+ On some systems, this command causes recompilation of some files.
+ --- 707,720 ----
+
+ This copies the files `cc1', `cpp' and `libgcc.a' to files `cc1',
+ `cpp' and `libgcc.a' in the directory
+ ! `/gnu/lib/gcc-lib/TARGET/VERSION', which is where the
+ compiler driver program looks for them. Here TARGET is the target
+ machine type specified when you ran `configure', and VERSION is
+ the version number of GNU CC. This naming scheme permits various
+ versions and/or cross-compilers to coexist.
+
+ This also copies the driver program `xgcc' into
+ ! `/gnu/bin/gcc', so that it appears in typical execution
+ search paths.
+
+ On some systems, this command causes recompilation of some files.
+ ***************
+ *** 854,860 ****
+ ----------------------------------------
+
+ If you have a cross-assembler and cross-linker available, you should
+ ! install them now. Put them in the directory `/usr/local/TARGET/bin'.
+ Here is a table of the tools you should put in this directory:
+
+ `as'
+ --- 854,860 ----
+ ----------------------------------------
+
+ If you have a cross-assembler and cross-linker available, you should
+ ! install them now. Put them in the directory `/gnu/TARGET/bin'.
+ Here is a table of the tools you should put in this directory:
+
+ `as'
+ ***************
+ *** 884,896 ****
+
+ If you want to install libraries to use with the cross-compiler,
+ such as a standard C library, put them in the directory
+ ! `/usr/local/TARGET/lib'; installation of GNU CC copies all all the
+ files in that subdirectory into the proper place for GNU CC to find
+ them and link with them. Here's an example of copying some libraries
+ from a target machine:
+
+ ftp TARGET-MACHINE
+ ! lcd /usr/local/TARGET/lib
+ cd /lib
+ get libc.a
+ cd /usr/lib
+ --- 884,896 ----
+
+ If you want to install libraries to use with the cross-compiler,
+ such as a standard C library, put them in the directory
+ ! `/gnu/TARGET/lib'; installation of GNU CC copies all all the
+ files in that subdirectory into the proper place for GNU CC to find
+ them and link with them. Here's an example of copying some libraries
+ from a target machine:
+
+ ftp TARGET-MACHINE
+ ! lcd /gnu/TARGET/lib
+ cd /lib
+ get libc.a
+ cd /usr/lib
+ ***************
+ *** 903,916 ****
+
+ Many targets require "start files" such as `crt0.o' and `crtn.o'
+ which are linked into each executable; these too should be placed in
+ ! `/usr/local/TARGET/lib'. There may be several alternatives for
+ `crt0.o', for use with profiling or other compilation options. Check
+ your target's definition of `STARTFILE_SPEC' to find out what start
+ files it uses. Here's an example of copying these files from a target
+ machine:
+
+ ftp TARGET-MACHINE
+ ! lcd /usr/local/TARGET/lib
+ prompt
+ cd /lib
+ mget *crt*.o
+ --- 903,916 ----
+
+ Many targets require "start files" such as `crt0.o' and `crtn.o'
+ which are linked into each executable; these too should be placed in
+ ! `/gnu/TARGET/lib'. There may be several alternatives for
+ `crt0.o', for use with profiling or other compilation options. Check
+ your target's definition of `STARTFILE_SPEC' to find out what start
+ files it uses. Here's an example of copying these files from a target
+ machine:
+
+ ftp TARGET-MACHINE
+ ! lcd /gnu/TARGET/lib
+ prompt
+ cd /lib
+ mget *crt*.o
+ ***************
+ *** 1023,1029 ****
+ cross-compiling.
+
+ When you have found suitable header files, put them in
+ ! `/usr/local/TARGET/include', before building the cross compiler. Then
+ installation will run fixincludes properly and install the corrected
+ versions of the header files where the compiler will use them.
+
+ --- 1023,1029 ----
+ cross-compiling.
+
+ When you have found suitable header files, put them in
+ ! `/gnu/TARGET/include', before building the cross compiler. Then
+ installation will run fixincludes properly and install the corrected
+ versions of the header files where the compiler will use them.
+
+ ***************
+ *** 1040,1046 ****
+ Then, on the host machine, do this:
+
+ ftp TARGET-MACHINE
+ ! lcd /usr/local/TARGET/include
+ get tarfile
+ quit
+ tar xf tarfile
+ --- 1040,1046 ----
+ Then, on the host machine, do this:
+
+ ftp TARGET-MACHINE
+ ! lcd /gnu/TARGET/include
+ get tarfile
+ quit
+ tar xf tarfile
+ ***************
+ *** 1098,1104 ****
+ `jaguar.cs.utah.edu' `dist' subdirectory. You would need to install
+ GAS in the file
+
+ ! /usr/local/lib/gcc-lib/CONFIGURATION/GCCVERSION/as
+
+ where CONFIGURATION is the configuration name (perhaps `hpNNN-hpux')
+ and GCCVERSION is the GNU CC version number. Do this *before* starting
+ --- 1098,1104 ----
+ `jaguar.cs.utah.edu' `dist' subdirectory. You would need to install
+ GAS in the file
+
+ ! /gnu/lib/gcc-lib/CONFIGURATION/GCCVERSION/as
+
+ where CONFIGURATION is the configuration name (perhaps `hpNNN-hpux')
+ and GCCVERSION is the GNU CC version number. Do this *before* starting
+ ***************
+ *** 1618,1625 ****
+ target independent header files in that directory.
+
+ `LOCAL_INCLUDE_DIR' is used only for a native compiler. It is
+ ! normally `/usr/local/include'. GNU CC searches this directory so that
+ ! users can install header files in `/usr/local/include'.
+
+ `CROSS_INCLUDE_DIR' is used only for a cross compiler. GNU CC
+ doesn't install anything there.
+ --- 1618,1625 ----
+ target independent header files in that directory.
+
+ `LOCAL_INCLUDE_DIR' is used only for a native compiler. It is
+ ! normally `/gnu/include'. GNU CC searches this directory so that
+ ! users can install header files in `/gnu/include'.
+
+ `CROSS_INCLUDE_DIR' is used only for a cross compiler. GNU CC
+ doesn't install anything there.
+ diff -rc --new-file gcc-2.5.8-fsf/Makefile.in gcc-2.5.8/Makefile.in
+ *** gcc-2.5.8-fsf/Makefile.in Thu Dec 23 23:13:50 1993
+ --- gcc-2.5.8/Makefile.in Tue Feb 22 11:26:49 1994
+ ***************
+ *** 58,68 ****
+ AR_FLAGS = rc
+ SHELL = /bin/sh
+ # on sysV, define this as cp.
+ ! INSTALL = install -c
+ # These permit overriding just for certain files.
+ INSTALL_PROGRAM = $(INSTALL)
+ INSTALL_DATA = $(INSTALL)
+ SYMLINK = ln -s
+ MAKEINFO = makeinfo
+ TEXI2DVI = texi2dvi
+
+ --- 58,71 ----
+ AR_FLAGS = rc
+ SHELL = /bin/sh
+ # on sysV, define this as cp.
+ ! INSTALL = cp
+ # These permit overriding just for certain files.
+ INSTALL_PROGRAM = $(INSTALL)
+ INSTALL_DATA = $(INSTALL)
+ SYMLINK = ln -s
+ + # Some systems don't support hardlinks. For this case, a simple copy
+ + # will achieve the same results for our purposes.
+ + HARDLINK = ln
+ MAKEINFO = makeinfo
+ TEXI2DVI = texi2dvi
+
+ ***************
+ *** 90,102 ****
+ OLDAR = ar
+
+ # Target to use when installing include directory. Either
+ ! # install-headers-tar or install-headers-cpio.
+ INSTALL_HEADERS_DIR = install-headers-tar
+
+ # The GCC to use for compiling libgcc2.a, enquire, and cross-test.
+ # Usually the one we just built.
+ # Don't use this as a dependency--use $(GCC_PASSES) or $(GCC_PARTS).
+ ! GCC_FOR_TARGET = ./xgcc -B./
+
+ # This is used instead of ALL_CFLAGS when compiling with GCC_FOR_TARGET.
+ # It omits XCFLAGS, and specifies -B./.
+ --- 93,106 ----
+ OLDAR = ar
+
+ # Target to use when installing include directory. Either
+ ! # install-headers-tar install-headers-cpio, or install-headers-cp.
+ INSTALL_HEADERS_DIR = install-headers-tar
+
+ # The GCC to use for compiling libgcc2.a, enquire, and cross-test.
+ # Usually the one we just built.
+ # Don't use this as a dependency--use $(GCC_PASSES) or $(GCC_PARTS).
+ ! XGCC = xgcc
+ ! GCC_FOR_TARGET = ./$(XGCC) -B./
+
+ # This is used instead of ALL_CFLAGS when compiling with GCC_FOR_TARGET.
+ # It omits XCFLAGS, and specifies -B./.
+ ***************
+ *** 141,152 ****
+ srcdir = .
+ # Common prefix for installation directories.
+ # NOTE: This directory must exist when you start installation.
+ ! prefix = /usr/local
+ # Directory in which to put localized header files. On the systems with
+ # gcc as the native cc, `local_prefix' may not be `prefix' which is
+ # `/usr'.
+ # NOTE: local_prefix *should not* default from prefix.
+ ! local_prefix = /usr/local
+ # Directory in which to put host dependent programs and libraries
+ exec_prefix = $(prefix)
+ # Directory in which to put the executable for the command `gcc'
+ --- 145,159 ----
+ srcdir = .
+ # Common prefix for installation directories.
+ # NOTE: This directory must exist when you start installation.
+ ! prefix = /gnu
+ # Directory in which to put localized header files. On the systems with
+ # gcc as the native cc, `local_prefix' may not be `prefix' which is
+ # `/usr'.
+ + # Similar considerations apply for toolkits located on non-writable storage,
+ + # such as CD-ROM, where we need a completely separate place to put local
+ + # include files.
+ # NOTE: local_prefix *should not* default from prefix.
+ ! local_prefix = /gnu
+ # Directory in which to put host dependent programs and libraries
+ exec_prefix = $(prefix)
+ # Directory in which to put the executable for the command `gcc'
+ ***************
+ *** 161,171 ****
+ # (But this currently agrees with what is in cross-make.)
+ assertdir = $(tooldir)/include
+ # where the info files go
+ ! infodir = $(prefix)/info
+ # Extension (if any) to put in installed man-page filename.
+ manext = .1
+ # Directory in which to put man pages.
+ ! mandir = $(prefix)/man/man1
+ # Directory in which to find other cross-compilation tools and headers.
+ # Used in install-cross.
+ tooldir = $(exec_prefix)/$(target)
+ --- 168,178 ----
+ # (But this currently agrees with what is in cross-make.)
+ assertdir = $(tooldir)/include
+ # where the info files go
+ ! infodir = /info
+ # Extension (if any) to put in installed man-page filename.
+ manext = .1
+ # Directory in which to put man pages.
+ ! mandir = /man/man1
+ # Directory in which to find other cross-compilation tools and headers.
+ # Used in install-cross.
+ tooldir = $(exec_prefix)/$(target)
+ ***************
+ *** 549,555 ****
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o xgcc gcc.o version.o $(LIBS)
+
+ # Dump a specs file to make -B./ read these specs over installed ones.
+ ! specs: xgcc
+ $(GCC_FOR_TARGET) -dumpspecs > specs
+
+ # Create the compiler driver for g++.
+ --- 556,562 ----
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o xgcc gcc.o version.o $(LIBS)
+
+ # Dump a specs file to make -B./ read these specs over installed ones.
+ ! specs: xgcc xgccv
+ $(GCC_FOR_TARGET) -dumpspecs > specs
+
+ # Create the compiler driver for g++.
+ ***************
+ *** 752,759 ****
+ # the second ar command tries to overwrite this file. To avoid the error
+ # message from ar, we make sure all files are writable.
+ -(cd tmpcopy; chmod +w * > /dev/null 2>&1)
+ ! (cd tmpcopy; $(AR) x ../$(LIBGCC2))
+ ! (cd tmpcopy; $(AR) $(AR_FLAGS) ../tmplibgcc.a *.o)
+ rm -rf tmpcopy
+ -if $(RANLIB_TEST) ; then $(RANLIB) tmplibgcc.a; else true; fi
+ # Actually build it in tmplibgcc.a, then rename at end,
+ --- 759,767 ----
+ # the second ar command tries to overwrite this file. To avoid the error
+ # message from ar, we make sure all files are writable.
+ -(cd tmpcopy; chmod +w * > /dev/null 2>&1)
+ ! # The "cd..; wait" makes sure that the lock on tmpcopy has time to disappear.
+ ! (cd tmpcopy; $(AR) x ../$(LIBGCC2); cd ..; /c/wait 2)
+ ! (cd tmpcopy; $(AR) $(AR_FLAGS) ../tmplibgcc.a *.o; cd ..; /c/wait 2)
+ rm -rf tmpcopy
+ -if $(RANLIB_TEST) ; then $(RANLIB) tmplibgcc.a; else true; fi
+ # Actually build it in tmplibgcc.a, then rename at end,
+ ***************
+ *** 770,779 ****
+ cd objc; \
+ $(MAKE) -f $${srcdir1}/objc/Makefile libobjc.a \
+ srcdir=$${srcdir1} tooldir=$(tooldir) AR="$(AR)" AR_FLAGS="$(AR_FLAGS)" \
+ ! GCC_FOR_TARGET="$${thisdir1}/xgcc -B$${thisdir1}/" \
+ GCC_CFLAGS="$(GCC_CFLAGS)"
+ -rm -f libobjc.a
+ ! ln objc/libobjc.a . >/dev/null 2>&1 || cp objc/libobjc.a .
+ -if $(RANLIB_TEST) ; then $(RANLIB) libobjc.a; else true; fi
+
+ # This is used by objc/Makefile if the user runs that directly.
+ --- 778,787 ----
+ cd objc; \
+ $(MAKE) -f $${srcdir1}/objc/Makefile libobjc.a \
+ srcdir=$${srcdir1} tooldir=$(tooldir) AR="$(AR)" AR_FLAGS="$(AR_FLAGS)" \
+ ! GCC_FOR_TARGET="$${thisdir1}/$(XGCC) -B$${thisdir1}/" \
+ GCC_CFLAGS="$(GCC_CFLAGS)"
+ -rm -f libobjc.a
+ ! cp objc/libobjc.a . >/dev/null 2>&1 || cp objc/libobjc.a .
+ -if $(RANLIB_TEST) ; then $(RANLIB) libobjc.a; else true; fi
+
+ # This is used by objc/Makefile if the user runs that directly.
+ ***************
+ *** 783,789 ****
+ cd objc; \
+ $(MAKE) -f $$srcdir1/objc/Makefile libobjc.a \
+ srcdir=$$srcdir1 tooldir=$(tooldir) AR="$(AR)" AR_FLAGS="$(AR_FLAGS)" \
+ ! GCC_FOR_TARGET="$$thisdir1/xgcc -B$$thisdir1/" \
+ GCC_CFLAGS="$(GCC_CFLAGS)"
+
+ # Compile two additional files that are linked with every program
+ --- 791,797 ----
+ cd objc; \
+ $(MAKE) -f $$srcdir1/objc/Makefile libobjc.a \
+ srcdir=$$srcdir1 tooldir=$(tooldir) AR="$(AR)" AR_FLAGS="$(AR_FLAGS)" \
+ ! GCC_FOR_TARGET="$$thisdir1/$(XGCC) -B$$thisdir1/" \
+ GCC_CFLAGS="$(GCC_CFLAGS)"
+
+ # Compile two additional files that are linked with every program
+ ***************
+ *** 872,878 ****
+ # To make a configuration always use collect2, set USE_COLLECT2 to ld.
+ ld: collect2
+ rm -f ld
+ ! ln collect2 ld
+
+ collect2 : collect2.o version.o $(LIBDEPS)
+ # Don't try modifying collect2 (aka ld) in place--it might be linking this.
+ --- 880,886 ----
+ # To make a configuration always use collect2, set USE_COLLECT2 to ld.
+ ld: collect2
+ rm -f ld
+ ! cp collect2 ld
+
+ collect2 : collect2.o version.o $(LIBDEPS)
+ # Don't try modifying collect2 (aka ld) in place--it might be linking this.
+ ***************
+ *** 1383,1389 ****
+ # Making the preprocessor
+ cpp: cccp
+ -rm -f cpp
+ ! ln cccp cpp
+ cccp: cccp.o cexp.o version.o $(LIBDEPS)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o cccp cccp.o cexp.o version.o $(LIBS)
+ cexp.o: $(srcdir)/cexp.c $(CONFIG_H)
+ --- 1391,1397 ----
+ # Making the preprocessor
+ cpp: cccp
+ -rm -f cpp
+ ! cp cccp cpp
+ cccp: cccp.o cexp.o version.o $(LIBDEPS)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o cccp cccp.o cexp.o version.o $(LIBS)
+ cexp.o: $(srcdir)/cexp.c $(CONFIG_H)
+ ***************
+ *** 1541,1547 ****
+ for dir in $(SYSTEM_HEADER_DIR) $(OTHER_FIXINCLUDES_DIRS); do \
+ if [ -d $$dir ]; \
+ then \
+ ! $(srcdir)/$(FIXINCLUDES) include $$dir $(srcdir) "`pwd`/xgcc -B`pwd`/"; \
+ else true; fi; \
+ done; \
+ else true; \
+ --- 1549,1555 ----
+ for dir in $(SYSTEM_HEADER_DIR) $(OTHER_FIXINCLUDES_DIRS); do \
+ if [ -d $$dir ]; \
+ then \
+ ! $(srcdir)/$(FIXINCLUDES) include $$dir $(srcdir) "`pwd`/$(XGCC) -B`pwd`/"; \
+ else true; fi; \
+ done; \
+ else true; \
+ ***************
+ *** 1563,1569 ****
+ cd objc; \
+ $(MAKE) -f $${srcdir1}/objc/Makefile copy-headers \
+ srcdir=$${srcdir1} tooldir=$(tooldir) AR="$(AR)" AR_FLAGS="$(AR_FLAGS)" \
+ ! GCC_FOR_TARGET="$${thisdir1}/xgcc -B$${thisdir1}/" \
+ GCC_CFLAGS="$(GCC_CFLAGS)" incinstalldir=$${thisdir1}/include
+ touch objc-headers
+
+ --- 1571,1577 ----
+ cd objc; \
+ $(MAKE) -f $${srcdir1}/objc/Makefile copy-headers \
+ srcdir=$${srcdir1} tooldir=$(tooldir) AR="$(AR)" AR_FLAGS="$(AR_FLAGS)" \
+ ! GCC_FOR_TARGET="$${thisdir1}/$(XGCC) -B$${thisdir1}/" \
+ GCC_CFLAGS="$(GCC_CFLAGS)" incinstalldir=$${thisdir1}/include
+ touch objc-headers
+
+ ***************
+ *** 1845,1864 ****
+ $(INSTALL_PROGRAM) g++-cross $(bindir)/$(target)-g++; \
+ chmod a+x $(bindir)/$(target)-g++; \
+ rm -f $(bindir)/$(target)-c++; \
+ ! ln $(bindir)/$(target)-g++ $(bindir)/$(target)-c++; \
+ fi ; \
+ else \
+ rm -f $(bindir)/gcc; \
+ $(INSTALL_PROGRAM) xgcc $(bindir)/gcc; \
+ rm -f $(bindir)/$(target)-gcc-1; \
+ ! ln $(bindir)/gcc $(bindir)/$(target)-gcc-1; \
+ mv $(bindir)/$(target)-gcc-1 $(bindir)/$(target)-gcc; \
+ if [ -f cc1plus ] ; then \
+ rm -f $(bindir)/g++; \
+ $(INSTALL_PROGRAM) g++ $(bindir)/g++; \
+ chmod a+x $(bindir)/g++; \
+ rm -f $(bindir)/c++; \
+ ! ln $(bindir)/g++ $(bindir)/c++; \
+ fi ; \
+ fi
+ # Install protoize if it was compiled.
+ --- 1853,1872 ----
+ $(INSTALL_PROGRAM) g++-cross $(bindir)/$(target)-g++; \
+ chmod a+x $(bindir)/$(target)-g++; \
+ rm -f $(bindir)/$(target)-c++; \
+ ! $(HARDLINK) $(bindir)/$(target)-g++ $(bindir)/$(target)-c++; \
+ fi ; \
+ else \
+ rm -f $(bindir)/gcc; \
+ $(INSTALL_PROGRAM) xgcc $(bindir)/gcc; \
+ rm -f $(bindir)/$(target)-gcc-1; \
+ ! $(HARDLINK) $(bindir)/gcc $(bindir)/$(target)-gcc-1; \
+ mv $(bindir)/$(target)-gcc-1 $(bindir)/$(target)-gcc; \
+ if [ -f cc1plus ] ; then \
+ rm -f $(bindir)/g++; \
+ $(INSTALL_PROGRAM) g++ $(bindir)/g++; \
+ chmod a+x $(bindir)/g++; \
+ rm -f $(bindir)/c++; \
+ ! $(HARDLINK) $(bindir)/g++ $(bindir)/c++; \
+ fi ; \
+ fi
+ # Install protoize if it was compiled.
+ ***************
+ *** 1924,1930 ****
+ dest=`ls -ld $(libsubdir)/include/$$i | sed -n 's/.*-> //p'`; \
+ if expr "$$dest" : "$$dir.*" > /dev/null; then \
+ rm -f $(libsubdir)/include/$$i; \
+ ! ln -s `echo $$i | sed "s|/[^/]*|/..|g" | sed 's|/..$$||'``echo "$$dest" | sed "s|$$dir||"` $(libsubdir)/include/$$i; \
+ fi; \
+ done; \
+ fi
+ --- 1932,1938 ----
+ dest=`ls -ld $(libsubdir)/include/$$i | sed -n 's/.*-> //p'`; \
+ if expr "$$dest" : "$$dir.*" > /dev/null; then \
+ rm -f $(libsubdir)/include/$$i; \
+ ! $(HARDLINK) -s `echo $$i | sed "s|/[^/]*|/..|g" | sed 's|/..$$||'``echo "$$dest" | sed "s|$$dir||"` $(libsubdir)/include/$$i; \
+ fi; \
+ done; \
+ fi
+ ***************
+ *** 1947,1952 ****
+ --- 1955,1964 ----
+ install-headers-cpio: stmp-headers $(STMP_FIXPROTO) install-include-dir
+ cd include; find . -print | cpio -pdum $(libsubdir)/include
+
+ + # Install the include directory using simple recursive copy.
+ + install-headers-cp: stmp-headers install-include-dir
+ + cd include; cp -r . $(libsubdir)/include
+ +
+ # Put assert.h where it won't override GNU libc's assert.h.
+ # It goes in a dir that is searched after GNU libc's headers;
+ # thus, the following conditionals are no longer needed.
+ ***************
+ *** 2034,2040 ****
+ mkdir tmp/config
+ mkdir tmp/objc
+ for file in *[0-9a-zA-Z+]; do \
+ ! ln $$file tmp > /dev/null 2>&1 || cp $$file tmp; \
+ done
+ cd config; \
+ for file in *[0-9a-zA-Z+]; do \
+ --- 2046,2052 ----
+ mkdir tmp/config
+ mkdir tmp/objc
+ for file in *[0-9a-zA-Z+]; do \
+ ! $(HARDLINK) $$file tmp > /dev/null 2>&1 || cp $$file tmp; \
+ done
+ cd config; \
+ for file in *[0-9a-zA-Z+]; do \
+ ***************
+ *** 2042,2061 ****
+ mkdir ../tmp/config/$$file; \
+ cd $$file; \
+ for subfile in *[0-9a-zA-Z+]; do \
+ ! ln $$subfile ../../tmp/config/$$file >/dev/null 2>&1 \
+ || cp $$subfile ../../tmp/config/$$file; \
+ done; \
+ cd ..; \
+ else \
+ ! ln $$file ../tmp/config >/dev/null 2>&1 \
+ || cp $$file ../tmp/config; \
+ fi; \
+ done
+ cd objc; \
+ for file in *[0-9a-zA-Z+]; do \
+ ! ln $$file ../tmp/objc >/dev/null 2>&1 || cp $$file ../tmp/objc; \
+ done
+ ! ln .gdbinit tmp
+ mv tmp gcc-$(version)
+ # Get rid of everything we don't want in the distribution.
+ cd gcc-$(version); make -f Makefile.in extraclean
+ --- 2054,2073 ----
+ mkdir ../tmp/config/$$file; \
+ cd $$file; \
+ for subfile in *[0-9a-zA-Z+]; do \
+ ! $(HARDLINK) $$subfile ../../tmp/config/$$file >/dev/null 2>&1 \
+ || cp $$subfile ../../tmp/config/$$file; \
+ done; \
+ cd ..; \
+ else \
+ ! $(HARDLINK) $$file ../tmp/config >/dev/null 2>&1 \
+ || cp $$file ../tmp/config; \
+ fi; \
+ done
+ cd objc; \
+ for file in *[0-9a-zA-Z+]; do \
+ ! $(HARDLINK) $$file ../tmp/objc >/dev/null 2>&1 || cp $$file ../tmp/objc; \
+ done
+ ! $(HARDLINK) .gdbinit tmp
+ mv tmp gcc-$(version)
+ # Get rid of everything we don't want in the distribution.
+ cd gcc-$(version); make -f Makefile.in extraclean
+ ***************
+ *** 2074,2090 ****
+ # in the intended test directory to make it a suitable test directory.
+ # THIS IS OBSOLETE; use the -srcdir operand in configure instead.
+ maketest:
+ ! ln -s $(DIR)/*.[chy] .
+ ! ln -s $(DIR)/configure .
+ ! ln -s $(DIR)/*.def .
+ -rm -f =*
+ ! ln -s $(DIR)/.gdbinit .
+ ! ln -s $(DIR)/$(FIXINCLUDES) .
+ ! -ln -s $(DIR)/bison.simple .
+ ! ln -s $(DIR)/config .
+ ! ln -s $(DIR)/move-if-change .
+ # The then and else were swapped to avoid a problem on Ultrix.
+ ! if [ ! -f Makefile ] ; then ln -s $(DIR)/Makefile .; else false; fi
+ -rm tm.h aux-output.c config.h md
+ make clean
+ # You must then run config to set up for compilation.
+ --- 2086,2102 ----
+ # in the intended test directory to make it a suitable test directory.
+ # THIS IS OBSOLETE; use the -srcdir operand in configure instead.
+ maketest:
+ ! cp $(DIR)/*.[chy] .
+ ! cp $(DIR)/configure .
+ ! cp $(DIR)/*.def .
+ -rm -f =*
+ ! cp $(DIR)/.gdbinit .
+ ! cp $(DIR)/$(FIXINCLUDES) .
+ ! -cp $(DIR)/bison.simple .
+ ! cp $(DIR)/config .
+ ! cp $(DIR)/move-if-change .
+ # The then and else were swapped to avoid a problem on Ultrix.
+ ! if [ ! -f Makefile ] ; then cp $(DIR)/Makefile .; else false; fi
+ -rm tm.h aux-output.c config.h md
+ make clean
+ # You must then run config to set up for compilation.
+ ***************
+ *** 2100,2116 ****
+ # To prevent `make install' from compiling alloca.o and then relinking cc1
+ # because alloca.o is newer, we permit these recursive makes to compile
+ # alloca.o. Then cc1 is newer, so it won't have to be relinked.
+ ! $(MAKE) CC="stage1/xgcc -Bstage1/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+ $(MAKE) stage2
+ ! $(MAKE) CC="stage2/xgcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+
+ bootstrap2: force
+ ! $(MAKE) CC="stage1/xgcc -Bstage1/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+ $(MAKE) stage2
+ ! $(MAKE) CC="stage2/xgcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+
+ bootstrap3: force
+ ! $(MAKE) CC="stage2/xgcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+
+ # Compare the object files in the current directory with those in the
+ # stage2 directory.
+ --- 2112,2128 ----
+ # To prevent `make install' from compiling alloca.o and then relinking cc1
+ # because alloca.o is newer, we permit these recursive makes to compile
+ # alloca.o. Then cc1 is newer, so it won't have to be relinked.
+ ! $(MAKE) CC="stage1/$(XGCC) -Bstage1/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+ $(MAKE) stage2
+ ! $(MAKE) CC="stage2/$(XGCC) -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+
+ bootstrap2: force
+ ! $(MAKE) CC="stage1/$(XGCC) -Bstage1/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+ $(MAKE) stage2
+ ! $(MAKE) CC="stage2/$(XGCC) -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+
+ bootstrap3: force
+ ! $(MAKE) CC="stage2/$(XGCC) -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)"
+
+ # Compare the object files in the current directory with those in the
+ # stage2 directory.
+ ***************
+ *** 2134,2161 ****
+ -rm -f tmp-foo*
+
+ # Copy the object files from a particular stage into a subdirectory.
+ ! stage1: force
+ -if [ -d stage1 ] ; then true ; else mkdir stage1 ; fi
+ -mv $(STAGESTUFF) stage1
+ -rm -f stage1/libgcc.a
+ -cp libgcc.a stage1
+ -if $(RANLIB_TEST) ; then $(RANLIB) stage1/libgcc.a; else true; fi
+
+ ! stage2: force
+ -if [ -d stage2 ] ; then true ; else mkdir stage2 ; fi
+ -mv $(STAGESTUFF) stage2
+ -rm -f stage2/libgcc.a
+ -cp libgcc.a stage2
+ -if $(RANLIB_TEST) ; then $(RANLIB) stage2/libgcc.a; else true; fi
+
+ ! stage3: force
+ -if [ -d stage3 ] ; then true ; else mkdir stage3 ; fi
+ -mv $(STAGESTUFF) stage3
+ -rm -f stage3/libgcc.a
+ -cp libgcc.a stage3
+ -if $(RANLIB_TEST) ; then $(RANLIB) stage3/libgcc.a; else true; fi
+
+ ! stage4: force
+ -if [ -d stage4 ] ; then true ; else mkdir stage4 ; fi
+ -mv $(STAGESTUFF) stage4
+ -rm -f stage4/libgcc.a
+ --- 2146,2173 ----
+ -rm -f tmp-foo*
+
+ # Copy the object files from a particular stage into a subdirectory.
+ ! stage1: force $(EXTRA_STAGE1_TARGETS)
+ -if [ -d stage1 ] ; then true ; else mkdir stage1 ; fi
+ -mv $(STAGESTUFF) stage1
+ -rm -f stage1/libgcc.a
+ -cp libgcc.a stage1
+ -if $(RANLIB_TEST) ; then $(RANLIB) stage1/libgcc.a; else true; fi
+
+ ! stage2: force $(EXTRA_STAGE2_TARGETS)
+ -if [ -d stage2 ] ; then true ; else mkdir stage2 ; fi
+ -mv $(STAGESTUFF) stage2
+ -rm -f stage2/libgcc.a
+ -cp libgcc.a stage2
+ -if $(RANLIB_TEST) ; then $(RANLIB) stage2/libgcc.a; else true; fi
+
+ ! stage3: force $(EXTRA_STAGE3_TARGETS)
+ -if [ -d stage3 ] ; then true ; else mkdir stage3 ; fi
+ -mv $(STAGESTUFF) stage3
+ -rm -f stage3/libgcc.a
+ -cp libgcc.a stage3
+ -if $(RANLIB_TEST) ; then $(RANLIB) stage3/libgcc.a; else true; fi
+
+ ! stage4: force $(EXTRA_STAGE4_TARGETS)
+ -if [ -d stage4 ] ; then true ; else mkdir stage4 ; fi
+ -mv $(STAGESTUFF) stage4
+ -rm -f stage4/libgcc.a
+ diff -rc --new-file gcc-2.5.8-fsf/README gcc-2.5.8/README
+ *** gcc-2.5.8-fsf/README Sun Dec 12 11:50:02 1993
+ --- gcc-2.5.8/README Tue Feb 22 11:26:53 1994
+ ***************
+ *** 10,17 ****
+ copy of the installation information, as plain ASCII.
+
+ Installing this package will create various files in subdirectories of
+ ! /usr/local/lib, which are passes used by the compiler and a library
+ ! named libgcc.a. It will also create /usr/local/bin/gcc, which is
+ the user-level command to do a compilation.
+
+ See the Bugs chapter of the GCC Manual for how to report bugs
+ --- 10,17 ----
+ copy of the installation information, as plain ASCII.
+
+ Installing this package will create various files in subdirectories of
+ ! /gnu/lib, which are passes used by the compiler and a library
+ ! named libgcc.a. It will also create /gnu/bin/gcc, which is
+ the user-level command to do a compilation.
+
+ See the Bugs chapter of the GCC Manual for how to report bugs
+ diff -rc --new-file gcc-2.5.8-fsf/bi-parser.c gcc-2.5.8/bi-parser.c
+ *** gcc-2.5.8-fsf/bi-parser.c Mon Nov 15 03:57:34 1993
+ --- gcc-2.5.8/bi-parser.c Tue Feb 22 11:22:13 1994
+ ***************
+ *** 1,5 ****
+
+ ! /* A Bison parser, made from bi-parser.y */
+
+ #define YYBISON 1 /* Identify Bison output. */
+
+ --- 1,6 ----
+
+ ! /* A Bison parser, made from bi-parser.y with Bison version GNU Bison version 1.22
+ ! */
+
+ #define YYBISON 1 /* Identify Bison output. */
+
+ ***************
+ *** 55,63 ****
+ --- 56,66 ----
+
+ #include <stdio.h>
+
+ + #ifndef __cplusplus
+ #ifndef __STDC__
+ #define const
+ #endif
+ + #endif
+
+
+
+ ***************
+ *** 96,101 ****
+ --- 99,105 ----
+ 2, 2, 2, 2, 2, 1, 2, 3, 4
+ };
+
+ + #if YYDEBUG != 0
+ static const short yyprhs[] = { 0,
+ 0, 2, 4, 7, 18, 20, 24, 28, 34, 42,
+ 52, 53, 55, 59, 60, 62, 66
+ ***************
+ *** 111,116 ****
+ --- 115,122 ----
+ 0, 16, 6, 15, 0, 4, 0
+ };
+
+ + #endif
+ +
+ #if YYDEBUG != 0
+ static const short yyrline[] = { 0,
+ 59, 64, 66, 70, 75, 77, 81, 84, 86, 88,
+ ***************
+ *** 173,179 ****
+ -1, 12, -1, -1, 16
+ };
+ /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+ ! #line 3 "bison.simple"
+
+ /* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
+ --- 179,185 ----
+ -1, 12, -1, -1, 16
+ };
+ /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+ ! #line 3 "/usr/lib/bison.simple"
+
+ /* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
+ ***************
+ *** 354,377 ****
+ #endif
+ #endif
+
+ ! #line 184 "bison.simple"
+ !
+ ! /* The user can define YYPARSE_PARAM as the name of an argument to be passed
+ ! into yyparse. The argument should have type void *.
+ ! It should actually point to an object.
+ ! Grammar actions can access the variable by casting it
+ ! to the proper pointer type. */
+ !
+ ! #ifdef YYPARSE_PARAM
+ ! #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+ ! #else
+ ! #define YYPARSE_PARAM
+ ! #define YYPARSE_PARAM_DECL
+ ! #endif
+ !
+ int
+ ! yyparse(YYPARSE_PARAM)
+ ! YYPARSE_PARAM_DECL
+ {
+ register int yystate;
+ register int yyn;
+ --- 360,368 ----
+ #endif
+ #endif
+
+ ! #line 184 "/usr/lib/bison.simple"
+ int
+ ! yyparse()
+ {
+ register int yystate;
+ register int yyn;
+ ***************
+ *** 710,716 ****
+ break;}
+ }
+ /* the action file gets copied in in place of this dollarsign */
+ ! #line 480 "bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+ --- 701,707 ----
+ break;}
+ }
+ /* the action file gets copied in in place of this dollarsign */
+ ! #line 465 "/usr/lib/bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+ diff -rc --new-file gcc-2.5.8-fsf/c-parse.c gcc-2.5.8/c-parse.c
+ *** gcc-2.5.8-fsf/c-parse.c Tue Nov 23 23:43:40 1993
+ --- gcc-2.5.8/c-parse.c Mon Apr 25 22:38:25 1994
+ ***************
+ *** 1,5 ****
+
+ ! /* A Bison parser, made from c-parse.y */
+
+ #define IDENTIFIER 258
+ #define TYPENAME 259
+ --- 1,8 ----
+
+ ! /* A Bison parser, made from c-parse.y with Bison version GNU Bison version 1.22
+ ! */
+ !
+ ! #define YYBISON 1 /* Identify Bison output. */
+
+ #define IDENTIFIER 258
+ #define TYPENAME 259
+ ***************
+ *** 143,151 ****
+ --- 146,156 ----
+
+ #include <stdio.h>
+
+ + #ifndef __cplusplus
+ #ifndef __STDC__
+ #define const
+ #endif
+ + #endif
+
+
+
+ ***************
+ *** 190,196 ****
+ 70, 71, 72, 73, 74, 75, 76
+ };
+
+ ! static const short yyrline[] = { 0,
+ 218, 222, 235, 237, 237, 238, 240, 242, 243, 253,
+ 259, 261, 263, 265, 267, 268, 269, 274, 280, 282,
+ 283, 285, 290, 292, 293, 295, 300, 302, 303, 307,
+ --- 195,363 ----
+ 70, 71, 72, 73, 74, 75, 76
+ };
+
+ ! #if YYDEBUG != 0
+ ! static const short yyprhs[] = { 0,
+ ! 0, 1, 3, 4, 7, 8, 12, 14, 16, 22,
+ ! 26, 31, 36, 39, 42, 45, 48, 50, 51, 52,
+ ! 60, 65, 66, 67, 75, 80, 81, 82, 89, 93,
+ ! 95, 97, 99, 101, 103, 105, 107, 109, 111, 113,
+ ! 114, 116, 118, 122, 124, 127, 128, 132, 135, 138,
+ ! 141, 146, 149, 154, 157, 160, 162, 167, 168, 176,
+ ! 178, 182, 186, 190, 194, 198, 202, 206, 210, 214,
+ ! 218, 222, 226, 230, 234, 240, 244, 248, 250, 252,
+ ! 254, 258, 262, 263, 268, 273, 278, 282, 286, 289,
+ ! 292, 294, 297, 298, 300, 303, 307, 309, 311, 314,
+ ! 317, 322, 327, 330, 333, 337, 339, 341, 344, 347,
+ ! 348, 353, 358, 362, 366, 369, 372, 375, 379, 380,
+ ! 383, 386, 388, 390, 393, 396, 399, 403, 404, 407,
+ ! 409, 411, 413, 418, 423, 425, 427, 429, 431, 435,
+ ! 437, 441, 442, 447, 448, 455, 459, 460, 467, 471,
+ ! 472, 479, 481, 485, 487, 489, 494, 499, 508, 510,
+ ! 511, 516, 518, 519, 522, 524, 528, 530, 531, 536,
+ ! 538, 539, 548, 549, 556, 557, 562, 563, 569, 570,
+ ! 574, 575, 579, 581, 583, 587, 591, 596, 600, 604,
+ ! 606, 610, 615, 619, 623, 625, 629, 633, 637, 642,
+ ! 646, 648, 649, 656, 661, 664, 665, 672, 677, 680,
+ ! 681, 689, 690, 697, 700, 701, 703, 704, 706, 708,
+ ! 711, 712, 716, 719, 723, 725, 729, 731, 733, 735,
+ ! 739, 744, 751, 757, 759, 763, 765, 769, 772, 775,
+ ! 776, 778, 780, 783, 784, 787, 791, 795, 798, 802,
+ ! 807, 811, 814, 818, 821, 823, 826, 829, 830, 832,
+ ! 835, 836, 837, 839, 841, 844, 848, 850, 853, 856,
+ ! 863, 869, 875, 878, 881, 886, 887, 892, 893, 894,
+ ! 898, 903, 907, 909, 911, 913, 915, 918, 919, 924,
+ ! 926, 930, 931, 932, 940, 946, 949, 950, 951, 952,
+ ! 965, 966, 973, 976, 979, 982, 986, 993, 1002, 1013,
+ ! 1026, 1030, 1035, 1037, 1039, 1040, 1047, 1051, 1057, 1060,
+ ! 1063, 1064, 1066, 1067, 1069, 1070, 1072, 1074, 1078, 1083,
+ ! 1085, 1089, 1090, 1093, 1096, 1097, 1102, 1105, 1106, 1108,
+ ! 1110, 1114, 1116, 1120, 1123, 1126, 1129, 1132, 1135, 1136,
+ ! 1139, 1141, 1144, 1146, 1150, 1152
+ ! };
+ !
+ ! static const short yyrhs[] = { -1,
+ ! 86, 0, 0, 87, 89, 0, 0, 86, 88, 89,
+ ! 0, 91, 0, 90, 0, 27, 60, 100, 77, 78,
+ ! 0, 117, 127, 78, 0, 121, 117, 127, 78, 0,
+ ! 119, 117, 126, 78, 0, 121, 78, 0, 119, 78,
+ ! 0, 1, 78, 0, 1, 79, 0, 78, 0, 0,
+ ! 0, 119, 117, 150, 92, 111, 93, 180, 0, 119,
+ ! 117, 150, 1, 0, 0, 0, 121, 117, 153, 94,
+ ! 111, 95, 180, 0, 121, 117, 153, 1, 0, 0,
+ ! 0, 117, 153, 96, 111, 97, 180, 0, 117, 153,
+ ! 1, 0, 3, 0, 4, 0, 44, 0, 50, 0,
+ ! 49, 0, 55, 0, 56, 0, 80, 0, 81, 0,
+ ! 102, 0, 0, 102, 0, 107, 0, 102, 82, 107,
+ ! 0, 108, 0, 51, 105, 0, 0, 32, 104, 105,
+ ! 0, 99, 105, 0, 41, 98, 0, 11, 103, 0,
+ ! 11, 60, 168, 77, 0, 29, 103, 0, 29, 60,
+ ! 168, 77, 0, 34, 105, 0, 35, 105, 0, 103,
+ ! 0, 60, 168, 77, 105, 0, 0, 60, 168, 77,
+ ! 83, 106, 138, 79, 0, 105, 0, 107, 49, 107,
+ ! 0, 107, 50, 107, 0, 107, 51, 107, 0, 107,
+ ! 52, 107, 0, 107, 53, 107, 0, 107, 47, 107,
+ ! 0, 107, 48, 107, 0, 107, 46, 107, 0, 107,
+ ! 45, 107, 0, 107, 44, 107, 0, 107, 42, 107,
+ ! 0, 107, 43, 107, 0, 107, 41, 107, 0, 107,
+ ! 40, 107, 0, 107, 38, 204, 39, 107, 0, 107,
+ ! 37, 107, 0, 107, 36, 107, 0, 3, 0, 8,
+ ! 0, 110, 0, 60, 100, 77, 0, 60, 1, 77,
+ ! 0, 0, 60, 109, 181, 77, 0, 108, 60, 101,
+ ! 77, 0, 108, 61, 100, 84, 0, 108, 59, 98,
+ ! 0, 108, 58, 98, 0, 108, 55, 0, 108, 56,
+ ! 0, 9, 0, 110, 9, 0, 0, 113, 0, 113,
+ ! 10, 0, 186, 187, 114, 0, 112, 0, 175, 0,
+ ! 113, 112, 0, 112, 175, 0, 119, 117, 126, 78,
+ ! 0, 121, 117, 127, 78, 0, 119, 78, 0, 121,
+ ! 78, 0, 186, 187, 118, 0, 115, 0, 175, 0,
+ ! 116, 115, 0, 115, 175, 0, 0, 119, 117, 126,
+ ! 78, 0, 121, 117, 127, 78, 0, 119, 117, 146,
+ ! 0, 121, 117, 148, 0, 119, 78, 0, 121, 78,
+ ! 0, 124, 120, 0, 121, 124, 120, 0, 0, 120,
+ ! 125, 0, 120, 5, 0, 7, 0, 5, 0, 121,
+ ! 7, 0, 121, 5, 0, 124, 123, 0, 170, 124,
+ ! 123, 0, 0, 123, 125, 0, 6, 0, 154, 0,
+ ! 4, 0, 28, 60, 100, 77, 0, 28, 60, 168,
+ ! 77, 0, 6, 0, 7, 0, 154, 0, 129, 0,
+ ! 126, 82, 129, 0, 131, 0, 127, 82, 129, 0,
+ ! 0, 27, 60, 110, 77, 0, 0, 150, 128, 133,
+ ! 37, 130, 136, 0, 150, 128, 133, 0, 0, 153,
+ ! 128, 133, 37, 132, 136, 0, 153, 128, 133, 0,
+ ! 0, 31, 60, 60, 134, 77, 77, 0, 135, 0,
+ ! 134, 82, 135, 0, 3, 0, 7, 0, 3, 60,
+ ! 3, 77, 0, 3, 60, 8, 77, 0, 3, 60,
+ ! 3, 82, 8, 82, 8, 77, 0, 107, 0, 0,
+ ! 83, 137, 138, 79, 0, 1, 0, 0, 139, 159,
+ ! 0, 140, 0, 139, 82, 140, 0, 107, 0, 0,
+ ! 83, 141, 138, 79, 0, 1, 0, 0, 61, 107,
+ ! 10, 107, 84, 37, 142, 140, 0, 0, 61, 107,
+ ! 84, 37, 143, 140, 0, 0, 98, 39, 144, 140,
+ ! 0, 0, 59, 98, 37, 145, 140, 0, 0, 150,
+ ! 147, 181, 0, 0, 153, 149, 181, 0, 151, 0,
+ ! 153, 0, 60, 151, 77, 0, 151, 60, 216, 0,
+ ! 151, 61, 100, 84, 0, 151, 61, 84, 0, 51,
+ ! 171, 151, 0, 4, 0, 152, 60, 216, 0, 152,
+ ! 61, 100, 84, 0, 152, 61, 84, 0, 51, 171,
+ ! 152, 0, 4, 0, 153, 60, 216, 0, 60, 153,
+ ! 77, 0, 51, 171, 153, 0, 153, 61, 100, 84,
+ ! 0, 153, 61, 84, 0, 3, 0, 0, 13, 98,
+ ! 83, 155, 161, 79, 0, 13, 83, 161, 79, 0,
+ ! 13, 98, 0, 0, 14, 98, 83, 156, 161, 79,
+ ! 0, 14, 83, 161, 79, 0, 14, 98, 0, 0,
+ ! 12, 98, 83, 157, 166, 160, 79, 0, 0, 12,
+ ! 83, 158, 166, 160, 79, 0, 12, 98, 0, 0,
+ ! 82, 0, 0, 82, 0, 162, 0, 162, 163, 0,
+ ! 0, 162, 163, 78, 0, 162, 78, 0, 122, 117,
+ ! 164, 0, 122, 0, 170, 117, 164, 0, 170, 0,
+ ! 1, 0, 165, 0, 164, 82, 165, 0, 186, 187,
+ ! 150, 133, 0, 186, 187, 150, 39, 107, 133, 0,
+ ! 186, 187, 39, 107, 133, 0, 167, 0, 166, 82,
+ ! 167, 0, 98, 0, 98, 37, 107, 0, 122, 169,
+ ! 0, 170, 169, 0, 0, 172, 0, 7, 0, 170,
+ ! 7, 0, 0, 171, 7, 0, 60, 172, 77, 0,
+ ! 51, 171, 172, 0, 51, 171, 0, 172, 60, 209,
+ ! 0, 172, 61, 100, 84, 0, 172, 61, 84, 0,
+ ! 60, 209, 0, 61, 100, 84, 0, 61, 84, 0,
+ ! 189, 0, 173, 189, 0, 173, 175, 0, 0, 173,
+ ! 0, 1, 78, 0, 0, 0, 178, 0, 179, 0,
+ ! 178, 179, 0, 33, 220, 78, 0, 181, 0, 1,
+ ! 181, 0, 83, 79, 0, 83, 176, 177, 116, 174,
+ ! 79, 0, 83, 176, 177, 1, 79, 0, 83, 176,
+ ! 177, 173, 79, 0, 183, 188, 0, 183, 1, 0,
+ ! 15, 60, 100, 77, 0, 0, 18, 185, 188, 17,
+ ! 0, 0, 0, 186, 187, 191, 0, 186, 187, 202,
+ ! 188, 0, 186, 187, 190, 0, 191, 0, 202, 0,
+ ! 181, 0, 199, 0, 100, 78, 0, 0, 182, 16,
+ ! 192, 188, 0, 182, 0, 182, 16, 1, 0, 0,
+ ! 0, 17, 193, 60, 100, 77, 194, 188, 0, 184,
+ ! 60, 100, 77, 78, 0, 184, 1, 0, 0, 0,
+ ! 0, 19, 60, 204, 78, 195, 204, 78, 196, 204,
+ ! 77, 197, 188, 0, 0, 20, 60, 100, 77, 198,
+ ! 188, 0, 23, 78, 0, 24, 78, 0, 25, 78,
+ ! 0, 25, 100, 78, 0, 27, 203, 60, 100, 77,
+ ! 78, 0, 27, 203, 60, 100, 39, 205, 77, 78,
+ ! 0, 27, 203, 60, 100, 39, 205, 39, 205, 77,
+ ! 78, 0, 27, 203, 60, 100, 39, 205, 39, 205,
+ ! 39, 208, 77, 78, 0, 26, 98, 78, 0, 26,
+ ! 51, 100, 78, 0, 78, 0, 200, 0, 0, 19,
+ ! 60, 108, 77, 201, 188, 0, 21, 107, 39, 0,
+ ! 21, 107, 10, 107, 39, 0, 22, 39, 0, 98,
+ ! 39, 0, 0, 7, 0, 0, 100, 0, 0, 206,
+ ! 0, 207, 0, 206, 82, 207, 0, 9, 60, 100,
+ ! 77, 0, 110, 0, 208, 82, 110, 0, 0, 210,
+ ! 211, 0, 213, 77, 0, 0, 214, 78, 212, 211,
+ ! 0, 1, 77, 0, 0, 10, 0, 214, 0, 214,
+ ! 82, 10, 0, 215, 0, 214, 82, 215, 0, 119,
+ ! 152, 0, 119, 153, 0, 119, 169, 0, 121, 153,
+ ! 0, 121, 169, 0, 0, 217, 218, 0, 211, 0,
+ ! 219, 77, 0, 3, 0, 219, 82, 3, 0, 98,
+ ! 0, 220, 82, 98, 0
+ ! };
+ !
+ ! #endif
+ !
+ ! #if YYDEBUG != 0
+ ! static const short yyrline[] = { 0,
+ 218, 222, 235, 237, 237, 238, 240, 242, 243, 253,
+ 259, 261, 263, 265, 267, 268, 269, 274, 280, 282,
+ 283, 285, 290, 292, 293, 295, 300, 302, 303, 307,
+ ***************
+ *** 206,245 ****
+ 764, 775, 779, 781, 784, 797, 800, 804, 806, 814,
+ 815, 816, 820, 822, 828, 829, 830, 833, 835, 838,
+ 840, 843, 846, 852, 859, 862, 868, 875, 878, 885,
+ ! 888, 893, 895, 900, 906, 907, 917, 928, 948, 950,
+ ! 955, 962, 967, 971, 974, 976, 981, 984, 986, 988,
+ ! 992, 995, 995, 998, 998, 1001, 1001, 1004, 1006, 1023,
+ ! 1027, 1044, 1051, 1053, 1058, 1061, 1066, 1068, 1070, 1072,
+ ! 1080, 1086, 1088, 1090, 1092, 1098, 1104, 1106, 1108, 1110,
+ ! 1112, 1115, 1120, 1124, 1127, 1129, 1131, 1133, 1136, 1138,
+ ! 1141, 1144, 1147, 1150, 1154, 1156, 1159, 1161, 1165, 1168,
+ ! 1173, 1175, 1177, 1191, 1197, 1202, 1207, 1212, 1216, 1218,
+ ! 1222, 1226, 1230, 1240, 1242, 1247, 1250, 1254, 1257, 1261,
+ ! 1264, 1267, 1270, 1274, 1277, 1281, 1285, 1287, 1289, 1291,
+ ! 1293, 1295, 1297, 1299, 1307, 1309, 1310, 1313, 1315, 1318,
+ ! 1321, 1332, 1334, 1339, 1341, 1344, 1358, 1361, 1364, 1366,
+ ! 1371, 1376, 1384, 1389, 1392, 1405, 1413, 1417, 1421, 1425,
+ ! 1431, 1435, 1440, 1442, 1453, 1456, 1457, 1474, 1479, 1482,
+ ! 1493, 1495, 1505, 1515, 1516, 1524, 1527, 1539, 1543, 1560,
+ ! 1567, 1576, 1578, 1583, 1588, 1592, 1596, 1607, 1614, 1621,
+ ! 1628, 1639, 1643, 1646, 1651, 1674, 1705, 1730, 1759, 1774,
+ ! 1785, 1789, 1793, 1796, 1801, 1803, 1806, 1808, 1812, 1817,
+ ! 1820, 1826, 1831, 1836, 1838, 1847, 1848, 1854, 1856, 1861,
+ ! 1863, 1867, 1870, 1876, 1879, 1881, 1883, 1885, 1892, 1897,
+ ! 1902, 1904, 1913, 1916, 1921, 1924
+ };
+
+ ! static const char * const yytname[] = { 0,
+ ! "error","$illegal.","IDENTIFIER","TYPENAME","SCSPEC","TYPESPEC","TYPE_QUAL","CONSTANT","STRING","ELLIPSIS",
+ ! "SIZEOF","ENUM","STRUCT","UNION","IF","ELSE","WHILE","DO","FOR","SWITCH",
+ ! "CASE","DEFAULT","BREAK","CONTINUE","RETURN","GOTO","ASM_KEYWORD","TYPEOF","ALIGNOF","ALIGN",
+ ! "ATTRIBUTE","EXTENSION","LABEL","REALPART","IMAGPART","ASSIGN","'='","'?'","':'","OROR",
+ ! "ANDAND","'|'","'^'","'&'","EQCOMPARE","ARITHCOMPARE","LSHIFT","RSHIFT","'+'","'-'",
+ ! "'*'","'/'","'%'","UNARY","PLUSPLUS","MINUSMINUS","HYPERUNARY","POINTSAT","'.'","'('",
+ ! "'['","INTERFACE","IMPLEMENTATION","END","SELECTOR","DEFS","ENCODE","CLASSNAME","PUBLIC","PRIVATE",
+ ! "PROTECTED","PROTOCOL","OBJECTNAME","CLASS","ALIAS","OBJC_STRING","')'","';'","'}'","'~'",
+ ! "'!'","','","'{'","']'","program"
+ };
+
+ static const short yyr1[] = { 0,
+ 85, 85, 87, 86, 88, 86, 89, 89, 89, 90,
+ --- 373,433 ----
+ 764, 775, 779, 781, 784, 797, 800, 804, 806, 814,
+ 815, 816, 820, 822, 828, 829, 830, 833, 835, 838,
+ 840, 843, 846, 852, 859, 862, 868, 875, 878, 885,
+ ! 888, 893, 895, 900, 914, 915, 925, 936, 956, 958,
+ ! 963, 970, 975, 979, 982, 984, 989, 992, 994, 996,
+ ! 1000, 1003, 1003, 1006, 1006, 1009, 1009, 1012, 1014, 1031,
+ ! 1035, 1052, 1059, 1061, 1066, 1069, 1074, 1076, 1078, 1080,
+ ! 1088, 1094, 1096, 1098, 1100, 1106, 1112, 1114, 1116, 1118,
+ ! 1120, 1123, 1128, 1132, 1135, 1137, 1139, 1141, 1144, 1146,
+ ! 1149, 1152, 1155, 1158, 1162, 1164, 1167, 1169, 1173, 1176,
+ ! 1181, 1183, 1185, 1199, 1205, 1210, 1215, 1220, 1224, 1226,
+ ! 1230, 1234, 1238, 1248, 1250, 1255, 1258, 1262, 1265, 1269,
+ ! 1272, 1275, 1278, 1282, 1285, 1289, 1293, 1295, 1297, 1299,
+ ! 1301, 1303, 1305, 1307, 1315, 1317, 1318, 1321, 1323, 1326,
+ ! 1329, 1340, 1342, 1347, 1349, 1352, 1366, 1369, 1372, 1374,
+ ! 1379, 1384, 1392, 1397, 1400, 1413, 1421, 1425, 1429, 1433,
+ ! 1439, 1443, 1448, 1450, 1461, 1464, 1465, 1482, 1487, 1490,
+ ! 1501, 1503, 1513, 1523, 1524, 1532, 1535, 1547, 1551, 1568,
+ ! 1575, 1584, 1586, 1591, 1596, 1600, 1604, 1615, 1622, 1629,
+ ! 1636, 1647, 1651, 1654, 1659, 1682, 1713, 1738, 1767, 1782,
+ ! 1793, 1797, 1801, 1804, 1809, 1811, 1814, 1816, 1820, 1825,
+ ! 1828, 1834, 1839, 1844, 1846, 1855, 1856, 1862, 1864, 1869,
+ ! 1871, 1875, 1878, 1884, 1887, 1889, 1891, 1893, 1900, 1905,
+ ! 1910, 1912, 1921, 1924, 1929, 1932
+ };
+
+ ! static const char * const yytname[] = { "$","error","$illegal.","IDENTIFIER",
+ ! "TYPENAME","SCSPEC","TYPESPEC","TYPE_QUAL","CONSTANT","STRING","ELLIPSIS","SIZEOF",
+ ! "ENUM","STRUCT","UNION","IF","ELSE","WHILE","DO","FOR","SWITCH","CASE","DEFAULT",
+ ! "BREAK","CONTINUE","RETURN","GOTO","ASM_KEYWORD","TYPEOF","ALIGNOF","ALIGN",
+ ! "ATTRIBUTE","EXTENSION","LABEL","REALPART","IMAGPART","ASSIGN","'='","'?'","':'",
+ ! "OROR","ANDAND","'|'","'^'","'&'","EQCOMPARE","ARITHCOMPARE","LSHIFT","RSHIFT",
+ ! "'+'","'-'","'*'","'/'","'%'","UNARY","PLUSPLUS","MINUSMINUS","HYPERUNARY","POINTSAT",
+ ! "'.'","'('","'['","INTERFACE","IMPLEMENTATION","END","SELECTOR","DEFS","ENCODE",
+ ! "CLASSNAME","PUBLIC","PRIVATE","PROTECTED","PROTOCOL","OBJECTNAME","CLASS","ALIAS",
+ ! "OBJC_STRING","')'","';'","'}'","'~'","'!'","','","'{'","']'","program","extdefs",
+ ! "@1","@2","extdef","datadef","fndef","@3","@4","@5","@6","@7","@8","identifier",
+ ! "unop","expr","exprlist","nonnull_exprlist","unary_expr","@9","cast_expr","@10",
+ ! "expr_no_commas","primary","@11","string","xdecls","lineno_datadecl","datadecls",
+ ! "datadecl","lineno_decl","decls","setspecs","decl","typed_declspecs","reserved_declspecs",
+ ! "declmods","typed_typespecs","reserved_typespecquals","typespec","typespecqual_reserved",
+ ! "initdecls","notype_initdecls","maybeasm","initdcl","@12","notype_initdcl","@13",
+ ! "maybe_attribute","attribute_list","attrib","init","@14","initlist_maybe_comma",
+ ! "initlist1","initelt","@15","@16","@17","@18","@19","nested_function","@20",
+ ! "notype_nested_function","@21","declarator","after_type_declarator","parm_declarator",
+ ! "notype_declarator","structsp","@22","@23","@24","@25","maybecomma","maybecomma_warn",
+ ! "component_decl_list","component_decl_list2","component_decl","components","component_declarator",
+ ! "enumlist","enumerator","typename","absdcl","nonempty_type_quals","type_quals",
+ ! "absdcl1","stmts","xstmts","errstmt","pushlevel","maybe_label_decls","label_decls",
+ ! "label_decl","compstmt_or_error","compstmt","simple_if","if_prefix","do_stmt_start",
+ ! "@26","save_filename","save_lineno","lineno_labeled_stmt","lineno_stmt_or_label",
+ ! "stmt_or_label","stmt","@27","@28","@29","@30","@31","@32","@33","all_iter_stmt",
+ ! "all_iter_stmt_simple","@34","label","maybe_type_qual","xexpr","asm_operands",
+ ! "nonnull_asm_operands","asm_operand","asm_clobbers","parmlist","@35","parmlist_1",
+ ! "@36","parmlist_2","parms","parm","parmlist_or_identifiers","@37","parmlist_or_identifiers_1",
+ ! "identifiers","identifiers_or_typenames",""
+ };
+ + #endif
+
+ static const short yyr1[] = { 0,
+ 85, 85, 87, 86, 88, 86, 89, 89, 89, 90,
+ ***************
+ *** 896,908 ****
+ 48, 49, 50, 51, 52, 53, 43, 44, 45, 46,
+ 47, 48, 49, 50, 51, 52, 53
+ };
+ - #define YYPURE 1
+ -
+ /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+ ! #line 3 "bison.simple"
+
+ /* Skeleton output parser for bison,
+ ! Copyright (C) 1984 Bob Corbett and Richard Stallman
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ --- 1084,1094 ----
+ 48, 49, 50, 51, 52, 53, 43, 44, 45, 46,
+ 47, 48, 49, 50, 51, 52, 53
+ };
+ /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+ ! #line 3 "/gnu/lib/bison.simple"
+
+ /* Skeleton output parser for bison,
+ ! Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ ***************
+ *** 919,927 ****
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+
+ ! #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__)
+ #include <alloca.h>
+ ! #endif
+
+ /* This is the parser code that is written into each bison parser
+ when the %semantic_parser declaration is not specified in the grammar.
+ --- 1105,1138 ----
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+
+ ! #ifndef alloca
+ ! #ifdef __GNUC__
+ ! #define alloca __builtin_alloca
+ ! #else /* not GNU C. */
+ ! #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
+ #include <alloca.h>
+ ! #else /* not sparc */
+ ! #if defined (MSDOS) && !defined (__TURBOC__)
+ ! #include <malloc.h>
+ ! #else /* not MSDOS, or __TURBOC__ */
+ ! #if defined(_AIX)
+ ! #include <malloc.h>
+ ! #pragma alloca
+ ! #else /* not MSDOS, __TURBOC__, or _AIX */
+ ! #ifdef __hpux
+ ! #ifdef __cplusplus
+ ! extern "C" {
+ ! void *alloca (unsigned int);
+ ! };
+ ! #else /* not __cplusplus */
+ ! void *alloca ();
+ ! #endif /* not __cplusplus */
+ ! #endif /* __hpux */
+ ! #endif /* not _AIX */
+ ! #endif /* not MSDOS, or __TURBOC__ */
+ ! #endif /* not sparc. */
+ ! #endif /* not GNU C. */
+ ! #endif /* alloca not defined. */
+
+ /* This is the parser code that is written into each bison parser
+ when the %semantic_parser declaration is not specified in the grammar.
+ ***************
+ *** 936,970 ****
+ #define yyclearin (yychar = YYEMPTY)
+ #define YYEMPTY -2
+ #define YYEOF 0
+ - #define YYFAIL goto yyerrlab;
+ #define YYACCEPT return(0)
+ #define YYABORT return(1)
+ ! #define YYERROR goto yyerrlab
+
+ #define YYTERROR 1
+ #define YYERRCODE 256
+
+ ! #ifndef YYIMPURE
+ #define YYLEX yylex()
+ #endif
+
+ ! #ifndef YYPURE
+ #define YYLEX yylex(&yylval, &yylloc)
+ #endif
+
+ /* If nonreentrant, generate the variables here */
+
+ ! #ifndef YYIMPURE
+
+ int yychar; /* the lookahead symbol */
+ YYSTYPE yylval; /* the semantic value of the */
+ /* lookahead symbol */
+
+ YYLTYPE yylloc; /* location data for the lookahead */
+ /* symbol */
+
+ int yynerrs; /* number of parse errors so far */
+ ! #endif /* YYIMPURE */
+
+ #if YYDEBUG != 0
+ int yydebug; /* nonzero means print parse trace */
+ --- 1147,1203 ----
+ #define yyclearin (yychar = YYEMPTY)
+ #define YYEMPTY -2
+ #define YYEOF 0
+ #define YYACCEPT return(0)
+ #define YYABORT return(1)
+ ! #define YYERROR goto yyerrlab1
+ ! /* Like YYERROR except do call yyerror.
+ ! This remains here temporarily to ease the
+ ! transition to the new meaning of YYERROR, for GCC.
+ ! Once GCC version 2 has supplanted version 1, this can go. */
+ ! #define YYFAIL goto yyerrlab
+ ! #define YYRECOVERING() (!!yyerrstatus)
+ ! #define YYBACKUP(token, value) \
+ ! do \
+ ! if (yychar == YYEMPTY && yylen == 1) \
+ ! { yychar = (token), yylval = (value); \
+ ! yychar1 = YYTRANSLATE (yychar); \
+ ! YYPOPSTACK; \
+ ! goto yybackup; \
+ ! } \
+ ! else \
+ ! { yyerror ("syntax error: cannot back up"); YYERROR; } \
+ ! while (0)
+
+ #define YYTERROR 1
+ #define YYERRCODE 256
+
+ ! #ifndef YYPURE
+ #define YYLEX yylex()
+ #endif
+
+ ! #ifdef YYPURE
+ ! #ifdef YYLSP_NEEDED
+ #define YYLEX yylex(&yylval, &yylloc)
+ + #else
+ + #define YYLEX yylex(&yylval)
+ + #endif
+ #endif
+
+ /* If nonreentrant, generate the variables here */
+
+ ! #ifndef YYPURE
+
+ int yychar; /* the lookahead symbol */
+ YYSTYPE yylval; /* the semantic value of the */
+ /* lookahead symbol */
+
+ + #ifdef YYLSP_NEEDED
+ YYLTYPE yylloc; /* location data for the lookahead */
+ /* symbol */
+ + #endif
+
+ int yynerrs; /* number of parse errors so far */
+ ! #endif /* not YYPURE */
+
+ #if YYDEBUG != 0
+ int yydebug; /* nonzero means print parse trace */
+ ***************
+ *** 972,992 ****
+ from coexisting. */
+ #endif
+
+ ! /* YYMAXDEPTH indicates the initial size of the parser's stacks */
+
+ ! #ifndef YYMAXDEPTH
+ ! #define YYMAXDEPTH 200
+ #endif
+
+ ! /* YYMAXLIMIT is the maximum size the stacks can grow to
+ (effective only if the built-in stack extension method is used). */
+
+ ! #ifndef YYMAXLIMIT
+ ! #define YYMAXLIMIT 10000
+ #endif
+
+
+ ! #line 90 "bison.simple"
+ int
+ yyparse()
+ {
+ --- 1205,1272 ----
+ from coexisting. */
+ #endif
+
+ ! /* YYINITDEPTH indicates the initial size of the parser's stacks */
+
+ ! #ifndef YYINITDEPTH
+ ! #define YYINITDEPTH 200
+ #endif
+
+ ! /* YYMAXDEPTH is the maximum size the stacks can grow to
+ (effective only if the built-in stack extension method is used). */
+
+ ! #if YYMAXDEPTH == 0
+ ! #undef YYMAXDEPTH
+ #endif
+
+ + #ifndef YYMAXDEPTH
+ + #define YYMAXDEPTH 10000
+ + #endif
+ +
+ + /* Prevent warning if -Wstrict-prototypes. */
+ + #ifdef __GNUC__
+ + int yyparse (void);
+ + #endif
+ +
+ + #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
+ + #define __yy_bcopy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT)
+ + #else /* not GNU C or C++ */
+ + #ifndef __cplusplus
+ +
+ + /* This is the most reliable way to avoid incompatibilities
+ + in available built-in functions on various systems. */
+ + static void
+ + __yy_bcopy (from, to, count)
+ + char *from;
+ + char *to;
+ + int count;
+ + {
+ + register char *f = from;
+ + register char *t = to;
+ + register int i = count;
+
+ ! while (i-- > 0)
+ ! *t++ = *f++;
+ ! }
+ !
+ ! #else /* __cplusplus */
+ !
+ ! /* This is the most reliable way to avoid incompatibilities
+ ! in available built-in functions on various systems. */
+ ! static void
+ ! __yy_bcopy (char *from, char *to, int count)
+ ! {
+ ! register char *f = from;
+ ! register char *t = to;
+ ! register int i = count;
+ !
+ ! while (i-- > 0)
+ ! *t++ = *f++;
+ ! }
+ !
+ ! #endif
+ ! #endif
+ !
+ ! #line 184 "/gnu/lib/bison.simple"
+ int
+ yyparse()
+ {
+ ***************
+ *** 994,1018 ****
+ register int yyn;
+ register short *yyssp;
+ register YYSTYPE *yyvsp;
+ - YYLTYPE *yylsp;
+ int yyerrstatus; /* number of tokens to shift before error messages enabled */
+ ! int yychar1; /* lookahead token as an internal (translated) token number */
+
+ ! short yyssa[YYMAXDEPTH]; /* the state stack */
+ ! YYSTYPE yyvsa[YYMAXDEPTH]; /* the semantic value stack */
+ ! YYLTYPE yylsa[YYMAXDEPTH]; /* the location stack */
+
+ short *yyss = yyssa; /* refer to the stacks thru separate pointers */
+ YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
+ YYLTYPE *yyls = yylsa;
+
+ ! int yymaxdepth = YYMAXDEPTH;
+
+ ! #ifndef YYPURE
+ int yychar;
+ YYSTYPE yylval;
+ - YYLTYPE yylloc;
+ int yynerrs;
+ #endif
+
+ YYSTYPE yyval; /* the variable used to return */
+ --- 1274,1307 ----
+ register int yyn;
+ register short *yyssp;
+ register YYSTYPE *yyvsp;
+ int yyerrstatus; /* number of tokens to shift before error messages enabled */
+ ! int yychar1 = 0; /* lookahead token as an internal (translated) token number */
+
+ ! short yyssa[YYINITDEPTH]; /* the state stack */
+ ! YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
+
+ short *yyss = yyssa; /* refer to the stacks thru separate pointers */
+ YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
+ +
+ + #ifdef YYLSP_NEEDED
+ + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
+ YYLTYPE *yyls = yylsa;
+ + YYLTYPE *yylsp;
+ +
+ + #define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
+ + #else
+ + #define YYPOPSTACK (yyvsp--, yyssp--)
+ + #endif
+
+ ! int yystacksize = YYINITDEPTH;
+
+ ! #ifdef YYPURE
+ int yychar;
+ YYSTYPE yylval;
+ int yynerrs;
+ + #ifdef YYLSP_NEEDED
+ + YYLTYPE yylloc;
+ + #endif
+ #endif
+
+ YYSTYPE yyval; /* the variable used to return */
+ ***************
+ *** 1033,1043 ****
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ ! so that they stay on the same level as the state stack. */
+
+ yyssp = yyss - 1;
+ yyvsp = yyvs;
+ yylsp = yyls;
+
+ /* Push a new state, which is found in yystate . */
+ /* In all cases, when you get here, the value and location stacks
+ --- 1322,1335 ----
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ ! so that they stay on the same level as the state stack.
+ ! The wasted elements are never initialized. */
+
+ yyssp = yyss - 1;
+ yyvsp = yyvs;
+ + #ifdef YYLSP_NEEDED
+ yylsp = yyls;
+ + #endif
+
+ /* Push a new state, which is found in yystate . */
+ /* In all cases, when you get here, the value and location stacks
+ ***************
+ *** 1046,1058 ****
+
+ *++yyssp = yystate;
+
+ ! if (yyssp >= yyss + yymaxdepth - 1)
+ {
+ /* Give user a chance to reallocate the stack */
+ /* Use copies of these so that the &'s don't force the real ones into memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ - YYLTYPE *yyls1 = yyls;
+ short *yyss1 = yyss;
+
+ /* Get the current used size of the three stacks, in elements. */
+ int size = yyssp - yyss + 1;
+ --- 1338,1352 ----
+
+ *++yyssp = yystate;
+
+ ! if (yyssp >= yyss + yystacksize - 1)
+ {
+ /* Give user a chance to reallocate the stack */
+ /* Use copies of these so that the &'s don't force the real ones into memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ short *yyss1 = yyss;
+ + #ifdef YYLSP_NEEDED
+ + YYLTYPE *yyls1 = yyls;
+ + #endif
+
+ /* Get the current used size of the three stacks, in elements. */
+ int size = yyssp - yyss + 1;
+ ***************
+ *** 1060,1086 ****
+ #ifdef yyoverflow
+ /* Each stack pointer address is followed by the size of
+ the data in use in that stack, in bytes. */
+ yyoverflow("parser stack overflow",
+ &yyss1, size * sizeof (*yyssp),
+ &yyvs1, size * sizeof (*yyvsp),
+ &yyls1, size * sizeof (*yylsp),
+ ! &yymaxdepth);
+
+ ! yyss = yyss1; yyvs = yyvs1; yyls = yyls1;
+ #else /* no yyoverflow */
+ /* Extend the stack our own way. */
+ ! if (yymaxdepth >= YYMAXLIMIT)
+ ! yyerror("parser stack overflow");
+ ! yymaxdepth *= 2;
+ ! if (yymaxdepth > YYMAXLIMIT)
+ ! yymaxdepth = YYMAXLIMIT;
+ ! yyss = (short *) alloca (yymaxdepth * sizeof (*yyssp));
+ ! bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
+ ! yyvs = (YYSTYPE *) alloca (yymaxdepth * sizeof (*yyvsp));
+ ! bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
+ #ifdef YYLSP_NEEDED
+ ! yyls = (YYLTYPE *) alloca (yymaxdepth * sizeof (*yylsp));
+ ! bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
+ #endif
+ #endif /* no yyoverflow */
+
+ --- 1354,1395 ----
+ #ifdef yyoverflow
+ /* Each stack pointer address is followed by the size of
+ the data in use in that stack, in bytes. */
+ + #ifdef YYLSP_NEEDED
+ + /* This used to be a conditional around just the two extra args,
+ + but that might be undefined if yyoverflow is a macro. */
+ yyoverflow("parser stack overflow",
+ &yyss1, size * sizeof (*yyssp),
+ &yyvs1, size * sizeof (*yyvsp),
+ &yyls1, size * sizeof (*yylsp),
+ ! &yystacksize);
+ ! #else
+ ! yyoverflow("parser stack overflow",
+ ! &yyss1, size * sizeof (*yyssp),
+ ! &yyvs1, size * sizeof (*yyvsp),
+ ! &yystacksize);
+ ! #endif
+
+ ! yyss = yyss1; yyvs = yyvs1;
+ ! #ifdef YYLSP_NEEDED
+ ! yyls = yyls1;
+ ! #endif
+ #else /* no yyoverflow */
+ /* Extend the stack our own way. */
+ ! if (yystacksize >= YYMAXDEPTH)
+ ! {
+ ! yyerror("parser stack overflow");
+ ! return 2;
+ ! }
+ ! yystacksize *= 2;
+ ! if (yystacksize > YYMAXDEPTH)
+ ! yystacksize = YYMAXDEPTH;
+ ! yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
+ ! __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
+ ! yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
+ ! __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
+ #ifdef YYLSP_NEEDED
+ ! yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
+ ! __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
+ #endif
+ #endif /* no yyoverflow */
+
+ ***************
+ *** 1092,1101 ****
+
+ #if YYDEBUG != 0
+ if (yydebug)
+ ! fprintf(stderr, "Stack size increased to %d\n", yymaxdepth);
+ #endif
+
+ ! if (yyssp >= yyss + yymaxdepth - 1)
+ YYABORT;
+ }
+
+ --- 1401,1410 ----
+
+ #if YYDEBUG != 0
+ if (yydebug)
+ ! fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+ #endif
+
+ ! if (yyssp >= yyss + yystacksize - 1)
+ YYABORT;
+ }
+
+ ***************
+ *** 1104,1112 ****
+ fprintf(stderr, "Entering state %d\n", yystate);
+ #endif
+
+ /* Do appropriate processing given the current state. */
+ /* Read a lookahead token if we need one and don't already have one. */
+ ! yyresume:
+
+ /* First try to decide what to do without reference to lookahead token. */
+
+ --- 1413,1424 ----
+ fprintf(stderr, "Entering state %d\n", yystate);
+ #endif
+
+ + goto yybackup;
+ + yybackup:
+ +
+ /* Do appropriate processing given the current state. */
+ /* Read a lookahead token if we need one and don't already have one. */
+ ! /* yyresume: */
+
+ /* First try to decide what to do without reference to lookahead token. */
+
+ ***************
+ *** 1146,1152 ****
+
+ #if YYDEBUG != 0
+ if (yydebug)
+ ! fprintf(stderr, "Next token is %d (%s)\n", yychar, yytname[yychar1]);
+ #endif
+ }
+
+ --- 1458,1472 ----
+
+ #if YYDEBUG != 0
+ if (yydebug)
+ ! {
+ ! fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+ ! /* Give the individual parser a way to print the precise meaning
+ ! of a token, for further debugging info. */
+ ! #ifdef YYPRINT
+ ! YYPRINT (stderr, yychar, yylval);
+ ! #endif
+ ! fprintf (stderr, ")\n");
+ ! }
+ #endif
+ }
+
+ ***************
+ *** 1208,1224 ****
+ /* Do a reduction. yyn is the number of a rule to reduce with. */
+ yyreduce:
+ yylen = yyr2[yyn];
+ ! yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+ #if YYDEBUG != 0
+ if (yydebug)
+ {
+ ! if (yylen == 1)
+ ! fprintf (stderr, "Reducing 1 value via line %d, ",
+ ! yyrline[yyn]);
+ ! else
+ ! fprintf (stderr, "Reducing %d values via line %d, ",
+ ! yylen, yyrline[yyn]);
+ }
+ #endif
+
+ --- 1528,1548 ----
+ /* Do a reduction. yyn is the number of a rule to reduce with. */
+ yyreduce:
+ yylen = yyr2[yyn];
+ ! if (yylen > 0)
+ ! yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+ #if YYDEBUG != 0
+ if (yydebug)
+ {
+ ! int i;
+ !
+ ! fprintf (stderr, "Reducing via rule %d (line %d), ",
+ ! yyn, yyrline[yyn]);
+ !
+ ! /* Print the symbols being reduced, and their result. */
+ ! for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+ ! fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+ ! fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+ }
+ #endif
+
+ ***************
+ *** 1959,1972 ****
+ break;}
+ case 154:
+ #line 901 "c-parse.y"
+ ! { if (strcmp (IDENTIFIER_POINTER (yyvsp[0].ttype), "packed")
+ && strcmp (IDENTIFIER_POINTER (yyvsp[0].ttype), "noreturn"))
+ warning ("`%s' attribute directive ignored",
+ IDENTIFIER_POINTER (yyvsp[0].ttype));
+ yyval.ttype = yyvsp[0].ttype; ;
+ break;}
+ case 156:
+ ! #line 908 "c-parse.y"
+ { /* If not "mode (m)", then issue warning. */
+ if (strcmp (IDENTIFIER_POINTER (yyvsp[-3].ttype), "mode") != 0)
+ {
+ --- 2283,2304 ----
+ break;}
+ case 154:
+ #line 901 "c-parse.y"
+ ! {
+ ! #ifdef HANDLE_ATTRIBUTE0
+ ! /* give the function a chance to validate further attributes */
+ ! if (HANDLE_ATTRIBUTE0 (IDENTIFIER_POINTER (yyvsp[0].ttype)) ||
+ ! (strcmp (IDENTIFIER_POINTER (yyvsp[0].ttype), "packed")
+ ! && strcmp (IDENTIFIER_POINTER (yyvsp[0].ttype), "noreturn")))
+ ! #else
+ ! if (strcmp (IDENTIFIER_POINTER (yyvsp[0].ttype), "packed")
+ && strcmp (IDENTIFIER_POINTER (yyvsp[0].ttype), "noreturn"))
+ + #endif
+ warning ("`%s' attribute directive ignored",
+ IDENTIFIER_POINTER (yyvsp[0].ttype));
+ yyval.ttype = yyvsp[0].ttype; ;
+ break;}
+ case 156:
+ ! #line 916 "c-parse.y"
+ { /* If not "mode (m)", then issue warning. */
+ if (strcmp (IDENTIFIER_POINTER (yyvsp[-3].ttype), "mode") != 0)
+ {
+ ***************
+ *** 1978,1984 ****
+ yyval.ttype = tree_cons (yyvsp[-3].ttype, yyvsp[-1].ttype, NULL_TREE); ;
+ break;}
+ case 157:
+ ! #line 918 "c-parse.y"
+ { /* if not "aligned(n)", then issue warning */
+ if (strcmp (IDENTIFIER_POINTER (yyvsp[-3].ttype), "aligned") != 0
+ || TREE_CODE (yyvsp[-1].ttype) != INTEGER_CST)
+ --- 2310,2316 ----
+ yyval.ttype = tree_cons (yyvsp[-3].ttype, yyvsp[-1].ttype, NULL_TREE); ;
+ break;}
+ case 157:
+ ! #line 926 "c-parse.y"
+ { /* if not "aligned(n)", then issue warning */
+ if (strcmp (IDENTIFIER_POINTER (yyvsp[-3].ttype), "aligned") != 0
+ || TREE_CODE (yyvsp[-1].ttype) != INTEGER_CST)
+ ***************
+ *** 1991,1997 ****
+ yyval.ttype = tree_cons (yyvsp[-3].ttype, yyvsp[-1].ttype, NULL_TREE); ;
+ break;}
+ case 158:
+ ! #line 929 "c-parse.y"
+ { /* if not "format(...)", then issue warning */
+ if (strcmp (IDENTIFIER_POINTER (yyvsp[-7].ttype), "format") != 0
+ || TREE_CODE (yyvsp[-3].ttype) != INTEGER_CST
+ --- 2323,2329 ----
+ yyval.ttype = tree_cons (yyvsp[-3].ttype, yyvsp[-1].ttype, NULL_TREE); ;
+ break;}
+ case 158:
+ ! #line 937 "c-parse.y"
+ { /* if not "format(...)", then issue warning */
+ if (strcmp (IDENTIFIER_POINTER (yyvsp[-7].ttype), "format") != 0
+ || TREE_CODE (yyvsp[-3].ttype) != INTEGER_CST
+ ***************
+ *** 2009,2022 ****
+ NULL_TREE); ;
+ break;}
+ case 160:
+ ! #line 951 "c-parse.y"
+ { really_start_incremental_init (NULL_TREE);
+ /* Note that the call to clear_momentary
+ is in process_init_element. */
+ push_momentary (); ;
+ break;}
+ case 161:
+ ! #line 956 "c-parse.y"
+ { yyval.ttype = pop_init_level (0);
+ if (yyval.ttype == error_mark_node)
+ pop_momentary ();
+ --- 2341,2354 ----
+ NULL_TREE); ;
+ break;}
+ case 160:
+ ! #line 959 "c-parse.y"
+ { really_start_incremental_init (NULL_TREE);
+ /* Note that the call to clear_momentary
+ is in process_init_element. */
+ push_momentary (); ;
+ break;}
+ case 161:
+ ! #line 964 "c-parse.y"
+ { yyval.ttype = pop_init_level (0);
+ if (yyval.ttype == error_mark_node)
+ pop_momentary ();
+ ***************
+ *** 2024,2067 ****
+ pop_momentary_nofree (); ;
+ break;}
+ case 162:
+ ! #line 963 "c-parse.y"
+ { yyval.ttype = error_mark_node; ;
+ break;}
+ case 163:
+ ! #line 969 "c-parse.y"
+ { if (pedantic)
+ pedwarn ("ANSI C forbids empty initializer braces"); ;
+ break;}
+ case 167:
+ ! #line 983 "c-parse.y"
+ { process_init_element (yyvsp[0].ttype); ;
+ break;}
+ case 168:
+ ! #line 985 "c-parse.y"
+ { push_init_level (0); ;
+ break;}
+ case 169:
+ ! #line 987 "c-parse.y"
+ { process_init_element (pop_init_level (0)); ;
+ break;}
+ case 171:
+ ! #line 993 "c-parse.y"
+ { set_init_index (yyvsp[-4].ttype, yyvsp[-2].ttype); ;
+ break;}
+ case 173:
+ ! #line 996 "c-parse.y"
+ { set_init_index (yyvsp[-2].ttype, NULL_TREE); ;
+ break;}
+ case 175:
+ ! #line 999 "c-parse.y"
+ { set_init_label (yyvsp[-1].ttype); ;
+ break;}
+ case 177:
+ ! #line 1002 "c-parse.y"
+ { set_init_label (yyvsp[-1].ttype); ;
+ break;}
+ case 179:
+ ! #line 1008 "c-parse.y"
+ { push_c_function_context ();
+ if (! start_function (current_declspecs, yyvsp[0].ttype, 1))
+ {
+ --- 2356,2399 ----
+ pop_momentary_nofree (); ;
+ break;}
+ case 162:
+ ! #line 971 "c-parse.y"
+ { yyval.ttype = error_mark_node; ;
+ break;}
+ case 163:
+ ! #line 977 "c-parse.y"
+ { if (pedantic)
+ pedwarn ("ANSI C forbids empty initializer braces"); ;
+ break;}
+ case 167:
+ ! #line 991 "c-parse.y"
+ { process_init_element (yyvsp[0].ttype); ;
+ break;}
+ case 168:
+ ! #line 993 "c-parse.y"
+ { push_init_level (0); ;
+ break;}
+ case 169:
+ ! #line 995 "c-parse.y"
+ { process_init_element (pop_init_level (0)); ;
+ break;}
+ case 171:
+ ! #line 1001 "c-parse.y"
+ { set_init_index (yyvsp[-4].ttype, yyvsp[-2].ttype); ;
+ break;}
+ case 173:
+ ! #line 1004 "c-parse.y"
+ { set_init_index (yyvsp[-2].ttype, NULL_TREE); ;
+ break;}
+ case 175:
+ ! #line 1007 "c-parse.y"
+ { set_init_label (yyvsp[-1].ttype); ;
+ break;}
+ case 177:
+ ! #line 1010 "c-parse.y"
+ { set_init_label (yyvsp[-1].ttype); ;
+ break;}
+ case 179:
+ ! #line 1016 "c-parse.y"
+ { push_c_function_context ();
+ if (! start_function (current_declspecs, yyvsp[0].ttype, 1))
+ {
+ ***************
+ *** 2072,2083 ****
+ store_parm_decls (); ;
+ break;}
+ case 180:
+ ! #line 1023 "c-parse.y"
+ { finish_function (1);
+ pop_c_function_context (); ;
+ break;}
+ case 181:
+ ! #line 1029 "c-parse.y"
+ { push_c_function_context ();
+ if (! start_function (current_declspecs, yyvsp[0].ttype, 1))
+ {
+ --- 2404,2415 ----
+ store_parm_decls (); ;
+ break;}
+ case 180:
+ ! #line 1031 "c-parse.y"
+ { finish_function (1);
+ pop_c_function_context (); ;
+ break;}
+ case 181:
+ ! #line 1037 "c-parse.y"
+ { push_c_function_context ();
+ if (! start_function (current_declspecs, yyvsp[0].ttype, 1))
+ {
+ ***************
+ *** 2088,2370 ****
+ store_parm_decls (); ;
+ break;}
+ case 182:
+ ! #line 1044 "c-parse.y"
+ { finish_function (1);
+ pop_c_function_context (); ;
+ break;}
+ case 185:
+ ! #line 1060 "c-parse.y"
+ { yyval.ttype = yyvsp[-1].ttype; ;
+ break;}
+ case 186:
+ ! #line 1062 "c-parse.y"
+ { yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 187:
+ ! #line 1067 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 188:
+ ! #line 1069 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ;
+ break;}
+ case 189:
+ ! #line 1071 "c-parse.y"
+ { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 191:
+ ! #line 1082 "c-parse.y"
+ { yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 192:
+ ! #line 1087 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 193:
+ ! #line 1089 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ;
+ break;}
+ case 194:
+ ! #line 1091 "c-parse.y"
+ { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 196:
+ ! #line 1100 "c-parse.y"
+ { yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 197:
+ ! #line 1105 "c-parse.y"
+ { yyval.ttype = yyvsp[-1].ttype; ;
+ break;}
+ case 198:
+ ! #line 1107 "c-parse.y"
+ { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 199:
+ ! #line 1109 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 200:
+ ! #line 1111 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ;
+ break;}
+ case 202:
+ ! #line 1117 "c-parse.y"
+ { yyval.ttype = start_struct (RECORD_TYPE, yyvsp[-1].ttype);
+ /* Start scope of tag before parsing components. */
+ ;
+ break;}
+ case 203:
+ ! #line 1121 "c-parse.y"
+ { yyval.ttype = finish_struct (yyvsp[-2].ttype, yyvsp[-1].ttype);
+ /* Really define the structure. */
+ ;
+ break;}
+ case 204:
+ ! #line 1125 "c-parse.y"
+ { yyval.ttype = finish_struct (start_struct (RECORD_TYPE, NULL_TREE),
+ yyvsp[-1].ttype); ;
+ break;}
+ case 205:
+ ! #line 1128 "c-parse.y"
+ { yyval.ttype = xref_tag (RECORD_TYPE, yyvsp[0].ttype); ;
+ break;}
+ case 206:
+ ! #line 1130 "c-parse.y"
+ { yyval.ttype = start_struct (UNION_TYPE, yyvsp[-1].ttype); ;
+ break;}
+ case 207:
+ ! #line 1132 "c-parse.y"
+ { yyval.ttype = finish_struct (yyvsp[-2].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 208:
+ ! #line 1134 "c-parse.y"
+ { yyval.ttype = finish_struct (start_struct (UNION_TYPE, NULL_TREE),
+ yyvsp[-1].ttype); ;
+ break;}
+ case 209:
+ ! #line 1137 "c-parse.y"
+ { yyval.ttype = xref_tag (UNION_TYPE, yyvsp[0].ttype); ;
+ break;}
+ case 210:
+ ! #line 1139 "c-parse.y"
+ { yyvsp[0].itype = suspend_momentary ();
+ yyval.ttype = start_enum (yyvsp[-1].ttype); ;
+ break;}
+ case 211:
+ ! #line 1142 "c-parse.y"
+ { yyval.ttype = finish_enum (yyvsp[-3].ttype, nreverse (yyvsp[-2].ttype));
+ resume_momentary (yyvsp[-4].itype); ;
+ break;}
+ case 212:
+ ! #line 1145 "c-parse.y"
+ { yyvsp[0].itype = suspend_momentary ();
+ yyval.ttype = start_enum (NULL_TREE); ;
+ break;}
+ case 213:
+ ! #line 1148 "c-parse.y"
+ { yyval.ttype = finish_enum (yyvsp[-3].ttype, nreverse (yyvsp[-2].ttype));
+ resume_momentary (yyvsp[-4].itype); ;
+ break;}
+ case 214:
+ ! #line 1151 "c-parse.y"
+ { yyval.ttype = xref_tag (ENUMERAL_TYPE, yyvsp[0].ttype); ;
+ break;}
+ case 218:
+ ! #line 1162 "c-parse.y"
+ { if (pedantic) pedwarn ("comma at end of enumerator list"); ;
+ break;}
+ case 219:
+ ! #line 1167 "c-parse.y"
+ { yyval.ttype = yyvsp[0].ttype; ;
+ break;}
+ case 220:
+ ! #line 1169 "c-parse.y"
+ { yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype);
+ pedwarn ("no semicolon at end of struct or union"); ;
+ break;}
+ case 221:
+ ! #line 1174 "c-parse.y"
+ { yyval.ttype = NULL_TREE; ;
+ break;}
+ case 222:
+ ! #line 1176 "c-parse.y"
+ { yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 223:
+ ! #line 1178 "c-parse.y"
+ { if (pedantic)
+ pedwarn ("extra semicolon in struct or union specified"); ;
+ break;}
+ case 224:
+ ! #line 1193 "c-parse.y"
+ { yyval.ttype = yyvsp[0].ttype;
+ current_declspecs = TREE_VALUE (declspec_stack);
+ declspec_stack = TREE_CHAIN (declspec_stack);
+ resume_momentary (yyvsp[-1].itype); ;
+ break;}
+ case 225:
+ ! #line 1198 "c-parse.y"
+ { if (pedantic)
+ pedwarn ("ANSI C forbids member declarations with no members");
+ shadow_tag(yyvsp[0].ttype);
+ yyval.ttype = NULL_TREE; ;
+ break;}
+ case 226:
+ ! #line 1203 "c-parse.y"
+ { yyval.ttype = yyvsp[0].ttype;
+ current_declspecs = TREE_VALUE (declspec_stack);
+ declspec_stack = TREE_CHAIN (declspec_stack);
+ resume_momentary (yyvsp[-1].itype); ;
+ break;}
+ case 227:
+ ! #line 1208 "c-parse.y"
+ { if (pedantic)
+ pedwarn ("ANSI C forbids member declarations with no members");
+ shadow_tag(yyvsp[0].ttype);
+ yyval.ttype = NULL_TREE; ;
+ break;}
+ case 228:
+ ! #line 1213 "c-parse.y"
+ { yyval.ttype = NULL_TREE; ;
+ break;}
+ case 230:
+ ! #line 1219 "c-parse.y"
+ { yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 231:
+ ! #line 1224 "c-parse.y"
+ { yyval.ttype = grokfield (yyvsp[-3].filename, yyvsp[-2].lineno, yyvsp[-1].ttype, current_declspecs, NULL_TREE);
+ decl_attributes (yyval.ttype, yyvsp[0].ttype); ;
+ break;}
+ case 232:
+ ! #line 1228 "c-parse.y"
+ { yyval.ttype = grokfield (yyvsp[-5].filename, yyvsp[-4].lineno, yyvsp[-3].ttype, current_declspecs, yyvsp[-1].ttype);
+ decl_attributes (yyval.ttype, yyvsp[0].ttype); ;
+ break;}
+ case 233:
+ ! #line 1231 "c-parse.y"
+ { yyval.ttype = grokfield (yyvsp[-4].filename, yyvsp[-3].lineno, NULL_TREE, current_declspecs, yyvsp[-1].ttype);
+ decl_attributes (yyval.ttype, yyvsp[0].ttype); ;
+ break;}
+ case 235:
+ ! #line 1243 "c-parse.y"
+ { yyval.ttype = chainon (yyvsp[0].ttype, yyvsp[-2].ttype); ;
+ break;}
+ case 236:
+ ! #line 1249 "c-parse.y"
+ { yyval.ttype = build_enumerator (yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 237:
+ ! #line 1251 "c-parse.y"
+ { yyval.ttype = build_enumerator (yyvsp[-2].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 238:
+ ! #line 1256 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 239:
+ ! #line 1258 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 240:
+ ! #line 1263 "c-parse.y"
+ { yyval.ttype = NULL_TREE; ;
+ break;}
+ case 242:
+ ! #line 1269 "c-parse.y"
+ { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 243:
+ ! #line 1271 "c-parse.y"
+ { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 244:
+ ! #line 1276 "c-parse.y"
+ { yyval.ttype = NULL_TREE; ;
+ break;}
+ case 245:
+ ! #line 1278 "c-parse.y"
+ { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 246:
+ ! #line 1283 "c-parse.y"
+ { yyval.ttype = yyvsp[-1].ttype; ;
+ break;}
+ case 247:
+ ! #line 1286 "c-parse.y"
+ { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 248:
+ ! #line 1288 "c-parse.y"
+ { yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 249:
+ ! #line 1290 "c-parse.y"
+ { yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 250:
+ ! #line 1292 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 251:
+ ! #line 1294 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ;
+ break;}
+ case 252:
+ ! #line 1296 "c-parse.y"
+ { yyval.ttype = build_nt (CALL_EXPR, NULL_TREE, yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 253:
+ ! #line 1298 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ;
+ break;}
+ case 254:
+ ! #line 1300 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, NULL_TREE); ;
+ break;}
+ case 261:
+ ! #line 1322 "c-parse.y"
+ { emit_line_note (input_filename, lineno);
+ pushlevel (0);
+ clear_last_expr ();
+ --- 2420,2702 ----
+ store_parm_decls (); ;
+ break;}
+ case 182:
+ ! #line 1052 "c-parse.y"
+ { finish_function (1);
+ pop_c_function_context (); ;
+ break;}
+ case 185:
+ ! #line 1068 "c-parse.y"
+ { yyval.ttype = yyvsp[-1].ttype; ;
+ break;}
+ case 186:
+ ! #line 1070 "c-parse.y"
+ { yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 187:
+ ! #line 1075 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 188:
+ ! #line 1077 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ;
+ break;}
+ case 189:
+ ! #line 1079 "c-parse.y"
+ { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 191:
+ ! #line 1090 "c-parse.y"
+ { yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 192:
+ ! #line 1095 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 193:
+ ! #line 1097 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ;
+ break;}
+ case 194:
+ ! #line 1099 "c-parse.y"
+ { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 196:
+ ! #line 1108 "c-parse.y"
+ { yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 197:
+ ! #line 1113 "c-parse.y"
+ { yyval.ttype = yyvsp[-1].ttype; ;
+ break;}
+ case 198:
+ ! #line 1115 "c-parse.y"
+ { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 199:
+ ! #line 1117 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 200:
+ ! #line 1119 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ;
+ break;}
+ case 202:
+ ! #line 1125 "c-parse.y"
+ { yyval.ttype = start_struct (RECORD_TYPE, yyvsp[-1].ttype);
+ /* Start scope of tag before parsing components. */
+ ;
+ break;}
+ case 203:
+ ! #line 1129 "c-parse.y"
+ { yyval.ttype = finish_struct (yyvsp[-2].ttype, yyvsp[-1].ttype);
+ /* Really define the structure. */
+ ;
+ break;}
+ case 204:
+ ! #line 1133 "c-parse.y"
+ { yyval.ttype = finish_struct (start_struct (RECORD_TYPE, NULL_TREE),
+ yyvsp[-1].ttype); ;
+ break;}
+ case 205:
+ ! #line 1136 "c-parse.y"
+ { yyval.ttype = xref_tag (RECORD_TYPE, yyvsp[0].ttype); ;
+ break;}
+ case 206:
+ ! #line 1138 "c-parse.y"
+ { yyval.ttype = start_struct (UNION_TYPE, yyvsp[-1].ttype); ;
+ break;}
+ case 207:
+ ! #line 1140 "c-parse.y"
+ { yyval.ttype = finish_struct (yyvsp[-2].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 208:
+ ! #line 1142 "c-parse.y"
+ { yyval.ttype = finish_struct (start_struct (UNION_TYPE, NULL_TREE),
+ yyvsp[-1].ttype); ;
+ break;}
+ case 209:
+ ! #line 1145 "c-parse.y"
+ { yyval.ttype = xref_tag (UNION_TYPE, yyvsp[0].ttype); ;
+ break;}
+ case 210:
+ ! #line 1147 "c-parse.y"
+ { yyvsp[0].itype = suspend_momentary ();
+ yyval.ttype = start_enum (yyvsp[-1].ttype); ;
+ break;}
+ case 211:
+ ! #line 1150 "c-parse.y"
+ { yyval.ttype = finish_enum (yyvsp[-3].ttype, nreverse (yyvsp[-2].ttype));
+ resume_momentary (yyvsp[-4].itype); ;
+ break;}
+ case 212:
+ ! #line 1153 "c-parse.y"
+ { yyvsp[0].itype = suspend_momentary ();
+ yyval.ttype = start_enum (NULL_TREE); ;
+ break;}
+ case 213:
+ ! #line 1156 "c-parse.y"
+ { yyval.ttype = finish_enum (yyvsp[-3].ttype, nreverse (yyvsp[-2].ttype));
+ resume_momentary (yyvsp[-4].itype); ;
+ break;}
+ case 214:
+ ! #line 1159 "c-parse.y"
+ { yyval.ttype = xref_tag (ENUMERAL_TYPE, yyvsp[0].ttype); ;
+ break;}
+ case 218:
+ ! #line 1170 "c-parse.y"
+ { if (pedantic) pedwarn ("comma at end of enumerator list"); ;
+ break;}
+ case 219:
+ ! #line 1175 "c-parse.y"
+ { yyval.ttype = yyvsp[0].ttype; ;
+ break;}
+ case 220:
+ ! #line 1177 "c-parse.y"
+ { yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype);
+ pedwarn ("no semicolon at end of struct or union"); ;
+ break;}
+ case 221:
+ ! #line 1182 "c-parse.y"
+ { yyval.ttype = NULL_TREE; ;
+ break;}
+ case 222:
+ ! #line 1184 "c-parse.y"
+ { yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 223:
+ ! #line 1186 "c-parse.y"
+ { if (pedantic)
+ pedwarn ("extra semicolon in struct or union specified"); ;
+ break;}
+ case 224:
+ ! #line 1201 "c-parse.y"
+ { yyval.ttype = yyvsp[0].ttype;
+ current_declspecs = TREE_VALUE (declspec_stack);
+ declspec_stack = TREE_CHAIN (declspec_stack);
+ resume_momentary (yyvsp[-1].itype); ;
+ break;}
+ case 225:
+ ! #line 1206 "c-parse.y"
+ { if (pedantic)
+ pedwarn ("ANSI C forbids member declarations with no members");
+ shadow_tag(yyvsp[0].ttype);
+ yyval.ttype = NULL_TREE; ;
+ break;}
+ case 226:
+ ! #line 1211 "c-parse.y"
+ { yyval.ttype = yyvsp[0].ttype;
+ current_declspecs = TREE_VALUE (declspec_stack);
+ declspec_stack = TREE_CHAIN (declspec_stack);
+ resume_momentary (yyvsp[-1].itype); ;
+ break;}
+ case 227:
+ ! #line 1216 "c-parse.y"
+ { if (pedantic)
+ pedwarn ("ANSI C forbids member declarations with no members");
+ shadow_tag(yyvsp[0].ttype);
+ yyval.ttype = NULL_TREE; ;
+ break;}
+ case 228:
+ ! #line 1221 "c-parse.y"
+ { yyval.ttype = NULL_TREE; ;
+ break;}
+ case 230:
+ ! #line 1227 "c-parse.y"
+ { yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 231:
+ ! #line 1232 "c-parse.y"
+ { yyval.ttype = grokfield (yyvsp[-3].filename, yyvsp[-2].lineno, yyvsp[-1].ttype, current_declspecs, NULL_TREE);
+ decl_attributes (yyval.ttype, yyvsp[0].ttype); ;
+ break;}
+ case 232:
+ ! #line 1236 "c-parse.y"
+ { yyval.ttype = grokfield (yyvsp[-5].filename, yyvsp[-4].lineno, yyvsp[-3].ttype, current_declspecs, yyvsp[-1].ttype);
+ decl_attributes (yyval.ttype, yyvsp[0].ttype); ;
+ break;}
+ case 233:
+ ! #line 1239 "c-parse.y"
+ { yyval.ttype = grokfield (yyvsp[-4].filename, yyvsp[-3].lineno, NULL_TREE, current_declspecs, yyvsp[-1].ttype);
+ decl_attributes (yyval.ttype, yyvsp[0].ttype); ;
+ break;}
+ case 235:
+ ! #line 1251 "c-parse.y"
+ { yyval.ttype = chainon (yyvsp[0].ttype, yyvsp[-2].ttype); ;
+ break;}
+ case 236:
+ ! #line 1257 "c-parse.y"
+ { yyval.ttype = build_enumerator (yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 237:
+ ! #line 1259 "c-parse.y"
+ { yyval.ttype = build_enumerator (yyvsp[-2].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 238:
+ ! #line 1264 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 239:
+ ! #line 1266 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 240:
+ ! #line 1271 "c-parse.y"
+ { yyval.ttype = NULL_TREE; ;
+ break;}
+ case 242:
+ ! #line 1277 "c-parse.y"
+ { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 243:
+ ! #line 1279 "c-parse.y"
+ { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 244:
+ ! #line 1284 "c-parse.y"
+ { yyval.ttype = NULL_TREE; ;
+ break;}
+ case 245:
+ ! #line 1286 "c-parse.y"
+ { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 246:
+ ! #line 1291 "c-parse.y"
+ { yyval.ttype = yyvsp[-1].ttype; ;
+ break;}
+ case 247:
+ ! #line 1294 "c-parse.y"
+ { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 248:
+ ! #line 1296 "c-parse.y"
+ { yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 249:
+ ! #line 1298 "c-parse.y"
+ { yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 250:
+ ! #line 1300 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 251:
+ ! #line 1302 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ;
+ break;}
+ case 252:
+ ! #line 1304 "c-parse.y"
+ { yyval.ttype = build_nt (CALL_EXPR, NULL_TREE, yyvsp[0].ttype, NULL_TREE); ;
+ break;}
+ case 253:
+ ! #line 1306 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ;
+ break;}
+ case 254:
+ ! #line 1308 "c-parse.y"
+ { yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, NULL_TREE); ;
+ break;}
+ case 261:
+ ! #line 1330 "c-parse.y"
+ { emit_line_note (input_filename, lineno);
+ pushlevel (0);
+ clear_last_expr ();
+ ***************
+ *** 2373,2384 ****
+ ;
+ break;}
+ case 263:
+ ! #line 1335 "c-parse.y"
+ { if (pedantic)
+ pedwarn ("ANSI C forbids label declarations"); ;
+ break;}
+ case 266:
+ ! #line 1346 "c-parse.y"
+ { tree link;
+ for (link = yyvsp[-1].ttype; link; link = TREE_CHAIN (link))
+ {
+ --- 2705,2716 ----
+ ;
+ break;}
+ case 263:
+ ! #line 1343 "c-parse.y"
+ { if (pedantic)
+ pedwarn ("ANSI C forbids label declarations"); ;
+ break;}
+ case 266:
+ ! #line 1354 "c-parse.y"
+ { tree link;
+ for (link = yyvsp[-1].ttype; link; link = TREE_CHAIN (link))
+ {
+ ***************
+ *** 2389,2424 ****
+ ;
+ break;}
+ case 267:
+ ! #line 1360 "c-parse.y"
+ {;
+ break;}
+ case 269:
+ ! #line 1365 "c-parse.y"
+ { yyval.ttype = convert (void_type_node, integer_zero_node); ;
+ break;}
+ case 270:
+ ! #line 1367 "c-parse.y"
+ { emit_line_note (input_filename, lineno);
+ expand_end_bindings (getdecls (), 1, 0);
+ yyval.ttype = poplevel (1, 1, 0);
+ pop_momentary (); ;
+ break;}
+ case 271:
+ ! #line 1372 "c-parse.y"
+ { emit_line_note (input_filename, lineno);
+ expand_end_bindings (getdecls (), kept_level_p (), 0);
+ yyval.ttype = poplevel (kept_level_p (), 0, 0);
+ pop_momentary (); ;
+ break;}
+ case 272:
+ ! #line 1377 "c-parse.y"
+ { emit_line_note (input_filename, lineno);
+ expand_end_bindings (getdecls (), kept_level_p (), 0);
+ yyval.ttype = poplevel (kept_level_p (), 0, 0);
+ pop_momentary (); ;
+ break;}
+ case 275:
+ ! #line 1394 "c-parse.y"
+ { emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno);
+ expand_start_cond (truthvalue_conversion (yyvsp[-1].ttype), 0);
+ yyval.itype = stmt_count;
+ --- 2721,2756 ----
+ ;
+ break;}
+ case 267:
+ ! #line 1368 "c-parse.y"
+ {;
+ break;}
+ case 269:
+ ! #line 1373 "c-parse.y"
+ { yyval.ttype = convert (void_type_node, integer_zero_node); ;
+ break;}
+ case 270:
+ ! #line 1375 "c-parse.y"
+ { emit_line_note (input_filename, lineno);
+ expand_end_bindings (getdecls (), 1, 0);
+ yyval.ttype = poplevel (1, 1, 0);
+ pop_momentary (); ;
+ break;}
+ case 271:
+ ! #line 1380 "c-parse.y"
+ { emit_line_note (input_filename, lineno);
+ expand_end_bindings (getdecls (), kept_level_p (), 0);
+ yyval.ttype = poplevel (kept_level_p (), 0, 0);
+ pop_momentary (); ;
+ break;}
+ case 272:
+ ! #line 1385 "c-parse.y"
+ { emit_line_note (input_filename, lineno);
+ expand_end_bindings (getdecls (), kept_level_p (), 0);
+ yyval.ttype = poplevel (kept_level_p (), 0, 0);
+ pop_momentary (); ;
+ break;}
+ case 275:
+ ! #line 1402 "c-parse.y"
+ { emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno);
+ expand_start_cond (truthvalue_conversion (yyvsp[-1].ttype), 0);
+ yyval.itype = stmt_count;
+ ***************
+ *** 2427,2433 ****
+ position_after_white_space (); ;
+ break;}
+ case 276:
+ ! #line 1407 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-2].filename, yyvsp[-1].lineno);
+ /* See comment in `while' alternative, above. */
+ --- 2759,2765 ----
+ position_after_white_space (); ;
+ break;}
+ case 276:
+ ! #line 1415 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-2].filename, yyvsp[-1].lineno);
+ /* See comment in `while' alternative, above. */
+ ***************
+ *** 2436,2466 ****
+ position_after_white_space (); ;
+ break;}
+ case 277:
+ ! #line 1414 "c-parse.y"
+ { expand_loop_continue_here (); ;
+ break;}
+ case 278:
+ ! #line 1418 "c-parse.y"
+ { yyval.filename = input_filename; ;
+ break;}
+ case 279:
+ ! #line 1422 "c-parse.y"
+ { yyval.lineno = lineno; ;
+ break;}
+ case 280:
+ ! #line 1427 "c-parse.y"
+ { ;
+ break;}
+ case 281:
+ ! #line 1432 "c-parse.y"
+ { ;
+ break;}
+ case 282:
+ ! #line 1437 "c-parse.y"
+ { ;
+ break;}
+ case 284:
+ ! #line 1443 "c-parse.y"
+ { int next;
+ position_after_white_space ();
+ next = getc (finput);
+ --- 2768,2798 ----
+ position_after_white_space (); ;
+ break;}
+ case 277:
+ ! #line 1422 "c-parse.y"
+ { expand_loop_continue_here (); ;
+ break;}
+ case 278:
+ ! #line 1426 "c-parse.y"
+ { yyval.filename = input_filename; ;
+ break;}
+ case 279:
+ ! #line 1430 "c-parse.y"
+ { yyval.lineno = lineno; ;
+ break;}
+ case 280:
+ ! #line 1435 "c-parse.y"
+ { ;
+ break;}
+ case 281:
+ ! #line 1440 "c-parse.y"
+ { ;
+ break;}
+ case 282:
+ ! #line 1445 "c-parse.y"
+ { ;
+ break;}
+ case 284:
+ ! #line 1451 "c-parse.y"
+ { int next;
+ position_after_white_space ();
+ next = getc (finput);
+ ***************
+ *** 2470,2480 ****
+ ;
+ break;}
+ case 285:
+ ! #line 1455 "c-parse.y"
+ { stmt_count++; ;
+ break;}
+ case 287:
+ ! #line 1458 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno);
+ /* It appears that this should not be done--that a non-lvalue array
+ --- 2802,2812 ----
+ ;
+ break;}
+ case 285:
+ ! #line 1463 "c-parse.y"
+ { stmt_count++; ;
+ break;}
+ case 287:
+ ! #line 1466 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno);
+ /* It appears that this should not be done--that a non-lvalue array
+ ***************
+ *** 2493,2511 ****
+ clear_momentary (); ;
+ break;}
+ case 288:
+ ! #line 1475 "c-parse.y"
+ { expand_start_else ();
+ yyvsp[-1].itype = stmt_count;
+ position_after_white_space (); ;
+ break;}
+ case 289:
+ ! #line 1479 "c-parse.y"
+ { expand_end_cond ();
+ if (extra_warnings && stmt_count == yyvsp[-3].itype)
+ warning ("empty body in an else-statement"); ;
+ break;}
+ case 290:
+ ! #line 1483 "c-parse.y"
+ { expand_end_cond ();
+ /* This warning is here instead of in simple_if, because we
+ do not want a warning if an empty if is followed by an
+ --- 2825,2843 ----
+ clear_momentary (); ;
+ break;}
+ case 288:
+ ! #line 1483 "c-parse.y"
+ { expand_start_else ();
+ yyvsp[-1].itype = stmt_count;
+ position_after_white_space (); ;
+ break;}
+ case 289:
+ ! #line 1487 "c-parse.y"
+ { expand_end_cond ();
+ if (extra_warnings && stmt_count == yyvsp[-3].itype)
+ warning ("empty body in an else-statement"); ;
+ break;}
+ case 290:
+ ! #line 1491 "c-parse.y"
+ { expand_end_cond ();
+ /* This warning is here instead of in simple_if, because we
+ do not want a warning if an empty if is followed by an
+ ***************
+ *** 2515,2525 ****
+ "empty body in an if-statement"); ;
+ break;}
+ case 291:
+ ! #line 1494 "c-parse.y"
+ { expand_end_cond (); ;
+ break;}
+ case 292:
+ ! #line 1496 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-2].filename, yyvsp[-1].lineno);
+ /* The emit_nop used to come before emit_line_note,
+ --- 2847,2857 ----
+ "empty body in an if-statement"); ;
+ break;}
+ case 291:
+ ! #line 1502 "c-parse.y"
+ { expand_end_cond (); ;
+ break;}
+ case 292:
+ ! #line 1504 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-2].filename, yyvsp[-1].lineno);
+ /* The emit_nop used to come before emit_line_note,
+ ***************
+ *** 2531,2537 ****
+ emit_nop (); ;
+ break;}
+ case 293:
+ ! #line 1506 "c-parse.y"
+ { /* Don't start the loop till we have succeeded
+ in parsing the end test. This is to make sure
+ that we end every loop we start. */
+ --- 2863,2869 ----
+ emit_nop (); ;
+ break;}
+ case 293:
+ ! #line 1514 "c-parse.y"
+ { /* Don't start the loop till we have succeeded
+ in parsing the end test. This is to make sure
+ that we end every loop we start. */
+ ***************
+ *** 2542,2552 ****
+ position_after_white_space (); ;
+ break;}
+ case 294:
+ ! #line 1515 "c-parse.y"
+ { expand_end_loop (); ;
+ break;}
+ case 295:
+ ! #line 1518 "c-parse.y"
+ { emit_line_note (input_filename, lineno);
+ expand_exit_loop_if_false (NULL_PTR,
+ truthvalue_conversion (yyvsp[-2].ttype));
+ --- 2874,2884 ----
+ position_after_white_space (); ;
+ break;}
+ case 294:
+ ! #line 1523 "c-parse.y"
+ { expand_end_loop (); ;
+ break;}
+ case 295:
+ ! #line 1526 "c-parse.y"
+ { emit_line_note (input_filename, lineno);
+ expand_exit_loop_if_false (NULL_PTR,
+ truthvalue_conversion (yyvsp[-2].ttype));
+ ***************
+ *** 2554,2565 ****
+ clear_momentary (); ;
+ break;}
+ case 296:
+ ! #line 1525 "c-parse.y"
+ { expand_end_loop ();
+ clear_momentary (); ;
+ break;}
+ case 297:
+ ! #line 1529 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno);
+ /* See comment in `while' alternative, above. */
+ --- 2886,2897 ----
+ clear_momentary (); ;
+ break;}
+ case 296:
+ ! #line 1533 "c-parse.y"
+ { expand_end_loop ();
+ clear_momentary (); ;
+ break;}
+ case 297:
+ ! #line 1537 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno);
+ /* See comment in `while' alternative, above. */
+ ***************
+ *** 2572,2583 ****
+ ;
+ break;}
+ case 298:
+ ! #line 1541 "c-parse.y"
+ { yyvsp[0].lineno = lineno;
+ yyval.filename = input_filename; ;
+ break;}
+ case 299:
+ ! #line 1544 "c-parse.y"
+ {
+ /* Start the loop. Doing this after parsing
+ all the expressions ensures we will end the loop. */
+ --- 2904,2915 ----
+ ;
+ break;}
+ case 298:
+ ! #line 1549 "c-parse.y"
+ { yyvsp[0].lineno = lineno;
+ yyval.filename = input_filename; ;
+ break;}
+ case 299:
+ ! #line 1552 "c-parse.y"
+ {
+ /* Start the loop. Doing this after parsing
+ all the expressions ensures we will end the loop. */
+ ***************
+ *** 2595,2601 ****
+ position_after_white_space (); ;
+ break;}
+ case 300:
+ ! #line 1560 "c-parse.y"
+ { /* Emit the increment expression, with a line number. */
+ emit_line_note (yyvsp[-4].filename, yyvsp[-5].lineno);
+ expand_loop_continue_here ();
+ --- 2927,2933 ----
+ position_after_white_space (); ;
+ break;}
+ case 300:
+ ! #line 1568 "c-parse.y"
+ { /* Emit the increment expression, with a line number. */
+ emit_line_note (yyvsp[-4].filename, yyvsp[-5].lineno);
+ expand_loop_continue_here ();
+ ***************
+ *** 2605,2611 ****
+ expand_end_loop (); ;
+ break;}
+ case 301:
+ ! #line 1568 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno);
+ c_expand_start_case (yyvsp[-1].ttype);
+ --- 2937,2943 ----
+ expand_end_loop (); ;
+ break;}
+ case 301:
+ ! #line 1576 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno);
+ c_expand_start_case (yyvsp[-1].ttype);
+ ***************
+ *** 2615,2652 ****
+ position_after_white_space (); ;
+ break;}
+ case 302:
+ ! #line 1576 "c-parse.y"
+ { expand_end_case (yyvsp[-3].ttype);
+ pop_momentary (); ;
+ break;}
+ case 303:
+ ! #line 1579 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno);
+ if ( ! expand_exit_something ())
+ error ("break statement not within loop or switch"); ;
+ break;}
+ case 304:
+ ! #line 1584 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno);
+ if (! expand_continue_loop (NULL_PTR))
+ error ("continue statement not within a loop"); ;
+ break;}
+ case 305:
+ ! #line 1589 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno);
+ c_expand_return (NULL_TREE); ;
+ break;}
+ case 306:
+ ! #line 1593 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-4].filename, yyvsp[-3].lineno);
+ c_expand_return (yyvsp[-1].ttype); ;
+ break;}
+ case 307:
+ ! #line 1597 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-7].filename, yyvsp[-6].lineno);
+ STRIP_NOPS (yyvsp[-2].ttype);
+ --- 2947,2984 ----
+ position_after_white_space (); ;
+ break;}
+ case 302:
+ ! #line 1584 "c-parse.y"
+ { expand_end_case (yyvsp[-3].ttype);
+ pop_momentary (); ;
+ break;}
+ case 303:
+ ! #line 1587 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno);
+ if ( ! expand_exit_something ())
+ error ("break statement not within loop or switch"); ;
+ break;}
+ case 304:
+ ! #line 1592 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno);
+ if (! expand_continue_loop (NULL_PTR))
+ error ("continue statement not within a loop"); ;
+ break;}
+ case 305:
+ ! #line 1597 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno);
+ c_expand_return (NULL_TREE); ;
+ break;}
+ case 306:
+ ! #line 1601 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-4].filename, yyvsp[-3].lineno);
+ c_expand_return (yyvsp[-1].ttype); ;
+ break;}
+ case 307:
+ ! #line 1605 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-7].filename, yyvsp[-6].lineno);
+ STRIP_NOPS (yyvsp[-2].ttype);
+ ***************
+ *** 2658,2664 ****
+ error ("argument of `asm' is not a constant string"); ;
+ break;}
+ case 308:
+ ! #line 1608 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-9].filename, yyvsp[-8].lineno);
+ c_expand_asm_operands (yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE,
+ --- 2990,2996 ----
+ error ("argument of `asm' is not a constant string"); ;
+ break;}
+ case 308:
+ ! #line 1616 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-9].filename, yyvsp[-8].lineno);
+ c_expand_asm_operands (yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE,
+ ***************
+ *** 2666,2672 ****
+ input_filename, lineno); ;
+ break;}
+ case 309:
+ ! #line 1615 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-11].filename, yyvsp[-10].lineno);
+ c_expand_asm_operands (yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE,
+ --- 2998,3004 ----
+ input_filename, lineno); ;
+ break;}
+ case 309:
+ ! #line 1623 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-11].filename, yyvsp[-10].lineno);
+ c_expand_asm_operands (yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE,
+ ***************
+ *** 2674,2680 ****
+ input_filename, lineno); ;
+ break;}
+ case 310:
+ ! #line 1623 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-13].filename, yyvsp[-12].lineno);
+ c_expand_asm_operands (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype,
+ --- 3006,3012 ----
+ input_filename, lineno); ;
+ break;}
+ case 310:
+ ! #line 1631 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-13].filename, yyvsp[-12].lineno);
+ c_expand_asm_operands (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype,
+ ***************
+ *** 2682,2688 ****
+ input_filename, lineno); ;
+ break;}
+ case 311:
+ ! #line 1629 "c-parse.y"
+ { tree decl;
+ stmt_count++;
+ emit_line_note (yyvsp[-4].filename, yyvsp[-3].lineno);
+ --- 3014,3020 ----
+ input_filename, lineno); ;
+ break;}
+ case 311:
+ ! #line 1637 "c-parse.y"
+ { tree decl;
+ stmt_count++;
+ emit_line_note (yyvsp[-4].filename, yyvsp[-3].lineno);
+ ***************
+ *** 2695,2707 ****
+ ;
+ break;}
+ case 312:
+ ! #line 1640 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno);
+ expand_computed_goto (convert (ptr_type_node, yyvsp[-1].ttype)); ;
+ break;}
+ case 315:
+ ! #line 1653 "c-parse.y"
+ {
+ /* The value returned by this action is */
+ /* 1 if everything is OK */
+ --- 3027,3039 ----
+ ;
+ break;}
+ case 312:
+ ! #line 1648 "c-parse.y"
+ { stmt_count++;
+ emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno);
+ expand_computed_goto (convert (ptr_type_node, yyvsp[-1].ttype)); ;
+ break;}
+ case 315:
+ ! #line 1661 "c-parse.y"
+ {
+ /* The value returned by this action is */
+ /* 1 if everything is OK */
+ ***************
+ *** 2724,2737 ****
+ ;
+ break;}
+ case 316:
+ ! #line 1674 "c-parse.y"
+ {
+ if (yyvsp[-1].itype)
+ iterator_for_loop_end (yyvsp[-3].ttype);
+ ;
+ break;}
+ case 317:
+ ! #line 1706 "c-parse.y"
+ { register tree value = check_case_value (yyvsp[-1].ttype);
+ register tree label
+ = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
+ --- 3056,3069 ----
+ ;
+ break;}
+ case 316:
+ ! #line 1682 "c-parse.y"
+ {
+ if (yyvsp[-1].itype)
+ iterator_for_loop_end (yyvsp[-3].ttype);
+ ;
+ break;}
+ case 317:
+ ! #line 1714 "c-parse.y"
+ { register tree value = check_case_value (yyvsp[-1].ttype);
+ register tree label
+ = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
+ ***************
+ *** 2758,2764 ****
+ position_after_white_space (); ;
+ break;}
+ case 318:
+ ! #line 1731 "c-parse.y"
+ { register tree value1 = check_case_value (yyvsp[-3].ttype);
+ register tree value2 = check_case_value (yyvsp[-1].ttype);
+ register tree label
+ --- 3090,3096 ----
+ position_after_white_space (); ;
+ break;}
+ case 318:
+ ! #line 1739 "c-parse.y"
+ { register tree value1 = check_case_value (yyvsp[-3].ttype);
+ register tree value2 = check_case_value (yyvsp[-1].ttype);
+ register tree label
+ ***************
+ *** 2789,2795 ****
+ position_after_white_space (); ;
+ break;}
+ case 319:
+ ! #line 1760 "c-parse.y"
+ {
+ tree duplicate;
+ register tree label
+ --- 3121,3127 ----
+ position_after_white_space (); ;
+ break;}
+ case 319:
+ ! #line 1768 "c-parse.y"
+ {
+ tree duplicate;
+ register tree label
+ ***************
+ *** 2806,2812 ****
+ position_after_white_space (); ;
+ break;}
+ case 320:
+ ! #line 1775 "c-parse.y"
+ { tree label = define_label (input_filename, lineno, yyvsp[-1].ttype);
+ stmt_count++;
+ emit_nop ();
+ --- 3138,3144 ----
+ position_after_white_space (); ;
+ break;}
+ case 320:
+ ! #line 1783 "c-parse.y"
+ { tree label = define_label (input_filename, lineno, yyvsp[-1].ttype);
+ stmt_count++;
+ emit_nop ();
+ ***************
+ *** 2815,2866 ****
+ position_after_white_space (); ;
+ break;}
+ case 321:
+ ! #line 1787 "c-parse.y"
+ { emit_line_note (input_filename, lineno);
+ yyval.ttype = NULL_TREE; ;
+ break;}
+ case 322:
+ ! #line 1790 "c-parse.y"
+ { emit_line_note (input_filename, lineno); ;
+ break;}
+ case 323:
+ ! #line 1795 "c-parse.y"
+ { yyval.ttype = NULL_TREE; ;
+ break;}
+ case 325:
+ ! #line 1802 "c-parse.y"
+ { yyval.ttype = NULL_TREE; ;
+ break;}
+ case 328:
+ ! #line 1809 "c-parse.y"
+ { yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 329:
+ ! #line 1814 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-3].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 330:
+ ! #line 1819 "c-parse.y"
+ { yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), NULL_TREE); ;
+ break;}
+ case 331:
+ ! #line 1821 "c-parse.y"
+ { yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), yyvsp[-2].ttype); ;
+ break;}
+ case 332:
+ ! #line 1827 "c-parse.y"
+ { pushlevel (0);
+ clear_parm_order ();
+ declare_parm_level (0); ;
+ break;}
+ case 333:
+ ! #line 1831 "c-parse.y"
+ { yyval.ttype = yyvsp[0].ttype;
+ parmlist_tags_warning ();
+ poplevel (0, 0, 0); ;
+ break;}
+ case 335:
+ ! #line 1839 "c-parse.y"
+ { tree parm;
+ if (pedantic)
+ pedwarn ("ANSI C forbids forward parameter declarations");
+ --- 3147,3198 ----
+ position_after_white_space (); ;
+ break;}
+ case 321:
+ ! #line 1795 "c-parse.y"
+ { emit_line_note (input_filename, lineno);
+ yyval.ttype = NULL_TREE; ;
+ break;}
+ case 322:
+ ! #line 1798 "c-parse.y"
+ { emit_line_note (input_filename, lineno); ;
+ break;}
+ case 323:
+ ! #line 1803 "c-parse.y"
+ { yyval.ttype = NULL_TREE; ;
+ break;}
+ case 325:
+ ! #line 1810 "c-parse.y"
+ { yyval.ttype = NULL_TREE; ;
+ break;}
+ case 328:
+ ! #line 1817 "c-parse.y"
+ { yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 329:
+ ! #line 1822 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-3].ttype, yyvsp[-1].ttype); ;
+ break;}
+ case 330:
+ ! #line 1827 "c-parse.y"
+ { yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), NULL_TREE); ;
+ break;}
+ case 331:
+ ! #line 1829 "c-parse.y"
+ { yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), yyvsp[-2].ttype); ;
+ break;}
+ case 332:
+ ! #line 1835 "c-parse.y"
+ { pushlevel (0);
+ clear_parm_order ();
+ declare_parm_level (0); ;
+ break;}
+ case 333:
+ ! #line 1839 "c-parse.y"
+ { yyval.ttype = yyvsp[0].ttype;
+ parmlist_tags_warning ();
+ poplevel (0, 0, 0); ;
+ break;}
+ case 335:
+ ! #line 1847 "c-parse.y"
+ { tree parm;
+ if (pedantic)
+ pedwarn ("ANSI C forbids forward parameter declarations");
+ ***************
+ *** 2870,2943 ****
+ clear_parm_order (); ;
+ break;}
+ case 336:
+ ! #line 1847 "c-parse.y"
+ { yyval.ttype = yyvsp[0].ttype; ;
+ break;}
+ case 337:
+ ! #line 1849 "c-parse.y"
+ { yyval.ttype = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); ;
+ break;}
+ case 338:
+ ! #line 1855 "c-parse.y"
+ { yyval.ttype = get_parm_info (0); ;
+ break;}
+ case 339:
+ ! #line 1857 "c-parse.y"
+ { yyval.ttype = get_parm_info (0);
+ if (pedantic)
+ pedwarn ("ANSI C requires a named argument before `...'");
+ ;
+ break;}
+ case 340:
+ ! #line 1862 "c-parse.y"
+ { yyval.ttype = get_parm_info (1); ;
+ break;}
+ case 341:
+ ! #line 1864 "c-parse.y"
+ { yyval.ttype = get_parm_info (0); ;
+ break;}
+ case 342:
+ ! #line 1869 "c-parse.y"
+ { push_parm_decl (yyvsp[0].ttype); ;
+ break;}
+ case 343:
+ ! #line 1871 "c-parse.y"
+ { push_parm_decl (yyvsp[0].ttype); ;
+ break;}
+ case 344:
+ ! #line 1878 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype) ; ;
+ break;}
+ case 345:
+ ! #line 1880 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype) ; ;
+ break;}
+ case 346:
+ ! #line 1882 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 347:
+ ! #line 1884 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype) ; ;
+ break;}
+ case 348:
+ ! #line 1886 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 349:
+ ! #line 1893 "c-parse.y"
+ { pushlevel (0);
+ clear_parm_order ();
+ declare_parm_level (1); ;
+ break;}
+ case 350:
+ ! #line 1897 "c-parse.y"
+ { yyval.ttype = yyvsp[0].ttype;
+ parmlist_tags_warning ();
+ poplevel (0, 0, 0); ;
+ break;}
+ case 352:
+ ! #line 1905 "c-parse.y"
+ { tree t;
+ for (t = yyvsp[-1].ttype; t; t = TREE_CHAIN (t))
+ if (TREE_VALUE (t) == NULL_TREE)
+ --- 3202,3275 ----
+ clear_parm_order (); ;
+ break;}
+ case 336:
+ ! #line 1855 "c-parse.y"
+ { yyval.ttype = yyvsp[0].ttype; ;
+ break;}
+ case 337:
+ ! #line 1857 "c-parse.y"
+ { yyval.ttype = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); ;
+ break;}
+ case 338:
+ ! #line 1863 "c-parse.y"
+ { yyval.ttype = get_parm_info (0); ;
+ break;}
+ case 339:
+ ! #line 1865 "c-parse.y"
+ { yyval.ttype = get_parm_info (0);
+ if (pedantic)
+ pedwarn ("ANSI C requires a named argument before `...'");
+ ;
+ break;}
+ case 340:
+ ! #line 1870 "c-parse.y"
+ { yyval.ttype = get_parm_info (1); ;
+ break;}
+ case 341:
+ ! #line 1872 "c-parse.y"
+ { yyval.ttype = get_parm_info (0); ;
+ break;}
+ case 342:
+ ! #line 1877 "c-parse.y"
+ { push_parm_decl (yyvsp[0].ttype); ;
+ break;}
+ case 343:
+ ! #line 1879 "c-parse.y"
+ { push_parm_decl (yyvsp[0].ttype); ;
+ break;}
+ case 344:
+ ! #line 1886 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype) ; ;
+ break;}
+ case 345:
+ ! #line 1888 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype) ; ;
+ break;}
+ case 346:
+ ! #line 1890 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 347:
+ ! #line 1892 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype) ; ;
+ break;}
+ case 348:
+ ! #line 1894 "c-parse.y"
+ { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ;
+ break;}
+ case 349:
+ ! #line 1901 "c-parse.y"
+ { pushlevel (0);
+ clear_parm_order ();
+ declare_parm_level (1); ;
+ break;}
+ case 350:
+ ! #line 1905 "c-parse.y"
+ { yyval.ttype = yyvsp[0].ttype;
+ parmlist_tags_warning ();
+ poplevel (0, 0, 0); ;
+ break;}
+ case 352:
+ ! #line 1913 "c-parse.y"
+ { tree t;
+ for (t = yyvsp[-1].ttype; t; t = TREE_CHAIN (t))
+ if (TREE_VALUE (t) == NULL_TREE)
+ ***************
+ *** 2945,2968 ****
+ yyval.ttype = tree_cons (NULL_TREE, NULL_TREE, yyvsp[-1].ttype); ;
+ break;}
+ case 353:
+ ! #line 1915 "c-parse.y"
+ { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ;
+ break;}
+ case 354:
+ ! #line 1917 "c-parse.y"
+ { yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ;
+ break;}
+ case 355:
+ ! #line 1923 "c-parse.y"
+ { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ;
+ break;}
+ case 356:
+ ! #line 1925 "c-parse.y"
+ { yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ;
+ break;}
+ }
+ /* the action file gets copied in in place of this dollarsign */
+ ! #line 327 "bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+ --- 3277,3300 ----
+ yyval.ttype = tree_cons (NULL_TREE, NULL_TREE, yyvsp[-1].ttype); ;
+ break;}
+ case 353:
+ ! #line 1923 "c-parse.y"
+ { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ;
+ break;}
+ case 354:
+ ! #line 1925 "c-parse.y"
+ { yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ;
+ break;}
+ case 355:
+ ! #line 1931 "c-parse.y"
+ { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ;
+ break;}
+ case 356:
+ ! #line 1933 "c-parse.y"
+ { yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ;
+ break;}
+ }
+ /* the action file gets copied in in place of this dollarsign */
+ ! #line 465 "/gnu/lib/bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+ ***************
+ *** 3021,3029 ****
+ /* If not already recovering from an error, report this error. */
+ {
+ ++yynerrs;
+ ! yyerror("parse error");
+ }
+
+ if (yyerrstatus == 3)
+ {
+ /* if just tried and failed to reuse lookahead token after an error, discard it. */
+ --- 3353,3406 ----
+ /* If not already recovering from an error, report this error. */
+ {
+ ++yynerrs;
+ !
+ ! #ifdef YYERROR_VERBOSE
+ ! yyn = yypact[yystate];
+ !
+ ! if (yyn > YYFLAG && yyn < YYLAST)
+ ! {
+ ! int size = 0;
+ ! char *msg;
+ ! int x, count;
+ !
+ ! count = 0;
+ ! /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
+ ! for (x = (yyn < 0 ? -yyn : 0);
+ ! x < (sizeof(yytname) / sizeof(char *)); x++)
+ ! if (yycheck[x + yyn] == x)
+ ! size += strlen(yytname[x]) + 15, count++;
+ ! msg = (char *) malloc(size + 15);
+ ! if (msg != 0)
+ ! {
+ ! strcpy(msg, "parse error");
+ !
+ ! if (count < 5)
+ ! {
+ ! count = 0;
+ ! for (x = (yyn < 0 ? -yyn : 0);
+ ! x < (sizeof(yytname) / sizeof(char *)); x++)
+ ! if (yycheck[x + yyn] == x)
+ ! {
+ ! strcat(msg, count == 0 ? ", expecting `" : " or `");
+ ! strcat(msg, yytname[x]);
+ ! strcat(msg, "'");
+ ! count++;
+ ! }
+ ! }
+ ! yyerror(msg);
+ ! free(msg);
+ ! }
+ ! else
+ ! yyerror ("parse error; also virtual memory exceeded");
+ ! }
+ ! else
+ ! #endif /* YYERROR_VERBOSE */
+ ! yyerror("parse error");
+ }
+
+ + goto yyerrlab1;
+ + yyerrlab1: /* here on error raised explicitly by an action */
+ +
+ if (yyerrstatus == 3)
+ {
+ /* if just tried and failed to reuse lookahead token after an error, discard it. */
+ ***************
+ *** 3113,3117 ****
+ yystate = yyn;
+ goto yynewstate;
+ }
+ ! #line 1928 "c-parse.y"
+
+ --- 3490,3494 ----
+ yystate = yyn;
+ goto yynewstate;
+ }
+ ! #line 1936 "c-parse.y"
+
+ diff -rc --new-file gcc-2.5.8-fsf/c-parse.y gcc-2.5.8/c-parse.y
+ *** gcc-2.5.8-fsf/c-parse.y Tue Nov 23 23:43:28 1993
+ --- gcc-2.5.8/c-parse.y Tue Feb 22 11:22:26 1994
+ ***************
+ *** 898,905 ****
+
+ attrib
+ : IDENTIFIER
+ ! { if (strcmp (IDENTIFIER_POINTER ($1), "packed")
+ && strcmp (IDENTIFIER_POINTER ($1), "noreturn"))
+ warning ("`%s' attribute directive ignored",
+ IDENTIFIER_POINTER ($1));
+ $$ = $1; }
+ --- 898,913 ----
+
+ attrib
+ : IDENTIFIER
+ ! {
+ ! #ifdef HANDLE_ATTRIBUTE0
+ ! /* give the function a chance to validate further attributes */
+ ! if (HANDLE_ATTRIBUTE0 (IDENTIFIER_POINTER ($1)) ||
+ ! (strcmp (IDENTIFIER_POINTER ($1), "packed")
+ ! && strcmp (IDENTIFIER_POINTER ($1), "noreturn")))
+ ! #else
+ ! if (strcmp (IDENTIFIER_POINTER ($1), "packed")
+ && strcmp (IDENTIFIER_POINTER ($1), "noreturn"))
+ + #endif
+ warning ("`%s' attribute directive ignored",
+ IDENTIFIER_POINTER ($1));
+ $$ = $1; }
+ diff -rc --new-file gcc-2.5.8-fsf/calls.c gcc-2.5.8/calls.c
+ *** gcc-2.5.8-fsf/calls.c Thu Dec 2 12:21:43 1993
+ --- gcc-2.5.8/calls.c Tue Feb 22 11:22:32 1994
+ ***************
+ *** 2107,2112 ****
+ --- 2107,2120 ----
+
+ argvec = (struct arg *) alloca (nargs * sizeof (struct arg));
+
+ + #if defined (__amigados__)
+ + /* how would you do this RIGHT ?? fake a DECL node? dunno... */
+ + #ifdef ENCODE_SECTION_INFO
+ + /* mark it as a function (to be in the text section that is) */
+ + SYMBOL_REF_FLAG (fun) = 1;
+ + #endif
+ + #endif
+ +
+ INIT_CUMULATIVE_ARGS (args_so_far, NULL_TREE, fun);
+
+ args_size.constant = 0;
+ diff -rc --new-file gcc-2.5.8-fsf/cccp.c gcc-2.5.8/cccp.c
+ *** gcc-2.5.8-fsf/cccp.c Sat Dec 11 13:49:38 1993
+ --- gcc-2.5.8/cccp.c Tue Feb 22 11:27:02 1994
+ ***************
+ *** 39,50 ****
+ #include "config.h"
+ #endif /* not EMACS */
+
+ #ifndef STANDARD_INCLUDE_DIR
+ ! #define STANDARD_INCLUDE_DIR "/usr/include"
+ #endif
+
+ #ifndef LOCAL_INCLUDE_DIR
+ ! #define LOCAL_INCLUDE_DIR "/usr/local/include"
+ #endif
+
+ #if 0 /* We can't get ptrdiff_t, so I arranged not to need PTR_INT_TYPE. */
+ --- 39,66 ----
+ #include "config.h"
+ #endif /* not EMACS */
+
+ + #ifdef amigados
+ + /* Since cpp uses alloca to store all its read files, this is quite deadly
+ + on a system with non-automatic stackgrowth like amigados, so we better
+ + turn it off now. Normally alloca is #defined to __builtin_alloca, so
+ + undefining it causes an external alloca to be used.
+ +
+ + Note that it's not wise to generally inhibit __builtin_alloca, since
+ + using the generic emulator entitels a serious (!) speed penalty, and
+ + it's bad enough that we have to live with it in cccp, don't make cc1
+ + unbearably slow as well... */
+ +
+ + #undef alloca
+ +
+ + static int amigados_abs_filename ();
+ + #endif
+ +
+ #ifndef STANDARD_INCLUDE_DIR
+ ! #define STANDARD_INCLUDE_DIR "/gnu/include"
+ #endif
+
+ #ifndef LOCAL_INCLUDE_DIR
+ ! #define LOCAL_INCLUDE_DIR "/local/include"
+ #endif
+
+ #if 0 /* We can't get ptrdiff_t, so I arranged not to need PTR_INT_TYPE. */
+ ***************
+ *** 1874,1884 ****
+ --- 1890,1904 ----
+ char *p = in_fname;
+ char *p1 = p;
+ /* Discard all directory prefixes from P. */
+ + #ifdef FILE_NAME_NONDIRECTORY
+ + p = FILE_NAME_NONDIRECTORY (p);
+ + #else
+ while (*p1) {
+ if (*p1 == '/')
+ p = p1 + 1;
+ p1++;
+ }
+ + #endif
+ /* Output P, but remove known suffixes. */
+ len = strlen (p);
+ if (p[len - 2] == '.' && p[len - 1] == 'c')
+ ***************
+ *** 3636,3642 ****
+
+ if (!no_output && already_output == 0
+ && (kt->pass_thru
+ ! || (kt->type == T_DEFINE
+ && (dump_macros == dump_names
+ || dump_macros == dump_definitions)))) {
+ int len;
+ --- 3656,3662 ----
+
+ if (!no_output && already_output == 0
+ && (kt->pass_thru
+ ! || ((kt->type == T_DEFINE || kt->type == T_UNDEF)
+ && (dump_macros == dump_names
+ || dump_macros == dump_definitions)))) {
+ int len;
+ ***************
+ *** 3982,3987 ****
+ --- 4002,4019 ----
+ search_start = dsp;
+ #ifndef VMS
+ ep = rindex (nam, '/');
+ +
+ + #ifdef amigados
+ + /* amigados uses unix-style directory-filename separation, but
+ + has VMS-style logicals as well */
+ +
+ + if (ep == NULL)
+ + {
+ + ep = rindex (nam, ':');
+ + /* a ':' is part of the directory name, a '/' isn't ! */
+ + if (ep != NULL) ep++;
+ + }
+ + #endif /* amigados */
+ #else /* VMS */
+ ep = rindex (nam, ']');
+ if (ep == NULL) ep = rindex (nam, '>');
+ ***************
+ *** 4061,4067 ****
+ --- 4093,4103 ----
+
+ /* If specified file name is absolute, just open it. */
+
+ + #ifndef amigados
+ if (*fbeg == '/') {
+ + #else
+ + if (amigados_abs_filename (fbeg, flen)) {
+ + #endif
+ strncpy (fname, fbeg, flen);
+ fname[flen] = 0;
+ if (redundant_include_p (fname))
+ ***************
+ *** 4084,4089 ****
+ --- 4120,4129 ----
+ if (searchptr->fname[0] == 0)
+ continue;
+ strcpy (fname, searchptr->fname);
+ +
+ + #ifdef amigados
+ + if (fname[strlen (fname) - 1] != ':')
+ + #endif
+ strcat (fname, "/");
+ fname[strlen (fname) + flen] = 0;
+ } else {
+ ***************
+ *** 9017,9025 ****
+ 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);
+ errors++;
+ --- 9057,9067 ----
+ perror_with_name (name)
+ char *name;
+ {
+ + int error = errno;
+ +
+ fprintf (stderr, "%s: ", progname);
+ ! if (error < sys_nerr)
+ ! fprintf (stderr, "%s: %s\n", name, sys_errlist[error]);
+ else
+ fprintf (stderr, "%s: undocumented I/O error\n", name);
+ errors++;
+ ***************
+ *** 9416,9418 ****
+ --- 9458,9484 ----
+ return dst;
+ }
+ #endif /* VMS */
+ +
+ +
+ + #ifdef amigados
+ +
+ + /* This function returns whether the LEN characters long filename FNAME
+ + is an absolute path specification. */
+ +
+ + static int
+ + amigados_abs_filename (fname, len)
+ + char *fname;
+ + int len;
+ + {
+ + /* we're using ixemul.library, which treats `/foo' as `foo:', so
+ + fname[0] is to be considered absolute as well */
+ + if (fname[0] == '/')
+ + return 1;
+ +
+ + /* else do an index() on fname, but one which is limited to len characters */
+ + while (*fname && *fname != ':' && len)
+ + fname++, len--;
+ +
+ + return *fname == ':';
+ + }
+ + #endif /* amigados */
+ diff -rc --new-file gcc-2.5.8-fsf/config/m68k/amigados.c gcc-2.5.8/config/m68k/amigados.c
+ *** gcc-2.5.8-fsf/config/m68k/amigados.c Thu Jan 1 00:00:00 1970
+ --- gcc-2.5.8/config/m68k/amigados.c Tue Feb 22 11:22:43 1994
+ ***************
+ *** 0 ****
+ --- 1,158 ----
+ + /* Definitions of target machine for GNU compiler. amiga 68000/68020 version.
+ + Copyright (C) 1992 Free Software Foundation, Inc.
+ + Contributed by Markus M. Wild (wild@amiga.physik.unizh.ch).
+ +
+ + This file is part of GNU CC.
+ +
+ + GNU CC is free software; you can redistribute it and/or modify
+ + it under the terms of the GNU General Public License as published by
+ + the Free Software Foundation; either version 2, or (at your option)
+ + any later version.
+ +
+ + GNU CC is distributed in the hope that it will be useful,
+ + but WITHOUT ANY WARRANTY; without even the implied warranty of
+ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ + GNU General Public License for more details.
+ +
+ + You should have received a copy of the GNU General Public License
+ + along with GNU CC; see the file COPYING. If not, write to
+ + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+ +
+ + #include "m68k/m68k.c"
+ +
+ + /* Does operand (which is a symbolic_operand) live in text space? If
+ + so SYMBOL_REF_FLAG, which is set by ENCODE_SECTION_INFO, will be true.
+ +
+ + This function is used in base relative code generation. */
+ +
+ + int
+ + read_only_operand (operand)
+ + rtx operand;
+ + {
+ + if (GET_CODE (operand) == CONST)
+ + operand = XEXP (XEXP (operand, 0), 0);
+ + if (GET_CODE (operand) == SYMBOL_REF)
+ + return SYMBOL_REF_FLAG (operand) || CONSTANT_POOL_ADDRESS_P (operand);
+ + return 1;
+ + }
+ +
+ +
+ + /* the rest of the file is to implement AmigaDOS specific keywords some day.
+ + The approach used so far used __attribute__ for this, but this required
+ + changes to c-parse.y as well as if we'd use the common keywords used
+ + on commercial AmigaDOS C-compilers as well. So in the future I'll probably
+ + switch to __saveds and __interrupt keywords as well.
+ +
+ + The rest of this file is currently ignored, because it's no longer
+ + working with the current gcc version. */
+ +
+ + #if not_yet_working
+ +
+ + #include "tree.h"
+ +
+ + struct attribute {
+ + tree ident;
+ + int saveds : 1,
+ + interrupt : 1;
+ + };
+ +
+ +
+ + static struct attribute *a_tab = 0;
+ + static int a_index, a_size;
+ +
+ + void
+ + add_attr_entry (attr)
+ + struct attribute *attr;
+ + {
+ + if (! a_tab)
+ + {
+ + a_size = 10;
+ + a_index = 0;
+ + a_tab = (struct attribute *) xmalloc (a_size * sizeof (struct attribute));
+ + }
+ +
+ + if (a_index == a_size)
+ + {
+ + a_size <<= 1;
+ + a_tab = (struct attribute *) xrealloc (a_tab, a_size * sizeof (struct attribute));
+ + }
+ +
+ + a_tab[a_index++] = *attr;
+ + }
+ +
+ +
+ + void
+ + attr_do_saveds (function_ident)
+ + tree function_ident;
+ + {
+ + struct attribute attr, *a;
+ + int i;
+ +
+ + for (i = 0, a = a_tab; i < a_index; i++, a++)
+ + if (a->ident == function_ident)
+ + {
+ + a->saveds = 1;
+ + return;
+ + }
+ +
+ + /* create a new entry for this function */
+ + attr.ident = function_ident;
+ + attr.saveds = 1;
+ + attr.interrupt = 0;
+ + add_attr_entry (&attr);
+ + }
+ +
+ + void
+ + attr_do_interrupt (function_ident)
+ + tree function_ident;
+ + {
+ + struct attribute attr, *a;
+ + int i;
+ +
+ + for (i = 0, a = a_tab; i < a_index; i++, a++)
+ + if (a->ident == function_ident)
+ + {
+ + /* __interrupt implies __saveds */
+ + a->saveds = 1;
+ + a->interrupt = 1;
+ + return;
+ + }
+ +
+ + /* create a new entry for this function */
+ + attr.ident = function_ident;
+ + attr.saveds = 1;
+ + attr.interrupt = 1;
+ + add_attr_entry (&attr);
+ + }
+ +
+ + int
+ + attr_does_saveds (function_name)
+ + char *function_name;
+ + {
+ + tree ident = get_identifier (function_name);
+ + struct attribute *attr;
+ + int i;
+ +
+ + for (i = 0, attr = a_tab; i < a_index; i++, attr++)
+ + if (attr->ident == ident)
+ + return attr->saveds;
+ +
+ + return 0;
+ + }
+ +
+ + int
+ + attr_does_interrupt (function_name)
+ + char *function_name;
+ + {
+ + tree ident = get_identifier (function_name);
+ + struct attribute *attr;
+ + int i;
+ +
+ + for (i = 0, attr = a_tab; i < a_index; i++, attr++)
+ + if (attr->ident == ident)
+ + return attr->interrupt;
+ +
+ + return 0;
+ + }
+ +
+ + #endif
+ diff -rc --new-file gcc-2.5.8-fsf/config/m68k/amigados.h gcc-2.5.8/config/m68k/amigados.h
+ *** gcc-2.5.8-fsf/config/m68k/amigados.h Thu Jan 1 00:00:00 1970
+ --- gcc-2.5.8/config/m68k/amigados.h Tue Feb 22 11:22:44 1994
+ ***************
+ *** 0 ****
+ --- 1,408 ----
+ + /* Definitions of target machine for GNU compiler. amiga 68000/68020 version.
+ + Copyright (C) 1992 Free Software Foundation, Inc.
+ + Contributed by Markus M. Wild (wild@amiga.physik.unizh.ch).
+ +
+ + This file is part of GNU CC.
+ +
+ + GNU CC is free software; you can redistribute it and/or modify
+ + it under the terms of the GNU General Public License as published by
+ + the Free Software Foundation; either version 2, or (at your option)
+ + any later version.
+ +
+ + GNU CC is distributed in the hope that it will be useful,
+ + but WITHOUT ANY WARRANTY; without even the implied warranty of
+ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ + GNU General Public License for more details.
+ +
+ + You should have received a copy of the GNU General Public License
+ + along with GNU CC; see the file COPYING. If not, write to
+ + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+ +
+ + #include "m68k/m68k.h"
+ +
+ + /* See m68k.h for bits in TARGET_DEFAULT.
+ + 0 means 68000, no hardware fpu (68881/68882/68040).
+ + 7 means 68020 (or higher) with hardware fpu. */
+ +
+ + #ifndef TARGET_DEFAULT
+ + #define TARGET_DEFAULT 0
+ + #endif
+ +
+ + /* Define __HAVE_68881__ in preprocessor according to the -m flags.
+ + This will control the use of inline 68881 insns in certain macros.
+ + Also inform the program which CPU this is for. */
+ +
+ + #if TARGET_DEFAULT & 02
+ +
+ + /* -m68881 is the default */
+ + #define CPP_SPEC \
+ + "%{!msoft-float:-D__HAVE_68881__ }\
+ + %{!ansi:%{m68000:-Dmc68010}%{mc68000:-Dmc68010}%{!mc68000:%{!m68000:-Dmc68020}}}"
+ +
+ + #else
+ +
+ + /* -msoft-float is the default, assume -mc68000 as well */
+ + #define CPP_SPEC \
+ + "%{m68881:-D__HAVE_68881__ }\
+ + %{!ansi:%{m68020:-Dmc68020}%{mc68020:-Dmc68020}%{!mc68020:%{!m68020:-Dmc68010}}}"
+ +
+ + /* Don't try using XFmode since we don't have appropriate runtime software
+ + support. */
+ + #undef LONG_DOUBLE_TYPE_SIZE
+ + #define LONG_DOUBLE_TYPE_SIZE 64
+ +
+ + #endif
+ +
+ + /* -m68000 requires special flags to the assembler. */
+ +
+ + #if TARGET_DEFAULT & 01
+ +
+ + #define ASM_SPEC \
+ + "%{m68000:-mc68010}%{mc68000:-mc68010}%{!mc68000:%{!m68000:-mc68020}} %{msmall-code:-l} "
+ +
+ + #else
+ +
+ + #define ASM_SPEC \
+ + "%{m68020:-mc68020}%{mc68020:-mc68020}%{!mc68020:%{!m68020:-mc68010}} %{msmall-code:-l} "
+ +
+ + #endif
+ +
+ + /* amiga/amigados are the new "standard" defines for the Amiga, MCH_AMIGA
+ + * was used before and is included for compatibility reasons */
+ +
+ + #define CPP_PREDEFINES "-Dmc68000 -Damiga -Damigados -DMCH_AMIGA -DAMIGA"
+ +
+ + /* Choose the right startup file, depending on whether we use base relative
+ + code, base relative code with automatic relocation (-resident), or plain
+ + crt0.o.
+ +
+ + Profiling is currently only available for plain startup.
+ + mcrt0.o does not (yet) exist. */
+ +
+ + #define STARTFILE_SPEC \
+ + "%{resident:rcrt0.o%s}%{!resident:%{!fbaserel:%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}}%{fbaserel:%{pg:bgcrt0.o%s}%{!pg:%{p:bmcrt0.o%s}%{!p:bcrt0.o%s}}}}"
+ +
+ +
+ + /* Automatically search libamiga.a for AmigaDOS specific functions. Note
+ + that we first search the standard C library to resolve as much as
+ + possible from there, since it has names that are duplicated in libamiga.a
+ + which we *don't* want from there. Then search the standard C library
+ + again to resolve any references that libamiga.a might have generated.
+ + This may only be a temporary solution since it might be better to simply
+ + remove the things from libamiga.a that should be pulled in from libc.a
+ + instead, which would eliminate the first reference to libc.a. */
+ +
+ + #define LIB_SPEC "%{!p:%{!pg:-lc -lamiga -lc}}%{p:-lc_p -lamiga -lc_p}%{pg:-lc_p -lamiga -lc_p}"
+ +
+ + /* if debugging, tell the linker to output amiga-hunk symbols *and* a BSD
+ + compatible debug hunk (which will probably change in the future, it's not
+ + tremendously useful in its current state). */
+ +
+ + #define LINK_SPEC "%{g:-amiga-debug-hunk} %{fbaserel:-databss-together} %{resident:-databss-together -datadata-reloc -flavor libb} "
+ +
+ + #define CC1_SPEC "%{resident:-fbaserel} "
+ +
+ + #define CC1PLUS_SPEC "%{resident:-fbaserel} "
+ +
+ + /* Omit frame pointer at high optimization levels. (This doesn't hurt, since
+ + GDB doesn't work under AmigaDOS at the moment anyway..) */
+ +
+ + #define OPTIMIZATION_OPTIONS(OPTIMIZE) \
+ + { \
+ + if (OPTIMIZE >= 2) \
+ + flag_omit_frame_pointer = 1; \
+ + }
+ +
+ + /* provide a dummy entry for the small-code switch. This is currently only
+ + needed by the assembler (explanations: m68k.h), but will be used by cc1
+ + to output 16bit pc-relative code later. */
+ +
+ + #undef TARGET_SWITCHES
+ + #define TARGET_SWITCHES \
+ + { { "68020", 5}, \
+ + { "c68020", 5}, \
+ + { "68881", 2}, \
+ + { "bitfield", 4}, \
+ + { "68000", -5}, \
+ + { "c68000", -5}, \
+ + { "soft-float", -0102}, \
+ + { "nobitfield", -4}, \
+ + { "rtd", 8}, \
+ + { "nortd", -8}, \
+ + { "short", 040}, \
+ + { "noshort", -040}, \
+ + { "fpa", 0100}, \
+ + { "nofpa", -0100}, \
+ + { "sky", 0200}, \
+ + { "nosky", -0200}, \
+ + { "68040", 0407}, \
+ + { "68030", -01400}, \
+ + { "68030", 7}, \
+ + { "68040-only", 01000}, \
+ + { "small-code", 0 }, \
+ + { "", TARGET_DEFAULT}}
+ +
+ + /* Every structure or union's size must be a multiple of 2 bytes. */
+ +
+ + #define STRUCTURE_SIZE_BOUNDARY 16
+ +
+ + /* This is (almost;-)) BSD, so it wants DBX format. */
+ +
+ + #define DBX_DEBUGGING_INFO
+ +
+ + /* Allow folding division by zero. */
+ + #define REAL_INFINITY
+ +
+ + #if 0 /* This apparently is no longer necessary? */
+ +
+ + /* This is how to output an assembler line defining a `double' constant. */
+ +
+ + #undef ASM_OUTPUT_DOUBLE
+ + #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
+ + { \
+ + if (REAL_VALUE_ISINF (VALUE)) \
+ + fprintf (FILE, "\t.double 0r%s99e999\n", (VALUE) > 0 ? "" : "-"); \
+ + else if (isnan (VALUE)) \
+ + { \
+ + union { double d; long l[2];} t; \
+ + t.d = (VALUE); \
+ + fprintf (FILE, "\t.long 0x%lx\n\t.long 0x%lx\n", t.l[0], t.l[1]); \
+ + } \
+ + else \
+ + fprintf (FILE, "\t.double 0r%.17g\n", VALUE); \
+ + }
+ +
+ + /* This is how to output an assembler line defining a `float' constant. */
+ +
+ + #undef ASM_OUTPUT_FLOAT
+ + #define ASM_OUTPUT_FLOAT(FILE,VALUE) \
+ + { \
+ + if (REAL_VALUE_ISINF (VALUE)) \
+ + fprintf (FILE, "\t.single 0r%s99e999\n", (VALUE) > 0 ? "" : "-"); \
+ + else if (isnan (VALUE)) \
+ + { \
+ + union { float f; long l;} t; \
+ + t.f = (VALUE); \
+ + fprintf (FILE, "\t.long 0x%lx\n", t.l); \
+ + } \
+ + else \
+ + fprintf (FILE, "\t.single 0r%.9g\n", VALUE); \
+ + }
+ +
+ + /* This is how to output an assembler lines defining floating operands.
+ + There's no way to output a NaN's fraction, so we lose it. */
+ +
+ + #undef ASM_OUTPUT_FLOAT_OPERAND
+ + #define ASM_OUTPUT_FLOAT_OPERAND(CODE,FILE,VALUE) \
+ + do { \
+ + if (CODE == 'f') \
+ + { \
+ + (REAL_VALUE_ISINF ((VALUE)) \
+ + ? asm_fprintf (FILE, "%I0r%s99e999", ((VALUE) > 0 ? "" : "-")) \
+ + : (VALUE) == -0.0 \
+ + ? asm_fprintf (FILE, "%I0r-0.0") \
+ + : asm_fprintf (FILE, "%I0r%.9g", (VALUE))) \
+ + } else { \
+ + long l; \
+ + REAL_VALUE_TO_TARGET_SINGLE (VALUE, l); \
+ + if (sizeof (int) == sizeof (long)) \
+ + asm_fprintf ((FILE), "%I0x%x", l); \
+ + else \
+ + asm_fprintf ((FILE), "%I0x%lx", l); \
+ + } \
+ + } while (0)
+ +
+ + #undef ASM_OUTPUT_DOUBLE_OPERAND
+ + #define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE) \
+ + (REAL_VALUE_ISINF ((VALUE)) \
+ + ? asm_fprintf (FILE, "%I0r%s99e999", ((VALUE) > 0 ? "" : "-")) \
+ + : (VALUE) == -0.0 \
+ + ? asm_fprintf (FILE, "%I0r-0.0") \
+ + : asm_fprintf (FILE, "%I0r%.17g", (VALUE)))
+ +
+ + #endif /* 0 */
+ +
+ + /* use A5 as framepointer instead of A6, this makes A6 available as a
+ + general purpose register, and can thus be used without problems in
+ + direct library calls. */
+ +
+ + #undef FRAME_POINTER_REGNUM
+ + #define FRAME_POINTER_REGNUM 13
+ + #undef ARG_POINTER_REGNUM
+ + #define ARG_POINTER_REGNUM 13
+ +
+ + /* we use A4 for this, not A5, which is the framepointer */
+ + #undef PIC_OFFSET_TABLE_REGNUM
+ + #define PIC_OFFSET_TABLE_REGNUM 12
+ +
+ + /* setup a default shell return value for those (gazillion..) programs that
+ + (inspite of ANSI-C) declare main() to be void (or even VOID...) and thus
+ + cause the shell to randomly caugh upon executing such programs (contrary
+ + to Unix, AmigaDOS scripts are terminated with an error if a program returns
+ + with an error code above the `error' or even `failure' level
+ + (which is configurable with the FAILAT command) */
+ +
+ + #define DEFAULT_MAIN_RETURN c_expand_return (integer_zero_node)
+ +
+ + /* we do have an ansi-compliant c-library ;-) */
+ + #define HAVE_VPRINTF
+ + #define HAVE_VFPRINTF
+ + #define HAVE_PUTENV
+ + #define HAVE_STRERROR
+ + #define HAVE_ATEXIT
+ +
+ + /* given that symbolic_operand(X), return TRUE if no special
+ + base relative relocation is necessary */
+ +
+ + #define LEGITIMATE_BASEREL_OPERAND_P(X) \
+ + (flag_pic >= 3 && read_only_operand (X))
+ +
+ + #undef LEGITIMATE_PIC_OPERAND_P
+ + #define LEGITIMATE_PIC_OPERAND_P(X) \
+ + (! symbolic_operand (X, VOIDmode) || LEGITIMATE_BASEREL_OPERAND_P (X))
+ +
+ +
+ + /* Define this macro if references to a symbol must be treated
+ + differently depending on something about the variable or
+ + function named by the symbol (such as what section it is in).
+ +
+ + The macro definition, if any, is executed immediately after the
+ + rtl for DECL or other node is created.
+ + The value of the rtl will be a `mem' whose address is a
+ + `symbol_ref'.
+ +
+ + The usual thing for this macro to do is to a flag in the
+ + `symbol_ref' (such as `SYMBOL_REF_FLAG') or to store a modified
+ + name string in the `symbol_ref' (if one bit is not enough
+ + information).
+ +
+ + On the Amiga we use this to indicate if a symbol is in text or
+ + data space. */
+ +
+ + #define ENCODE_SECTION_INFO(DECL)\
+ + do \
+ + { \
+ + if (TREE_CODE (DECL) == FUNCTION_DECL) \
+ + SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; \
+ + else \
+ + { \
+ + rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \
+ + ? TREE_CST_RTL (DECL) : DECL_RTL (DECL)); \
+ + if (RTX_UNCHANGING_P (rtl) && !MEM_VOLATILE_P (rtl)) \
+ + SYMBOL_REF_FLAG (XEXP (rtl, 0)) = 1; \
+ + } \
+ + } \
+ + while (0)
+ +
+ + #undef SELECT_RTX_SECTION
+ + #define SELECT_RTX_SECTION(MODE, X) readonly_data_section ();
+ +
+ + /* according to varasm.c, RELOC referrs *only* to whether constants (!)
+ + are addressed by address. This doesn't matter in baserelative code,
+ + so we allow (inspite of flag_pic) readonly_data_section() in that
+ + case */
+ +
+ + #undef SELECT_SECTION
+ + #define SELECT_SECTION(DECL, RELOC) \
+ + { \
+ + if (TREE_CODE (DECL) == STRING_CST) \
+ + { \
+ + if (! flag_writable_strings) \
+ + readonly_data_section (); \
+ + else \
+ + data_section (); \
+ + } \
+ + else if (TREE_CODE (DECL) == VAR_DECL) \
+ + { \
+ + if ((flag_pic && flag_pic < 3 && RELOC) \
+ + || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)) \
+ + data_section (); \
+ + else \
+ + readonly_data_section (); \
+ + } \
+ + else \
+ + readonly_data_section (); \
+ + }
+ +
+ +
+ +
+ + #if not_yet_working
+ +
+ + /* starting support for amiga specific keywords
+ + * --------------------------------------------
+ + */
+ +
+ + /* validate attributes that don't take a parameter. Currently we support
+ + * __attribute__ (saveds) and __attribute__ (interrupt)
+ + */
+ + #define HANDLE_ATTRIBUTE0(attr) \
+ + (strcmp(attr, "saveds") != 0 && strcmp(attr, "interrupt") != 0)
+ +
+ + /* (c-common.c)
+ + * install additional attributes
+ + */
+ + #define HANDLE_EXTRA_ATTRIBUTES(a) \
+ + if (TREE_VALUE (a) != 0 \
+ + && TREE_CODE (TREE_VALUE (a)) == IDENTIFIER_NODE \
+ + && TREE_VALUE (a) == get_identifier ("saveds")) \
+ + { \
+ + if (TREE_CODE (decl) != FUNCTION_DECL) \
+ + { \
+ + warning_with_decl (decl, \
+ + "saveds attribute specified for non-function `%s'"); \
+ + return; \
+ + } \
+ + \
+ + attr_do_saveds (DECL_NAME (decl)); \
+ + } \
+ + else if (TREE_VALUE (a) != 0 \
+ + && TREE_CODE (TREE_VALUE (a)) == IDENTIFIER_NODE \
+ + && TREE_VALUE (a) == get_identifier ("interrupt")) \
+ + { \
+ + if (TREE_CODE (decl) != FUNCTION_DECL) \
+ + { \
+ + warning_with_decl (decl, \
+ + "saveds attribute specified for non-function `%s'"); \
+ + return; \
+ + } \
+ + \
+ + attr_do_interrupt (DECL_NAME (decl)); \
+ + } \
+ +
+ +
+ + #define PROLOGUE_EXTRA_SAVE(mask) \
+ + { extern char *current_function_name; \
+ + /* saveds makes the function preserve d1/a0/a1 as well */ \
+ + if (attr_does_saveds (current_function_name)) \
+ + mask |= 0x40c0; } \
+ +
+ +
+ + #define EPILOGUE_EXTRA_RESTORE(mask, nregs) \
+ + { extern char *current_function_name; \
+ + /* restore those extra registers */ \
+ + if (attr_does_saveds (current_function_name)) \
+ + { \
+ + mask |= 0x0302; \
+ + nregs += 3; \
+ + } } \
+ +
+ +
+ + #define EPILOGUE_EXTRA_BARRIER_KLUDGE(stream) \
+ + { extern char *current_function_name; \
+ + /* PLEASE Help! how is this done cleaner?? */ \
+ + if (attr_does_saveds (current_function_name)) \
+ + { \
+ + fprintf (stderr, \
+ + "warning: couldn't cleanup `saveds'-stack in `%s'.\n"); \
+ + fprintf (stderr, \
+ + " this is only ok, if the function never returns!\n"); \
+ + } } \
+ +
+ +
+ + #define EPILOGUE_EXTRA_TEST(stream) \
+ + { extern char *current_function_name; \
+ + /* with the interrupt-attribute, we have to set the cc before rts */ \
+ + if (attr_does_interrupt (current_function_name)) \
+ + asm_fprintf (stream, "\ttstl %s\n", reg_names[0]); } \
+ +
+ + #endif
+ diff -rc --new-file gcc-2.5.8-fsf/config/m68k/m68k.c gcc-2.5.8/config/m68k/m68k.c
+ *** gcc-2.5.8-fsf/config/m68k/m68k.c Wed Nov 3 21:17:46 1993
+ --- gcc-2.5.8/config/m68k/m68k.c Tue Feb 22 11:22:46 1994
+ ***************
+ *** 61,67 ****
+ void
+ finalize_pic ()
+ {
+ ! if (flag_pic && current_function_uses_pic_offset_table)
+ emit_insn (gen_rtx (USE, VOIDmode, pic_offset_table_rtx));
+ }
+
+ --- 61,67 ----
+ void
+ finalize_pic ()
+ {
+ ! if (flag_pic && (flag_pic < 3) && current_function_uses_pic_offset_table)
+ emit_insn (gen_rtx (USE, VOIDmode, pic_offset_table_rtx));
+ }
+
+ ***************
+ *** 181,186 ****
+ --- 181,189 ----
+ mask &= ~ (1 << (15 - FRAME_POINTER_REGNUM));
+ num_saved_regs--;
+ }
+ + #ifdef PROLOGUE_EXTRA_SAVE
+ + PROLOGUE_EXTRA_SAVE (mask);
+ + #endif
+
+ #if NEED_PROBE
+ fprintf (stream, "\ttstl sp@(%d)\n", NEED_PROBE - num_saved_regs * 4);
+ ***************
+ *** 214,220 ****
+ asm_fprintf (stream, "\tmoveml %0I0x%x,%Rsp@-\n", mask);
+ #endif
+ }
+ ! if (flag_pic && current_function_uses_pic_offset_table)
+ {
+ #ifdef MOTOROLA
+ asm_fprintf (stream, "\t%Olea (%Rpc, %U_GLOBAL_OFFSET_TABLE_@GOTPC), %s\n",
+ --- 217,223 ----
+ asm_fprintf (stream, "\tmoveml %0I0x%x,%Rsp@-\n", mask);
+ #endif
+ }
+ ! if (flag_pic && (flag_pic < 3) && current_function_uses_pic_offset_table)
+ {
+ #ifdef MOTOROLA
+ asm_fprintf (stream, "\t%Olea (%Rpc, %U_GLOBAL_OFFSET_TABLE_@GOTPC), %s\n",
+ ***************
+ *** 279,284 ****
+ --- 282,290 ----
+ /* Output just a no-op so that debuggers don't get confused
+ about which function the pc is in at this address. */
+ asm_fprintf (stream, "\tnop\n");
+ + #ifdef EPILOGUE_EXTRA_BARRIER_KLUDGE
+ + EPILOGUE_EXTRA_BARRIER_KLUDGE(stream);
+ + #endif
+ return;
+ }
+
+ ***************
+ *** 309,314 ****
+ --- 315,323 ----
+ nregs++;
+ mask |= 1 << regno;
+ }
+ + #ifdef EPILOGUE_EXTRA_RESTORE
+ + EPILOGUE_EXTRA_RESTORE(mask, nregs);
+ + #endif
+ offset = foffset + nregs * 4;
+ if (offset + fsize >= 0x8000
+ && frame_pointer_needed
+ ***************
+ *** 511,516 ****
+ --- 520,528 ----
+ #endif
+ }
+ }
+ + #ifdef EPILOGUE_EXTRA_TEST
+ + EPILOGUE_EXTRA_TEST(stream);
+ + #endif
+ if (current_function_pops_args)
+ asm_fprintf (stream, "\trtd %0I%d\n", current_function_pops_args);
+ else
+ ***************
+ *** 801,815 ****
+ /* First handle a simple SYMBOL_REF or LABEL_REF */
+ if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF)
+ {
+ if (reg == 0)
+ abort ();
+
+ ! pic_ref = gen_rtx (MEM, Pmode,
+ ! gen_rtx (PLUS, Pmode,
+ ! pic_offset_table_rtx, orig));
+ current_function_uses_pic_offset_table = 1;
+ RTX_UNCHANGING_P (pic_ref) = 1;
+ emit_move_insn (reg, pic_ref);
+ return reg;
+ }
+ else if (GET_CODE (orig) == CONST)
+ --- 813,837 ----
+ /* First handle a simple SYMBOL_REF or LABEL_REF */
+ if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF)
+ {
+ + #ifdef LEGITIMATE_BASEREL_OPERAND_P
+ + if (LEGITIMATE_BASEREL_OPERAND_P (orig))
+ + return orig;
+ + #endif
+ +
+ if (reg == 0)
+ abort ();
+
+ ! if (flag_pic >= 3)
+ ! pic_ref = gen_rtx (PLUS, Pmode, pic_offset_table_rtx, orig);
+ ! else
+ ! pic_ref = gen_rtx (MEM, Pmode,
+ ! gen_rtx (PLUS, Pmode,
+ ! pic_offset_table_rtx, orig));
+ !
+ current_function_uses_pic_offset_table = 1;
+ RTX_UNCHANGING_P (pic_ref) = 1;
+ emit_move_insn (reg, pic_ref);
+ +
+ return reg;
+ }
+ else if (GET_CODE (orig) == CONST)
+ ***************
+ *** 838,843 ****
+ --- 860,866 ----
+ pic_ref = gen_rtx (PLUS, Pmode, base, orig);
+ /* Likewise, should we set special REG_NOTEs here? */
+ }
+ +
+ return pic_ref;
+ }
+
+ ***************
+ *** 2166,2171 ****
+ --- 2189,2198 ----
+ fprintf (file, ":w");
+ if ((flag_pic == 2) && (breg == pic_offset_table_rtx))
+ fprintf (file, ":l");
+ + if ((flag_pic == 3) && (breg == pic_offset_table_rtx))
+ + fprintf (file, ":W");
+ + if ((flag_pic == 4) && (breg == pic_offset_table_rtx))
+ + fprintf (file, ":L");
+ }
+ if (addr != 0 && ireg != 0)
+ {
+ diff -rc --new-file gcc-2.5.8-fsf/config/m68k/m68k.h gcc-2.5.8/config/m68k/m68k.h
+ *** gcc-2.5.8-fsf/config/m68k/m68k.h Fri Nov 5 08:09:54 1993
+ --- gcc-2.5.8/config/m68k/m68k.h Tue Feb 22 11:22:49 1994
+ ***************
+ *** 353,361 ****
+ #ifndef SUPPORT_SUN_FPA
+
+ #define CONDITIONAL_REGISTER_USAGE \
+ ! { \
+ ! if (flag_pic) \
+ ! fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
+ }
+
+ #else /* defined SUPPORT_SUN_FPA */
+ --- 353,364 ----
+ #ifndef SUPPORT_SUN_FPA
+
+ #define CONDITIONAL_REGISTER_USAGE \
+ ! { \
+ ! if (flag_pic) \
+ ! fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
+ ! /* prevent saving/restoring of the base reg */ \
+ ! if (flag_pic == 3) \
+ ! call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
+ }
+
+ #else /* defined SUPPORT_SUN_FPA */
+ diff -rc --new-file gcc-2.5.8-fsf/config/m68k/m68k.md gcc-2.5.8/config/m68k/m68k.md
+ *** gcc-2.5.8-fsf/config/m68k/m68k.md Wed Dec 1 00:17:46 1993
+ --- gcc-2.5.8/config/m68k/m68k.md Tue Feb 22 11:22:53 1994
+ ***************
+ *** 716,728 ****
+ {
+ if (flag_pic && symbolic_operand (operands[1], SImode))
+ {
+ ! /* The source is an address which requires PIC relocation.
+ ! Call legitimize_pic_address with the source, mode, and a relocation
+ ! register (a new pseudo, or the final destination if reload_in_progress
+ ! is set). Then fall through normally */
+ ! extern rtx legitimize_pic_address();
+ ! rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode);
+ ! operands[1] = legitimize_pic_address (operands[1], SImode, temp);
+ }
+ }")
+
+ --- 716,733 ----
+ {
+ if (flag_pic && symbolic_operand (operands[1], SImode))
+ {
+ ! #ifdef LEGITIMATE_BASEREL_OPERAND_P
+ ! if (flag_pic < 3 || !LEGITIMATE_BASEREL_OPERAND_P (operands[1]))
+ ! #endif
+ ! {
+ ! /* The source is an address which requires PIC relocation.
+ ! Call legitimize_pic_address with the source, mode, and a relocation
+ ! register (a new pseudo, or the final destination if reload_in_progress
+ ! is set). Then fall through normally */
+ ! extern rtx legitimize_pic_address();
+ ! rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode);
+ ! operands[1] = legitimize_pic_address (operands[1], SImode, temp);
+ ! }
+ }
+ }")
+
+ ***************
+ *** 1890,1897 ****
+
+ /* These insns can result from reloads to access
+ stack slots over 64k from the frame pointer. */
+ ! if (GET_CODE (operands[2]) == CONST_INT
+ ! && INTVAL (operands[2]) + 0x8000 >= (unsigned) 0x10000)
+ return \"move%.l %2,%0\;add%.l %1,%0\";
+ #ifdef SGS
+ if (GET_CODE (operands[2]) == REG)
+ --- 1895,1903 ----
+
+ /* These insns can result from reloads to access
+ stack slots over 64k from the frame pointer. */
+ ! if (((GET_CODE (operands[2]) == CONST_INT
+ ! && INTVAL (operands[2]) + 0x8000 >= (unsigned) 0x10000))
+ ! || (flag_pic == 4 && operands[1] == pic_offset_table_rtx))
+ return \"move%.l %2,%0\;add%.l %1,%0\";
+ #ifdef SGS
+ if (GET_CODE (operands[2]) == REG)
+ ***************
+ *** 4858,4864 ****
+ ""
+ "
+ {
+ ! if (flag_pic && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
+ #ifdef MOTOROLA
+ SYMBOL_REF_FLAG (XEXP (operands[0], 0)) = 1;
+ #else
+ --- 4864,4870 ----
+ ""
+ "
+ {
+ ! if (flag_pic && flag_pic < 3 && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
+ #ifdef MOTOROLA
+ SYMBOL_REF_FLAG (XEXP (operands[0], 0)) = 1;
+ #else
+ ***************
+ *** 4873,4879 ****
+ (match_operand:SI 1 "general_operand" "g"))]
+ ;; Operand 1 not really used on the m68000.
+
+ ! "! flag_pic"
+ "*
+ #ifdef MOTOROLA
+ return \"jsr %0\";
+ --- 4879,4885 ----
+ (match_operand:SI 1 "general_operand" "g"))]
+ ;; Operand 1 not really used on the m68000.
+
+ ! "(! flag_pic || flag_pic >= 3)"
+ "*
+ #ifdef MOTOROLA
+ return \"jsr %0\";
+ ***************
+ *** 4888,4894 ****
+ (match_operand:SI 1 "general_operand" "g"))]
+ ;; Operand 1 not really used on the m68000.
+
+ ! "flag_pic"
+ "*
+ #ifdef HPUX_ASM
+ return \"bsr %0\";
+ --- 4894,4900 ----
+ (match_operand:SI 1 "general_operand" "g"))]
+ ;; Operand 1 not really used on the m68000.
+
+ ! "(flag_pic && flag_pic < 3)"
+ "*
+ #ifdef HPUX_ASM
+ return \"bsr %0\";
+ ***************
+ *** 4913,4919 ****
+ ""
+ "
+ {
+ ! if (flag_pic && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
+ #ifdef MOTOROLA
+ SYMBOL_REF_FLAG (XEXP (operands[1], 0)) = 1;
+ #else
+ --- 4919,4925 ----
+ ""
+ "
+ {
+ ! if (flag_pic && flag_pic < 3 && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
+ #ifdef MOTOROLA
+ SYMBOL_REF_FLAG (XEXP (operands[1], 0)) = 1;
+ #else
+ ***************
+ *** 4928,4934 ****
+ (call (match_operand:QI 1 "memory_operand" "o")
+ (match_operand:SI 2 "general_operand" "g")))]
+ ;; Operand 2 not really used on the m68000.
+ ! "! flag_pic"
+ "*
+ #ifdef MOTOROLA
+ return \"jsr %1\";
+ --- 4934,4940 ----
+ (call (match_operand:QI 1 "memory_operand" "o")
+ (match_operand:SI 2 "general_operand" "g")))]
+ ;; Operand 2 not really used on the m68000.
+ ! "(! flag_pic || flag_pic >= 3)"
+ "*
+ #ifdef MOTOROLA
+ return \"jsr %1\";
+ ***************
+ *** 4943,4949 ****
+ (call (match_operand:QI 1 "memory_operand" "o")
+ (match_operand:SI 2 "general_operand" "g")))]
+ ;; Operand 2 not really used on the m68000.
+ ! "flag_pic"
+ "*
+ #ifdef HPUX_ASM
+ return \"bsr %1\";
+ --- 4949,4955 ----
+ (call (match_operand:QI 1 "memory_operand" "o")
+ (match_operand:SI 2 "general_operand" "g")))]
+ ;; Operand 2 not really used on the m68000.
+ ! "(flag_pic && flag_pic < 3)"
+ "*
+ #ifdef HPUX_ASM
+ return \"bsr %1\";
+ diff -rc --new-file gcc-2.5.8-fsf/config/m68k/t-amigados gcc-2.5.8/config/m68k/t-amigados
+ *** gcc-2.5.8-fsf/config/m68k/t-amigados Thu Jan 1 00:00:00 1970
+ --- gcc-2.5.8/config/m68k/t-amigados Tue Feb 22 11:27:03 1994
+ ***************
+ *** 0 ****
+ --- 1,186 ----
+ + # Makefile fragment for amigados target.
+ +
+ + # We generate two additional things:
+ + #
+ + # libb/libgcc.a
+ + # A base relative version of libgcc.a which is used when compiling and
+ + # linking with the '-resident' option.
+ + #
+ + # xgccv
+ + # A forking gcc instead of one calling ssytem(). This makes it less
+ + # system conformant (can't ^C it when started from make), while providing
+ + # increased functionality (-pipe option).
+ +
+ + # Use the vfork'ing version of gcc by default, so that the -pipe option can
+ + # get tested. To use the regular version just do "make XGCC=gcc". Note that
+ + # PIPE is defined in x-amigados, so if we are doing a native build, it will
+ + # be defined. It can be overridden with "make PIPE=".
+ +
+ + XGCC = xgccv $(PIPE)
+ + GCC_FOR_TARGET = ./$(XGCC) -B./
+ +
+ + # Build residentable versions of the gcc executables by default. Use
+ + # "make RESIDENT=" to build non-residentable versions.
+ + # Note: This failed during bootstrapping of 2.5.5.
+ +
+ + #RESIDENT = -resident
+ +
+ + # The standard additional target flags for the compiler.
+ +
+ + T_CFLAGS = $(RESIDENT)
+ +
+ + # Allow the user to override the default target optimizations with gcc, or if
+ + # the target compiler is not gcc and doesn't understand -O<N>.
+ +
+ + T_OPTIMISE = -O2
+ +
+ + # Each compilation environment (Manx, Dice, GCC, SAS/C, etc) provides its
+ + # own equivalent of the UNIX /usr/include tree. For gcc, the standard headers
+ + # are in /gnu/include and system specific headers are in /gnu/os-include.
+ + # Use these paths for fixincludes.
+ +
+ + SYSTEM_HEADER_DIR = /gnu/include
+ + OTHER_FIXINCLUDES_DIRS = /gnu/os-include
+ +
+ + # We don't need a libgcc1, it's all in ixemul.library
+ +
+ + LIBGCC1 = libgcc1.null
+ +
+ + # Flags to use when compiling the normal version of libgcc.a.
+ + # Don't compile with debugging, as long as there is no debugger.
+ + # Explicitly leave out the -resident compilation flag and don't use T_CFLAGS.
+ +
+ + LIBGCC2_CFLAGS = $(T_OPTIMIZE) $(INTERNAL_CFLAGS) $(X_CFLAGS) $(CFLAGS) \
+ + $(CROSS_GCC_CFLAGS)
+ +
+ + # Flags to use when compiling the base relative version of libgcc.a.
+ + # Don't compile with debugging, as long as there is no debugger.
+ + # Explicitly force -resident in the compilation flags and don't use T_CFLAGS.
+ +
+ + LIBBGCC2_CFLAGS = $(T_OPTIMIZE) $(INTERNAL_CFLAGS) $(X_CFLAGS) $(CFLAGS) \
+ + $(CROSS_GCC_CFLAGS) -resident
+ +
+ + # Build the base relative library.
+ + # It is later copied into /gnu/lib/gcc-lib/amigados/<version>/libb/libgcc.a, whereas
+ + # libgcc.a is copied into /gnu/lib/gcc-lib/amigados/<version>/libgcc.a.
+ + # It doesn't work very well to define one of the EXTRA_* macros to contain
+ + # libb/libgcc.a, particularly for doing "make stageN" or "make install".
+ +
+ + GCC_PARTS=$(GCC_PASSES) libgcc.a libb/libgcc.a $(EXTRA_PROGRAMS) $(USE_COLLECT2) $(EXTRA_PARTS)
+ +
+ + # Add install_libbgcc to normal define of INSTALL_LIBGCC. Let install-gccv
+ + # hitch a ride on here as well.
+ +
+ + INSTALL_LIBGCC = install-libgcc install-libbgcc install-gccv
+ +
+ + # This includes the knowledge that target amigados doesn't need libgcc1.a
+ +
+ + libb/libgcc.a: libgcc1.null libgcc2.c libgcc2.ready $(CONFIG_H) \
+ + $(LIB2FUNCS_EXTRA) machmode.h longlong.h gbl-ctors.h config.status
+ + # Actually build it in tmplibbgcc.a, then rename at end,
+ + # so that libb/libgcc.a itself remains nonexistent if compilation is aborted.
+ + -rm -f tmplibbgcc.a
+ + # -e causes any failing command to make this rule fail.
+ + # -e doesn't work in certain shells, so we test $$? as well.
+ + set -e; \
+ + for name in $(LIB2FUNCS); \
+ + do \
+ + echo $${name}; \
+ + $(GCC_FOR_TARGET) $(LIBBGCC2_CFLAGS) $(INCLUDES) -c -DL$${name} \
+ + $(srcdir)/libgcc2.c -o $${name}.o; \
+ + if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
+ + $(AR) $(AR_FLAGS) tmplibbgcc.a $${name}.o; \
+ + rm -f $${name}.o; \
+ + done
+ + # Some shells crash when a loop has no items.
+ + # So make sure there is always at least one--`..'.
+ + # Then ignore it.
+ + # We don't use -e here because there are if statements
+ + # that should not make the command give up when the if condition is false.
+ + # Instead, we test for failure after each command where it matters.
+ + -for file in .. $(LIB2FUNCS_EXTRA); \
+ + do \
+ + if [ x$${file} != x.. ]; then \
+ + name=`echo $${file} | sed -e 's/[.]c$$//' -e 's/[.]asm$$//'`; \
+ + echo $${name}; \
+ + if [ $${name}.asm = $${file} ]; then \
+ + cp $${file} $${name}.s || exit 1; file=$${name}.s; \
+ + else true; fi; \
+ + $(GCC_FOR_TARGET) $(LIBBGCC2_CFLAGS) $(INCLUDES) -c $${file}; \
+ + if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
+ + $(AR) $(AR_FLAGS) tmplibbgcc.a $${name}.o; \
+ + rm -f $${name}.[so]; \
+ + else true; \
+ + fi; \
+ + done
+ + -if $(RANLIB_TEST) ; then $(RANLIB) tmplibbgcc.a; else true; fi
+ + -if [ -d libb ] ; then true ; else mkdir libb ; fi
+ + mv tmplibbgcc.a libb/libgcc.a
+ +
+ +
+ + install-libbgcc: libb/libgcc.a install-dir
+ + -if [ -d $(libsubdir)/libb ] ; then true ; else mkdir $(libsubdir)/libb ; fi
+ + -if [ -f libb/libgcc.a ] ; then \
+ + rm -f $(libsubdir)/libb/libgcc.a; \
+ + $(INSTALL_DATA) libb/libgcc.a $(libsubdir)/libb/libgcc.a; \
+ + if $(RANLIB_TEST) ; then \
+ + (cd $(libsubdir)/libb; $(RANLIB) libgcc.a); else true; fi; \
+ + chmod a-x $(libsubdir)/libb/libgcc.a; \
+ + else true; fi
+ +
+ +
+ + # The default gcc (xgcc) is built without -DAMIGADOS_FORK_GCC. This gcc (xgccv)
+ + # is built with AMIGADOS_FORK_GCC defined, so that it can use '-pipe'. We
+ + # don't want to define EXTRA_PASSES to xgccv because that will cause xgccv
+ + # to be installed in $(libsubdir), so instead we use the default GCC_PASSES
+ + # and add xgccv to it.
+ +
+ + GCC_PASSES = xgcc xgccv cc1 cpp $(EXTRA_PASSES)
+ +
+ + xgccv: xgccv.o version.o $(LIBDEPS)
+ + $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o xgccv xgccv.o version.o $(LIBS)
+ +
+ + xgccv.o: gcc.c $(CONFIG_H) gvarargs.h obstack.h
+ + $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ + -DSTANDARD_STARTFILE_PREFIX=\"$(libdir)/\" \
+ + -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc-lib/\" \
+ + -DDEFAULT_TARGET_MACHINE=\"$(target)\" \
+ + -DTOOLDIR=\"$(tooldir)/\" \
+ + -DAMIGADOS_FORK_GCC \
+ + -c `echo $(srcdir)/gcc.c | sed 's,^\./,,'` -o xgccv.o
+ +
+ + install-gccv: xgccv
+ + rm -f $(bindir)/gccv
+ + $(INSTALL_PROGRAM) xgccv $(bindir)/gccv
+ +
+ + # When making one of the stage<N> dirs, we need to make a libb subdir for
+ + # it, and copy libbgcc.a there as libgcc.a.
+ +
+ + EXTRA_STAGE1_TARGETS = stage1-libb
+ + EXTRA_STAGE2_TARGETS = stage2-libb
+ + EXTRA_STAGE3_TARGETS = stage3-libb
+ + EXTRA_STAGE4_TARGETS = stage4-libb
+ +
+ + stage1-libb:
+ + -if [ -d stage1 ] ; then true ; else mkdir stage1 ; fi
+ + -if [ -d stage1/libb ] ; then true ; else mkdir stage1/libb ; fi
+ + -cp libb/libgcc.a stage1/libb/libgcc.a
+ + -if $(RANLIB_TEST) ; then $(RANLIB) stage1/libb/libgcc.a; else true; fi
+ +
+ + stage2-libb:
+ + -if [ -d stage2 ] ; then true ; else mkdir stage2 ; fi
+ + -if [ -d stage2/libb ] ; then true ; else mkdir stage2/libb ; fi
+ + -cp libb/libgcc.a stage2/libb/libgcc.a
+ + -if $(RANLIB_TEST) ; then $(RANLIB) stage2/libb/libgcc.a; else true; fi
+ +
+ + stage3-libb:
+ + -if [ -d stage3 ] ; then true ; else mkdir stage3 ; fi
+ + -if [ -d stage3/libb ] ; then true ; else mkdir stage3/libb ; fi
+ + -cp libb/libgcc.a stage3/libb/libgcc.a
+ + -if $(RANLIB_TEST) ; then $(RANLIB) stage3/libb/libgcc.a; else true; fi
+ +
+ + stage4-libb:
+ + -if [ -d stage4 ] ; then true ; else mkdir stage4 ; fi
+ + -if [ -d stage4/libb ] ; then true ; else mkdir stage4/libb ; fi
+ + -cp libb/libgcc.a stage4/libb/libgcc.a
+ + -if $(RANLIB_TEST) ; then $(RANLIB) stage4/libb/libgcc.a; else true; fi
+ diff -rc --new-file gcc-2.5.8-fsf/config/m68k/x-amigados gcc-2.5.8/config/m68k/x-amigados
+ *** gcc-2.5.8-fsf/config/m68k/x-amigados Thu Jan 1 00:00:00 1970
+ --- gcc-2.5.8/config/m68k/x-amigados Tue Feb 22 11:22:55 1994
+ ***************
+ *** 0 ****
+ --- 1,44 ----
+ + # Note: It doesn't do any good to try to define prefix or local_prefix
+ + # in the host overrides because configure will just change them back.
+ + # You either have to give an appropriate option to configure or live with
+ + # an Amiga specific patch to configure. See the note in configure. -fnf
+ +
+ + # Building under amigados almost certainly requires an already working gcc.
+ + # Use gccv, which is a gcc compiled with AMIGADOS_FORK_GCC so "-pipe" will
+ + # work and get exercised. To bootstrap with the regular gcc just do
+ + # "make CC=gcc". To bootstrap without "-pipe" do "make PIPE=".
+ +
+ + CC = gccv $(PIPE)
+ +
+ + # Disable -pipe for now since I had problems bootstrapping gcc 2.5.5 with
+ + # it. (fnf)
+ + #PIPE = -pipe
+ +
+ + # Allow the user to override the default host optimization with gcc, or if the
+ + # host compiler is not gcc and doesn't understand -O<N>.
+ +
+ + X_OPTIMIZE = -O2
+ +
+ + # The standard additional host flags for the compiler.
+ +
+ + X_CFLAGS = $(X_OPTIMIZE)
+ +
+ + # Man pages get a wierd suffix...
+ +
+ + manext = .0
+ +
+ + # We really shouldn't specify CFLAGS from here, but there's no other way
+ + # to get rid of the `-g' indoctrinated by Makefile.in. Note this becomes
+ + # part of both the host compilation CFLAGS and the target compilation
+ + # CFLAGS.
+ +
+ + CFLAGS =
+ +
+ + # Ranlib does exist, but may not be in a path where the default RANLIB_TEST
+ + # expects it, so just force it to true.
+ +
+ + RANLIB_TEST = true
+ +
+ + # My current version of ln doesn't work, so use cp instead. -fnf
+ +
+ + HARDLINK = cp
+ diff -rc --new-file gcc-2.5.8-fsf/config/m68k/xm-amigados.h gcc-2.5.8/config/m68k/xm-amigados.h
+ *** gcc-2.5.8-fsf/config/m68k/xm-amigados.h Thu Jan 1 00:00:00 1970
+ --- gcc-2.5.8/config/m68k/xm-amigados.h Tue Feb 22 11:27:04 1994
+ ***************
+ *** 0 ****
+ --- 1,215 ----
+ + /* Configuration for GNU C-compiler for Commodore Amiga, running AmigaDOS.
+ + Copyright (C) 1992 Free Software Foundation, Inc.
+ + Contributed by Markus M. Wild (wild@amiga.physik.unizh.ch).
+ +
+ + This file is part of GNU CC.
+ +
+ + GNU CC is free software; you can redistribute it and/or modify
+ + it under the terms of the GNU General Public License as published by
+ + the Free Software Foundation; either version 2, or (at your option)
+ + any later version.
+ +
+ + GNU CC is distributed in the hope that it will be useful,
+ + but WITHOUT ANY WARRANTY; without even the implied warranty of
+ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ + GNU General Public License for more details.
+ +
+ + You should have received a copy of the GNU General Public License
+ + along with GNU CC; see the file COPYING. If not, write to
+ + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+ +
+ + /* first include the generic header, then modify some parts.. */
+ +
+ + #include "m68k/xm-m68k.h"
+ +
+ + /* Amiga specific headers, such as from the Native Developer Update kits,
+ + go in SYSTEM_INCLUDE_DIR. STANDARD_INCLUDE_DIR is the equivalent of
+ + Unix "/usr/include". All other include paths are set in Makefile. */
+ +
+ + #define SYSTEM_INCLUDE_DIR "/gnu/os-include"
+ + #define STANDARD_INCLUDE_DIR "/gnu/include"
+ +
+ + /* Fork one piped subcommand. SEARCH_FLAG is the system call to use
+ + (either execv or execvp). ARGV is the arg vector to use.
+ + NOT_LAST is nonzero if this is not the last subcommand
+ + (i.e. its output should be piped to the next one.) */
+ +
+ + #ifndef AMIGADOS_FORK_GCC
+ +
+ + /* This version uses a more or less amigados-conformant way of running a
+ + program (in the context of the parent). If you want to use -pipe however,
+ + you'll have to use the vfork() version afterwards. */
+ +
+ + #define PEXECUTE(SEARCH_FLAG,PROGRAM,ARGV,NOT_LAST) \
+ + ({char *_argline; \
+ + int _arglinelength, _i; \
+ + \
+ + for (_i = 1, _arglinelength=0; ARGV[_i]; ++_i) \
+ + _arglinelength += strlen(ARGV[_i]) + 1; \
+ + \
+ + _arglinelength += strlen(PROGRAM) + 1; \
+ + \
+ + if (!(_argline = (char *)alloca(_arglinelength))) \
+ + pfatal_with_name ("alloca"); \
+ + \
+ + strcpy(_argline, PROGRAM); \
+ + for (_i = 1; ARGV[_i]; ++_i) \
+ + { \
+ + strcat(_argline, " "); \
+ + strcat(_argline, ARGV[_i]); \
+ + } \
+ + \
+ + ssystem(_argline); }) \
+ +
+ + #define PEXECUTE_RESULT(STATUS, COMMAND) \
+ + ({ STATUS = COMMAND.pid; })
+ +
+ + #else
+ +
+ + /* the vfork() version. This one has the drawback, that gcc is not
+ + interruptible when started from make, since ixemul.library doesn't yet
+ + propagate ^C to subprocesses. */
+ +
+ + #define PEXECUTE(SEARCH_FLAG,PROGRAM,ARGV,NOT_LAST) \
+ + ({int (*_func)() = (SEARCH_FLAG ? execv : execvp); \
+ + int _pid; \
+ + int _pdes[2]; \
+ + int _input_desc = last_pipe_input; \
+ + int _output_desc = STDOUT_FILE_NO; \
+ + int _retries, _sleep_interval, _result; \
+ + \
+ + /* If this isn't the last process, make a pipe for its output, \
+ + and record it as waiting to be the input to the next process. */ \
+ + \
+ + if (NOT_LAST) \
+ + { \
+ + if (pipe (_pdes) < 0) \
+ + pfatal_with_name ("pipe"); \
+ + _output_desc = _pdes[WRITE_PORT]; \
+ + last_pipe_input = _pdes[READ_PORT]; \
+ + } \
+ + else \
+ + last_pipe_input = STDIN_FILE_NO; \
+ + \
+ + /* Fork a subprocess; wait and retry if it fails. */ \
+ + _sleep_interval = 1; \
+ + for (_retries = 0; _retries < 4; _retries++) \
+ + { \
+ + _pid = vfork (); \
+ + if (_pid >= 0) \
+ + break; \
+ + sleep (_sleep_interval); \
+ + _sleep_interval *= 2; \
+ + } \
+ + \
+ + switch (_pid) \
+ + { \
+ + case -1: \
+ + pfatal_with_name ("vfork"); \
+ + /* NOTREACHED */ \
+ + _result = 0; \
+ + break; \
+ + \
+ + case 0: /* child */ \
+ + /* Move the input and output pipes into place, if nec. */ \
+ + if (_input_desc != STDIN_FILE_NO) \
+ + { \
+ + close (STDIN_FILE_NO); \
+ + dup (_input_desc); \
+ + close (_input_desc); \
+ + } \
+ + if (_output_desc != STDOUT_FILE_NO) \
+ + { \
+ + close (STDOUT_FILE_NO); \
+ + dup (_output_desc); \
+ + close (_output_desc); \
+ + } \
+ + \
+ + /* Close the parent's descs that aren't wanted here. */ \
+ + if (last_pipe_input != STDIN_FILE_NO) \
+ + close (last_pipe_input); \
+ + \
+ + /* Exec the program. */ \
+ + (*_func) (PROGRAM, ARGV); \
+ + perror_exec (PROGRAM); \
+ + exit (-1); \
+ + /* NOTREACHED */ \
+ + _result = 0; \
+ + break; \
+ + \
+ + default: \
+ + /* In the parent, after forking. \
+ + Close the descriptors that we made for this child. */ \
+ + if (_input_desc != STDIN_FILE_NO) \
+ + close (_input_desc); \
+ + if (_output_desc != STDOUT_FILE_NO) \
+ + close (_output_desc); \
+ + \
+ + /* Return child's process number. */ \
+ + _result = _pid; \
+ + break; \
+ + } \
+ + _result; }) \
+ +
+ + #define PEXECUTE_RESULT(STATUS, COMMAND) \
+ + ({ wait (& STATUS); })
+ +
+ + #endif /* AMIGADOS_FORK_GCC */
+ +
+ + /* the following macros are stolen more or less from xm-vms.h ... */
+ +
+ + /* This macro is used to help compare filenames in cp-lex.c.
+ +
+ + We also need to make sure that the names are all lower case, because
+ + we must be able to compare filenames to determine if a file implements
+ + a class. */
+ +
+ + #define FILE_NAME_NONDIRECTORY(C) \
+ + ({ \
+ + extern char *rindex(); \
+ + char * pnt_ = (C), * pnt1_; \
+ + pnt1_ = pnt_ - 1; \
+ + while (*++pnt1_) \
+ + if ((*pnt1_ >= 'A' && *pnt1_ <= 'Z')) *pnt1_ |= 0x20; \
+ + pnt1_ = rindex (pnt_, '/'); \
+ + pnt1_ = (pnt1_ == 0 ? rindex (pnt_, ':') : pnt1_); \
+ + (pnt1_ == 0 ? pnt_ : pnt1_ + 1); \
+ + })
+ +
+ + /* Macro to generate the name of the cross reference file. The standard
+ + one does not work, since it was written assuming that the conventions
+ + of a unix style filesystem will work on the host system.
+ +
+ + Contrary to VMS, I'm using the original unix filename, there's no reason
+ + not to use this under AmigaDOS. */
+ +
+ + #define XREF_FILE_NAME(BUFF, NAME) \
+ + s = FILE_NAME_NONDIRECTORY (NAME); \
+ + if (s == NAME) sprintf(BUFF, ".%s.gxref", NAME); \
+ + else { \
+ + unsigned char ch = *s; /* could be Latin1 char.. */ \
+ + /* temporary: cut the filename from the directory */\
+ + *s = 0; \
+ + sprintf (BUFF, "%s.%c%s.gxref", NAME, ch, s+1); \
+ + /* and restore the filename */ \
+ + *s = ch; \
+ + } \
+ +
+ + /* Macro that is used in cp-xref.c to determine whether a file name is
+ + absolute or not.
+ +
+ + This checks for both, '/' as first character, since we're running under
+ + ixemul.library which provides for this unix'ism, and for the usual
+ + logical-terminator, ':', somewhere in the filename. */
+ +
+ + #define FILE_NAME_ABSOLUTE_P(NAME) (NAME[0] == '/' || index(NAME, ':'))
+ +
+ + /* the colon conflicts with the name space of logicals */
+ +
+ + #define PATH_SEPARATOR ','
+ +
+ + /* AmigaDOS handles rename(2) *much* better than any link(2)/unlink(2)
+ + hacks. It's actually the inverse case as on Unix. rename(2) was always
+ + there, link(2) is new with OS 2.0 */
+ +
+ + #define HAVE_rename 1
+ diff -rc --new-file gcc-2.5.8-fsf/configure gcc-2.5.8/configure
+ *** gcc-2.5.8-fsf/configure Fri Nov 19 21:44:34 1993
+ --- gcc-2.5.8/configure Thu Apr 21 22:35:12 1994
+ ***************
+ *** 4,9 ****
+ --- 4,13 ----
+
+ #This file is part of GNU CC.
+
+ + # AmigaDOS Notes: Where "echo" can be invoked with a first arg that
+ + # starts with '-', run the external echo instead, since the pdksh builtin
+ + # version botches this case.
+ +
+ #GNU CC is free software; you can redistribute it and/or modify
+ #it under the terms of the GNU General Public License as published by
+ #the Free Software Foundation; either version 2, or (at your option)
+ ***************
+ *** 45,52 ****
+
+ # Default --srcdir to the directory where the script is found,
+ # if a directory was specified.
+ ! # The second sed call is to convert `.//configure' to `./configure'.
+ ! srcdir=`echo $0 | sed 's|//|/|' | sed 's|/[^/]*$||'`
+ if [ x$srcdir = x$0 ]
+ then
+ srcdir=
+ --- 49,58 ----
+
+ # Default --srcdir to the directory where the script is found,
+ # if a directory was specified.
+ ! # The first sed call works around a bug in the AmigaDOS port of sksh, where
+ ! # $0 has a trailing slash appended to it. It is a NOP for other systems.
+ ! # The third sed call is to convert `.//configure' to `./configure'.
+ ! srcdir=`echo $0 | sed 's|/$||' | sed 's|//|/|' | sed 's|/[^/]*$||'`
+ if [ x$srcdir = x$0 ]
+ then
+ srcdir=
+ ***************
+ *** 54,75 ****
+
+ host=
+
+ ! # Default prefix to /usr/local.
+ ! prefix=/usr/local
+
+ ! # local_prefix specifies where to find the directory /usr/local/include
+ # We don't use $(prefix) for this
+ ! # because we always want GCC to search /usr/local/include
+ ! # even if GCC is installed somewhere other than /usr/local.
+ # Think THREE TIMES before specifying any other value for this!
+ # DO NOT make this use $prefix!
+ ! local_prefix=/usr/local
+ # Default is to let the Makefile set exec_prefix from $(prefix)
+ exec_prefix='$(prefix)'
+
+ remove=rm
+ ! hard_link=ln
+ ! symbolic_link='ln -s'
+ copy=cp
+
+ # Record all the arguments, to write them in config.status.
+ --- 60,87 ----
+
+ host=
+
+ ! # Note: For AmigaDOS we want this to default to /gnu unless we specify
+ ! # otherwise to configure. Changing it in Makefile.in or config/m68k/x-amigados
+ ! # is ineffective since configure will always change them back in the final
+ ! # generated Makefile, so we have to go to the root of the problem, which is
+ ! # here. -fnf
+ ! # Default prefix to "/gnu".
+ ! prefix=/gnu
+
+ ! # local_prefix specifies where to find the directory /local/include
+ # We don't use $(prefix) for this
+ ! # because we always want GCC to search /local/include
+ ! # even if GCC is installed somewhere other than /local.
+ # Think THREE TIMES before specifying any other value for this!
+ # DO NOT make this use $prefix!
+ ! # Note: See AmigaDOS note above for this AmigaDOS specific change. -fnf
+ ! local_prefix=/local
+ # Default is to let the Makefile set exec_prefix from $(prefix)
+ exec_prefix='$(prefix)'
+
+ remove=rm
+ ! hard_link=cp
+ ! symbolic_link=cp
+ copy=cp
+
+ # Record all the arguments, to write them in config.status.
+ ***************
+ *** 121,151 ****
+ next_arg=--srcdir
+ ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=* | --s=*)
+ ! srcdir=`echo $arg | sed 's/-*s[a-z]*=//'`
+ ;;
+ -host | --host | --hos | --ho | --h)
+ next_arg=--host
+ ;;
+ -host=* | --host=* | --hos=* | --ho=* | --h=*)
+ ! host=`echo $arg | sed 's/-*h[a-z]*=//'`
+ ;;
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ next_arg=--target
+ ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ ! target=`echo $arg | sed 's/-*t[a-z]*=//'`
+ ;;
+ -build | --build | --buil | --bui | --bu | --b)
+ next_arg=--build
+ ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*)
+ ! build=`echo $arg | sed 's/-*b[a-z]*=//'`
+ ;;
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ next_arg=--prefix
+ ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ ! prefix=`echo $arg | sed 's/-*p[a-z]*=//'`
+ ;;
+ -local-prefix | --local-prefix | --local-prefi | --local-pref | --local-pre \
+ | --local-pr | --local-p | --local- | --local | --loc | --lo | --l)
+ --- 133,163 ----
+ next_arg=--srcdir
+ ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=* | --s=*)
+ ! srcdir=`/bin/echo $arg | sed 's/-*s[a-z]*=//'`
+ ;;
+ -host | --host | --hos | --ho | --h)
+ next_arg=--host
+ ;;
+ -host=* | --host=* | --hos=* | --ho=* | --h=*)
+ ! host=`/bin/echo $arg | sed 's/-*h[a-z]*=//'`
+ ;;
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ next_arg=--target
+ ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ ! target=`/bin/echo $arg | sed 's/-*t[a-z]*=//'`
+ ;;
+ -build | --build | --buil | --bui | --bu | --b)
+ next_arg=--build
+ ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*)
+ ! build=`/bin/echo $arg | sed 's/-*b[a-z]*=//'`
+ ;;
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ next_arg=--prefix
+ ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ ! prefix=`/bin/echo $arg | sed 's/-*p[a-z]*=//'`
+ ;;
+ -local-prefix | --local-prefix | --local-prefi | --local-pref | --local-pre \
+ | --local-pr | --local-p | --local- | --local | --loc | --lo | --l)
+ ***************
+ *** 154,160 ****
+ -local-prefix=* | --local-prefix=* | --local-prefi=* | --local-pref=* \
+ | --local-pre=* | --local-pr=* | --local-p=* | --local-=* | --local=* \
+ | --loc=* | --lo=* | --l=*)
+ ! local_prefix=`echo $arg | sed 's/-*l[-a-z]*=//'`
+ ;;
+ -exec-prefix | --exec-prefix | --exec-prefi | --exec-pref | --exec-pre \
+ | --exec-pr | --exec-p | --exec- | --exec | --exe | --ex | --e)
+ --- 166,172 ----
+ -local-prefix=* | --local-prefix=* | --local-prefi=* | --local-pref=* \
+ | --local-pre=* | --local-pr=* | --local-p=* | --local-=* | --local=* \
+ | --loc=* | --lo=* | --l=*)
+ ! local_prefix=`/bin/echo $arg | sed 's/-*l[-a-z]*=//'`
+ ;;
+ -exec-prefix | --exec-prefix | --exec-prefi | --exec-pref | --exec-pre \
+ | --exec-pr | --exec-p | --exec- | --exec | --exe | --ex | --e)
+ ***************
+ *** 163,169 ****
+ -exec-prefix=* | --exec-prefix=* | --exec-prefi=* | --exec-pref=* \
+ | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* | --exec=* \
+ | --exe=* | --ex=* | --e=*)
+ ! exec_prefix=`echo $arg | sed 's/-*e[-a-z]*=//'`
+ ;;
+ -with-gnu-ld | --with-gnu-ld | --with-gnu-l)
+ gnu_ld=yes
+ --- 175,181 ----
+ -exec-prefix=* | --exec-prefix=* | --exec-prefi=* | --exec-pref=* \
+ | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* | --exec=* \
+ | --exe=* | --ex=* | --e=*)
+ ! exec_prefix=`/bin/echo $arg | sed 's/-*e[-a-z]*=//'`
+ ;;
+ -with-gnu-ld | --with-gnu-ld | --with-gnu-l)
+ gnu_ld=yes
+ ***************
+ *** 297,303 ****
+ use_collect2=
+ # Set this to override the default target model.
+ target_cpu_default=
+ ! # Set this to force use of install.sh.
+ broken_install=
+ # Set this to control which fixincludes program to use.
+ fixincludes=fixincludes
+ --- 309,316 ----
+ use_collect2=
+ # Set this to override the default target model.
+ target_cpu_default=
+ ! # Set this to force use of install.sh (if set to 'yes')
+ ! # Set to name of installer to use a custom installer.
+ broken_install=
+ # Set this to control which fixincludes program to use.
+ fixincludes=fixincludes
+ ***************
+ *** 642,647 ****
+ --- 655,670 ----
+ tm_file=sparc/lite.h
+ use_collect2=yes
+ ;;
+ + m68k-*-amigados)
+ + xm_file=m68k/xm-amigados.h
+ + out_file=m68k/amigados.c
+ + tm_file=m68k/amigados.h
+ + tmake_file=m68k/t-amigados
+ + xmake_file=m68k/x-amigados
+ + fixincludes=Makefile.in # Headers are already fixed.
+ + broken_install=cp
+ + install_headers_dir=install-headers-cp
+ + ;;
+ m68k-cbm-sysv4*) # Commodore variant of V.4.
+ tm_file=m68k/amix.h
+ xm_file=m68k/xm-amix.h
+ ***************
+ *** 1763,1770 ****
+ then true
+ else
+ rm -f Makefile.xx
+ ! abssrcdir=`cd ${srcdir}; pwd`
+ ! sed "s|^INSTALL = .*|INSTALL = ${abssrcdir}/install.sh -c|" Makefile.tem > Makefile.xx
+ rm -f Makefile.tem
+ mv Makefile.xx Makefile.tem
+ fi
+ --- 1786,1799 ----
+ then true
+ else
+ rm -f Makefile.xx
+ ! if [ x$host_broken_install = xyes ]
+ ! then
+ ! abssrcdir=`cd ${srcdir}; pwd`
+ ! installer=${abssrcdir}/install.sh -c
+ ! else
+ ! installer=$host_broken_install
+ ! fi
+ ! sed "s|^INSTALL = .*|INSTALL = ${installer}|" Makefile.tem > Makefile.xx
+ rm -f Makefile.tem
+ mv Makefile.xx Makefile.tem
+ fi
+ diff -rc --new-file gcc-2.5.8-fsf/cp-parse.c gcc-2.5.8/cp-parse.c
+ *** gcc-2.5.8-fsf/cp-parse.c Sat Nov 27 11:35:17 1993
+ --- gcc-2.5.8/cp-parse.c Tue Feb 22 11:23:11 1994
+ ***************
+ *** 2657,2663 ****
+ 65, 66, 67, 68, 69, 70, 71, 72, 73
+ };
+ /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+ ! #line 3 "/usr/local/lib/bison.simple"
+
+ /* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
+ --- 2657,2663 ----
+ 65, 66, 67, 68, 69, 70, 71, 72, 73
+ };
+ /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+ ! #line 3 "/usr/lib/bison.simple"
+
+ /* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
+ ***************
+ *** 2838,2861 ****
+ #endif
+ #endif
+
+ ! #line 184 "/usr/local/lib/bison.simple"
+ !
+ ! /* The user can define YYPARSE_PARAM as the name of an argument to be passed
+ ! into yyparse. The argument should have type void *.
+ ! It should actually point to an object.
+ ! Grammar actions can access the variable by casting it
+ ! to the proper pointer type. */
+ !
+ ! #ifdef YYPARSE_PARAM
+ ! #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+ ! #else
+ ! #define YYPARSE_PARAM
+ ! #define YYPARSE_PARAM_DECL
+ ! #endif
+ !
+ int
+ ! yyparse(YYPARSE_PARAM)
+ ! YYPARSE_PARAM_DECL
+ {
+ register int yystate;
+ register int yyn;
+ --- 2838,2846 ----
+ #endif
+ #endif
+
+ ! #line 184 "/usr/lib/bison.simple"
+ int
+ ! yyparse()
+ {
+ register int yystate;
+ register int yyn;
+ ***************
+ *** 7264,7270 ****
+ break;}
+ }
+ /* the action file gets copied in in place of this dollarsign */
+ ! #line 480 "/usr/local/lib/bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+ --- 7249,7255 ----
+ break;}
+ }
+ /* the action file gets copied in in place of this dollarsign */
+ ! #line 465 "/usr/lib/bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+ diff -rc --new-file gcc-2.5.8-fsf/cpp.info gcc-2.5.8/cpp.info
+ *** gcc-2.5.8-fsf/cpp.info Thu Oct 14 08:47:18 1993
+ --- gcc-2.5.8/cpp.info Tue May 3 14:09:31 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file cpp.info, produced by Makeinfo-1.54 from the input
+ file cpp.texi.
+
+ This file documents the GNU C Preprocessor.
+ --- 1,4 ----
+ ! This is Info file cpp.info, produced by Makeinfo-1.55 from the input
+ file cpp.texi.
+
+ This file documents the GNU C Preprocessor.
+ ***************
+ *** 21,28 ****
+
+ Indirect:
+ cpp.info-1: 778
+ ! cpp.info-2: 50641
+ ! cpp.info-3: 99631
+
+ Tag Table:
+ (Indirect)
+ --- 21,28 ----
+
+ Indirect:
+ cpp.info-1: 778
+ ! cpp.info-2: 50624
+ ! cpp.info-3: 99614
+
+ Tag Table:
+ (Indirect)
+ ***************
+ *** 35,74 ****
+ Node: Include Operation12652
+ Node: Once-Only14327
+ Node: Inheritance16636
+ ! Node: Macros19196
+ ! Node: Simple Macros20110
+ ! Node: Argument Macros23230
+ ! Node: Predefined28900
+ ! Node: Standard Predefined29330
+ ! Node: Nonstandard Predefined34543
+ ! Node: Stringification38116
+ ! Node: Concatenation41040
+ ! Node: Undefining44313
+ ! Node: Redefining45346
+ ! Node: Macro Pitfalls46646
+ ! Node: Misnesting47750
+ ! Node: Macro Parentheses48764
+ ! Node: Swallow Semicolon50641
+ ! Node: Side Effects52541
+ ! Node: Self-Reference54239
+ ! Node: Argument Prescan56515
+ ! Node: Cascaded Macros61517
+ ! Node: Newlines in Args62572
+ ! Node: Conditionals63917
+ ! Node: Conditional Uses65263
+ ! Node: Conditional Syntax66628
+ ! Node: #if Command67206
+ ! Node: #else Command69457
+ ! Node: #elif Command70112
+ ! Node: Deleted Code71474
+ ! Node: Conditionals-Macros72010
+ ! Node: Assertions75707
+ ! Node: #error Command79937
+ ! Node: Combining Sources81361
+ ! Node: Other Commands84257
+ ! Node: Output85692
+ ! Node: Invocation86847
+ ! Node: Concept Index97960
+ ! Node: Index99631
+
+ End Tag Table
+ --- 35,74 ----
+ Node: Include Operation12652
+ Node: Once-Only14327
+ Node: Inheritance16636
+ ! Node: Macros19179
+ ! Node: Simple Macros20093
+ ! Node: Argument Macros23213
+ ! Node: Predefined28883
+ ! Node: Standard Predefined29313
+ ! Node: Nonstandard Predefined34526
+ ! Node: Stringification38099
+ ! Node: Concatenation41023
+ ! Node: Undefining44296
+ ! Node: Redefining45329
+ ! Node: Macro Pitfalls46629
+ ! Node: Misnesting47733
+ ! Node: Macro Parentheses48747
+ ! Node: Swallow Semicolon50624
+ ! Node: Side Effects52524
+ ! Node: Self-Reference54222
+ ! Node: Argument Prescan56498
+ ! Node: Cascaded Macros61500
+ ! Node: Newlines in Args62555
+ ! Node: Conditionals63900
+ ! Node: Conditional Uses65246
+ ! Node: Conditional Syntax66611
+ ! Node: #if Command67189
+ ! Node: #else Command69440
+ ! Node: #elif Command70095
+ ! Node: Deleted Code71457
+ ! Node: Conditionals-Macros71993
+ ! Node: Assertions75690
+ ! Node: #error Command79920
+ ! Node: Combining Sources81344
+ ! Node: Other Commands84240
+ ! Node: Output85675
+ ! Node: Invocation86830
+ ! Node: Concept Index97943
+ ! Node: Index99614
+
+ End Tag Table
+ diff -rc --new-file gcc-2.5.8-fsf/cpp.info-1 gcc-2.5.8/cpp.info-1
+ *** gcc-2.5.8-fsf/cpp.info-1 Thu Oct 14 08:47:17 1993
+ --- gcc-2.5.8/cpp.info-1 Tue May 3 14:09:29 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file cpp.info, produced by Makeinfo-1.54 from the input
+ file cpp.texi.
+
+ This file documents the GNU C Preprocessor.
+ --- 1,4 ----
+ ! This is Info file cpp.info, produced by Makeinfo-1.55 from the input
+ file cpp.texi.
+
+ This file documents the GNU C Preprocessor.
+ ***************
+ *** 415,421 ****
+ file `sys/signal.h', but the version of `/usr/include/sys/signal.h' on
+ a particular system doesn't do what the application program expects.
+ It might be convenient to define a "local" version, perhaps under the
+ ! name `/usr/local/include/sys/signal.h', to override or add to the one
+ supplied by the system.
+
+ You can do this by using the option `-I.' for compilation, and
+ --- 415,421 ----
+ file `sys/signal.h', but the version of `/usr/include/sys/signal.h' on
+ a particular system doesn't do what the application program expects.
+ It might be convenient to define a "local" version, perhaps under the
+ ! name `/gnu/include/sys/signal.h', to override or add to the one
+ supplied by the system.
+
+ You can do this by using the option `-I.' for compilation, and
+ ***************
+ *** 438,449 ****
+ searching the list of header file directories *after* the directory in
+ which the current file was found.
+
+ ! Suppose you specify `-I /usr/local/include', and the list of
+ ! directories to search also includes `/usr/include'; and suppose that
+ ! both directories contain a file named `sys/signal.h'. Ordinary
+ ! `#include <sys/signal.h>' finds the file under `/usr/local/include'.
+ ! If that file contains `#include_next <sys/signal.h>', it starts
+ ! searching after that directory, and finds the file in `/usr/include'.
+
+
+ File: cpp.info, Node: Macros, Next: Conditionals, Prev: Header Files, Up: Top
+ --- 438,449 ----
+ searching the list of header file directories *after* the directory in
+ which the current file was found.
+
+ ! Suppose you specify `-I /gnu/include', and the list of directories
+ ! to search also includes `/usr/include'; and suppose that both
+ ! directories contain a file named `sys/signal.h'. Ordinary `#include
+ ! <sys/signal.h>' finds the file under `/gnu/include'. If that file
+ ! contains `#include_next <sys/signal.h>', it starts searching after that
+ ! directory, and finds the file in `/usr/include'.
+
+
+ File: cpp.info, Node: Macros, Next: Conditionals, Prev: Header Files, Up: Top
+ diff -rc --new-file gcc-2.5.8-fsf/cpp.info-2 gcc-2.5.8/cpp.info-2
+ *** gcc-2.5.8-fsf/cpp.info-2 Thu Oct 14 08:47:17 1993
+ --- gcc-2.5.8/cpp.info-2 Tue May 3 14:09:30 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file cpp.info, produced by Makeinfo-1.54 from the input
+ file cpp.texi.
+
+ This file documents the GNU C Preprocessor.
+ --- 1,4 ----
+ ! This is Info file cpp.info, produced by Makeinfo-1.55 from the input
+ file cpp.texi.
+
+ This file documents the GNU C Preprocessor.
+ diff -rc --new-file gcc-2.5.8-fsf/cpp.info-3 gcc-2.5.8/cpp.info-3
+ *** gcc-2.5.8-fsf/cpp.info-3 Thu Oct 14 08:47:18 1993
+ --- gcc-2.5.8/cpp.info-3 Tue May 3 14:09:30 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file cpp.info, produced by Makeinfo-1.54 from the input
+ file cpp.texi.
+
+ This file documents the GNU C Preprocessor.
+ --- 1,4 ----
+ ! This is Info file cpp.info, produced by Makeinfo-1.55 from the input
+ file cpp.texi.
+
+ This file documents the GNU C Preprocessor.
+ diff -rc --new-file gcc-2.5.8-fsf/cpp.texi gcc-2.5.8/cpp.texi
+ *** gcc-2.5.8-fsf/cpp.texi Tue Oct 12 06:59:12 1993
+ --- gcc-2.5.8/cpp.texi Tue Feb 22 11:27:15 1994
+ ***************
+ *** 477,483 ****
+ @file{sys/signal.h}, but the version of @file{/usr/include/sys/signal.h}
+ on a particular system doesn't do what the application program expects.
+ It might be convenient to define a ``local'' version, perhaps under the
+ ! name @file{/usr/local/include/sys/signal.h}, to override or add to the
+ one supplied by the system.
+
+ You can do this by using the option @samp{-I.} for compilation, and
+ --- 477,483 ----
+ @file{sys/signal.h}, but the version of @file{/usr/include/sys/signal.h}
+ on a particular system doesn't do what the application program expects.
+ It might be convenient to define a ``local'' version, perhaps under the
+ ! name @file{/gnu/include/sys/signal.h}, to override or add to the
+ one supplied by the system.
+
+ You can do this by using the option @samp{-I.} for compilation, and
+ ***************
+ *** 503,513 ****
+ file directories @emph{after} the directory in which the current file
+ was found.
+
+ ! Suppose you specify @samp{-I /usr/local/include}, and the list of
+ directories to search also includes @file{/usr/include}; and suppose that
+ both directories contain a file named @file{sys/signal.h}. Ordinary
+ @samp{#include <sys/signal.h>} finds the file under
+ ! @file{/usr/local/include}. If that file contains @samp{#include_next
+ <sys/signal.h>}, it starts searching after that directory, and finds the
+ file in @file{/usr/include}.
+
+ --- 503,513 ----
+ file directories @emph{after} the directory in which the current file
+ was found.
+
+ ! Suppose you specify @samp{-I /gnu/include}, and the list of
+ directories to search also includes @file{/usr/include}; and suppose that
+ both directories contain a file named @file{sys/signal.h}. Ordinary
+ @samp{#include <sys/signal.h>} finds the file under
+ ! @file{/gnu/include}. If that file contains @samp{#include_next
+ <sys/signal.h>}, it starts searching after that directory, and finds the
+ file in @file{/usr/include}.
+
+ diff -rc --new-file gcc-2.5.8-fsf/cross-make gcc-2.5.8/cross-make
+ *** gcc-2.5.8-fsf/cross-make Thu Sep 9 18:17:56 1993
+ --- gcc-2.5.8/cross-make Tue Feb 22 11:27:19 1994
+ ***************
+ *** 11,17 ****
+ RANLIB = $(RANLIB_FOR_TARGET)
+ RANLIB_TEST = $(RANLIB_TEST_FOR_TARGET)
+
+ ! # Dir to search for system headers. Normally /usr/include.
+ SYSTEM_HEADER_DIR = $(tooldir)/include
+
+ # Don't try to compile the things we can't compile.
+ --- 11,17 ----
+ RANLIB = $(RANLIB_FOR_TARGET)
+ RANLIB_TEST = $(RANLIB_TEST_FOR_TARGET)
+
+ ! # Dir to search for system headers. Normally /gnu/include.
+ SYSTEM_HEADER_DIR = $(tooldir)/include
+
+ # Don't try to compile the things we can't compile.
+ ***************
+ *** 20,26 ****
+ # Use cross-compiler version of float.h.
+ FLOAT_H = $(CROSS_FLOAT_H)
+
+ ! # Don't install assert.h in /usr/local/include.
+ assertdir = $(tooldir)/include
+
+ # Don't run fixproto
+ --- 20,26 ----
+ # Use cross-compiler version of float.h.
+ FLOAT_H = $(CROSS_FLOAT_H)
+
+ ! # Don't install assert.h in /local/include.
+ assertdir = $(tooldir)/include
+
+ # Don't run fixproto
+ diff -rc --new-file gcc-2.5.8-fsf/g++.1 gcc-2.5.8/g++.1
+ *** gcc-2.5.8-fsf/g++.1 Wed Oct 13 23:15:18 1993
+ --- gcc-2.5.8/g++.1 Tue Feb 22 11:27:23 1994
+ ***************
+ *** 598,604 ****
+ .sp
+ .I LIBDIR
+ is usually
+ ! .B /usr/local/lib/\c
+ .IR machine / version .
+ .br
+ .I TMPDIR
+ --- 598,604 ----
+ .sp
+ .I LIBDIR
+ is usually
+ ! .B /gnu/lib/\c
+ .IR machine / version .
+ .br
+ .I TMPDIR
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.1 gcc-2.5.8/gcc.1
+ *** gcc-2.5.8-fsf/gcc.1 Wed Oct 13 23:19:36 1993
+ --- gcc-2.5.8/gcc.1 Tue Feb 22 11:27:28 1994
+ ***************
+ *** 1542,1548 ****
+ `\|\c
+ .B /usr/lib/gcc/\c
+ \&\|' and `\|\c
+ ! .B /usr/local/lib/gcc-lib/\c
+ \&\|'. If neither of
+ those results in a file name that is found, the compiler driver
+ searches for the unmodified program
+ --- 1542,1548 ----
+ `\|\c
+ .B /usr/lib/gcc/\c
+ \&\|' and `\|\c
+ ! .B /gnu/lib/gcc-lib/\c
+ \&\|'. If neither of
+ those results in a file name that is found, the compiler driver
+ searches for the unmodified program
+ ***************
+ *** 3997,4003 ****
+ .fi
+ .I LIBDIR
+ is usually
+ ! .B /usr/local/lib/\c
+ .IR machine / version .
+ .br
+ .I TMPDIR
+ --- 3997,4003 ----
+ .fi
+ .I LIBDIR
+ is usually
+ ! .B /gnu/lib/\c
+ .IR machine / version .
+ .br
+ .I TMPDIR
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.c gcc-2.5.8/gcc.c
+ *** gcc-2.5.8-fsf/gcc.c Thu Dec 23 22:50:01 1993
+ --- gcc-2.5.8/gcc.c Fri Jul 1 13:45:19 1994
+ ***************
+ *** 578,584 ****
+ {".adb", "@ada"},
+ {".ada", "@ada"},
+ {"@ada",
+ ! "gnat1 %{gnat*} %{k8:-gnatk8} %{w:-gnatws}\
+ -dumpbase %b.ada\
+ %{g*} %{O*} %{p} %{pg:-p} %{f*} %{d*}\
+ %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
+ --- 578,584 ----
+ {".adb", "@ada"},
+ {".ada", "@ada"},
+ {"@ada",
+ ! "gnat1 %{gnat*} %{k8:-gnatk8} %{!v:-quiet} %{w:-gnatws}\
+ -dumpbase %b.ada\
+ %{g*} %{O*} %{p} %{pg:-p} %{f*} %{d*}\
+ %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
+ ***************
+ *** 1162,1178 ****
+ #endif
+
+ #ifndef STANDARD_EXEC_PREFIX
+ ! #define STANDARD_EXEC_PREFIX "/usr/local/lib/gcc-lib/"
+ #endif /* !defined STANDARD_EXEC_PREFIX */
+
+ static char *standard_exec_prefix = STANDARD_EXEC_PREFIX;
+ ! static char *standard_exec_prefix_1 = "/usr/lib/gcc/";
+ #ifdef MD_EXEC_PREFIX
+ static char *md_exec_prefix = MD_EXEC_PREFIX;
+ #endif
+
+ #ifndef STANDARD_STARTFILE_PREFIX
+ ! #define STANDARD_STARTFILE_PREFIX "/usr/local/lib/"
+ #endif /* !defined STANDARD_STARTFILE_PREFIX */
+
+ #ifdef MD_STARTFILE_PREFIX
+ --- 1162,1178 ----
+ #endif
+
+ #ifndef STANDARD_EXEC_PREFIX
+ ! #define STANDARD_EXEC_PREFIX "/gnu/lib/gcc-lib/"
+ #endif /* !defined STANDARD_EXEC_PREFIX */
+
+ static char *standard_exec_prefix = STANDARD_EXEC_PREFIX;
+ ! static char *standard_exec_prefix_1 = "/local/lib/gcc-lib/";
+ #ifdef MD_EXEC_PREFIX
+ static char *md_exec_prefix = MD_EXEC_PREFIX;
+ #endif
+
+ #ifndef STANDARD_STARTFILE_PREFIX
+ ! #define STANDARD_STARTFILE_PREFIX "/gnu/lib/"
+ #endif /* !defined STANDARD_STARTFILE_PREFIX */
+
+ #ifdef MD_STARTFILE_PREFIX
+ ***************
+ *** 1182,1192 ****
+ static char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
+ #endif
+ static char *standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
+ ! static char *standard_startfile_prefix_1 = "/lib/";
+ ! static char *standard_startfile_prefix_2 = "/usr/lib/";
+
+ #ifndef TOOLDIR_BASE_PREFIX
+ ! #define TOOLDIR_BASE_PREFIX "/usr/local/"
+ #endif
+ static char *tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
+ static char *tooldir_prefix;
+ --- 1182,1192 ----
+ static char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
+ #endif
+ static char *standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
+ ! static char *standard_startfile_prefix_1 = "/local/lib/";
+ ! static char *standard_startfile_prefix_2 = "/local/lib/";
+
+ #ifndef TOOLDIR_BASE_PREFIX
+ ! #define TOOLDIR_BASE_PREFIX "/local/"
+ #endif
+ static char *tooldir_base_prefix = TOOLDIR_BASE_PREFIX;
+ static char *tooldir_prefix;
+ ***************
+ *** 1398,1405 ****
+ --- 1398,1409 ----
+ base = choose_temp_base_try (P_tmpdir, base);
+ #endif
+
+ + #ifdef amigados
+ + base = "ram:";
+ + #else
+ base = choose_temp_base_try ("/usr/tmp", base);
+ base = choose_temp_base_try ("/tmp", base);
+ + #endif
+
+ /* If all else fails, use the current directory! */
+ if (base == (char *)0)
+ ***************
+ *** 1408,1414 ****
+ len = strlen (base);
+ temp_filename = xmalloc (len + sizeof("/ccXXXXXX") + 1);
+ strcpy (temp_filename, base);
+ ! if (len > 0 && temp_filename[len-1] != '/')
+ temp_filename[len++] = '/';
+ strcpy (temp_filename + len, "ccXXXXXX");
+
+ --- 1412,1422 ----
+ len = strlen (base);
+ temp_filename = xmalloc (len + sizeof("/ccXXXXXX") + 1);
+ strcpy (temp_filename, base);
+ ! if (len > 0 && temp_filename[len-1] != '/'
+ ! #ifdef amigados
+ ! && temp_filename[len-1] != ':'
+ ! #endif
+ ! )
+ temp_filename[len++] = '/';
+ strcpy (temp_filename + len, "ccXXXXXX");
+
+ ***************
+ *** 1552,1558 ****
+
+ /* Determine the filename to execute (special case for absolute paths). */
+
+ ! if (*name == '/')
+ {
+ if (access (name, mode))
+ {
+ --- 1560,1570 ----
+
+ /* Determine the filename to execute (special case for absolute paths). */
+
+ ! if (*name == '/'
+ ! #ifdef amigados
+ ! || index (name, ':')
+ ! #endif
+ ! )
+ {
+ if (access (name, mode))
+ {
+ ***************
+ *** 1758,1763 ****
+ --- 1770,1776 ----
+ NOT_LAST is nonzero if this is not the last subcommand
+ (i.e. its output should be piped to the next one.) */
+
+ + #ifndef PEXECUTE
+ #ifndef OS2
+ #ifdef __MSDOS__
+
+ ***************
+ *** 1913,1918 ****
+ --- 1926,1932 ----
+ return (search_flag ? spawnv : spawnvp) (1, program, argv);
+ }
+ #endif /* not OS2 */
+ + #endif /* !defined (PEXECUTE) */
+
+ /* Execute the command specified by the arguments on the current line of spec.
+ When using pipes, this includes several piped-together commands
+ ***************
+ *** 2007,2015 ****
+ --- 2021,2035 ----
+ {
+ char *string = commands[i].argv[0];
+
+ + #ifdef PEXECUTE
+ + commands[i].pid = PEXECUTE (string != commands[i].prog,
+ + string, commands[i].argv,
+ + i + 1 < n_commands);
+ + #else
+ commands[i].pid = pexecute (string != commands[i].prog,
+ string, commands[i].argv,
+ i + 1 < n_commands);
+ + #endif
+
+ if (string != commands[i].prog)
+ free (string);
+ ***************
+ *** 2030,2040 ****
+ --- 2050,2064 ----
+ int pid;
+ char *prog;
+
+ + #ifdef PEXECUTE_RESULT
+ + pid = PEXECUTE_RESULT (status, commands[i]);
+ + #else /* PEXECUTE_RESULT */
+ #ifdef __MSDOS__
+ status = pid = commands[i].pid;
+ #else
+ pid = wait (&status);
+ #endif
+ + #endif /* PEXECUTE_RESULT */
+ if (pid < 0)
+ abort ();
+
+ ***************
+ *** 2141,2146 ****
+ --- 2165,2171 ----
+ if (*endp == PATH_SEPARATOR || *endp == 0)
+ {
+ strncpy (nstore, startp, endp-startp);
+ + #ifndef amigados
+ if (endp == startp)
+ {
+ strcpy (nstore, "./");
+ ***************
+ *** 2152,2157 ****
+ --- 2177,2191 ----
+ }
+ else
+ nstore[endp-startp] = 0;
+ + #else
+ + if (endp[-1] != '/' && endp[-1] != ':')
+ + {
+ + nstore[endp-startp] = '/';
+ + nstore[endp-startp+1] = 0;
+ + }
+ + else
+ + nstore[endp-startp] = 0;
+ + #endif
+ add_prefix (&exec_prefix, nstore, 0, 0, NULL_PTR);
+ if (*endp == 0)
+ break;
+ ***************
+ *** 2174,2179 ****
+ --- 2208,2214 ----
+ if (*endp == PATH_SEPARATOR || *endp == 0)
+ {
+ strncpy (nstore, startp, endp-startp);
+ + #ifndef amigados
+ if (endp == startp)
+ {
+ strcpy (nstore, "./");
+ ***************
+ *** 2185,2190 ****
+ --- 2220,2234 ----
+ }
+ else
+ nstore[endp-startp] = 0;
+ + #else
+ + if (endp[-1] != '/' && endp[-1] != ':')
+ + {
+ + nstore[endp-startp] = '/';
+ + nstore[endp-startp+1] = 0;
+ + }
+ + else
+ + nstore[endp-startp] = 0;
+ + #endif
+ add_prefix (&startfile_prefix, nstore, 0, 0, NULL_PTR);
+ if (*endp == 0)
+ break;
+ ***************
+ *** 2208,2213 ****
+ --- 2252,2258 ----
+ if (*endp == PATH_SEPARATOR || *endp == 0)
+ {
+ strncpy (nstore, startp, endp-startp);
+ + #ifndef amigados
+ if (endp == startp)
+ {
+ strcpy (nstore, "./");
+ ***************
+ *** 2219,2224 ****
+ --- 2264,2278 ----
+ }
+ else
+ nstore[endp-startp] = 0;
+ + #else
+ + if (endp[-1] != '/' && endp[-1] != ':')
+ + {
+ + nstore[endp-startp] = '/';
+ + nstore[endp-startp+1] = 0;
+ + }
+ + else
+ + nstore[endp-startp] = 0;
+ + #endif
+ add_prefix (&startfile_prefix, nstore, 0, 0, NULL_PTR);
+ if (*endp == 0)
+ break;
+ ***************
+ *** 3862,3871 ****
+ --- 3916,3929 ----
+ register char *p;
+ int len;
+
+ + #ifdef FILE_NAME_NONDIRECTORY
+ + input_basename = FILE_NAME_NONDIRECTORY (input_filename);
+ + #else
+ input_basename = input_filename;
+ for (p = input_filename; *p; p++)
+ if (*p == '/')
+ input_basename = p + 1;
+ + #endif
+
+ /* Find a suffix starting with the last period,
+ and set basename_length to exclude that suffix. */
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info gcc-2.5.8/gcc.info
+ *** gcc-2.5.8-fsf/gcc.info Sat Nov 27 19:39:23 1993
+ --- gcc-2.5.8/gcc.info Tue May 3 14:10:31 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ ***************
+ *** 32,57 ****
+ gcc.info-1: 1305
+ gcc.info-2: 49956
+ gcc.info-3: 91430
+ ! gcc.info-4: 136088
+ ! gcc.info-5: 176230
+ ! gcc.info-6: 225032
+ ! gcc.info-7: 274452
+ ! gcc.info-8: 323146
+ ! gcc.info-9: 372521
+ ! gcc.info-10: 411789
+ ! gcc.info-11: 448922
+ ! gcc.info-12: 498287
+ ! gcc.info-13: 541773
+ ! gcc.info-14: 591219
+ ! gcc.info-15: 622815
+ ! gcc.info-16: 670482
+ ! gcc.info-17: 716044
+ ! gcc.info-18: 765468
+ ! gcc.info-19: 812673
+ ! gcc.info-20: 861775
+ ! gcc.info-21: 909034
+ ! gcc.info-22: 944667
+ ! gcc.info-23: 966158
+
+ Tag Table:
+ (Indirect)
+ --- 32,57 ----
+ gcc.info-1: 1305
+ gcc.info-2: 49956
+ gcc.info-3: 91430
+ ! gcc.info-4: 136070
+ ! gcc.info-5: 176194
+ ! gcc.info-6: 224902
+ ! gcc.info-7: 274304
+ ! gcc.info-8: 322998
+ ! gcc.info-9: 372325
+ ! gcc.info-10: 411593
+ ! gcc.info-11: 448726
+ ! gcc.info-12: 498091
+ ! gcc.info-13: 541577
+ ! gcc.info-14: 591023
+ ! gcc.info-15: 622619
+ ! gcc.info-16: 670286
+ ! gcc.info-17: 715848
+ ! gcc.info-18: 765243
+ ! gcc.info-19: 812448
+ ! gcc.info-20: 861550
+ ! gcc.info-21: 908809
+ ! gcc.info-22: 944442
+ ! gcc.info-23: 965933
+
+ Tag Table:
+ (Indirect)
+ ***************
+ *** 73,286 ****
+ Node: Assembler Options107289
+ Node: Link Options107613
+ Node: Directory Options111621
+ ! Node: Target Options114521
+ ! Node: Submodel Options118248
+ ! Node: M680x0 Options119594
+ ! Node: VAX Options122978
+ ! Node: SPARC Options123513
+ ! Node: Convex Options125569
+ ! Node: AMD29K Options127750
+ ! Node: M88K Options129898
+ ! Node: RS/6000 and PowerPC Options136088
+ ! Node: RT Options142032
+ ! Node: MIPS Options143736
+ ! Node: i386 Options149801
+ ! Node: HPPA Options151147
+ ! Node: Intel 960 Options152342
+ ! Node: DEC Alpha Options154952
+ ! Node: Clipper Options156624
+ ! Node: System V Options157024
+ ! Node: Code Gen Options157711
+ ! Node: Environment Variables165976
+ ! Node: Running Protoize170001
+ ! Node: Installation176230
+ ! Node: Other Dir211589
+ ! Node: Cross-Compiler213273
+ ! Node: Steps of Cross215085
+ ! Node: Configure Cross216203
+ ! Node: Tools and Libraries216852
+ ! Node: Cross Runtime219295
+ ! Node: Cross Headers223047
+ ! Node: Build Cross225032
+ ! Node: PA Install226937
+ ! Node: Sun Install229239
+ ! Node: 3b1 Install230978
+ ! Node: Unos Install232011
+ ! Node: VMS Install233551
+ ! Node: WE32K Install243486
+ ! Node: MIPS Install244865
+ ! Node: Collect2247727
+ ! Node: Header Dirs250570
+ ! Node: C Extensions251984
+ ! Node: Statement Exprs255159
+ ! Node: Local Labels257053
+ ! Node: Labels as Values259115
+ ! Node: Nested Functions260980
+ ! Node: Constructing Calls264836
+ ! Node: Naming Types266893
+ ! Node: Typeof267987
+ ! Node: Lvalues269852
+ ! Node: Conditionals272117
+ ! Node: Long Long273008
+ ! Node: Complex274452
+ ! Node: Zero Length276314
+ ! Node: Variable Length276988
+ ! Node: Macro Varargs279513
+ ! Node: Subscripting281616
+ ! Node: Pointer Arith282099
+ ! Node: Initializers282664
+ ! Node: Constructors283110
+ ! Node: Labeled Elements284804
+ ! Node: Case Ranges287126
+ ! Node: Cast to Union288085
+ ! Node: Function Attributes289163
+ ! Node: Function Prototypes294844
+ ! Node: Dollar Signs296549
+ ! Node: Character Escapes297336
+ ! Node: Alignment297617
+ ! Node: Variable Attributes299093
+ ! Node: Inline301992
+ ! Node: Extended Asm305727
+ ! Node: Asm Labels316014
+ ! Node: Explicit Reg Vars317333
+ ! Node: Global Reg Vars318581
+ ! Node: Local Reg Vars323146
+ ! Node: Alternate Keywords324738
+ ! Node: Incomplete Enums326140
+ ! Node: Function Names326848
+ ! Node: C++ Extensions327853
+ ! Node: Naming Results328833
+ ! Node: Min and Max332147
+ ! Node: Destructors and Goto333597
+ ! Node: C++ Interface334147
+ ! Node: Trouble339014
+ ! Node: Actual Bugs340582
+ ! Node: Installation Problems341688
+ ! Node: Cross-Compiler Problems355013
+ ! Node: Interoperation356484
+ ! Node: External Bugs370514
+ ! Node: Incompatibilities372521
+ ! Node: Fixed Headers381069
+ ! Node: Disappointments383408
+ ! Node: C++ Misunderstandings387628
+ ! Node: Static Definitions388275
+ ! Node: Temporaries389329
+ ! Node: Protoize Caveats391533
+ ! Node: Non-bugs395488
+ ! Node: Warnings and Errors404690
+ ! Node: Bugs406461
+ ! Node: Bug Criteria407821
+ ! Node: Bug Lists410251
+ ! Node: Bug Reporting411789
+ ! Node: Sending Patches423733
+ ! Node: Service429085
+ ! Node: VMS429646
+ ! Node: Include Files and VMS430001
+ ! Node: Global Declarations433891
+ ! Node: VMS Misc438200
+ ! Node: Portability442526
+ ! Node: Interface444289
+ ! Node: Passes448922
+ ! Node: RTL466265
+ ! Node: RTL Objects468153
+ ! Node: Accessors471197
+ ! Node: Flags476523
+ ! Node: Machine Modes485542
+ ! Node: Constants493099
+ ! Node: Regs and Memory498287
+ ! Node: Arithmetic509997
+ ! Node: Comparisons516065
+ ! Node: Bit Fields520127
+ ! Node: Conversions521491
+ ! Node: RTL Declarations524379
+ ! Node: Side Effects525188
+ ! Node: Incdec537735
+ ! Node: Assembler540251
+ ! Node: Insns541773
+ ! Node: Calls562518
+ ! Node: Sharing565113
+ ! Node: Reading RTL568189
+ ! Node: Machine Desc569133
+ ! Node: Patterns570986
+ ! Node: Example573930
+ ! Node: RTL Template575058
+ ! Node: Output Template587258
+ ! Node: Output Statement591219
+ ! Node: Constraints594932
+ ! Node: Simple Constraints595935
+ ! Node: Multi-Alternative607368
+ ! Node: Class Preferences610204
+ ! Node: Modifiers611084
+ ! Node: Machine Constraints614199
+ ! Node: No Constraints621694
+ ! Node: Standard Names622815
+ ! Node: Pattern Ordering650086
+ ! Node: Dependent Patterns651312
+ ! Node: Jump Patterns654252
+ ! Node: Insn Canonicalizations660068
+ ! Node: Peephole Definitions663563
+ ! Node: Expander Definitions670482
+ ! Node: Insn Splitting677622
+ ! Node: Insn Attributes684636
+ ! Node: Defining Attributes685683
+ ! Node: Expressions687695
+ ! Node: Tagging Insns694017
+ ! Node: Attr Example698380
+ ! Node: Insn Lengths700756
+ ! Node: Constant Attributes704120
+ ! Node: Delay Slots705280
+ ! Node: Function Units708491
+ ! Node: Target Macros714161
+ ! Node: Driver716044
+ ! Node: Run-time Target726307
+ ! Node: Storage Layout731789
+ ! Node: Type Layout744378
+ ! Node: Registers750707
+ ! Node: Register Basics751687
+ ! Node: Allocation Order755680
+ ! Node: Values in Registers757060
+ ! Node: Leaf Functions761814
+ ! Node: Stack Registers764635
+ ! Node: Obsolete Register Macros765468
+ ! Node: Register Classes768163
+ ! Node: Stack and Calling785880
+ ! Node: Frame Layout786255
+ ! Node: Frame Registers789660
+ ! Node: Elimination793379
+ ! Node: Stack Arguments797682
+ ! Node: Register Arguments803998
+ ! Node: Scalar Return812673
+ ! Node: Aggregate Return816636
+ ! Node: Caller Saves820351
+ ! Node: Function Entry821501
+ ! Node: Profiling830429
+ ! Node: Varargs833333
+ ! Node: Trampolines840016
+ ! Node: Library Calls846451
+ ! Node: Addressing Modes854223
+ ! Node: Condition Code861775
+ ! Node: Costs866398
+ ! Node: Sections874777
+ ! Node: PIC879566
+ ! Node: Assembler Format882056
+ ! Node: File Framework883061
+ ! Node: Data Output886768
+ ! Node: Uninitialized Data892207
+ ! Node: Label Output894802
+ ! Node: Initialization902891
+ ! Node: Macros for Initialization909034
+ ! Node: Instruction Output911817
+ ! Node: Dispatch Tables919763
+ ! Node: Alignment Output922105
+ ! Node: Debugging Info923802
+ ! Node: All Debuggers924354
+ ! Node: DBX Options926721
+ ! Node: DBX Hooks931305
+ ! Node: File Names and DBX934608
+ ! Node: SDB and DWARF936536
+ ! Node: Cross-compilation938220
+ ! Node: Misc944667
+ ! Node: Config960043
+ ! Node: Index966158
+
+ End Tag Table
+ --- 73,286 ----
+ Node: Assembler Options107289
+ Node: Link Options107613
+ Node: Directory Options111621
+ ! Node: Target Options114515
+ ! Node: Submodel Options118230
+ ! Node: M680x0 Options119576
+ ! Node: VAX Options122960
+ ! Node: SPARC Options123495
+ ! Node: Convex Options125551
+ ! Node: AMD29K Options127732
+ ! Node: M88K Options129880
+ ! Node: RS/6000 and PowerPC Options136070
+ ! Node: RT Options142014
+ ! Node: MIPS Options143718
+ ! Node: i386 Options149783
+ ! Node: HPPA Options151129
+ ! Node: Intel 960 Options152324
+ ! Node: DEC Alpha Options154934
+ ! Node: Clipper Options156606
+ ! Node: System V Options157006
+ ! Node: Code Gen Options157693
+ ! Node: Environment Variables165958
+ ! Node: Running Protoize169971
+ ! Node: Installation176194
+ ! Node: Other Dir211501
+ ! Node: Cross-Compiler213185
+ ! Node: Steps of Cross214997
+ ! Node: Configure Cross216115
+ ! Node: Tools and Libraries216764
+ ! Node: Cross Runtime219177
+ ! Node: Cross Headers222929
+ ! Node: Build Cross224902
+ ! Node: PA Install226807
+ ! Node: Sun Install229103
+ ! Node: 3b1 Install230842
+ ! Node: Unos Install231875
+ ! Node: VMS Install233415
+ ! Node: WE32K Install243350
+ ! Node: MIPS Install244729
+ ! Node: Collect2247591
+ ! Node: Header Dirs250434
+ ! Node: C Extensions251836
+ ! Node: Statement Exprs255011
+ ! Node: Local Labels256905
+ ! Node: Labels as Values258967
+ ! Node: Nested Functions260832
+ ! Node: Constructing Calls264688
+ ! Node: Naming Types266745
+ ! Node: Typeof267839
+ ! Node: Lvalues269704
+ ! Node: Conditionals271969
+ ! Node: Long Long272860
+ ! Node: Complex274304
+ ! Node: Zero Length276166
+ ! Node: Variable Length276840
+ ! Node: Macro Varargs279365
+ ! Node: Subscripting281468
+ ! Node: Pointer Arith281951
+ ! Node: Initializers282516
+ ! Node: Constructors282962
+ ! Node: Labeled Elements284656
+ ! Node: Case Ranges286978
+ ! Node: Cast to Union287937
+ ! Node: Function Attributes289015
+ ! Node: Function Prototypes294696
+ ! Node: Dollar Signs296401
+ ! Node: Character Escapes297188
+ ! Node: Alignment297469
+ ! Node: Variable Attributes298945
+ ! Node: Inline301844
+ ! Node: Extended Asm305579
+ ! Node: Asm Labels315866
+ ! Node: Explicit Reg Vars317185
+ ! Node: Global Reg Vars318433
+ ! Node: Local Reg Vars322998
+ ! Node: Alternate Keywords324590
+ ! Node: Incomplete Enums325992
+ ! Node: Function Names326700
+ ! Node: C++ Extensions327705
+ ! Node: Naming Results328685
+ ! Node: Min and Max331999
+ ! Node: Destructors and Goto333449
+ ! Node: C++ Interface333999
+ ! Node: Trouble338866
+ ! Node: Actual Bugs340434
+ ! Node: Installation Problems341540
+ ! Node: Cross-Compiler Problems354841
+ ! Node: Interoperation356312
+ ! Node: External Bugs370324
+ ! Node: Incompatibilities372325
+ ! Node: Fixed Headers380873
+ ! Node: Disappointments383212
+ ! Node: C++ Misunderstandings387432
+ ! Node: Static Definitions388079
+ ! Node: Temporaries389133
+ ! Node: Protoize Caveats391337
+ ! Node: Non-bugs395292
+ ! Node: Warnings and Errors404494
+ ! Node: Bugs406265
+ ! Node: Bug Criteria407625
+ ! Node: Bug Lists410055
+ ! Node: Bug Reporting411593
+ ! Node: Sending Patches423537
+ ! Node: Service428889
+ ! Node: VMS429450
+ ! Node: Include Files and VMS429805
+ ! Node: Global Declarations433695
+ ! Node: VMS Misc438004
+ ! Node: Portability442330
+ ! Node: Interface444093
+ ! Node: Passes448726
+ ! Node: RTL466069
+ ! Node: RTL Objects467957
+ ! Node: Accessors471001
+ ! Node: Flags476327
+ ! Node: Machine Modes485346
+ ! Node: Constants492903
+ ! Node: Regs and Memory498091
+ ! Node: Arithmetic509801
+ ! Node: Comparisons515869
+ ! Node: Bit Fields519931
+ ! Node: Conversions521295
+ ! Node: RTL Declarations524183
+ ! Node: Side Effects524992
+ ! Node: Incdec537539
+ ! Node: Assembler540055
+ ! Node: Insns541577
+ ! Node: Calls562322
+ ! Node: Sharing564917
+ ! Node: Reading RTL567993
+ ! Node: Machine Desc568937
+ ! Node: Patterns570790
+ ! Node: Example573734
+ ! Node: RTL Template574862
+ ! Node: Output Template587062
+ ! Node: Output Statement591023
+ ! Node: Constraints594736
+ ! Node: Simple Constraints595739
+ ! Node: Multi-Alternative607172
+ ! Node: Class Preferences610008
+ ! Node: Modifiers610888
+ ! Node: Machine Constraints614003
+ ! Node: No Constraints621498
+ ! Node: Standard Names622619
+ ! Node: Pattern Ordering649890
+ ! Node: Dependent Patterns651116
+ ! Node: Jump Patterns654056
+ ! Node: Insn Canonicalizations659872
+ ! Node: Peephole Definitions663367
+ ! Node: Expander Definitions670286
+ ! Node: Insn Splitting677426
+ ! Node: Insn Attributes684440
+ ! Node: Defining Attributes685487
+ ! Node: Expressions687499
+ ! Node: Tagging Insns693821
+ ! Node: Attr Example698184
+ ! Node: Insn Lengths700560
+ ! Node: Constant Attributes703924
+ ! Node: Delay Slots705084
+ ! Node: Function Units708295
+ ! Node: Target Macros713965
+ ! Node: Driver715848
+ ! Node: Run-time Target726082
+ ! Node: Storage Layout731564
+ ! Node: Type Layout744153
+ ! Node: Registers750482
+ ! Node: Register Basics751462
+ ! Node: Allocation Order755455
+ ! Node: Values in Registers756835
+ ! Node: Leaf Functions761589
+ ! Node: Stack Registers764410
+ ! Node: Obsolete Register Macros765243
+ ! Node: Register Classes767938
+ ! Node: Stack and Calling785655
+ ! Node: Frame Layout786030
+ ! Node: Frame Registers789435
+ ! Node: Elimination793154
+ ! Node: Stack Arguments797457
+ ! Node: Register Arguments803773
+ ! Node: Scalar Return812448
+ ! Node: Aggregate Return816411
+ ! Node: Caller Saves820126
+ ! Node: Function Entry821276
+ ! Node: Profiling830204
+ ! Node: Varargs833108
+ ! Node: Trampolines839791
+ ! Node: Library Calls846226
+ ! Node: Addressing Modes853998
+ ! Node: Condition Code861550
+ ! Node: Costs866173
+ ! Node: Sections874552
+ ! Node: PIC879341
+ ! Node: Assembler Format881831
+ ! Node: File Framework882836
+ ! Node: Data Output886543
+ ! Node: Uninitialized Data891982
+ ! Node: Label Output894577
+ ! Node: Initialization902666
+ ! Node: Macros for Initialization908809
+ ! Node: Instruction Output911592
+ ! Node: Dispatch Tables919538
+ ! Node: Alignment Output921880
+ ! Node: Debugging Info923577
+ ! Node: All Debuggers924129
+ ! Node: DBX Options926496
+ ! Node: DBX Hooks931080
+ ! Node: File Names and DBX934383
+ ! Node: SDB and DWARF936311
+ ! Node: Cross-compilation937995
+ ! Node: Misc944442
+ ! Node: Config959818
+ ! Node: Index965933
+
+ End Tag Table
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-1 gcc-2.5.8/gcc.info-1
+ *** gcc-2.5.8-fsf/gcc.info-1 Sat Nov 27 19:38:42 1993
+ --- gcc-2.5.8/gcc.info-1 Tue May 3 14:10:10 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-10 gcc-2.5.8/gcc.info-10
+ *** gcc-2.5.8-fsf/gcc.info-10 Sat Nov 27 19:38:59 1993
+ --- gcc-2.5.8/gcc.info-10 Tue May 3 14:10:18 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-11 gcc-2.5.8/gcc.info-11
+ *** gcc-2.5.8-fsf/gcc.info-11 Sat Nov 27 19:38:59 1993
+ --- gcc-2.5.8/gcc.info-11 Tue May 3 14:10:19 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-12 gcc-2.5.8/gcc.info-12
+ *** gcc-2.5.8-fsf/gcc.info-12 Sat Nov 27 19:39:04 1993
+ --- gcc-2.5.8/gcc.info-12 Tue May 3 14:10:20 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-13 gcc-2.5.8/gcc.info-13
+ *** gcc-2.5.8-fsf/gcc.info-13 Sat Nov 27 19:39:09 1993
+ --- gcc-2.5.8/gcc.info-13 Tue May 3 14:10:21 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-14 gcc-2.5.8/gcc.info-14
+ *** gcc-2.5.8-fsf/gcc.info-14 Sat Nov 27 19:39:13 1993
+ --- gcc-2.5.8/gcc.info-14 Tue May 3 14:10:22 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-15 gcc-2.5.8/gcc.info-15
+ *** gcc-2.5.8-fsf/gcc.info-15 Sat Nov 27 19:39:14 1993
+ --- gcc-2.5.8/gcc.info-15 Tue May 3 14:10:23 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-16 gcc-2.5.8/gcc.info-16
+ *** gcc-2.5.8-fsf/gcc.info-16 Sat Nov 27 19:39:14 1993
+ --- gcc-2.5.8/gcc.info-16 Tue May 3 14:10:23 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-17 gcc-2.5.8/gcc.info-17
+ *** gcc-2.5.8-fsf/gcc.info-17 Sat Nov 27 19:39:15 1993
+ --- gcc-2.5.8/gcc.info-17 Tue May 3 14:10:25 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ ***************
+ *** 174,182 ****
+
+ `STANDARD_EXEC_PREFIX'
+ Define this macro as a C string constant if you wish to override
+ ! the standard choice of `/usr/local/lib/gcc-lib/' as the default
+ ! prefix to try when searching for the executable files of the
+ ! compiler.
+
+ `MD_EXEC_PREFIX'
+ If defined, this macro is an additional prefix to try after
+ --- 174,181 ----
+
+ `STANDARD_EXEC_PREFIX'
+ Define this macro as a C string constant if you wish to override
+ ! the standard choice of `/gnu/lib/gcc-lib/' as the default prefix to
+ ! try when searching for the executable files of the compiler.
+
+ `MD_EXEC_PREFIX'
+ If defined, this macro is an additional prefix to try after
+ ***************
+ *** 185,192 ****
+
+ `STANDARD_STARTFILE_PREFIX'
+ Define this macro as a C string constant if you wish to override
+ ! the standard choice of `/usr/local/lib/' as the default prefix to
+ ! try when searching for startup files such as `crt0.o'.
+
+ `MD_STARTFILE_PREFIX'
+ If defined, this macro supplies an additional prefix to try after
+ --- 184,191 ----
+
+ `STANDARD_STARTFILE_PREFIX'
+ Define this macro as a C string constant if you wish to override
+ ! the standard choice of `/gnu/lib/' as the default prefix to try
+ ! when searching for startup files such as `crt0.o'.
+
+ `MD_STARTFILE_PREFIX'
+ If defined, this macro supplies an additional prefix to try after
+ ***************
+ *** 201,212 ****
+
+ `LOCAL_INCLUDE_DIR'
+ Define this macro as a C string constant if you wish to override
+ ! the standard choice of `/usr/local/include' as the default prefix
+ ! to try when searching for local header files. `LOCAL_INCLUDE_DIR'
+ ! comes before `SYSTEM_INCLUDE_DIR' in the search order.
+
+ Cross compilers do not use this macro and do not search either
+ ! `/usr/local/include' or its replacement.
+
+ `SYSTEM_INCLUDE_DIR'
+ Define this macro as a C string constant if you wish to specify a
+ --- 200,211 ----
+
+ `LOCAL_INCLUDE_DIR'
+ Define this macro as a C string constant if you wish to override
+ ! the standard choice of `/gnu/include' as the default prefix to try
+ ! when searching for local header files. `LOCAL_INCLUDE_DIR' comes
+ ! before `SYSTEM_INCLUDE_DIR' in the search order.
+
+ Cross compilers do not use this macro and do not search either
+ ! `/gnu/include' or its replacement.
+
+ `SYSTEM_INCLUDE_DIR'
+ Define this macro as a C string constant if you wish to specify a
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-18 gcc-2.5.8/gcc.info-18
+ *** gcc-2.5.8-fsf/gcc.info-18 Sat Nov 27 19:39:15 1993
+ --- gcc-2.5.8/gcc.info-18 Tue May 3 14:10:25 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-19 gcc-2.5.8/gcc.info-19
+ *** gcc-2.5.8-fsf/gcc.info-19 Sat Nov 27 19:39:16 1993
+ --- gcc-2.5.8/gcc.info-19 Tue May 3 14:10:26 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-2 gcc-2.5.8/gcc.info-2
+ *** gcc-2.5.8-fsf/gcc.info-2 Sat Nov 27 19:38:47 1993
+ --- gcc-2.5.8/gcc.info-2 Tue May 3 14:10:11 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-20 gcc-2.5.8/gcc.info-20
+ *** gcc-2.5.8-fsf/gcc.info-20 Sat Nov 27 19:39:21 1993
+ --- gcc-2.5.8/gcc.info-20 Tue May 3 14:10:27 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-21 gcc-2.5.8/gcc.info-21
+ *** gcc-2.5.8-fsf/gcc.info-21 Sat Nov 27 19:39:21 1993
+ --- gcc-2.5.8/gcc.info-21 Tue May 3 14:10:28 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-22 gcc-2.5.8/gcc.info-22
+ *** gcc-2.5.8-fsf/gcc.info-22 Sat Nov 27 19:39:22 1993
+ --- gcc-2.5.8/gcc.info-22 Tue May 3 14:10:29 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-23 gcc-2.5.8/gcc.info-23
+ *** gcc-2.5.8-fsf/gcc.info-23 Sat Nov 27 19:39:23 1993
+ --- gcc-2.5.8/gcc.info-23 Tue May 3 14:10:31 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-3 gcc-2.5.8/gcc.info-3
+ *** gcc-2.5.8-fsf/gcc.info-3 Sat Nov 27 19:38:47 1993
+ --- gcc-2.5.8/gcc.info-3 Tue May 3 14:10:12 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ ***************
+ *** 568,577 ****
+ For each subprogram to be run, the compiler driver first tries the
+ `-B' prefix, if any. If that name is not found, or if `-B' was
+ not specified, the driver tries two standard prefixes, which are
+ ! `/usr/lib/gcc/' and `/usr/local/lib/gcc-lib/'. If neither of
+ ! those results in a file name that is found, the unmodified program
+ ! name is searched for using the directories specified in your
+ ! `PATH' environment variable.
+
+ `-B' prefixes that effectively specify directory names also apply
+ to libraries in the linker, because the compiler translates these
+ --- 568,577 ----
+ For each subprogram to be run, the compiler driver first tries the
+ `-B' prefix, if any. If that name is not found, or if `-B' was
+ not specified, the driver tries two standard prefixes, which are
+ ! `/usr/lib/gcc/' and `/gnu/lib/gcc-lib/'. If neither of those
+ ! results in a file name that is found, the unmodified program name
+ ! is searched for using the directories specified in your `PATH'
+ ! environment variable.
+
+ `-B' prefixes that effectively specify directory names also apply
+ to libraries in the linker, because the compiler translates these
+ ***************
+ *** 628,640 ****
+ The `-b' and `-V' options actually work by controlling part of the
+ file name used for the executable files and libraries used for
+ compilation. A given version of GNU CC, for a given target machine, is
+ ! normally kept in the directory `/usr/local/lib/gcc-lib/MACHINE/VERSION'.
+
+ Thus, sites can customize the effect of `-b' or `-V' either by
+ changing the names of these directories or adding alternate names (or
+ ! symbolic links). If in directory `/usr/local/lib/gcc-lib/' the file
+ ! `80386' is a link to the file `i386v', then `-b 80386' becomes an alias
+ ! for `-b i386v'.
+
+ In one respect, the `-b' or `-V' do not completely change to a
+ different compiler: the top-level driver program `gcc' that you
+ --- 628,640 ----
+ The `-b' and `-V' options actually work by controlling part of the
+ file name used for the executable files and libraries used for
+ compilation. A given version of GNU CC, for a given target machine, is
+ ! normally kept in the directory `/gnu/lib/gcc-lib/MACHINE/VERSION'.
+
+ Thus, sites can customize the effect of `-b' or `-V' either by
+ changing the names of these directories or adding alternate names (or
+ ! symbolic links). If in directory `/gnu/lib/gcc-lib/' the file `80386'
+ ! is a link to the file `i386v', then `-b 80386' becomes an alias for `-b
+ ! i386v'.
+
+ In one respect, the `-b' or `-V' do not completely change to a
+ different compiler: the top-level driver program `gcc' that you
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-4 gcc-2.5.8/gcc.info-4
+ *** gcc-2.5.8-fsf/gcc.info-4 Sat Nov 27 19:38:47 1993
+ --- gcc-2.5.8/gcc.info-4 Tue May 3 14:10:12 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ ***************
+ *** 789,801 ****
+
+ In addition, the prefix is used in an unusual way in finding the
+ directories to search for header files. For each of the standard
+ ! directories whose name normally begins with
+ ! `/usr/local/lib/gcc-lib' (more precisely, with the value of
+ ! `GCC_INCLUDE_DIR'), GNU CC tries replacing that beginning with the
+ ! specified prefix to produce an alternate directory name. Thus,
+ ! with `-Bfoo/', GNU CC will search `foo/bar' where it would
+ ! normally search `/usr/local/lib/bar'. These alternate directories
+ ! are searched first; the standard directories come next.
+
+ `COMPILER_PATH'
+ The value of `COMPILER_PATH' is a colon-separated list of
+ --- 789,801 ----
+
+ In addition, the prefix is used in an unusual way in finding the
+ directories to search for header files. For each of the standard
+ ! directories whose name normally begins with `/gnu/lib/gcc-lib'
+ ! (more precisely, with the value of `GCC_INCLUDE_DIR'), GNU CC tries
+ ! replacing that beginning with the specified prefix to produce an
+ ! alternate directory name. Thus, with `-Bfoo/', GNU CC will search
+ ! `foo/bar' where it would normally search `/gnu/lib/bar'. These
+ ! alternate directories are searched first; the standard directories
+ ! come next.
+
+ `COMPILER_PATH'
+ The value of `COMPILER_PATH' is a colon-separated list of
+ ***************
+ *** 896,902 ****
+
+ `-B DIRECTORY'
+ Look for the file `SYSCALLS.c.X' in DIRECTORY, instead of the
+ ! usual directory (normally `/usr/local/lib'). This file contains
+ prototype information about standard system functions. This option
+ applies only to `protoize'.
+
+ --- 896,902 ----
+
+ `-B DIRECTORY'
+ Look for the file `SYSCALLS.c.X' in DIRECTORY, instead of the
+ ! usual directory (normally `/gnu/lib'). This file contains
+ prototype information about standard system functions. This option
+ applies only to `protoize'.
+
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-5 gcc-2.5.8/gcc.info-5
+ *** gcc-2.5.8-fsf/gcc.info-5 Sat Nov 27 19:38:48 1993
+ --- gcc-2.5.8/gcc.info-5 Tue May 3 14:10:13 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ ***************
+ *** 557,576 ****
+ files do not exist, it means nothing needs to be added for a
+ given target or host.
+
+ ! 4. The standard directory for installing GNU CC is `/usr/local/lib'.
+ ! If you want to install its files somewhere else, specify
+ `--prefix=DIR' when you run `configure'. Here DIR is a directory
+ ! name to use instead of `/usr/local' for all purposes with one
+ ! exception: the directory `/usr/local/include' is searched for
+ ! header files no matter where you install the compiler.
+
+ 5. Specify `--local-prefix=DIR' if you want the compiler to search
+ directory `DIR/include' for header files *instead* of
+ ! `/usr/local/include'. (This is for systems that have different
+ conventions for where to put site-specific things.)
+
+ ! Unless you have a convention other than `/usr/local' for
+ ! site-specific files, it is a bad idea to specify `--local-prefix'.
+
+ 6. Make sure the Bison parser generator is installed. (This is
+ unnecessary if the Bison output files `c-parse.c' and `cexp.c' are
+ --- 557,576 ----
+ files do not exist, it means nothing needs to be added for a
+ given target or host.
+
+ ! 4. The standard directory for installing GNU CC is `/gnu/lib'. If
+ ! you want to install its files somewhere else, specify
+ `--prefix=DIR' when you run `configure'. Here DIR is a directory
+ ! name to use instead of `/gnu' for all purposes with one exception:
+ ! the directory `/gnu/include' is searched for header files no
+ ! matter where you install the compiler.
+
+ 5. Specify `--local-prefix=DIR' if you want the compiler to search
+ directory `DIR/include' for header files *instead* of
+ ! `/gnu/include'. (This is for systems that have different
+ conventions for where to put site-specific things.)
+
+ ! Unless you have a convention other than `/gnu' for site-specific
+ ! files, it is a bad idea to specify `--local-prefix'.
+
+ 6. Make sure the Bison parser generator is installed. (This is
+ unnecessary if the Bison output files `c-parse.c' and `cexp.c' are
+ ***************
+ *** 621,629 ****
+ If you are building with a previous GNU C compiler, do not use
+ `CC=gcc' on the make command or by editing the Makefile. Instead,
+ use a full pathname to specify the compiler, such as
+ ! `CC=/usr/local/bin/gcc'. This is because make might execute the
+ ! `gcc' in the current directory before all of the compiler
+ ! components have been built.
+
+ 9. If you are building a cross-compiler, stop here. *Note
+ Cross-Compiler::.
+ --- 621,629 ----
+ If you are building with a previous GNU C compiler, do not use
+ `CC=gcc' on the make command or by editing the Makefile. Instead,
+ use a full pathname to specify the compiler, such as
+ ! `CC=/gnu/bin/gcc'. This is because make might execute the `gcc'
+ ! in the current directory before all of the compiler components
+ ! have been built.
+
+ 9. If you are building a cross-compiler, stop here. *Note
+ Cross-Compiler::.
+ ***************
+ *** 746,760 ****
+
+ This copies the files `cc1', `cpp' and `libgcc.a' to files `cc1',
+ `cpp' and `libgcc.a' in the directory
+ ! `/usr/local/lib/gcc-lib/TARGET/VERSION', which is where the
+ ! compiler driver program looks for them. Here TARGET is the target
+ ! machine type specified when you ran `configure', and VERSION is
+ ! the version number of GNU CC. This naming scheme permits various
+ versions and/or cross-compilers to coexist.
+
+ ! This also copies the driver program `xgcc' into
+ ! `/usr/local/bin/gcc', so that it appears in typical execution
+ ! search paths.
+
+ On some systems, this command causes recompilation of some files.
+ This is usually due to bugs in `make'. You should either ignore
+ --- 746,759 ----
+
+ This copies the files `cc1', `cpp' and `libgcc.a' to files `cc1',
+ `cpp' and `libgcc.a' in the directory
+ ! `/gnu/lib/gcc-lib/TARGET/VERSION', which is where the compiler
+ ! driver program looks for them. Here TARGET is the target machine
+ ! type specified when you ran `configure', and VERSION is the
+ ! version number of GNU CC. This naming scheme permits various
+ versions and/or cross-compilers to coexist.
+
+ ! This also copies the driver program `xgcc' into `/gnu/bin/gcc', so
+ ! that it appears in typical execution search paths.
+
+ On some systems, this command causes recompilation of some files.
+ This is usually due to bugs in `make'. You should either ignore
+ ***************
+ *** 919,926 ****
+ ----------------------------------------
+
+ If you have a cross-assembler and cross-linker available, you should
+ ! install them now. Put them in the directory `/usr/local/TARGET/bin'.
+ ! Here is a table of the tools you should put in this directory:
+
+ `as'
+ This should be the cross-assembler.
+ --- 918,925 ----
+ ----------------------------------------
+
+ If you have a cross-assembler and cross-linker available, you should
+ ! install them now. Put them in the directory `/gnu/TARGET/bin'. Here
+ ! is a table of the tools you should put in this directory:
+
+ `as'
+ This should be the cross-assembler.
+ ***************
+ *** 949,961 ****
+
+ If you want to install libraries to use with the cross-compiler,
+ such as a standard C library, put them in the directory
+ ! `/usr/local/TARGET/lib'; installation of GNU CC copies all all the
+ ! files in that subdirectory into the proper place for GNU CC to find
+ ! them and link with them. Here's an example of copying some libraries
+ ! from a target machine:
+
+ ftp TARGET-MACHINE
+ ! lcd /usr/local/TARGET/lib
+ cd /lib
+ get libc.a
+ cd /usr/lib
+ --- 948,960 ----
+
+ If you want to install libraries to use with the cross-compiler,
+ such as a standard C library, put them in the directory
+ ! `/gnu/TARGET/lib'; installation of GNU CC copies all all the files in
+ ! that subdirectory into the proper place for GNU CC to find them and
+ ! link with them. Here's an example of copying some libraries from a
+ ! target machine:
+
+ ftp TARGET-MACHINE
+ ! lcd /gnu/TARGET/lib
+ cd /lib
+ get libc.a
+ cd /usr/lib
+ ***************
+ *** 968,981 ****
+
+ Many targets require "start files" such as `crt0.o' and `crtn.o'
+ which are linked into each executable; these too should be placed in
+ ! `/usr/local/TARGET/lib'. There may be several alternatives for
+ ! `crt0.o', for use with profiling or other compilation options. Check
+ ! your target's definition of `STARTFILE_SPEC' to find out what start
+ ! files it uses. Here's an example of copying these files from a target
+ ! machine:
+
+ ftp TARGET-MACHINE
+ ! lcd /usr/local/TARGET/lib
+ prompt
+ cd /lib
+ mget *crt*.o
+ --- 967,979 ----
+
+ Many targets require "start files" such as `crt0.o' and `crtn.o'
+ which are linked into each executable; these too should be placed in
+ ! `/gnu/TARGET/lib'. There may be several alternatives for `crt0.o', for
+ ! use with profiling or other compilation options. Check your target's
+ ! definition of `STARTFILE_SPEC' to find out what start files it uses.
+ ! Here's an example of copying these files from a target machine:
+
+ ftp TARGET-MACHINE
+ ! lcd /gnu/TARGET/lib
+ prompt
+ cd /lib
+ mget *crt*.o
+ ***************
+ *** 1094,1100 ****
+ cross-compiling.
+
+ When you have found suitable header files, put them in
+ ! `/usr/local/TARGET/include', before building the cross compiler. Then
+ installation will run fixincludes properly and install the corrected
+ versions of the header files where the compiler will use them.
+
+ --- 1092,1098 ----
+ cross-compiling.
+
+ When you have found suitable header files, put them in
+ ! `/gnu/TARGET/include', before building the cross compiler. Then
+ installation will run fixincludes properly and install the corrected
+ versions of the header files where the compiler will use them.
+
+ ***************
+ *** 1111,1117 ****
+ Then, on the host machine, do this:
+
+ ftp TARGET-MACHINE
+ ! lcd /usr/local/TARGET/include
+ get tarfile
+ quit
+ tar xf tarfile
+ --- 1109,1115 ----
+ Then, on the host machine, do this:
+
+ ftp TARGET-MACHINE
+ ! lcd /gnu/TARGET/include
+ get tarfile
+ quit
+ tar xf tarfile
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-6 gcc-2.5.8/gcc.info-6
+ *** gcc-2.5.8-fsf/gcc.info-6 Sat Nov 27 19:38:48 1993
+ --- gcc-2.5.8/gcc.info-6 Tue May 3 14:10:15 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ ***************
+ *** 86,92 ****
+ `jaguar.cs.utah.edu' `dist' subdirectory. You would need to install
+ GAS in the file
+
+ ! /usr/local/lib/gcc-lib/CONFIGURATION/GCCVERSION/as
+
+ where CONFIGURATION is the configuration name (perhaps `hpNNN-hpux')
+ and GCCVERSION is the GNU CC version number. Do this *before* starting
+ --- 86,92 ----
+ `jaguar.cs.utah.edu' `dist' subdirectory. You would need to install
+ GAS in the file
+
+ ! /gnu/lib/gcc-lib/CONFIGURATION/GCCVERSION/as
+
+ where CONFIGURATION is the configuration name (perhaps `hpNNN-hpux')
+ and GCCVERSION is the GNU CC version number. Do this *before* starting
+ ***************
+ *** 631,638 ****
+ target independent header files in that directory.
+
+ `LOCAL_INCLUDE_DIR' is used only for a native compiler. It is
+ ! normally `/usr/local/include'. GNU CC searches this directory so that
+ ! users can install header files in `/usr/local/include'.
+
+ `CROSS_INCLUDE_DIR' is used only for a cross compiler. GNU CC
+ doesn't install anything there.
+ --- 631,638 ----
+ target independent header files in that directory.
+
+ `LOCAL_INCLUDE_DIR' is used only for a native compiler. It is
+ ! normally `/gnu/include'. GNU CC searches this directory so that users
+ ! can install header files in `/gnu/include'.
+
+ `CROSS_INCLUDE_DIR' is used only for a cross compiler. GNU CC
+ doesn't install anything there.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-7 gcc-2.5.8/gcc.info-7
+ *** gcc-2.5.8-fsf/gcc.info-7 Sat Nov 27 19:38:49 1993
+ --- gcc-2.5.8/gcc.info-7 Tue May 3 14:10:15 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-8 gcc-2.5.8/gcc.info-8
+ *** gcc-2.5.8-fsf/gcc.info-8 Sat Nov 27 19:38:54 1993
+ --- gcc-2.5.8/gcc.info-8 Tue May 3 14:10:16 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ ***************
+ *** 509,516 ****
+
+ * In previous versions of GNU CC, the `gcc' driver program looked for
+ `as' and `ld' in various places; for example, in files beginning
+ ! with `/usr/local/lib/gcc-'. GNU CC version 2 looks for them in
+ ! the directory `/usr/local/lib/gcc-lib/TARGET/VERSION'.
+
+ Thus, to use a version of `as' or `ld' that is not the system
+ default, for example `gas' or GNU `ld', you must put them in that
+ --- 509,516 ----
+
+ * In previous versions of GNU CC, the `gcc' driver program looked for
+ `as' and `ld' in various places; for example, in files beginning
+ ! with `/gnu/lib/gcc-'. GNU CC version 2 looks for them in the
+ ! directory `/gnu/lib/gcc-lib/TARGET/VERSION'.
+
+ Thus, to use a version of `as' or `ld' that is not the system
+ default, for example `gas' or GNU `ld', you must put them in that
+ ***************
+ *** 680,687 ****
+
+ * On System V, if you get an error like this,
+
+ ! /usr/local/lib/bison.simple: In function `yyparse':
+ ! /usr/local/lib/bison.simple:625: virtual memory exhausted
+
+ that too indicates a problem with disk space, ULIMIT, or `MAXUMEM'.
+
+ --- 680,687 ----
+
+ * On System V, if you get an error like this,
+
+ ! /gnu/lib/bison.simple: In function `yyparse':
+ ! /gnu/lib/bison.simple:625: virtual memory exhausted
+
+ that too indicates a problem with disk space, ULIMIT, or `MAXUMEM'.
+
+ ***************
+ *** 871,877 ****
+
+ Instead, you should use these options (when compiling C programs):
+
+ ! -I/usr/local/lib/gcc-lib/TARGET/VERSION/include -I/usr/include
+
+ For C++ programs, GNU CC also uses a special directory that
+ defines C++ interfaces to standard C subroutines. This directory
+ --- 871,877 ----
+
+ Instead, you should use these options (when compiling C programs):
+
+ ! -I/gnu/lib/gcc-lib/TARGET/VERSION/include -I/usr/include
+
+ For C++ programs, GNU CC also uses a special directory that
+ defines C++ interfaces to standard C subroutines. This directory
+ ***************
+ *** 880,886 ****
+ C++ programs and specifying include directories explicitly, use
+ this option first, then the two options above:
+
+ ! -I/usr/local/lib/g++-include
+
+ * On some SGI systems, when you use `-lgl_s' as an option, it gets
+ translated magically to `-lgl_s -lX11_s -lc_s'. Naturally, this
+ --- 880,886 ----
+ C++ programs and specifying include directories explicitly, use
+ this option first, then the two options above:
+
+ ! -I/gnu/lib/g++-include
+
+ * On some SGI systems, when you use `-lgl_s' as an option, it gets
+ translated magically to `-lgl_s -lX11_s -lc_s'. Naturally, this
+ ***************
+ *** 1098,1104 ****
+ with the ordinary C compiler. If you do so, you must specify the
+ following options:
+
+ ! -L/usr/local/lib/gcc-lib/we32k-att-sysv/2.5 -lgcc -lc_s
+
+ The first specifies where to find the library `libgcc.a' specified
+ with the `-lgcc' option.
+ --- 1098,1104 ----
+ with the ordinary C compiler. If you do so, you must specify the
+ following options:
+
+ ! -L/gnu/lib/gcc-lib/we32k-att-sysv/2.5 -lgcc -lc_s
+
+ The first specifies where to find the library `libgcc.a' specified
+ with the `-lgcc' option.
+ ***************
+ *** 1167,1173 ****
+ If you have installed GNU malloc as a separate library package,
+ use this option when you relink GNU CC:
+
+ ! MALLOC=/usr/local/lib/libgmalloc.a
+
+ Alternatively, if you have compiled `gmalloc.c' from Emacs 19, copy
+ the object file to `gmalloc.o' and use this option when you relink
+ --- 1167,1173 ----
+ If you have installed GNU malloc as a separate library package,
+ use this option when you relink GNU CC:
+
+ ! MALLOC=/gnu/lib/libgmalloc.a
+
+ Alternatively, if you have compiled `gmalloc.c' from Emacs 19, copy
+ the object file to `gmalloc.o' and use this option when you relink
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.info-9 gcc-2.5.8/gcc.info-9
+ *** gcc-2.5.8-fsf/gcc.info-9 Sat Nov 27 19:38:54 1993
+ --- gcc-2.5.8/gcc.info-9 Tue May 3 14:10:17 1994
+ ***************
+ *** 1,4 ****
+ ! This is Info file gcc.info, produced by Makeinfo-1.54 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ --- 1,4 ----
+ ! This is Info file gcc.info, produced by Makeinfo-1.55 from the input
+ file gcc.texi.
+
+ This file documents the use and the internals of the GNU compiler.
+ diff -rc --new-file gcc-2.5.8-fsf/gcc.texi gcc-2.5.8/gcc.texi
+ *** gcc-2.5.8-fsf/gcc.texi Sat Nov 27 19:13:22 1993
+ --- gcc-2.5.8/gcc.texi Tue Feb 22 11:27:42 1994
+ ***************
+ *** 1075,1083 ****
+ @item
+ In previous versions of GNU CC, the @code{gcc} driver program looked for
+ @code{as} and @code{ld} in various places; for example, in files
+ ! beginning with @file{/usr/local/lib/gcc-}. GNU CC version 2 looks for
+ them in the directory
+ ! @file{/usr/local/lib/gcc-lib/@var{target}/@var{version}}.
+
+ Thus, to use a version of @code{as} or @code{ld} that is not the system
+ default, for example @code{gas} or GNU @code{ld}, you must put them in
+ --- 1075,1083 ----
+ @item
+ In previous versions of GNU CC, the @code{gcc} driver program looked for
+ @code{as} and @code{ld} in various places; for example, in files
+ ! beginning with @file{/gnu/lib/gcc-}. GNU CC version 2 looks for
+ them in the directory
+ ! @file{/gnu/lib/gcc-lib/@var{target}/@var{version}}.
+
+ Thus, to use a version of @code{as} or @code{ld} that is not the system
+ default, for example @code{gas} or GNU @code{ld}, you must put them in
+ ***************
+ *** 1276,1283 ****
+ On System V, if you get an error like this,
+
+ @example
+ ! /usr/local/lib/bison.simple: In function `yyparse':
+ ! /usr/local/lib/bison.simple:625: virtual memory exhausted
+ @end example
+
+ @noindent
+ --- 1276,1283 ----
+ On System V, if you get an error like this,
+
+ @example
+ ! /gnu/lib/bison.simple: In function `yyparse':
+ ! /gnu/lib/bison.simple:625: virtual memory exhausted
+ @end example
+
+ @noindent
+ ***************
+ *** 1507,1513 ****
+ Instead, you should use these options (when compiling C programs):
+
+ @smallexample
+ ! -I/usr/local/lib/gcc-lib/@var{target}/@var{version}/include -I/usr/include
+ @end smallexample
+
+ For C++ programs, GNU CC also uses a special directory that defines C++
+ --- 1507,1513 ----
+ Instead, you should use these options (when compiling C programs):
+
+ @smallexample
+ ! -I/gnu/lib/gcc-lib/@var{target}/@var{version}/include -I/usr/include
+ @end smallexample
+
+ For C++ programs, GNU CC also uses a special directory that defines C++
+ ***************
+ *** 1518,1524 ****
+ options above:
+
+ @example
+ ! -I/usr/local/lib/g++-include
+ @end example
+
+ @ignore
+ --- 1518,1524 ----
+ options above:
+
+ @example
+ ! -I/gnu/lib/g++-include
+ @end example
+
+ @ignore
+ ***************
+ *** 1789,1795 ****
+ options:
+
+ @smallexample
+ ! -L/usr/local/lib/gcc-lib/we32k-att-sysv/2.5 -lgcc -lc_s
+ @end smallexample
+
+ The first specifies where to find the library @file{libgcc.a}
+ --- 1789,1795 ----
+ options:
+
+ @smallexample
+ ! -L/gnu/lib/gcc-lib/we32k-att-sysv/2.5 -lgcc -lc_s
+ @end smallexample
+
+ The first specifies where to find the library @file{libgcc.a}
+ ***************
+ *** 1869,1875 ****
+ option when you relink GNU CC:
+
+ @example
+ ! MALLOC=/usr/local/lib/libgmalloc.a
+ @end example
+
+ Alternatively, if you have compiled @file{gmalloc.c} from Emacs 19, copy
+ --- 1869,1875 ----
+ option when you relink GNU CC:
+
+ @example
+ ! MALLOC=/gnu/lib/libgmalloc.a
+ @end example
+
+ Alternatively, if you have compiled @file{gmalloc.c} from Emacs 19, copy
+ diff -rc --new-file gcc-2.5.8-fsf/genconfig.c gcc-2.5.8/genconfig.c
+ *** gcc-2.5.8-fsf/genconfig.c Tue Oct 13 04:11:48 1992
+ --- gcc-2.5.8/genconfig.c Tue Feb 22 11:23:23 1994
+ ***************
+ *** 303,310 ****
+ --- 303,318 ----
+ printf ("/* Generated automatically by the program `genconfig'\n\
+ from the machine description file `md'. */\n\n");
+
+ + #ifdef amigados
+ + /* this constant probably better be 14 in general, or a cross compiling
+ + host might choke on some amigados header files... */
+ +
+ + /* Allow at least 14 operands for the sake of asm constructs. */
+ + max_recog_operands = 14;
+ + #else
+ /* Allow at least 10 operands for the sake of asm constructs. */
+ max_recog_operands = 9; /* We will add 1 later. */
+ + #endif
+ max_dup_operands = 1;
+
+ /* Read the machine description. */
+ diff -rc --new-file gcc-2.5.8-fsf/gstdarg.h gcc-2.5.8/gstdarg.h
+ *** gcc-2.5.8-fsf/gstdarg.h Sat Nov 13 01:54:16 1993
+ --- gcc-2.5.8/gstdarg.h Tue Feb 22 11:23:26 1994
+ ***************
+ *** 157,160 ****
+ --- 157,166 ----
+
+ #endif /* __GNUC__ */
+ #endif /* not _ANSI_STDARG_H_ */
+ + #ifdef amigados
+ + # ifndef _VA_LIST
+ + # define _VA_LIST
+ + typedef __gnuc_va_list va_list;
+ + # endif
+ + #endif /* amigados */
+ #endif /* not _STDARG_H */
+ diff -rc --new-file gcc-2.5.8-fsf/gstddef.h gcc-2.5.8/gstddef.h
+ *** gcc-2.5.8-fsf/gstddef.h Fri Dec 3 11:47:17 1993
+ --- gcc-2.5.8/gstddef.h Tue Feb 22 11:23:31 1994
+ ***************
+ *** 3,8 ****
+ --- 3,48 ----
+ #ifndef _ANSI_STDDEF_H
+ #ifndef __STDDEF_H__
+
+ + #ifdef amigados
+ +
+ + /* GNU libc has special support in this file, 4.3bsd-net2 libc deserves that
+ + just as well. The system headers are ANSI compliant, the used compiler IS
+ + gcc, so it's really ok to use the system header, no reason to hassle
+ + with a jungle of ifdefs. Besides, amigados is only defined if compiling
+ + with host=amigados, it doesn't apply if compiling with target=amigados
+ + on a different host with possibly different system headers. Same thing
+ + would apply to gstdarg.h and gvarargs.h, but those headers are more
+ + easily fixable than this one and I'm sick of writing the same comment
+ + there as well. MW
+ +
+ + Include the contents of <stddef.h> inline rather than with a #include,
+ + to avoid infinite include recursion when this file is installed in
+ + gcc's include directory as stddef.h. (fnf) */
+ +
+ + #define _STDDEF_H_
+ +
+ + #include <machine/ansi.h>
+ +
+ + typedef _PTRDIFF_T_ ptrdiff_t;
+ +
+ + #ifdef _SIZE_T_
+ + typedef _SIZE_T_ size_t;
+ + #undef _SIZE_T_
+ + #endif
+ +
+ + #ifdef _WCHAR_T_
+ + typedef _WCHAR_T_ wchar_t;
+ + #undef _WCHAR_T_
+ + #endif
+ +
+ + #ifndef NULL
+ + #define NULL 0
+ + #endif
+ +
+ + #define offsetof(type, member) ((size_t)(&((type *)0)->member))
+ +
+ + #else /* not amigados */
+ +
+ /* Any one of these symbols __need_* means that GNU libc
+ wants us just to define one data type. So don't define
+ the symbols that indicate this file's entire job has been done. */
+ ***************
+ *** 172,177 ****
+ --- 212,219 ----
+ #ifndef __WCHAR_TYPE__
+ #define __WCHAR_TYPE__ int
+ #endif
+ +
+ + #endif /* not amigados */
+ #ifdef __GNUG__
+ /* In C++, wchar_t is a distinct basic type,
+ and we can expect __wchar_t to be defined by cc1plus. */
+ diff -rc --new-file gcc-2.5.8-fsf/gvarargs.h gcc-2.5.8/gvarargs.h
+ *** gcc-2.5.8-fsf/gvarargs.h Sat Nov 13 08:33:41 1993
+ --- gcc-2.5.8/gvarargs.h Tue Feb 22 11:23:35 1994
+ ***************
+ *** 156,162 ****
+ /* The macro _VA_LIST_T_H is used in the Bull dpx2 */
+ #ifndef _VA_LIST_T_H
+ #define _VA_LIST_T_H
+ ! #if !(defined (__BSD_NET2__) || defined (____386BSD____) || defined (__bsdi__) || defined (__sequent__))
+ #define _VA_LIST_
+ #endif
+ #define _VA_LIST
+ --- 156,162 ----
+ /* The macro _VA_LIST_T_H is used in the Bull dpx2 */
+ #ifndef _VA_LIST_T_H
+ #define _VA_LIST_T_H
+ ! #if !(defined (__BSD_NET2__) || defined (____386BSD____) || defined (__bsdi__) || defined (__sequent__) || defined (__amigados__))
+ #define _VA_LIST_
+ #endif
+ #define _VA_LIST
+ ***************
+ *** 172,176 ****
+ --- 172,183 ----
+ #ifdef _BSD_VA_LIST
+ #undef _BSD_VA_LIST
+ #endif
+ +
+ + #ifdef amigados
+ + # ifndef _VA_LIST
+ + # define _VA_LIST
+ + typedef __gnuc_va_list va_list;
+ + # endif
+ + #endif /* amigados */
+
+ #endif /* __GNUC__ */
+ diff -rc --new-file gcc-2.5.8-fsf/install.texi gcc-2.5.8/install.texi
+ *** gcc-2.5.8-fsf/install.texi Wed Nov 24 20:09:49 1993
+ --- gcc-2.5.8/install.texi Tue Feb 22 11:27:48 1994
+ ***************
+ *** 599,618 ****
+ @end itemize
+
+ @item
+ ! The standard directory for installing GNU CC is @file{/usr/local/lib}.
+ If you want to install its files somewhere else, specify
+ @samp{--prefix=@var{dir}} when you run @file{configure}. Here @var{dir}
+ ! is a directory name to use instead of @file{/usr/local} for all purposes
+ ! with one exception: the directory @file{/usr/local/include} is searched
+ for header files no matter where you install the compiler.
+
+ @item
+ Specify @samp{--local-prefix=@var{dir}} if you want the compiler to
+ search directory @file{@var{dir}/include} for header files
+ ! @emph{instead} of @file{/usr/local/include}. (This is for systems that
+ have different conventions for where to put site-specific things.)
+
+ ! Unless you have a convention other than @file{/usr/local} for
+ site-specific files, it is a bad idea to specify @samp{--local-prefix}.
+
+ @cindex Bison parser generator
+ --- 599,618 ----
+ @end itemize
+
+ @item
+ ! The standard directory for installing GNU CC is @file{/gnu/lib}.
+ If you want to install its files somewhere else, specify
+ @samp{--prefix=@var{dir}} when you run @file{configure}. Here @var{dir}
+ ! is a directory name to use instead of @file{/gnu} for all purposes
+ ! with one exception: the directory @file{/gnu/include} is searched
+ for header files no matter where you install the compiler.
+
+ @item
+ Specify @samp{--local-prefix=@var{dir}} if you want the compiler to
+ search directory @file{@var{dir}/include} for header files
+ ! @emph{instead} of @file{/gnu/include}. (This is for systems that
+ have different conventions for where to put site-specific things.)
+
+ ! Unless you have a convention other than @file{/gnu} for
+ site-specific files, it is a bad idea to specify @samp{--local-prefix}.
+
+ @cindex Bison parser generator
+ ***************
+ *** 673,679 ****
+ If you are building with a previous GNU C compiler, do not
+ use @samp{CC=gcc} on the make command or by editing the Makefile.
+ Instead, use a full pathname to specify the compiler, such as
+ ! @samp{CC=/usr/local/bin/gcc}. This is because make might execute
+ the @file{gcc} in the current directory before all of the
+ compiler components have been built.
+
+ --- 673,679 ----
+ If you are building with a previous GNU C compiler, do not
+ use @samp{CC=gcc} on the make command or by editing the Makefile.
+ Instead, use a full pathname to specify the compiler, such as
+ ! @samp{CC=/gnu/bin/gcc}. This is because make might execute
+ the @file{gcc} in the current directory before all of the
+ compiler components have been built.
+
+ ***************
+ *** 827,840 ****
+ @noindent
+ This copies the files @file{cc1}, @file{cpp} and @file{libgcc.a} to
+ files @file{cc1}, @file{cpp} and @file{libgcc.a} in the directory
+ ! @file{/usr/local/lib/gcc-lib/@var{target}/@var{version}}, which is where
+ the compiler driver program looks for them. Here @var{target} is the
+ target machine type specified when you ran @file{configure}, and
+ @var{version} is the version number of GNU CC. This naming scheme
+ permits various versions and/or cross-compilers to coexist.
+
+ This also copies the driver program @file{xgcc} into
+ ! @file{/usr/local/bin/gcc}, so that it appears in typical execution
+ search paths.
+
+ On some systems, this command causes recompilation of some files. This
+ --- 827,840 ----
+ @noindent
+ This copies the files @file{cc1}, @file{cpp} and @file{libgcc.a} to
+ files @file{cc1}, @file{cpp} and @file{libgcc.a} in the directory
+ ! @file{/gnu/lib/gcc-lib/@var{target}/@var{version}}, which is where
+ the compiler driver program looks for them. Here @var{target} is the
+ target machine type specified when you ran @file{configure}, and
+ @var{version} is the version number of GNU CC. This naming scheme
+ permits various versions and/or cross-compilers to coexist.
+
+ This also copies the driver program @file{xgcc} into
+ ! @file{/gnu/bin/gcc}, so that it appears in typical execution
+ search paths.
+
+ On some systems, this command causes recompilation of some files. This
+ ***************
+ *** 1021,1027 ****
+
+ If you have a cross-assembler and cross-linker available, you should
+ install them now. Put them in the directory
+ ! @file{/usr/local/@var{target}/bin}. Here is a table of the tools
+ you should put in this directory:
+
+ @table @file
+ --- 1021,1027 ----
+
+ If you have a cross-assembler and cross-linker available, you should
+ install them now. Put them in the directory
+ ! @file{/gnu/@var{target}/bin}. Here is a table of the tools
+ you should put in this directory:
+
+ @table @file
+ ***************
+ *** 1052,1065 ****
+
+ If you want to install libraries to use with the cross-compiler, such as
+ a standard C library, put them in the directory
+ ! @file{/usr/local/@var{target}/lib}; installation of GNU CC copies all
+ all the files in that subdirectory into the proper place for GNU CC to
+ find them and link with them. Here's an example of copying some
+ libraries from a target machine:
+
+ @example
+ ftp @var{target-machine}
+ ! lcd /usr/local/@var{target}/lib
+ cd /lib
+ get libc.a
+ cd /usr/lib
+ --- 1052,1065 ----
+
+ If you want to install libraries to use with the cross-compiler, such as
+ a standard C library, put them in the directory
+ ! @file{/gnu/@var{target}/lib}; installation of GNU CC copies all
+ all the files in that subdirectory into the proper place for GNU CC to
+ find them and link with them. Here's an example of copying some
+ libraries from a target machine:
+
+ @example
+ ftp @var{target-machine}
+ ! lcd /gnu/@var{target}/lib
+ cd /lib
+ get libc.a
+ cd /usr/lib
+ ***************
+ *** 1075,1081 ****
+ @cindex start files
+ Many targets require ``start files'' such as @file{crt0.o} and
+ @file{crtn.o} which are linked into each executable; these too should be
+ ! placed in @file{/usr/local/@var{target}/lib}. There may be several
+ alternatives for @file{crt0.o}, for use with profiling or other
+ compilation options. Check your target's definition of
+ @code{STARTFILE_SPEC} to find out what start files it uses.
+ --- 1075,1081 ----
+ @cindex start files
+ Many targets require ``start files'' such as @file{crt0.o} and
+ @file{crtn.o} which are linked into each executable; these too should be
+ ! placed in @file{/gnu/@var{target}/lib}. There may be several
+ alternatives for @file{crt0.o}, for use with profiling or other
+ compilation options. Check your target's definition of
+ @code{STARTFILE_SPEC} to find out what start files it uses.
+ ***************
+ *** 1083,1089 ****
+
+ @example
+ ftp @var{target-machine}
+ ! lcd /usr/local/@var{target}/lib
+ prompt
+ cd /lib
+ mget *crt*.o
+ --- 1083,1089 ----
+
+ @example
+ ftp @var{target-machine}
+ ! lcd /gnu/@var{target}/lib
+ prompt
+ cd /lib
+ mget *crt*.o
+ ***************
+ *** 1201,1207 ****
+ cross-compiling.
+
+ When you have found suitable header files, put them in
+ ! @file{/usr/local/@var{target}/include}, before building the cross
+ compiler. Then installation will run fixincludes properly and install
+ the corrected versions of the header files where the compiler will use
+ them.
+ --- 1201,1207 ----
+ cross-compiling.
+
+ When you have found suitable header files, put them in
+ ! @file{/gnu/@var{target}/include}, before building the cross
+ compiler. Then installation will run fixincludes properly and install
+ the corrected versions of the header files where the compiler will use
+ them.
+ ***************
+ *** 1222,1228 ****
+
+ @example
+ ftp @var{target-machine}
+ ! lcd /usr/local/@var{target}/include
+ get tarfile
+ quit
+ tar xf tarfile
+ --- 1222,1228 ----
+
+ @example
+ ftp @var{target-machine}
+ ! lcd /gnu/@var{target}/include
+ get tarfile
+ quit
+ tar xf tarfile
+ ***************
+ *** 1283,1289 ****
+ @samp{dist} subdirectory. You would need to install GAS in the file
+
+ @example
+ ! /usr/local/lib/gcc-lib/@var{configuration}/@var{gccversion}/as
+ @end example
+
+ @noindent
+ --- 1283,1289 ----
+ @samp{dist} subdirectory. You would need to install GAS in the file
+
+ @example
+ ! /gnu/lib/gcc-lib/@var{configuration}/@var{gccversion}/as
+ @end example
+
+ @noindent
+ ***************
+ *** 1915,1922 ****
+ installs only target independent header files in that directory.
+
+ @code{LOCAL_INCLUDE_DIR} is used only for a native compiler. It is
+ ! normally @file{/usr/local/include}. GNU CC searches this directory so
+ ! that users can install header files in @file{/usr/local/include}.
+
+ @code{CROSS_INCLUDE_DIR} is used only for a cross compiler. GNU CC
+ doesn't install anything there.
+ --- 1915,1922 ----
+ installs only target independent header files in that directory.
+
+ @code{LOCAL_INCLUDE_DIR} is used only for a native compiler. It is
+ ! normally @file{/gnu/include}. GNU CC searches this directory so
+ ! that users can install header files in @file{/gnu/include}.
+
+ @code{CROSS_INCLUDE_DIR} is used only for a cross compiler. GNU CC
+ doesn't install anything there.
+ diff -rc --new-file gcc-2.5.8-fsf/invoke.texi gcc-2.5.8/invoke.texi
+ *** gcc-2.5.8-fsf/invoke.texi Thu Nov 11 13:32:01 1993
+ --- gcc-2.5.8/invoke.texi Tue Feb 22 11:27:55 1994
+ ***************
+ *** 2079,2085 ****
+ For each subprogram to be run, the compiler driver first tries the
+ @samp{-B} prefix, if any. If that name is not found, or if @samp{-B}
+ was not specified, the driver tries two standard prefixes, which are
+ ! @file{/usr/lib/gcc/} and @file{/usr/local/lib/gcc-lib/}. If neither of
+ those results in a file name that is found, the unmodified program
+ name is searched for using the directories specified in your
+ @samp{PATH} environment variable.
+ --- 2079,2085 ----
+ For each subprogram to be run, the compiler driver first tries the
+ @samp{-B} prefix, if any. If that name is not found, or if @samp{-B}
+ was not specified, the driver tries two standard prefixes, which are
+ ! @file{/usr/lib/gcc/} and @file{/gnu/lib/gcc-lib/}. If neither of
+ those results in a file name that is found, the unmodified program
+ name is searched for using the directories specified in your
+ @samp{PATH} environment variable.
+ ***************
+ *** 2145,2155 ****
+ The @samp{-b} and @samp{-V} options actually work by controlling part of
+ the file name used for the executable files and libraries used for
+ compilation. A given version of GNU CC, for a given target machine, is
+ ! normally kept in the directory @file{/usr/local/lib/gcc-lib/@var{machine}/@var{version}}.@refill
+
+ Thus, sites can customize the effect of @samp{-b} or @samp{-V} either by
+ changing the names of these directories or adding alternate names (or
+ ! symbolic links). If in directory @file{/usr/local/lib/gcc-lib/} the
+ file @file{80386} is a link to the file @file{i386v}, then @samp{-b
+ 80386} becomes an alias for @samp{-b i386v}.
+
+ --- 2145,2155 ----
+ The @samp{-b} and @samp{-V} options actually work by controlling part of
+ the file name used for the executable files and libraries used for
+ compilation. A given version of GNU CC, for a given target machine, is
+ ! normally kept in the directory @file{/gnu/lib/gcc-lib/@var{machine}/@var{version}}.@refill
+
+ Thus, sites can customize the effect of @samp{-b} or @samp{-V} either by
+ changing the names of these directories or adding alternate names (or
+ ! symbolic links). If in directory @file{/gnu/lib/gcc-lib/} the
+ file @file{80386} is a link to the file @file{i386v}, then @samp{-b
+ 80386} becomes an alias for @samp{-b i386v}.
+
+ ***************
+ *** 3526,3536 ****
+
+ In addition, the prefix is used in an unusual way in finding the
+ directories to search for header files. For each of the standard
+ ! directories whose name normally begins with @samp{/usr/local/lib/gcc-lib}
+ (more precisely, with the value of @code{GCC_INCLUDE_DIR}), GNU CC tries
+ replacing that beginning with the specified prefix to produce an
+ alternate directory name. Thus, with @samp{-Bfoo/}, GNU CC will search
+ ! @file{foo/bar} where it would normally search @file{/usr/local/lib/bar}.
+ These alternate directories are searched first; the standard directories
+ come next.
+
+ --- 3526,3536 ----
+
+ In addition, the prefix is used in an unusual way in finding the
+ directories to search for header files. For each of the standard
+ ! directories whose name normally begins with @samp{/gnu/lib/gcc-lib}
+ (more precisely, with the value of @code{GCC_INCLUDE_DIR}), GNU CC tries
+ replacing that beginning with the specified prefix to produce an
+ alternate directory name. Thus, with @samp{-Bfoo/}, GNU CC will search
+ ! @file{foo/bar} where it would normally search @file{/gnu/lib/bar}.
+ These alternate directories are searched first; the standard directories
+ come next.
+
+ ***************
+ *** 3641,3647 ****
+ @table @code
+ @item -B @var{directory}
+ Look for the file @file{SYSCALLS.c.X} in @var{directory}, instead of the
+ ! usual directory (normally @file{/usr/local/lib}). This file contains
+ prototype information about standard system functions. This option
+ applies only to @code{protoize}.
+
+ --- 3641,3647 ----
+ @table @code
+ @item -B @var{directory}
+ Look for the file @file{SYSCALLS.c.X} in @var{directory}, instead of the
+ ! usual directory (normally @file{/gnu/lib}). This file contains
+ prototype information about standard system functions. This option
+ applies only to @code{protoize}.
+
+ diff -rc --new-file gcc-2.5.8-fsf/machmode.h gcc-2.5.8/machmode.h
+ *** gcc-2.5.8-fsf/machmode.h Mon Jun 28 01:18:48 1993
+ --- gcc-2.5.8/machmode.h Tue Feb 22 11:23:39 1994
+ ***************
+ *** 92,98 ****
+
+ /* Get the name of mode MODE as a string. */
+
+ ! extern char *mode_name[];
+ #define GET_MODE_NAME(MODE) (mode_name[(int)(MODE)])
+
+ enum mode_class { MODE_RANDOM, MODE_INT, MODE_FLOAT, MODE_PARTIAL_INT, MODE_CC,
+ --- 92,98 ----
+
+ /* Get the name of mode MODE as a string. */
+
+ ! extern char * const mode_name[];
+ #define GET_MODE_NAME(MODE) (mode_name[(int)(MODE)])
+
+ enum mode_class { MODE_RANDOM, MODE_INT, MODE_FLOAT, MODE_PARTIAL_INT, MODE_CC,
+ ***************
+ *** 101,107 ****
+ /* Get the general kind of object that mode MODE represents
+ (integer, floating, complex, etc.) */
+
+ ! extern enum mode_class mode_class[];
+ #define GET_MODE_CLASS(MODE) (mode_class[(int)(MODE)])
+
+ /* Nonzero if MODE is an integral mode. */
+ --- 101,107 ----
+ /* Get the general kind of object that mode MODE represents
+ (integer, floating, complex, etc.) */
+
+ ! extern const enum mode_class mode_class[];
+ #define GET_MODE_CLASS(MODE) (mode_class[(int)(MODE)])
+
+ /* Nonzero if MODE is an integral mode. */
+ ***************
+ *** 117,128 ****
+
+ /* Get the size in bytes of an object of mode MODE. */
+
+ ! extern int mode_size[];
+ #define GET_MODE_SIZE(MODE) (mode_size[(int)(MODE)])
+
+ /* Get the size in bytes of the basic parts of an object of mode MODE. */
+
+ ! extern int mode_unit_size[];
+ #define GET_MODE_UNIT_SIZE(MODE) (mode_unit_size[(int)(MODE)])
+
+ /* Get the number of units in the object. */
+ --- 117,128 ----
+
+ /* Get the size in bytes of an object of mode MODE. */
+
+ ! extern const int mode_size[];
+ #define GET_MODE_SIZE(MODE) (mode_size[(int)(MODE)])
+
+ /* Get the size in bytes of the basic parts of an object of mode MODE. */
+
+ ! extern const int mode_unit_size[];
+ #define GET_MODE_UNIT_SIZE(MODE) (mode_unit_size[(int)(MODE)])
+
+ /* Get the number of units in the object. */
+ ***************
+ *** 144,150 ****
+
+ /* Get the next wider natural mode (eg, QI -> HI -> SI -> DI -> TI). */
+
+ ! extern enum machine_mode mode_wider_mode[];
+ #define GET_MODE_WIDER_MODE(MODE) (mode_wider_mode[(int)(MODE)])
+
+ /* Return the mode for data of a given size SIZE and mode class CLASS.
+ --- 144,150 ----
+
+ /* Get the next wider natural mode (eg, QI -> HI -> SI -> DI -> TI). */
+
+ ! extern const enum machine_mode mode_wider_mode[];
+ #define GET_MODE_WIDER_MODE(MODE) (mode_wider_mode[(int)(MODE)])
+
+ /* Return the mode for data of a given size SIZE and mode class CLASS.
+ diff -rc --new-file gcc-2.5.8-fsf/objc-parse.c gcc-2.5.8/objc-parse.c
+ *** gcc-2.5.8-fsf/objc-parse.c Sat Nov 27 11:34:19 1993
+ --- gcc-2.5.8/objc-parse.c Tue Feb 22 11:23:46 1994
+ ***************
+ *** 1529,1535 ****
+ 53
+ };
+ /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+ ! #line 3 "/usr/local/lib/bison.simple"
+
+ /* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
+ --- 1529,1535 ----
+ 53
+ };
+ /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+ ! #line 3 "/usr/lib/bison.simple"
+
+ /* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
+ ***************
+ *** 1710,1733 ****
+ #endif
+ #endif
+
+ ! #line 184 "/usr/local/lib/bison.simple"
+ !
+ ! /* The user can define YYPARSE_PARAM as the name of an argument to be passed
+ ! into yyparse. The argument should have type void *.
+ ! It should actually point to an object.
+ ! Grammar actions can access the variable by casting it
+ ! to the proper pointer type. */
+ !
+ ! #ifdef YYPARSE_PARAM
+ ! #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+ ! #else
+ ! #define YYPARSE_PARAM
+ ! #define YYPARSE_PARAM_DECL
+ ! #endif
+ !
+ int
+ ! yyparse(YYPARSE_PARAM)
+ ! YYPARSE_PARAM_DECL
+ {
+ register int yystate;
+ register int yyn;
+ --- 1710,1718 ----
+ #endif
+ #endif
+
+ ! #line 184 "/usr/lib/bison.simple"
+ int
+ ! yyparse()
+ {
+ register int yystate;
+ register int yyn;
+ ***************
+ *** 4516,4522 ****
+ break;}
+ }
+ /* the action file gets copied in in place of this dollarsign */
+ ! #line 480 "/usr/local/lib/bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+ --- 4501,4507 ----
+ break;}
+ }
+ /* the action file gets copied in in place of this dollarsign */
+ ! #line 465 "/usr/lib/bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+ diff -rc --new-file gcc-2.5.8-fsf/print-tree.c gcc-2.5.8/print-tree.c
+ *** gcc-2.5.8-fsf/print-tree.c Wed Oct 27 05:55:26 1993
+ --- gcc-2.5.8/print-tree.c Tue Feb 22 11:23:51 1994
+ ***************
+ *** 24,30 ****
+
+ extern char **tree_code_name;
+
+ ! extern char *mode_name[];
+
+ void print_node ();
+ void indent_to ();
+ --- 24,30 ----
+
+ extern char **tree_code_name;
+
+ ! extern char *const mode_name[];
+
+ void print_node ();
+ void indent_to ();
+ diff -rc --new-file gcc-2.5.8-fsf/protoize.c gcc-2.5.8/protoize.c
+ *** gcc-2.5.8-fsf/protoize.c Wed Nov 24 19:31:26 1993
+ --- gcc-2.5.8/protoize.c Tue Feb 22 11:28:02 1994
+ ***************
+ *** 202,208 ****
+ /* Define a default place to find the SYSCALLS.X file. */
+
+ #ifndef STD_PROTO_DIR
+ ! #define STD_PROTO_DIR "/usr/local/lib"
+ #endif /* !defined (STD_PROTO_DIR) */
+
+ /* Suffix of aux_info files. */
+ --- 202,208 ----
+ /* Define a default place to find the SYSCALLS.X file. */
+
+ #ifndef STD_PROTO_DIR
+ ! #define STD_PROTO_DIR "/gnu/lib"
+ #endif /* !defined (STD_PROTO_DIR) */
+
+ /* Suffix of aux_info files. */
+ ***************
+ *** 266,276 ****
+ just as it is done in cccp.c. */
+
+ #ifndef STANDARD_INCLUDE_DIR
+ ! #define STANDARD_INCLUDE_DIR "/usr/include"
+ #endif
+
+ #ifndef LOCAL_INCLUDE_DIR
+ ! #define LOCAL_INCLUDE_DIR "/usr/local/include"
+ #endif
+
+ struct default_include { const char *fname; int cplusplus; } include_defaults[]
+ --- 266,276 ----
+ just as it is done in cccp.c. */
+
+ #ifndef STANDARD_INCLUDE_DIR
+ ! #define STANDARD_INCLUDE_DIR "/gnu/include"
+ #endif
+
+ #ifndef LOCAL_INCLUDE_DIR
+ ! #define LOCAL_INCLUDE_DIR "/local/include"
+ #endif
+
+ struct default_include { const char *fname; int cplusplus; } include_defaults[]
+ ***************
+ *** 839,846 ****
+ --- 839,851 ----
+ {
+ struct default_include *p;
+
+ + #ifdef FILE_NAME_ABSOLUTE_P
+ + if (! FILE_NAME_ABSOLUTE_P (path))
+ + abort ();
+ + #else
+ if (path[0] != '/')
+ abort (); /* Must be an absolutized filename. */
+ + #endif
+
+ for (p = include_defaults; p->fname; p++)
+ if (!strncmp (path, p->fname, strlen (p->fname))
+ ***************
+ *** 1267,1273 ****
+ --- 1272,1282 ----
+ {
+ const char *src_p;
+
+ + #ifdef FILE_NAME_ABSOLUTE_P
+ + if (! FILE_NAME_ABSOLUTE_P (rel_filename))
+ + #else
+ if (rel_filename[0] != '/')
+ + #endif
+ {
+ src_p = cwd2;
+ while (*endp++ = *src_p++)
+ ***************
+ *** 1530,1535 ****
+ --- 1539,1563 ----
+ return ++q;
+ }
+
+ + /* Use this macro to advance a char * over the filename part in a line
+ + read from an aux-info file. */
+ +
+ + #ifndef amigados
+ + /* Version for file systems where the colon has no special meaning */
+ + #define ADVANCE_PAST_FILENAME(CP) \
+ + while (* (CP) != ':') (CP)++
+ + #else
+ + /* Have to heuristically decide whether the colon is part of the filename
+ + or whether it serves to delimit the filename from the line number. If
+ + it's the latter case, then the character following the colon *must*
+ + be a digit. Note that this heuristic fails if the filename starts
+ + with a digit. */
+ + #define ADVANCE_PAST_FILENAME(CP) \
+ + while ((CP)[0] != ':' || !isdigit ((CP)[1])) \
+ + (CP)++;
+ + #endif
+ +
+ +
+ /* Given a line from an aux info file, and a time at which the aux info
+ file it came from was created, check to see if the item described in
+ the line comes from a file which has been modified since the aux info
+ ***************
+ *** 1551,1558 ****
+ {
+ const char *filename_start = p = l + 3;
+
+ ! while (*p != ':')
+ ! p++;
+ filename = (char *) alloca ((size_t) (p - filename_start) + 1);
+ strncpy (filename, filename_start, (size_t) (p - filename_start));
+ filename[p-filename_start] = '\0';
+ --- 1579,1585 ----
+ {
+ const char *filename_start = p = l + 3;
+
+ ! ADVANCE_PAST_FILENAME (p);
+ filename = (char *) alloca ((size_t) (p - filename_start) + 1);
+ strncpy (filename, filename_start, (size_t) (p - filename_start));
+ filename[p-filename_start] = '\0';
+ ***************
+ *** 1609,1616 ****
+ const char *filename_start = p = l + 3;
+ char *filename;
+
+ ! while (*p != ':')
+ ! p++;
+ filename = (char *) alloca ((size_t) (p - filename_start) + 1);
+ strncpy (filename, filename_start, (size_t) (p - filename_start));
+ filename[p-filename_start] = '\0';
+ --- 1636,1642 ----
+ const char *filename_start = p = l + 3;
+ char *filename;
+
+ ! ADVANCE_PAST_FILENAME (p);
+ filename = (char *) alloca ((size_t) (p - filename_start) + 1);
+ strncpy (filename, filename_start, (size_t) (p - filename_start));
+ filename[p-filename_start] = '\0';
+ ***************
+ *** 2330,2336 ****
+ {
+ char *p = aux_info_base;
+
+ ! while (*p != ':')
+ p++;
+ p++;
+ while (*p == ' ')
+ --- 2356,2364 ----
+ {
+ char *p = aux_info_base;
+
+ ! /* have to make sure at least one space is following the colon to make
+ ! sure the colon is not part of the filename */
+ ! while (*p != ':' && p[1] != ' ')
+ p++;
+ p++;
+ while (*p == ' ')
+ ***************
+ *** 2344,2350 ****
+ continue;
+ aux_info_second_line = p;
+ aux_info_relocated_name = 0;
+ ! if (invocation_filename[0] != '/')
+ {
+ /* INVOCATION_FILENAME is relative;
+ append it to BASE_SOURCE_FILENAME's dir. */
+ --- 2372,2382 ----
+ continue;
+ aux_info_second_line = p;
+ aux_info_relocated_name = 0;
+ ! #ifdef FILE_NAME_ABSOLUTE_P
+ ! if (! FILE_NAME_ABSOLUTE_P (invocation_filename))
+ ! #else
+ ! if (invocation_filename[0] != '/')
+ ! #endif
+ {
+ /* INVOCATION_FILENAME is relative;
+ append it to BASE_SOURCE_FILENAME's dir. */
+ ***************
+ *** 2432,2438 ****
+ #ifndef UNPROTOIZE
+
+ /* Check an individual filename for a .c suffix. If the filename has this
+ ! suffix, rename the file such that its suffix is changed to .C. This
+ function implements the -C option. */
+
+ static void
+ --- 2464,2470 ----
+ #ifndef UNPROTOIZE
+
+ /* Check an individual filename for a .c suffix. If the filename has this
+ ! suffix, rename the file such that its suffix is changed to .cc. This
+ function implements the -C option. */
+
+ static void
+ ***************
+ *** 2441,2447 ****
+ {
+ const char *filename = hp->symbol;
+ int last_char_index = strlen (filename) - 1;
+ ! char *const new_filename = (char *) alloca (strlen (filename) + 1);
+
+ /* Note that we don't care here if the given file was converted or not. It
+ is possible that the given file was *not* converted, simply because there
+ --- 2473,2479 ----
+ {
+ const char *filename = hp->symbol;
+ int last_char_index = strlen (filename) - 1;
+ ! char *const new_filename = (char *) alloca (strlen (filename) + 2);
+
+ /* Note that we don't care here if the given file was converted or not. It
+ is possible that the given file was *not* converted, simply because there
+ ***************
+ *** 2453,2460 ****
+ return;
+
+ strcpy (new_filename, filename);
+ ! new_filename[last_char_index] = 'C';
+
+ if (my_link (filename, new_filename) == -1)
+ {
+ fprintf (stderr, "%s: warning: can't link file `%s' to `%s': %s\n",
+ --- 2485,2509 ----
+ return;
+
+ strcpy (new_filename, filename);
+ ! strcat (new_filename + last_char_index, "cc");
+ !
+ ! /* use rename(2) if available !! Update config files to include HAVE_rename
+ ! if the used OS provides it. Advantages are: it's atomic, it's one
+ ! system call compared to two. */
+
+ + #ifdef HAVE_rename
+ + /* if the mentioned systems (POSIX 1003.1-1988) have rename(2), this has
+ + to be changed to `my_rename' as well. */
+ +
+ + if (rename (filename, new_filename) == -1)
+ + {
+ + fprintf (stderr, "%s: warning: can't rename file `%s' to `%s': %s\n",
+ + pname, shortpath (NULL, filename),
+ + shortpath (NULL, new_filename), sys_errlist[errno]);
+ + errors++;
+ + return;
+ + }
+ + #else
+ if (my_link (filename, new_filename) == -1)
+ {
+ fprintf (stderr, "%s: warning: can't link file `%s' to `%s': %s\n",
+ ***************
+ *** 2471,2476 ****
+ --- 2520,2526 ----
+ errors++;
+ return;
+ }
+ + #endif
+ }
+
+ #endif /* !defined (UNPROTOIZE) */
+ diff -rc --new-file gcc-2.5.8-fsf/real.c gcc-2.5.8/real.c
+ *** gcc-2.5.8-fsf/real.c Wed Oct 13 19:46:38 1993
+ --- gcc-2.5.8/real.c Tue Feb 22 11:24:04 1994
+ ***************
+ *** 4333,4341 ****
+ if (y[NE - 1] == 0x7fff)
+ {
+ if (sign)
+ ! sprintf (wstring, " -Infinity ");
+ else
+ ! sprintf (wstring, " Infinity ");
+ goto bxit;
+ }
+
+ --- 4333,4341 ----
+ if (y[NE - 1] == 0x7fff)
+ {
+ if (sign)
+ ! sprintf (wstring, " -NaN ");
+ else
+ ! sprintf (wstring, " NaN ");
+ goto bxit;
+ }
+
+ diff -rc --new-file gcc-2.5.8-fsf/rtl.c gcc-2.5.8/rtl.c
+ *** gcc-2.5.8-fsf/rtl.c Thu Oct 7 21:05:00 1993
+ --- gcc-2.5.8/rtl.c Tue Feb 22 11:24:10 1994
+ ***************
+ *** 50,56 ****
+
+ #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
+
+ ! char *rtx_name[] = {
+ #include "rtl.def" /* rtl expressions are documented here */
+ };
+
+ --- 50,56 ----
+
+ #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
+
+ ! char * const rtx_name[] = {
+ #include "rtl.def" /* rtl expressions are documented here */
+ };
+
+ ***************
+ *** 61,67 ****
+
+ #define DEF_MACHMODE(SYM, NAME, CLASS, SIZE, UNIT, WIDER) NAME,
+
+ ! char *mode_name[(int) MAX_MACHINE_MODE] = {
+ #include "machmode.def"
+
+ #ifdef EXTRA_CC_MODES
+ --- 61,67 ----
+
+ #define DEF_MACHMODE(SYM, NAME, CLASS, SIZE, UNIT, WIDER) NAME,
+
+ ! char * const mode_name[(int) MAX_MACHINE_MODE] = {
+ #include "machmode.def"
+
+ #ifdef EXTRA_CC_MODES
+ ***************
+ *** 77,83 ****
+
+ #define DEF_MACHMODE(SYM, NAME, CLASS, SIZE, UNIT, WIDER) CLASS,
+
+ ! enum mode_class mode_class[(int) MAX_MACHINE_MODE] = {
+ #include "machmode.def"
+ };
+
+ --- 77,83 ----
+
+ #define DEF_MACHMODE(SYM, NAME, CLASS, SIZE, UNIT, WIDER) CLASS,
+
+ ! const enum mode_class mode_class[(int) MAX_MACHINE_MODE] = {
+ #include "machmode.def"
+ };
+
+ ***************
+ *** 88,94 ****
+
+ #define DEF_MACHMODE(SYM, NAME, CLASS, SIZE, UNIT, WIDER) SIZE,
+
+ ! int mode_size[(int) MAX_MACHINE_MODE] = {
+ #include "machmode.def"
+ };
+
+ --- 88,94 ----
+
+ #define DEF_MACHMODE(SYM, NAME, CLASS, SIZE, UNIT, WIDER) SIZE,
+
+ ! const int mode_size[(int) MAX_MACHINE_MODE] = {
+ #include "machmode.def"
+ };
+
+ ***************
+ *** 99,105 ****
+
+ #define DEF_MACHMODE(SYM, NAME, CLASS, SIZE, UNIT, WIDER) UNIT,
+
+ ! int mode_unit_size[(int) MAX_MACHINE_MODE] = {
+ #include "machmode.def" /* machine modes are documented here */
+ };
+
+ --- 99,105 ----
+
+ #define DEF_MACHMODE(SYM, NAME, CLASS, SIZE, UNIT, WIDER) UNIT,
+
+ ! const int mode_unit_size[(int) MAX_MACHINE_MODE] = {
+ #include "machmode.def" /* machine modes are documented here */
+ };
+
+ ***************
+ *** 112,118 ****
+ #define DEF_MACHMODE(SYM, NAME, CLASS, SIZE, UNIT, WIDER) \
+ (enum machine_mode) WIDER,
+
+ ! enum machine_mode mode_wider_mode[(int) MAX_MACHINE_MODE] = {
+ #include "machmode.def" /* machine modes are documented here */
+ };
+
+ --- 112,118 ----
+ #define DEF_MACHMODE(SYM, NAME, CLASS, SIZE, UNIT, WIDER) \
+ (enum machine_mode) WIDER,
+
+ ! const enum machine_mode mode_wider_mode[(int) MAX_MACHINE_MODE] = {
+ #include "machmode.def" /* machine modes are documented here */
+ };
+
+ ***************
+ *** 126,132 ****
+ rtx's of that code. The sequence is a C string in which
+ each character describes one operand. */
+
+ ! char *rtx_format[] = {
+ /* "*" undefined.
+ can cause a warning message
+ "0" field is unused (or used in a phase-dependent manner)
+ --- 126,132 ----
+ rtx's of that code. The sequence is a C string in which
+ each character describes one operand. */
+
+ ! char *const rtx_format[] = {
+ /* "*" undefined.
+ can cause a warning message
+ "0" field is unused (or used in a phase-dependent manner)
+ ***************
+ *** 157,163 ****
+ /* Indexed by rtx code, gives a character representing the "class" of
+ that rtx code. See rtl.def for documentation on the defined classes. */
+
+ ! char rtx_class[] = {
+ #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) CLASS,
+ #include "rtl.def" /* rtl expressions are defined here */
+ #undef DEF_RTL_EXPR
+ --- 157,163 ----
+ /* Indexed by rtx code, gives a character representing the "class" of
+ that rtx code. See rtl.def for documentation on the defined classes. */
+
+ ! const char rtx_class[] = {
+ #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) CLASS,
+ #include "rtl.def" /* rtl expressions are defined here */
+ #undef DEF_RTL_EXPR
+ ***************
+ *** 165,171 ****
+
+ /* Names for kinds of NOTEs and REG_NOTEs. */
+
+ ! char *note_insn_name[] = { 0 , "NOTE_INSN_DELETED",
+ "NOTE_INSN_BLOCK_BEG", "NOTE_INSN_BLOCK_END",
+ "NOTE_INSN_LOOP_BEG", "NOTE_INSN_LOOP_END",
+ "NOTE_INSN_FUNCTION_END", "NOTE_INSN_SETJMP",
+ --- 165,171 ----
+
+ /* Names for kinds of NOTEs and REG_NOTEs. */
+
+ ! char * const note_insn_name[] = { 0 , "NOTE_INSN_DELETED",
+ "NOTE_INSN_BLOCK_BEG", "NOTE_INSN_BLOCK_END",
+ "NOTE_INSN_LOOP_BEG", "NOTE_INSN_LOOP_END",
+ "NOTE_INSN_FUNCTION_END", "NOTE_INSN_SETJMP",
+ ***************
+ *** 173,179 ****
+ "NOTE_INSN_PROLOGUE_END", "NOTE_INSN_EPILOGUE_BEG",
+ "NOTE_INSN_DELETED_LABEL", "NOTE_INSN_FUNCTION_BEG"};
+
+ ! char *reg_note_name[] = { "", "REG_DEAD", "REG_INC", "REG_EQUIV", "REG_WAS_0",
+ "REG_EQUAL", "REG_RETVAL", "REG_LIBCALL",
+ "REG_NONNEG", "REG_NO_CONFLICT", "REG_UNUSED",
+ "REG_CC_SETTER", "REG_CC_USER", "REG_LABEL",
+ --- 173,180 ----
+ "NOTE_INSN_PROLOGUE_END", "NOTE_INSN_EPILOGUE_BEG",
+ "NOTE_INSN_DELETED_LABEL", "NOTE_INSN_FUNCTION_BEG"};
+
+ ! char * const reg_note_name[] =
+ ! { "", "REG_DEAD", "REG_INC", "REG_EQUIV", "REG_WAS_0",
+ "REG_EQUAL", "REG_RETVAL", "REG_LIBCALL",
+ "REG_NONNEG", "REG_NO_CONFLICT", "REG_UNUSED",
+ "REG_CC_SETTER", "REG_CC_USER", "REG_LABEL",
+ diff -rc --new-file gcc-2.5.8-fsf/rtl.h gcc-2.5.8/rtl.h
+ *** gcc-2.5.8-fsf/rtl.h Wed Sep 29 22:34:24 1993
+ --- gcc-2.5.8/rtl.h Tue Feb 22 11:24:14 1994
+ ***************
+ *** 44,56 ****
+ extern int rtx_length[];
+ #define GET_RTX_LENGTH(CODE) (rtx_length[(int)(CODE)])
+
+ ! extern char *rtx_name[];
+ #define GET_RTX_NAME(CODE) (rtx_name[(int)(CODE)])
+
+ ! extern char *rtx_format[];
+ #define GET_RTX_FORMAT(CODE) (rtx_format[(int)(CODE)])
+
+ ! extern char rtx_class[];
+ #define GET_RTX_CLASS(CODE) (rtx_class[(int)(CODE)])
+
+ /* Common union for an element of an rtx. */
+ --- 44,56 ----
+ extern int rtx_length[];
+ #define GET_RTX_LENGTH(CODE) (rtx_length[(int)(CODE)])
+
+ ! extern char * const rtx_name[];
+ #define GET_RTX_NAME(CODE) (rtx_name[(int)(CODE)])
+
+ ! extern char * const rtx_format[];
+ #define GET_RTX_FORMAT(CODE) (rtx_format[(int)(CODE)])
+
+ ! extern const char rtx_class[];
+ #define GET_RTX_CLASS(CODE) (rtx_class[(int)(CODE)])
+
+ /* Common union for an element of an rtx. */
+ ***************
+ *** 331,337 ****
+
+ /* Names for REG_NOTE's in EXPR_LIST insn's. */
+
+ ! extern char *reg_note_name[];
+ #define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int)(MODE)])
+
+ /* The label-number of a code-label. The assembler label
+ --- 331,337 ----
+
+ /* Names for REG_NOTE's in EXPR_LIST insn's. */
+
+ ! extern char *const reg_note_name[];
+ #define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int)(MODE)])
+
+ /* The label-number of a code-label. The assembler label
+ ***************
+ *** 408,414 ****
+
+ /* Names for NOTE insn's other than line numbers. */
+
+ ! extern char *note_insn_name[];
+ #define GET_NOTE_INSN_NAME(NOTE_CODE) (note_insn_name[-(NOTE_CODE)])
+
+ /* The name of a label, in case it corresponds to an explicit label
+ --- 408,414 ----
+
+ /* Names for NOTE insn's other than line numbers. */
+
+ ! extern char *const note_insn_name[];
+ #define GET_NOTE_INSN_NAME(NOTE_CODE) (note_insn_name[-(NOTE_CODE)])
+
+ /* The name of a label, in case it corresponds to an explicit label
+ diff -rc --new-file gcc-2.5.8-fsf/scan-types.sh gcc-2.5.8/scan-types.sh
+ *** gcc-2.5.8-fsf/scan-types.sh Tue Oct 26 23:01:02 1993
+ --- gcc-2.5.8/scan-types.sh Tue Feb 22 11:24:18 1994
+ ***************
+ *** 1,4 ****
+ ! #! /bin/sh
+ # Deduce values of standard ANSI and POSIX types (e.g. size_t, pid_t).
+ # Emits macros definitions for these, and some other types.
+ # Intended to be used to massage the sys-protos.h file.
+ --- 1,4 ----
+ ! #!/bin/sh
+ # Deduce values of standard ANSI and POSIX types (e.g. size_t, pid_t).
+ # Emits macros definitions for these, and some other types.
+ # Intended to be used to massage the sys-protos.h file.
+ diff -rc --new-file gcc-2.5.8-fsf/tm.texi gcc-2.5.8/tm.texi
+ *** gcc-2.5.8-fsf/tm.texi Thu Nov 11 13:45:26 1993
+ --- gcc-2.5.8/tm.texi Tue Feb 22 11:28:11 1994
+ ***************
+ *** 205,211 ****
+ @findex STANDARD_EXEC_PREFIX
+ @item STANDARD_EXEC_PREFIX
+ Define this macro as a C string constant if you wish to override the
+ ! standard choice of @file{/usr/local/lib/gcc-lib/} as the default prefix to
+ try when searching for the executable files of the compiler.
+
+ @findex MD_EXEC_PREFIX
+ --- 205,211 ----
+ @findex STANDARD_EXEC_PREFIX
+ @item STANDARD_EXEC_PREFIX
+ Define this macro as a C string constant if you wish to override the
+ ! standard choice of @file{/gnu/lib/gcc-lib/} as the default prefix to
+ try when searching for the executable files of the compiler.
+
+ @findex MD_EXEC_PREFIX
+ ***************
+ *** 218,224 ****
+ @findex STANDARD_STARTFILE_PREFIX
+ @item STANDARD_STARTFILE_PREFIX
+ Define this macro as a C string constant if you wish to override the
+ ! standard choice of @file{/usr/local/lib/} as the default prefix to
+ try when searching for startup files such as @file{crt0.o}.
+
+ @findex MD_STARTFILE_PREFIX
+ --- 218,224 ----
+ @findex STANDARD_STARTFILE_PREFIX
+ @item STANDARD_STARTFILE_PREFIX
+ Define this macro as a C string constant if you wish to override the
+ ! standard choice of @file{/gnu/lib/} as the default prefix to
+ try when searching for startup files such as @file{crt0.o}.
+
+ @findex MD_STARTFILE_PREFIX
+ ***************
+ *** 237,248 ****
+ @findex LOCAL_INCLUDE_DIR
+ @item LOCAL_INCLUDE_DIR
+ Define this macro as a C string constant if you wish to override the
+ ! standard choice of @file{/usr/local/include} as the default prefix to
+ try when searching for local header files. @code{LOCAL_INCLUDE_DIR}
+ comes before @code{SYSTEM_INCLUDE_DIR} in the search order.
+
+ Cross compilers do not use this macro and do not search either
+ ! @file{/usr/local/include} or its replacement.
+
+ @findex SYSTEM_INCLUDE_DIR
+ @item SYSTEM_INCLUDE_DIR
+ --- 237,248 ----
+ @findex LOCAL_INCLUDE_DIR
+ @item LOCAL_INCLUDE_DIR
+ Define this macro as a C string constant if you wish to override the
+ ! standard choice of @file{/gnu/include} as the default prefix to
+ try when searching for local header files. @code{LOCAL_INCLUDE_DIR}
+ comes before @code{SYSTEM_INCLUDE_DIR} in the search order.
+
+ Cross compilers do not use this macro and do not search either
+ ! @file{/gnu/include} or its replacement.
+
+ @findex SYSTEM_INCLUDE_DIR
+ @item SYSTEM_INCLUDE_DIR
+ diff -rc --new-file gcc-2.5.8-fsf/toplev.c gcc-2.5.8/toplev.c
+ *** gcc-2.5.8-fsf/toplev.c Sat Dec 11 00:59:54 1993
+ --- gcc-2.5.8/toplev.c Tue Feb 22 11:24:24 1994
+ ***************
+ *** 504,509 ****
+ --- 504,510 ----
+ {"unroll-all-loops", &flag_unroll_all_loops, 1},
+ {"writable-strings", &flag_writable_strings, 1},
+ {"peephole", &flag_no_peephole, 0},
+ + {"large-baserel", &flag_pic, 4},
+ {"force-mem", &flag_force_mem, 1},
+ {"force-addr", &flag_force_addr, 1},
+ {"function-cse", &flag_no_function_cse, 0},
+ ***************
+ *** 522,527 ****
+ --- 523,529 ----
+ {"schedule-insns2", &flag_schedule_insns_after_reload, 1},
+ {"pic", &flag_pic, 1},
+ {"PIC", &flag_pic, 2},
+ + {"baserel", &flag_pic, 3},
+ {"fast-math", &flag_fast_math, 1},
+ {"common", &flag_no_common, 0},
+ {"inhibit-size-directive", &flag_inhibit_size_directive, 1},
+ ***************
+ *** 1530,1535 ****
+ --- 1532,1540 ----
+ FILE *asm_file;
+ char *input_name;
+ {
+ + #ifdef FILE_NAME_NONDIRECTORY
+ + char *na = FILE_NAME_NONDIRECTORY (input_name);
+ + #else
+ int len = strlen (input_name);
+ char *na = input_name + len;
+
+ ***************
+ *** 1540,1545 ****
+ --- 1545,1551 ----
+ break;
+ na--;
+ }
+ + #endif
+
+ #ifdef ASM_OUTPUT_MAIN_SOURCE_FILENAME
+ ASM_OUTPUT_MAIN_SOURCE_FILENAME (asm_file, na);
+ ***************
+ *** 3507,3512 ****
+ --- 3513,3519 ----
+
+ #ifndef OS2
+ #ifndef VMS
+ + #ifndef amigados
+ if (flag_print_mem)
+ {
+ char *lim = (char *) sbrk (0);
+ ***************
+ *** 3521,3526 ****
+ --- 3528,3534 ----
+ system ("ps v");
+ #endif /* not USG */
+ }
+ + #endif /* not amigados */
+ #endif /* not VMS */
+ #endif /* not OS2 */
+
+ diff -rc --new-file gcc-2.5.8-fsf/tree.c gcc-2.5.8/tree.c
+ *** gcc-2.5.8-fsf/tree.c Tue Jan 4 12:36:01 1994
+ --- gcc-2.5.8/tree.c Tue Feb 22 11:24:31 1994
+ ***************
+ *** 248,254 ****
+ /* Unique id for next type created. */
+ static int next_type_uid = 1;
+
+ ! extern char *mode_name[];
+
+ void gcc_obstack_init ();
+ static tree stabilize_reference_1 ();
+ --- 248,254 ----
+ /* Unique id for next type created. */
+ static int next_type_uid = 1;
+
+ ! extern char *const mode_name[];
+
+ void gcc_obstack_init ();
+ static tree stabilize_reference_1 ();
diff -rc --new-file /src/baseline/gnat-1.80/amiga/gcc-gnat.diffs gnat-1.80/amiga/gcc-gnat.diffs
*** /src/baseline/gnat-1.80/amiga/gcc-gnat.diffs Thu Jan 1 00:00:00 1970
--- gnat-1.80/amiga/gcc-gnat.diffs Wed Jul 6 14:44:54 1994
***************
*** 0 ****
--- 1,2092 ----
+ diff -rc gcc-2.5.8/Makefile.in gcc-2.5.8-ada/Makefile.in
+ *** gcc-2.5.8/Makefile.in Tue Feb 22 11:26:49 1994
+ --- gcc-2.5.8-ada/Makefile.in Wed Jul 6 08:41:43 1994
+ ***************
+ *** 29,41 ****
+ # See below for how to change them for certain systems.
+
+ # Selection of languages to be made.
+ ! LANGUAGES = c c++ objective-c proto
+
+ ALLOCA =
+ ALLOCA_FLAGS =
+ ALLOCA_FINISH = true
+
+ ! # Various ways of specifying flags for compilations:
+ # CFLAGS is for the user to override to, e.g., do a bootstrap with -O2.
+ # BOOT_CFLAGS is the value of CFLAGS to pass
+ # to the stage2 and stage3 compilations
+ --- 29,41 ----
+ # See below for how to change them for certain systems.
+
+ # Selection of languages to be made.
+ ! LANGUAGES = c c++ objective-c ada proto
+
+ ALLOCA =
+ ALLOCA_FLAGS =
+ ALLOCA_FINISH = true
+
+ ! # Various ways of specifying flags for compilations:
+ # CFLAGS is for the user to override to, e.g., do a bootstrap with -O2.
+ # BOOT_CFLAGS is the value of CFLAGS to pass
+ # to the stage2 and stage3 compilations
+ ***************
+ *** 70,76 ****
+ TEXI2DVI = texi2dvi
+
+ # Define this as & to perform parallel make on a Sequent.
+ ! # Note that this has some bugs, and it seems currently necessary
+ # to compile all the gen* files first by hand to avoid erroneous results.
+ P =
+
+ --- 70,76 ----
+ TEXI2DVI = texi2dvi
+
+ # Define this as & to perform parallel make on a Sequent.
+ ! # Note that this has some bugs, and it seems currently necessary
+ # to compile all the gen* files first by hand to avoid erroneous results.
+ P =
+
+ ***************
+ *** 133,139 ****
+ # PREMADE_ATTRTAB is the file name of the file to use.
+ # PREMADE_ATTRTAB_MD is the md file it corresponds to.
+ PREMADE_ATTRTAB_MD = Makefile # Guaranteed not to cmp equal to md.
+ ! PREMADE_ATTRTAB =
+
+ target= ... `configure' substitutes actual target name here.
+ xmake_file= ... `configure' substitutes actual x- file name here.
+ --- 133,139 ----
+ # PREMADE_ATTRTAB is the file name of the file to use.
+ # PREMADE_ATTRTAB_MD is the md file it corresponds to.
+ PREMADE_ATTRTAB_MD = Makefile # Guaranteed not to cmp equal to md.
+ ! PREMADE_ATTRTAB =
+
+ target= ... `configure' substitutes actual target name here.
+ xmake_file= ... `configure' substitutes actual x- file name here.
+ ***************
+ *** 230,243 ****
+ EXTRA_PASSES =
+
+ # Like EXTRA_PASSES, but these are used when linking.
+ ! EXTRA_PROGRAMS =
+
+ # List of extra object files that should be compiled for this target machine.
+ # The rules for compiling them should be in the t-* file for the machine.
+ EXTRA_PARTS =
+
+ # List of extra object files that should be compiled and linked with
+ ! # compiler proper (cc1, cc1obj, cc1plus).
+ EXTRA_OBJS =
+
+ # List of additional header files to install.
+ --- 230,243 ----
+ EXTRA_PASSES =
+
+ # Like EXTRA_PASSES, but these are used when linking.
+ ! EXTRA_PROGRAMS =
+
+ # List of extra object files that should be compiled for this target machine.
+ # The rules for compiling them should be in the t-* file for the machine.
+ EXTRA_PARTS =
+
+ # List of extra object files that should be compiled and linked with
+ ! # compiler proper (cc1, cc1obj, cc1plus, gnat1).
+ EXTRA_OBJS =
+
+ # List of additional header files to install.
+ ***************
+ *** 251,267 ****
+
+ # List of extra C and assembler files to add to libgcc1.a.
+ # Assembler files should have names ending in `.asm'.
+ ! LIB1FUNCS_EXTRA =
+
+ # List of extra C and assembler files to add to libgcc2.a.
+ # Assembler files should have names ending in `.asm'.
+ ! LIB2FUNCS_EXTRA =
+
+ # Default float.h source to use for cross-compiler.
+ CROSS_FLOAT_H=float.h-cross
+
+ # Program to convert libraries.
+ ! LIBCONVERT =
+
+ # Control whether header files are installed.
+ INSTALL_HEADERS=install-headers
+ --- 251,267 ----
+
+ # List of extra C and assembler files to add to libgcc1.a.
+ # Assembler files should have names ending in `.asm'.
+ ! LIB1FUNCS_EXTRA =
+
+ # List of extra C and assembler files to add to libgcc2.a.
+ # Assembler files should have names ending in `.asm'.
+ ! LIB2FUNCS_EXTRA =
+
+ # Default float.h source to use for cross-compiler.
+ CROSS_FLOAT_H=float.h-cross
+
+ # Program to convert libraries.
+ ! LIBCONVERT =
+
+ # Control whether header files are installed.
+ INSTALL_HEADERS=install-headers
+ ***************
+ *** 276,282 ****
+ # Additional directories of header files to run fixincludes on.
+ # These should be directories searched automatically by default
+ # just as /usr/include is.
+ ! # *Do not* use this for directories that happen to contain
+ # header files, but are not searched automatically by default.
+ # On most systems, this is empty.
+ OTHER_FIXINCLUDES_DIRS=
+ --- 276,282 ----
+ # Additional directories of header files to run fixincludes on.
+ # These should be directories searched automatically by default
+ # just as /usr/include is.
+ ! # *Do not* use this for directories that happen to contain
+ # header files, but are not searched automatically by default.
+ # On most systems, this is empty.
+ OTHER_FIXINCLUDES_DIRS=
+ ***************
+ *** 301,307 ****
+ HOST_PREFIX=
+ # Prefix to apply to names of object files when compiling them
+ # to run on the machine we are compiling on.
+ ! # The default for this variable is chosen to keep these rules
+ # out of the way of the other rules for compiling the same source files.
+ HOST_PREFIX_1=loser-
+ HOST_CC=$(CC)
+ --- 301,307 ----
+ HOST_PREFIX=
+ # Prefix to apply to names of object files when compiling them
+ # to run on the machine we are compiling on.
+ ! # The default for this variable is chosen to keep these rules
+ # out of the way of the other rules for compiling the same source files.
+ HOST_PREFIX_1=loser-
+ HOST_CC=$(CC)
+ ***************
+ *** 399,405 ****
+ # Lists of files for various purposes.
+
+ # A list of all the language-specific executables.
+ ! COMPILERS = cc1 cc1plus cc1obj
+
+ # Language-specific object files for C.
+ C_OBJS = c-parse.o c-lang.o c-lex.o c-pragma.o \
+ --- 399,405 ----
+ # Lists of files for various purposes.
+
+ # A list of all the language-specific executables.
+ ! COMPILERS = cc1 cc1plus cc1obj gnat1
+
+ # Language-specific object files for C.
+ C_OBJS = c-parse.o c-lang.o c-lex.o c-pragma.o \
+ ***************
+ *** 417,422 ****
+ --- 417,714 ----
+ cp-expr.o cp-pt.o cp-edsel.o cp-xref.o \
+ $(CPLUS_INPUT) cp-spew.o c-common.o cp-error.o cp-errfn.o
+
+ + # Languages-specific object files for Ada.
+ + # Object files for gnat1 from C sources.
+ + GNAT1_C_OBJS = b_gnat1.o a-adaint.o a-gettty.o a-gtran3.o a-misc.o a-trans3.o \
+ + a-trans4.o a-trans.o a-uintp.o a-urealp.o
+ +
+ + # Object files from Ada sources that are used by gnat1 and gnatf
+ + GNAT_ADA_OBJS = alloc.o atree.o casing.o comperr.o csets.o debug.o \
+ + debug_a.o einfo.o elists.o errout.o excep.o expand.o \
+ + exp_attr.o exp_ch2.o exp_ch3.o \
+ + exp_ch4.o exp_ch5.o exp_ch6.o exp_ch7.o exp_ch8.o exp_ch9.o exp_ch10.o \
+ + exp_ch11.o exp_ch12.o exp_ch13.o exp_intr.o exp_prag.o exp_util.o \
+ + fix_util.o fname.o frontend.o \
+ + get_targ.o gnatvsn.o itypes.o krunch.o lib.o limits.o namet.o nlists.o \
+ + nmake.o opt.o osint.o output.o par.o rtsfind.o scans.o scn.o \
+ + sdefault.o sem.o sem_aggr.o sem_attr.o sem_ch3.o sem_ch4.o \
+ + sem_ch5.o sem_ch6.o sem_ch7.o sem_ch8.o sem_ch9.o sem_ch10.o sem_ch11.o \
+ + sem_ch12.o sem_ch13.o sem_disp.o sem_eval.o sem_intr.o sem_prag.o \
+ + sem_res.o sem_type.o \
+ + sem_util.o sinfo.o sinfo-cn.o sinput.o snames.o sprint.o stand.o \
+ + stringt.o style.o switch.o system.o s-assert.o s-secsta.o \
+ + s-stalib.o s-stoele.o s-strcon.o s-strequ.o s-strops.o s-tasoli.o s-taspda.o \
+ + s-enviro.o tbuild.o treepr.o treeprs.o ttypes.o ttypef.o types.o \
+ + uintp.o urealp.o uname.o unixlib.o usage.o widechar.o
+ +
+ + # Object files for gnat executables
+ + GNATF_OBJS = $(GNAT_ADA_OBJS) gnatfdrv.o xref.o xref_tab.o a-adaint.o \
+ + a-gettty.o a-deftarg.o
+ + GNAT1_ADA_OBJS = $(GNAT_ADA_OBJS) back_end.o gnat1drv.o
+ + GNAT1_OBJS = $(GNAT1_C_OBJS) $(GNAT1_ADA_OBJS)
+ + GNATBIND_OBJS = gnatbind.o ali.o alloc.o bcheck.o binde.o binderr.o bindgen.o \
+ + bindusg.o butil.o debug.o excep.o gnatvsn.o limits.o namet.o \
+ + opt.o osint.o output.o sdefault.o switch.o system.o \
+ + s-assert.o s-strequ.o s-strops.o s-tasoli.o s-taspda.o s-secsta.o \
+ + s-stalib.o s-stoele.o s-enviro.o types.o unixlib.o widechar.o a-adaint.o
+ +
+ + # ??? should this include all the s-*.o files explicitly?
+ + GNATK8_OBJS = ada.o a-ioexce.o a-teioau.o a-textio.o gnatk8.o krunch.o \
+ + system.o s-enviro.o s-stoele.o s-secsta.o s-taspda.o s-tasoli.o \
+ + s-stalib.o $(LIBGNAT_OBJS)
+ +
+ + # The runtime library for gnat comprises two directories. One contains the
+ + # Ada source files that the compiler (gnat1) needs -- these files are listed
+ + # by ADA_INCLUDE_SRCS -- and the other contains the object files and their
+ + # corresponding .ali files for the parts written in Ada, libgnat.a for
+ + # the parts of the runtime written in C, and libpthreads.a for the pthreads
+ + # emulation library. LIBGNAT_OBJS lists the objects that go into libgnat.a,
+ + # while GNAT_RTL_OBJS lists the object files compiled from Ada sources that
+ + # go into the directory. The pthreads emulation is built in the threads
+ + # subdirectory and copied.
+ + LIBGNAT_SRCS = io-aux.c a-cio.c get_errno.c
+ +
+ + LIBGNAT_OBJS = io-aux.o a-cio.o get_errno.o
+ +
+ + # NOTE ??? - when the -I option for compiling Ada code is made to work,
+ + # the library installation will change and there will be a
+ + # GNAT_RTL_SRCS. Right now we count on being able to build GNAT_RTL_OBJS
+ + # from ADA_INCLUDE_SRCS.
+ + GNAT_RTL_OBJS = ada.o \
+ + a-calend.o \
+ + a-calcon.o \
+ + a-chlat1.o a-cwila1.o a-finali.o \
+ + a-charac.o \
+ + a-ioexce.o \
+ + a-numeri.o \
+ + a-numaux.o \
+ + a-nlelfu.o \
+ + a-nllefu.o \
+ + a-nselfu.o \
+ + a-nuelfu.o a-nuranu.o \
+ + a-reatim.o \
+ + a-retico.o \
+ + a-retide.o \
+ + a-string.o a-strmap.o a-strbou.o a-strcon.o\
+ + a-strfix.o a-strsea.o a-tags.o \
+ + a-taside.o \
+ + a-textio.o \
+ + a-teioau.o calendar.o interfac.o ioexcept.o \
+ + i-c.o \
+ + i-cstrin.o \
+ + system.o \
+ + s-addima.o \
+ + s-pooglo.o \
+ + s-poosiz.o \
+ + s-pooemp.o \
+ + s-pooloc.o \
+ + s-stopoo.o \
+ + s-assert.o \
+ + s-enviro.o \
+ + s-errrep.o \
+ + s-cconst.o \
+ + s-comexc.o \
+ + s-comopt.o \
+ + s-finimp.o \
+ + s-norstr.o \
+ + s-poscon.o \
+ + s-poserr.o \
+ + s-posrte.o \
+ + s-postim.o \
+ + s-pthrea.o \
+ + s-img_b.o \
+ + s-img_c.o s-img_i.o s-imglli.o \
+ + s-img_f.o s-img_lf.o s-imgllf.o s-img_sf.o \
+ + s-img_wc.o \
+ + s-secsta.o \
+ + s-stalib.o \
+ + s-std.o s-stoele.o \
+ + s-strcon.o s-strequ.o \
+ + s-strops.o \
+ + s-taprob.o \
+ + s-tasabo.o \
+ + s-tasoli.o \
+ + s-tasclo.o \
+ + s-taskin.o \
+ + s-tasmem.o \
+ + s-taspda.o \
+ + s-taspri.o \
+ + s-tasque.o \
+ + s-tasren.o \
+ + s-tassta.o \
+ + s-tastal.o \
+ + s-tasuti.o \
+ + s-tatise.o \
+ + s-tcmasp.o \
+ + s-timtyp.o \
+ + s-unstyp.o \
+ + s-xn.o \
+ + s-xn_f.o \
+ + s-xn_i.o \
+ + s-xn_lf.o \
+ + s-xn_li.o \
+ + s-xn_llf.o \
+ + s-xn_lli.o \
+ + s-xn_sf.o \
+ + s-xn_si.o \
+ + s-xn_ssi.o \
+ + s-xp.o \
+ + s-xp_bml.o \
+ + s-xp_bmi.o \
+ + s-xp_f.o s-xp_i.o \
+ + s-xp_lf.o s-xp_li.o s-xp_llf.o s-xp_lli.o \
+ + s-xp_nbm.o \
+ + s-xp_sf.o s-xp_si.o s-xp_ssi.o \
+ + s-valenu.o \
+ + s-valueb.o \
+ + s-valuec.o \
+ + text_io.o \
+ + io.o a-cio.o get_errno.o \
+ + s-retico.o \
+ + s-retide.o
+ +
+ + ADA_INCLUDE_SRCS = ada.ads \
+ + a-astaco.ads \
+ + a-calend.ads a-calend.adb \
+ + a-calcon.ads a-calcon.adb \
+ + a-caldel.adb \
+ + a-charac.ads a-charac.adb \
+ + a-chlat1.ads a-cwila1.ads \
+ + a-decima.ads \
+ + a-direio.ads a-direio.adb \
+ + a-dynpri.ads \
+ + a-except.ads a-finali.ads a-finali.adb \
+ + a-interr.ads \
+ + a-intnam.ads \
+ + a-ioexce.ads \
+ + a-numeri.ads \
+ + a-numaux.ads \
+ + a-nuelfu.ads \
+ + a-ngelfu.ads \
+ + a-ngelfu.adb \
+ + a-ngcoty.ads \
+ + a-ngcoty.adb \
+ + a-ngcefu.ads \
+ + a-ngcefu.adb \
+ + a-nlelfu.ads \
+ + a-nllefu.ads \
+ + a-nuranu.ads \
+ + a-nuranu.adb \
+ + a-nselfu.ads \
+ + a-reatim.ads a-reatim.adb \
+ + a-retico.ads a-retico.adb \
+ + a-retide.ads a-retide.adb \
+ + a-sequio.ads a-sequio.adb\
+ + a-string.ads \
+ + a-strcon.ads \
+ + a-strbou.ads a-strbou.adb \
+ + a-strfix.ads a-strfix.adb \
+ + a-strsea.ads a-strsea.adb \
+ + a-strmap.ads a-strmap.adb \
+ + a-stwibo.ads a-stwibo.adb \
+ + a-stwico.ads \
+ + a-stwifi.ads a-stwifi.adb \
+ + a-stwima.ads a-stwima.adb \
+ + a-stwise.ads a-stwise.adb \
+ + a-stwiun.ads a-stwiun.adb \
+ + a-strunb.ads a-strunb.adb \
+ + a-storio.ads a-storio.adb \
+ + a-stream.ads a-ststio.ads \
+ + a-tags.adb a-tags.ads \
+ + a-sytaco.ads \
+ + a-tasatt.ads a-tasatt.adb \
+ + a-taside.ads a-taside.adb \
+ + a-textio.ads a-textio.adb \
+ + a-teioau.ads a-teioau.adb \
+ + a-ticoio.ads a-ticoio.adb \
+ + a-teiopi.ads \
+ + a-unccon.ads a-unccon.adb \
+ + a-uncdea.ads a-uncdea.adb \
+ + a-witeio.ads \
+ + a-wticio.ads a-wticio.adb \
+ + a-wtiopi.ads \
+ + calendar.ads \
+ + directio.ads \
+ + interfac.ads \
+ + i-c.ads i-c.adb \
+ + i-cpoint.ads \
+ + i-cstrin.ads i-cstrin.adb\
+ + i-cobol.ads i-fortra.ads \
+ + ioexcept.ads \
+ + sequenio.ads \
+ + s-assert.ads \
+ + s-addima.ads s-addima.adb \
+ + s-errrep.ads s-errrep.adb \
+ + s-cconst.ads \
+ + s-comexc.ads s-comexc.adb \
+ + s-comopt.ads \
+ + s-enviro.ads s-enviro.adb \
+ + s-finimp.ads s-finimp.adb \
+ + s-img_b.adb s-img_b.ads \
+ + s-img_c.adb s-img_c.ads s-img_f.ads s-img_f.adb \
+ + s-img_i.ads s-img_i.adb s-img_lf.adb s-img_lf.ads \
+ + s-imgllf.adb s-imgllf.ads s-imglli.adb s-imglli.ads \
+ + s-img_sf.adb s-img_sf.ads s-img_wc.ads s-img_wc.adb \
+ + s-norstr.ads s-norstr.adb \
+ + s-pooglo.ads s-pooglo.adb \
+ + s-poosiz.ads s-poosiz.adb \
+ + s-pooemp.ads s-pooemp.adb \
+ + s-pooloc.ads s-pooloc.adb \
+ + s-stopoo.ads\
+ + s-poscon.ads \
+ + s-poserr.ads \
+ + s-posrte.ads s-posrte.adb \
+ + s-postim.ads s-postim.adb \
+ + s-pthrea.ads s-pthrea.adb \
+ + s-secsta.ads s-secsta.adb \
+ + s-stalib.ads \
+ + s-std.ads s-std.adb \
+ + s-stoele.ads s-stoele.adb \
+ + s-strcon.adb s-strcon.ads \
+ + s-strequ.adb s-strequ.ads \
+ + s-strops.adb s-strops.ads \
+ + s-taprob.adb s-taprob.ads \
+ + s-tasabo.adb s-tasabo.ads \
+ + s-tasoli.adb s-tasoli.ads \
+ + s-taspda.adb s-taspda.ads \
+ + s-tasclo.adb s-tasclo.ads \
+ + s-taskin.adb s-taskin.ads \
+ + s-tasmem.adb s-tasmem.ads \
+ + s-taspri.adb s-taspri.ads \
+ + s-tasque.adb s-tasque.ads \
+ + s-tasren.adb s-tasren.ads \
+ + s-tassta.adb s-tassta.ads \
+ + s-tastal.adb s-tastal.ads \
+ + s-tasuti.ads s-tasuti.adb \
+ + s-tatise.adb s-tatise.ads \
+ + s-tcmasp.adb s-tcmasp.ads \
+ + s-timtyp.ads \
+ + system.ads \
+ + s-xn.ads s-xn.adb \
+ + s-xn_i.ads s-xn_llf.ads s-xn_si.ads \
+ + s-xn_lf.ads s-xn_lli.ads s-xn_ssi.ads \
+ + s-xn_f.ads s-xn_li.ads s-xn_sf.ads \
+ + s-xp.adb s-xp.ads \
+ + s-xp_bml.ads s-xp_bml.adb \
+ + s-xp_bmi.ads s-xp_bmi.adb \
+ + s-xp_f.ads s-xp_i.ads s-xp_lf.ads s-xp_li.ads \
+ + s-xp_llf.ads s-xp_lli.ads \
+ + s-xp_nbm.adb s-xp_nbm.ads \
+ + s-xp_sf.ads s-xp_si.ads \
+ + s-xp_ssi.ads \
+ + s-unstyp.ads \
+ + s-valenu.ads s-valenu.adb \
+ + s-valueb.ads s-valueb.adb \
+ + s-valuec.ads s-valuec.adb \
+ + text_io.ads \
+ + unchconv.adb unchconv.ads \
+ + unchdeal.adb unchdeal.ads \
+ + io.ads io.adb \
+ + s-reatim.ads s-reatim.adb \
+ + s-retico.ads s-retico.adb \
+ + s-retide.ads s-retide.adb \
+ + s-taruty.ads s-taruty.adb
+ +
+ # Files specific to the C interpreter bytecode compiler(s).
+ BC_OBJS = bc-emit.o bc-optab.o
+
+ ***************
+ *** 449,455 ****
+ stamp-bcarity stamp-bcopcode stamp-bcopname \
+ bi-arity bi-opcode bi-opname \
+ $(GCC_PASSES) $(EXTRA_PARTS) $(EXTRA_PROGRAMS) gcc-cross cccp g++ g++-cross \
+ ! cc1plus cc1obj enquire protoize unprotoize specs collect2 $(USE_COLLECT2)
+
+ # Members of libgcc1.a.
+ LIB1FUNCS = _mulsi3 _udivsi3 _divsi3 _umodsi3 _modsi3 \
+ --- 741,748 ----
+ stamp-bcarity stamp-bcopcode stamp-bcopname \
+ bi-arity bi-opcode bi-opname \
+ $(GCC_PASSES) $(EXTRA_PARTS) $(EXTRA_PROGRAMS) gcc-cross cccp g++ g++-cross \
+ ! cc1plus cc1obj enquire protoize unprotoize specs collect2 $(USE_COLLECT2) \
+ ! gnat1 gnatbind gnatbl gnatf gnatk8 gnatchop *.ali
+
+ # Members of libgcc1.a.
+ LIB1FUNCS = _mulsi3 _udivsi3 _divsi3 _umodsi3 _modsi3 \
+ ***************
+ *** 491,503 ****
+ # Avoid a lot of time thinking about remaking Makefile.in and *.def.
+ .SUFFIXES: .in .def
+
+ Makefile: $(srcdir)/Makefile.in $(srcdir)/configure $(srcdir)/version.c \
+ $(srcdir)/config/$(xmake_file) $(srcdir)/config/$(tmake_file)
+ sh config.status
+
+ all.internal: start.encap rest.encap
+ # This is what to compile if making a cross-compiler.
+ ! # Note that we can compile enquire using the cross-compiler just build,
+ # although we can't run it on this machine.
+ all.cross: native gcc-cross g++-cross specs $(LIBGCC) stmp-headers $(STMP_FIXPROTO) $(CROSS_TEST) $(ENQUIRE) $(EXTRA_PARTS)
+ # This is what to compile if making gcc with a cross-compiler.
+ --- 784,812 ----
+ # Avoid a lot of time thinking about remaking Makefile.in and *.def.
+ .SUFFIXES: .in .def
+
+ + # Say how to compile Ada programs.
+ + .SUFFIXES: .ada .adb .ads
+ +
+ + ADA_CC=$(CC)
+ + ADAFLAGS= -gnatg -gnata
+ + BOOT_ADAFLAGS= $(ADAFLAGS)
+ + ALL_ADAFLAGS= $(CFLAGS) $(ADAFLAGS)
+ + GNATBIND= gnatbind
+ +
+ + .ada.o:
+ + $(ADA_CC) -c $(ALL_ADAFLAGS) $<
+ + .adb.o:
+ + $(ADA_CC) -c $(ALL_ADAFLAGS) $<
+ + .ads.o:
+ + $(ADA_CC) -c $(ALL_ADAFLAGS) $<
+ +
+ Makefile: $(srcdir)/Makefile.in $(srcdir)/configure $(srcdir)/version.c \
+ $(srcdir)/config/$(xmake_file) $(srcdir)/config/$(tmake_file)
+ sh config.status
+
+ all.internal: start.encap rest.encap
+ # This is what to compile if making a cross-compiler.
+ ! # Note that we can compile enquire using the cross-compiler just built,
+ # although we can't run it on this machine.
+ all.cross: native gcc-cross g++-cross specs $(LIBGCC) stmp-headers $(STMP_FIXPROTO) $(CROSS_TEST) $(ENQUIRE) $(EXTRA_PARTS)
+ # This is what to compile if making gcc with a cross-compiler.
+ ***************
+ *** 521,526 ****
+ --- 830,837 ----
+ # The next two ought to depend on objc-runtime, but that doesn't work yet.
+ OBJC objc: cc1obj
+ OBJECTIVE-C objective-c: cc1obj
+ + Ada ada: gnat1 gnatbind gnatbl gnatf gnatk8 gnatchop
+ + true
+ PROTO: proto
+
+ # Really, really stupid make features, such as SUN's KEEP_STATE, may force
+ ***************
+ *** 583,588 ****
+ --- 894,927 ----
+ cc1obj: $(P) $(OBJC_OBJS) $(OBJS) $(BC_OBJS) $(LIBDEPS)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o cc1obj $(OBJC_OBJS) $(OBJS) $(BC_OBJS) $(LIBS)
+
+ + # Needs to be built with CC=gcc
+ + gnat1: $(P) $(GNAT1_OBJS) $(OBJS) $(BC_OBJS) $(LIBDEPS)
+ + $(ADA_CC) $(ALL_CFLAGS) $(LDFLAGS) -o gnat1 $(GNAT1_OBJS) $(OBJS) $(BC_OBJS) $(LIBS)
+ +
+ + gnatf: $(P) $(GNATF_OBJS) b_gnatf.o
+ + $(ADA_CC) $(ALL_CFLAGS) $(LDFLAGS) -o gnatf $(GNATF_OBJS) b_gnatf.o
+ +
+ + gnatbind: $(P) $(GNATBIND_OBJS) b_gnatb.o
+ + $(ADA_CC) $(ALL_CFLAGS) $(LDFLAGS) -o gnatbind $(GNATBIND_OBJS)\
+ + b_gnatb.o
+ +
+ + gnatk8: $(P) $(GNATK8_OBJS) b_gnatk8.o
+ + $(ADA_CC) $(ALL_CFLAGS) $(LDFLAGS) -o gnatk8 $(GNATK8_OBJS) b_gnatk8.o
+ +
+ + gnatchp: $(P) gnatchop.o
+ + $(ADA_CC) $(ALL_CFLAGS) $(LDFLAGS) -o gnatchp gnatchop.o
+ +
+ + gnatbl.o: gnatbl.c config.status
+ + $(ADA_CC) -c $(ALL_CFLAGS) $(INCLUDES) \
+ + -DADA_RTL_OBJ_DIR="\"$(ADA_RTL_OBJ_DIR)\"" gnatbl.c
+ +
+ + gnatbl: gnatbl.o
+ + $(ADA_CC) -o gnatbl $(ALL_CFLAGS) $(LDFLAGS) gnatbl.o
+ +
+ + # .s files for cross-building
+ + gnat-cross: force
+ + make $(GNAT1_ADA_OBJS) CC="gcc -Bstage1/" CFLAGS="-S -gnatp"
+ +
+ # Copy float.h from its source.
+ gfloat.h: $(FLOAT_H)
+ cp $(FLOAT_H) gfloat.h
+ ***************
+ *** 634,640 ****
+ rm -f dummy.o dummy.c
+
+ # This is $(LIBGCC1) for a cross-compiler.
+ ! # We have no automatic way of building libgcc1.a,
+ # so it's up to the installer to find a way to do that.
+ # This rule deliberately does not depend on libgcc1.a
+ # so that it will fail if the installer hasn't provided it.
+ --- 973,979 ----
+ rm -f dummy.o dummy.c
+
+ # This is $(LIBGCC1) for a cross-compiler.
+ ! # We have no automatic way of building libgcc1.a,
+ # so it's up to the installer to find a way to do that.
+ # This rule deliberately does not depend on libgcc1.a
+ # so that it will fail if the installer hasn't provided it.
+ ***************
+ *** 794,799 ****
+ --- 1133,1153 ----
+ GCC_FOR_TARGET="$$thisdir1/$(XGCC) -B$$thisdir1/" \
+ GCC_CFLAGS="$(GCC_CFLAGS)"
+
+ + ada-runtime : $(GNAT_RTL_OBJS) libgnat.a
+ +
+ + libgnat.a : $(LIBGNAT_OBJS)
+ + -rm -f libgnat.a
+ + $(AR) rc libgnat.a $(LIBGNAT_OBJS)
+ +
+ + # The pthreads emulation is presumed to only work for sunos4.1
+ + # Create a dummy (links will fail) in other cases
+ + stamp-pthreads :
+ + (cd threads/src; \
+ + $(MAKE) clean; \
+ + $(MAKE) CC="../../xgcc -B../../" INC2="-I../../include" `case $(target) in sparc-sun-sunos4.1*) true;; \
+ + *) echo OBJS=fake.o ;; esac`)
+ + touch stamp-pthreads
+ +
+ # Compile two additional files that are linked with every program
+ # linked using GCC on system V, for the sake of C++ constructors.
+ crtbegin.o: crtstuff.c $(GCC_PASSES) $(CONFIG_H) gbl-ctors.h
+ ***************
+ *** 877,882 ****
+ --- 1231,1921 ----
+
+ g++.o : g++.c $(CONFIG_H) gvarargs.h
+
+ + # Ada language specific files.
+ +
+ + ada_extra_files : treeprs.ads a-einfo.h a-sinfo.h nmake.adb \
+ + nmake.ads
+ +
+ + b_gnat1.c : $(GNAT1_ADA_OBJS)
+ + $(GNATBIND) -o b_gnat1.c -n -t gnat1drv.ali
+ + b_gnat1.o : b_gnat1.c
+ +
+ + b_gnatf.c : $(GNATF_OBJS)
+ + $(GNATBIND) -o b_gnatf.c -t gnatfdrv.ali
+ +
+ + b_gnatf.o : b_gnatf.c
+ +
+ +
+ + b_gnatb.c : $(GNATBIND_OBJS)
+ + $(GNATBIND) -o b_gnatb.c -t gnatbind.ali
+ + b_gnatb.o : b_gnatb.c
+ +
+ + b_gnatk8.c : $(GNATK8_OBJS)
+ + $(GNATBIND) -o b_gnatk8.c -t gnatk8.ali
+ +
+ + b_gnatk8.o : b_gnatk8.c
+ +
+ + treeprs.ads : treeprs.adt sinfo.ads xtreeprs.spt
+ + spitbol xtreeprs.spt
+ +
+ + a-einfo.h : einfo.ads einfo.adb xeinfo.spt
+ + spitbol xeinfo.spt
+ +
+ + a-sinfo.h : sinfo.ads xsinfo.spt
+ + spitbol xsinfo.spt
+ +
+ + nmake.adb : nmake.adt sinfo.ads xnmake.spt
+ + spitbol xnmake.spt -b
+ +
+ + nmake.ads : nmake.adt sinfo.ads xnmake.spt
+ + spitbol xnmake.spt -s
+ +
+ + mkttypef.o : mkttypef.c hconfig.h machmode.h real.h
+ + $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(srcdir)/mkttypef.c
+ +
+ + mkttypef : mkttypef.o $(HOST_LIBDEPS)
+ + $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o mkttypef \
+ + mkttypef.o $(HOST_LIBS)
+ +
+ + ttypef.ads: stamp-ttypef; @true
+ + stamp-ttypef : ttypef.adt mkttypef $(srcdir)/move-if-change
+ + ./mkttypef ttypef.adt > tmp-ttypef.ads
+ + $(srcdir)/move-if-change tmp-ttypef.ads ttypef.ads
+ + touch stamp-ttypef
+ +
+ + ADA_INCLUDE_DIR = $(libsubdir)/adainclude
+ + ADA_RTL_OBJ_DIR = $(libsubdir)/adalib
+ + # Note: the strings below do not make sense for Ada strings in the OS/2
+ + # case. This is ignored for now since the OS/2 version doesn't use
+ + # these -- there are no default locations.
+ + sdefault.adb: stamp-sdefault ; @true
+ + stamp-sdefault : $(srcdir)/version.c $(srcdir)/move-if-change Makefile.in
+ + echo "package body Sdefault is" >tmp-sdefault.adb
+ + echo " function Include_Dir_Default_Name return String is" >>tmp-sdefault.adb
+ + echo " begin" >>tmp-sdefault.adb
+ + echo " return \"$(ADA_INCLUDE_DIR)/\";" >>tmp-sdefault.adb
+ + echo " end Include_Dir_Default_Name;" >>tmp-sdefault.adb
+ + echo " function Object_Dir_Default_Name return String is" >>tmp-sdefault.adb
+ + echo " begin" >>tmp-sdefault.adb
+ + echo " return \"$(ADA_RTL_OBJ_DIR)/\";" >>tmp-sdefault.adb
+ + echo " end Object_Dir_Default_Name;" >>tmp-sdefault.adb
+ + echo "end Sdefault;" >> tmp-sdefault.adb
+ + $(srcdir)/move-if-change tmp-sdefault.adb sdefault.adb
+ + touch stamp-sdefault
+ +
+ + A_MISC_H = a-misc.h a-tree.def
+ +
+ + # special compiles for sdefault without -gnatg, to avoid long line error
+ + osint.o : alloc.ads debug.ads limits.ads namet.ads opt.ads osint.ads \
+ + osint.adb output.ads sdefault.ads switch.ads system.ads \
+ + s-assert.ads s-strequ.ads s-enviro.ads \
+ + table.ads table.adb types.ads unchdeal.ads \
+ + unchdeal.adb unixlib.ads
+ + $(ADA_CC) -c $(CFLAGS) -gnata osint.adb
+ +
+ + sdefault.o : sdefault.ads sdefault.adb
+ + $(ADA_CC) -c $(CFLAGS) -gnata sdefault.adb
+ +
+ + a-adaint.o : $(CONFIG_H)
+ +
+ + a-gtran3.o : $(CONFIG_H) $(TREE_H) obstack.h flags.h convert.h a-ada.h \
+ + a-types.h a-atree.h a-sinfo.h a-snames.h a-einfo.h a-namet.h a-string.h \
+ + a-uintp.h a-trans.h a-trans3.h a-trans4.h a-gtran3.h $(A_MISC_H) a-rtree.h
+ +
+ + a-ptypes.o : $(CONFIG_H)
+ +
+ + a-misc.o : $(CONFIG_H) $(TREE_H) a-ada.h a-types.h a-atree.h a-sinfo.h \
+ + a-einfo.h a-namet.h a-string.h a-uintp.h a-trans.h a-trans3.h $(A_MISC_H) \
+ + a-rtree.h flags.h $(RTL_H) expr.h insn-codes.h
+ +
+ + a-trans3.o : $(CONFIG_H) $(TREE_H) flags.h a-ada.h a-types.h a-atree.h \
+ + a-sinfo.h a-einfo.h a-namet.h a-string.h a-uintp.h a-trans.h a-gtran3.h \
+ + a-trans3.h a-trans4.h $(A_MISC_H) a-rtree.h convert.h
+ +
+ + a-trans4.o : $(CONFIG_H) $(TREE_H) flags.h a-ada.h a-types.h a-atree.h \
+ + a-sinfo.h a-einfo.h a-namet.h a-snames.h a-string.h a-uintp.h a-trans.h \
+ + a-trans3.h a-trans4.h $(A_MISC_H)
+ +
+ + a-trans.o : $(CONFIG_H) $(TREE_H) flags.h a-ada.h a-types.h a-atree.h \
+ + a-sinfo.h a-snames.h a-einfo.h a-namet.h a-string.h a-uintp.h a-urealp.h \
+ + a-trans.h \
+ + a-trans3.h a-gtran3.h a-trans4.h $(A_MISC_H) a-rtree.h
+ +
+ + a-uintp.o : $(CONFIG_H) $(TREE_H) a-ada.h a-types.h a-atree.h a-sinfo.h \
+ + a-einfo.h a-namet.h a-string.h a-uintp.h
+ +
+ + a-urealp.o : $(CONFIG_H) $(TREE_H) a-ada.h a-types.h a-atree.h \
+ + a-einfo.h a-namet.h a-string.h a-uintp.h a-urealp.h
+ +
+ + a-ioexce.o : ada.ads a-ioexce.ads
+ +
+ + a-teioau.o : ada.ads a-ioexce.ads a-textio.ads a-teioau.ads a-teioau.adb \
+ + system.ads
+ +
+ + a-textio.o : ada.ads a-ioexce.ads a-textio.ads a-textio.adb a-teioau.ads
+ +
+ + ada.o : ada.ads
+ +
+ + ali.o : ali.ads ali.adb binderr.ads butil.ads debug.ads limits.ads \
+ + namet.ads opt.ads osint.ads output.ads system.ads table.ads table.adb \
+ + types.ads unchdeal.ads unchdeal.adb
+ +
+ + alloc.o : alloc.ads
+ +
+ + atree.o : alloc.ads atree.ads atree.adb casing.ads comperr.ads debug.ads \
+ + einfo.ads elists.ads nlists.ads output.ads sinfo.ads sinput.ads \
+ + system.ads s-assert.ads table.ads table.adb types.ads unchconv.ads \
+ + unchconv.adb unchdeal.ads unchdeal.adb
+ +
+ + back_end.o : alloc.ads atree.ads back_end.ads back_end.adb casing.ads \
+ + debug.ads einfo.ads elists.ads get_targ.ads lib.ads limits.ads \
+ + namet.ads nlists.ads output.ads sinfo.ads sinput.ads stringt.ads \
+ + system.ads table.ads table.adb ttypes.ads types.ads uintp.ads \
+ + unchdeal.ads unchdeal.adb urealp.ads
+ +
+ + bcheck.o : ali.ads bcheck.ads bcheck.adb binderr.ads debug.ads limits.ads \
+ + namet.ads opt.ads osint.ads output.ads system.ads table.ads table.adb \
+ + types.ads unchdeal.ads unchdeal.adb
+ +
+ + binde.o : ali.ads binde.ads binde.adb binderr.ads butil.ads debug.ads \
+ + limits.ads namet.ads opt.ads osint.ads output.ads system.ads \
+ + s-assert.ads table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+ +
+ + binderr.o : binderr.ads binderr.adb butil.ads debug.ads excep.ads \
+ + limits.ads namet.ads opt.ads osint.ads output.ads system.ads table.ads \
+ + table.adb types.ads unchdeal.ads unchdeal.adb
+ +
+ + bindgen.o : ali.ads binde.ads bindgen.ads bindgen.adb debug.ads limits.ads \
+ + namet.ads opt.ads osint.ads output.ads system.ads table.ads table.adb \
+ + types.ads unchdeal.ads unchdeal.adb
+ +
+ + bindusg.o : bindusg.ads bindusg.adb osint.ads output.ads system.ads \
+ + s-assert.ads types.ads unchdeal.ads unchdeal.adb
+ +
+ + butil.o : butil.ads butil.adb debug.ads limits.ads namet.ads output.ads \
+ + system.ads table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+ +
+ + casing.o : casing.ads casing.adb csets.ads debug.ads limits.ads namet.ads \
+ + output.ads scans.ads sinput.ads system.ads table.ads table.adb \
+ + types.ads unchdeal.ads unchdeal.adb widechar.ads
+ +
+ + comperr.o : alloc.ads atree.ads casing.ads comperr.ads comperr.adb \
+ + debug.ads einfo.ads errout.ads excep.ads osint.ads output.ads sinfo.ads \
+ + sinput.ads sprint.ads system.ads table.ads table.adb treepr.ads \
+ + types.ads unchdeal.ads unchdeal.adb
+ +
+ + csets.o : csets.ads csets.adb opt.ads osint.ads system.ads types.ads \
+ + unchdeal.ads unchdeal.adb
+ +
+ + debug.o : debug.ads debug.adb
+ +
+ + debug_a.o : alloc.ads atree.ads casing.ads comperr.ads debug.ads \
+ + debug_a.ads debug_a.adb einfo.ads output.ads sinfo.ads sinput.ads \
+ + system.ads table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+ +
+ + einfo.o : alloc.ads atree.ads debug.ads einfo.ads einfo.adb limits.ads \
+ + namet.ads nlists.ads output.ads sinfo.ads snames.ads stand.ads \
+ + system.ads s-assert.ads table.ads table.adb types.ads unchdeal.ads \
+ + unchdeal.adb
+ +
+ + elists.o : alloc.ads debug.ads elists.ads elists.adb output.ads system.ads \
+ + table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+ +
+ + errout.o : alloc.ads atree.ads casing.ads csets.ads debug.ads einfo.ads \
+ + errout.ads errout.adb excep.ads exp_util.ads get_targ.ads lib.ads \
+ + limits.ads namet.ads opt.ads osint.ads output.ads rtsfind.ads scans.ads \
+ + sinfo.ads sinput.ads stand.ads system.ads s-assert.ads table.ads \
+ + table.adb ttypes.ads types.ads uintp.ads uname.ads unchdeal.ads \
+ + unchdeal.adb
+ +
+ + excep.o : excep.ads
+ +
+ + exp_attr.o : alloc.ads atree.ads debug.ads einfo.ads exp_attr.ads \
+ + exp_attr.adb exp_ch9.ads exp_util.ads get_targ.ads itypes.ads \
+ + limits.ads namet.ads nlists.ads nmake.ads opt.ads osint.ads output.ads \
+ + rtsfind.ads sem.ads sem_eval.ads sem_res.ads sem_util.ads sinfo.ads \
+ + snames.ads stand.ads system.ads s-assert.ads table.ads table.adb \
+ + tbuild.ads ttypes.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+ +
+ + exp_ch10.o : exp_ch10.ads
+ +
+ + exp_ch11.o : exp_ch11.ads
+ +
+ + exp_ch12.o : exp_ch12.ads
+ +
+ + exp_ch13.o : alloc.ads atree.ads debug.ads einfo.ads exp_ch13.ads \
+ + exp_ch13.adb exp_ch3.ads nlists.ads nmake.ads opt.ads osint.ads \
+ + output.ads rtsfind.ads sem.ads sem_util.ads sinfo.ads snames.ads \
+ + system.ads table.ads table.adb tbuild.ads types.ads unchdeal.ads \
+ + unchdeal.adb
+ +
+ + exp_ch2.o : alloc.ads atree.ads debug.ads einfo.ads exp_ch2.ads \
+ + exp_ch2.adb nlists.ads nmake.ads opt.ads osint.ads output.ads sem.ads \
+ + sinfo.ads snames.ads system.ads table.ads table.adb tbuild.ads \
+ + types.ads unchdeal.ads unchdeal.adb
+ +
+ + exp_ch3.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads exp_ch3.ads \
+ + exp_ch3.adb exp_ch4.ads exp_ch7.ads exp_ch9.ads exp_util.ads \
+ + get_targ.ads itypes.ads limits.ads namet.ads nlists.ads nmake.ads \
+ + opt.ads osint.ads output.ads rtsfind.ads sem.ads sem_eval.ads \
+ + sem_res.ads sem_util.ads sinfo.ads snames.ads stand.ads system.ads \
+ + s-assert.ads table.ads table.adb tbuild.ads ttypes.ads types.ads \
+ + uintp.ads unchdeal.ads unchdeal.adb urealp.ads
+ +
+ + exp_ch4.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads exp_ch3.ads \
+ + exp_ch4.ads exp_ch4.adb exp_ch7.ads exp_ch9.ads exp_util.ads \
+ + fix_util.ads get_targ.ads itypes.ads limits.ads namet.ads nlists.ads \
+ + nmake.ads opt.ads osint.ads output.ads rtsfind.ads sem.ads sem_ch5.ads \
+ + sem_res.ads sem_util.ads sinfo.ads sinfo-cn.ads snames.ads stand.ads \
+ + system.ads s-assert.ads table.ads table.adb tbuild.ads ttypes.ads \
+ + types.ads uintp.ads unchdeal.ads unchdeal.adb urealp.ads
+ +
+ + exp_ch5.o : alloc.ads atree.ads debug.ads einfo.ads exp_ch5.ads \
+ + exp_ch5.adb exp_ch7.ads exp_ch9.ads exp_util.ads get_targ.ads \
+ + limits.ads namet.ads nlists.ads nmake.ads opt.ads osint.ads output.ads \
+ + rtsfind.ads sem.ads sem_res.ads sem_util.ads sinfo.ads snames.ads \
+ + stand.ads system.ads table.ads table.adb tbuild.ads ttypes.ads \
+ + types.ads uintp.ads unchdeal.ads unchdeal.adb urealp.ads
+ +
+ + exp_ch6.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads errout.ads \
+ + exp_ch6.ads exp_ch6.adb exp_ch7.ads exp_ch9.ads exp_intr.ads \
+ + exp_util.ads limits.ads namet.ads nlists.ads nmake.ads opt.ads \
+ + osint.ads output.ads rtsfind.ads sem.ads sem_ch3.ads sem_disp.ads \
+ + sem_util.ads sinfo.ads snames.ads stand.ads system.ads s-assert.ads \
+ + table.ads table.adb tbuild.ads types.ads unchdeal.ads unchdeal.adb
+ +
+ + exp_ch7.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads exp_ch7.ads \
+ + exp_ch7.adb exp_ch9.ads exp_util.ads expand.ads limits.ads namet.ads \
+ + nlists.ads nmake.ads opt.ads osint.ads output.ads rtsfind.ads sem.ads \
+ + sem_ch7.ads sem_ch8.ads sem_res.ads sem_util.ads sinfo.ads snames.ads \
+ + stand.ads system.ads s-assert.ads table.ads table.adb tbuild.ads \
+ + types.ads unchdeal.ads unchdeal.adb
+ +
+ + exp_ch8.o : exp_ch8.ads
+ +
+ + exp_ch9.o : alloc.ads atree.ads debug.ads einfo.ads exp_ch3.ads \
+ + exp_ch6.ads exp_ch9.ads exp_ch9.adb exp_util.ads get_targ.ads \
+ + limits.ads namet.ads nlists.ads nmake.ads opt.ads osint.ads output.ads \
+ + rtsfind.ads sem.ads sem_ch11.ads sem_res.ads sem_util.ads sinfo.ads \
+ + snames.ads stand.ads system.ads s-assert.ads table.ads table.adb \
+ + tbuild.ads ttypes.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+ +
+ + exp_intr.o : alloc.ads atree.ads debug.ads einfo.ads exp_intr.ads \
+ + exp_intr.adb exp_util.ads limits.ads namet.ads nlists.ads nmake.ads \
+ + opt.ads osint.ads output.ads rtsfind.ads sem.ads sem_util.ads sinfo.ads \
+ + snames.ads system.ads s-assert.ads table.ads table.adb tbuild.ads \
+ + types.ads unchdeal.ads unchdeal.adb
+ +
+ + exp_prag.o : alloc.ads atree.ads debug.ads einfo.ads exp_prag.ads \
+ + exp_prag.adb exp_util.ads nlists.ads nmake.ads opt.ads osint.ads \
+ + output.ads rtsfind.ads sem.ads sinfo.ads snames.ads system.ads \
+ + s-assert.ads table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+ +
+ + exp_util.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads elists.ads \
+ + errout.ads exp_util.ads exp_util.adb get_targ.ads itypes.ads lib.ads \
+ + limits.ads namet.ads nlists.ads nmake.ads opt.ads osint.ads output.ads \
+ + rtsfind.ads sem.ads sem_ch13.ads sem_res.ads sem_util.ads sinfo.ads \
+ + sinput.ads snames.ads stand.ads system.ads table.ads table.adb \
+ + tbuild.ads ttypes.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+ +
+ + expand.o : alloc.ads atree.ads debug.ads debug_a.ads einfo.ads \
+ + exp_attr.ads exp_ch13.ads exp_ch2.ads exp_ch3.ads exp_ch4.ads \
+ + exp_ch5.ads exp_ch6.ads exp_ch7.ads exp_ch9.ads exp_prag.ads \
+ + exp_util.ads expand.ads expand.adb output.ads rtsfind.ads sinfo.ads \
+ + system.ads table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+ +
+ + fix_util.o : debug.ads fix_util.ads fix_util.adb get_targ.ads output.ads \
+ + system.ads table.ads table.adb ttypes.ads types.ads uintp.ads \
+ + unchdeal.ads unchdeal.adb urealp.ads
+ +
+ + fname.o : debug.ads fname.ads fname.adb krunch.ads limits.ads namet.ads \
+ + opt.ads osint.ads output.ads system.ads s-assert.ads table.ads \
+ + table.adb types.ads unchdeal.ads unchdeal.adb widechar.ads
+ +
+ + frontend.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads elists.ads \
+ + errout.ads frontend.ads frontend.adb lib.ads limits.ads namet.ads \
+ + nlists.ads opt.ads osint.ads output.ads par.ads rtsfind.ads scn.ads \
+ + sem.ads sinfo.ads sinput.ads snames.ads sprint.ads stand.ads system.ads \
+ + table.ads table.adb tbuild.ads treepr.ads types.ads unchdeal.ads \
+ + unchdeal.adb usage.ads
+ +
+ + get_targ.o : get_targ.ads get_targ.adb system.ads s-assert.ads types.ads \
+ + unchdeal.ads unchdeal.adb
+ +
+ + gnatk8.o : ada.ads a-ioexce.ads a-textio.ads a-textio.adb a-teioau.ads \
+ + gnatk8.adb krunch.ads system.ads s-enviro.ads
+ +
+ + gnat1drv.o : alloc.ads atree.ads back_end.ads casing.ads comperr.ads \
+ + csets.ads debug.ads einfo.ads errout.ads excep.ads frontend.ads \
+ + get_targ.ads gnat1drv.ads gnat1drv.adb gnatvsn.ads lib.ads limits.ads \
+ + namet.ads opt.ads osint.ads output.ads par.ads sinfo.ads snames.ads \
+ + sprint.ads stringt.ads system.ads s-assert.ads s-secsta.ads \
+ + s-stalib.ads s-stoele.ads s-taspda.ads s-tasoli.ads table.ads table.adb \
+ + treepr.ads ttypes.ads types.ads uintp.ads unchconv.ads unchconv.adb \
+ + unchdeal.ads unchdeal.adb urealp.ads usage.ads
+ +
+ + gnatbind.o : ali.ads bcheck.ads binde.ads binderr.ads bindgen.ads \
+ + bindusg.ads butil.ads debug.ads excep.ads gnatbind.adb gnatvsn.ads \
+ + limits.ads namet.ads opt.ads osint.ads output.ads system.ads \
+ + s-secsta.ads s-stalib.ads s-stoele.ads s-taspda.ads s-tasoli.ads \
+ + table.ads table.adb types.ads unchconv.ads unchconv.adb unchdeal.ads \
+ + unchdeal.adb
+ +
+ + gnatfdrv.o : casing.ads comperr.ads csets.ads debug.ads einfo.ads \
+ + errout.ads excep.ads frontend.ads get_targ.ads gnatfdrv.ads \
+ + gnatfdrv.adb gnatvsn.ads lib.ads limits.ads namet.ads opt.ads osint.ads \
+ + output.ads par.ads snames.ads sprint.ads stringt.ads system.ads \
+ + s-assert.ads table.ads table.adb treepr.ads ttypes.ads types.ads \
+ + uintp.ads unchdeal.ads unchdeal.adb urealp.ads usage.ads xref.ads \
+ + xref_tab.ads
+ +
+ + gnatvsn.o : gnatvsn.ads
+ +
+ + itypes.o : alloc.ads atree.ads debug.ads einfo.ads itypes.ads itypes.adb \
+ + limits.ads namet.ads nlists.ads output.ads sem_util.ads sinfo.ads \
+ + stand.ads system.ads s-assert.ads table.ads table.adb types.ads \
+ + unchdeal.ads unchdeal.adb
+ +
+ + krunch.o : krunch.ads krunch.adb
+ +
+ + lib.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ + excep.ads fname.ads gnatvsn.ads lib.ads lib.adb lib-list.adb \
+ + lib-load.adb lib-sort.adb lib-writ.adb limits.ads namet.ads nlists.ads \
+ + osint.ads output.ads par.ads scn.ads sinfo.ads sinput.ads system.ads \
+ + table.ads table.adb types.ads uname.ads unchdeal.ads unchdeal.adb
+ +
+ + limits.o : limits.ads
+ +
+ + namet.o : alloc.ads debug.ads limits.ads namet.ads namet.adb \
+ + namet-hash.adb output.ads system.ads s-assert.ads table.ads table.adb \
+ + types.ads unchdeal.ads unchdeal.adb widechar.ads
+ +
+ + nlists.o : alloc.ads atree.ads debug.ads einfo.ads nlists.ads nlists.adb \
+ + output.ads sinfo.ads system.ads s-assert.ads table.ads table.adb \
+ + types.ads unchdeal.ads unchdeal.adb
+ +
+ + nmake.o : alloc.ads atree.ads debug.ads einfo.ads nlists.ads nmake.ads \
+ + nmake.adb output.ads sinfo.ads snames.ads system.ads table.ads \
+ + table.adb types.ads unchdeal.ads unchdeal.adb
+ +
+ + opt.o : opt.ads osint.ads system.ads types.ads unchdeal.ads unchdeal.adb
+ +
+ + osint.o : debug.ads limits.ads namet.ads opt.ads osint.ads osint.adb \
+ + output.ads sdefault.ads switch.ads system.ads s-assert.ads s-enviro.ads \
+ + s-secsta.ads s-tasoli.ads table.ads table.adb types.ads unchdeal.ads \
+ + unchdeal.adb unixlib.ads
+ +
+ + output.o : output.ads output.adb system.ads types.ads unchdeal.ads \
+ + unchdeal.adb unixlib.ads
+ +
+ + par.o : alloc.ads atree.ads casing.ads csets.ads debug.ads einfo.ads \
+ + elists.ads errout.ads excep.ads fname.ads get_targ.ads lib.ads \
+ + limits.ads namet.ads nlists.ads nmake.ads opt.ads osint.ads output.ads \
+ + par.ads par.adb par-ch10.adb par-ch11.adb par-ch12.adb par-ch13.adb \
+ + par-ch2.adb par-ch3.adb par-ch4.adb par-ch5.adb par-ch6.adb par-ch7.adb \
+ + par-ch8.adb par-ch9.adb par-endh.adb par-labl.adb par-load.adb \
+ + par-prag.adb par-sync.adb par-tchk.adb par-util.adb scans.ads scn.ads \
+ + sinfo.ads sinfo-cn.ads sinput.ads snames.ads style.ads system.ads \
+ + s-assert.ads table.ads table.adb tbuild.ads ttypes.ads types.ads \
+ + uintp.ads uname.ads unchdeal.ads unchdeal.adb
+ +
+ + rtsfind.o : alloc.ads atree.ads casing.ads csets.ads debug.ads einfo.ads \
+ + excep.ads fname.ads lib.ads limits.ads namet.ads nlists.ads nmake.ads \
+ + opt.ads osint.ads output.ads rtsfind.ads rtsfind.adb sem.ads \
+ + sem_util.ads sinfo.ads snames.ads system.ads s-assert.ads table.ads \
+ + table.adb tbuild.ads types.ads unchdeal.ads unchdeal.adb
+ +
+ + s-assert.o : system.ads s-assert.ads
+ +
+ + s-enviro.o : system.ads s-enviro.ads s-enviro.adb
+ +
+ + s-secsta.o : system.ads s-secsta.ads s-secsta.adb s-stoele.ads \
+ + s-taspda.ads unchconv.ads unchconv.adb unchdeal.ads unchdeal.adb
+ +
+ + s-stalib.o : system.ads s-secsta.ads s-stalib.ads s-stoele.ads \
+ + s-taspda.ads s-tasoli.ads unchconv.ads unchconv.adb unchdeal.ads \
+ + unchdeal.adb
+ +
+ + s-stoele.o : system.ads s-stoele.ads s-stoele.adb unchconv.ads \
+ + unchconv.adb
+ +
+ + s-strcon.o : system.ads s-strcon.ads s-strcon.adb
+ +
+ + s-strequ.o : system.ads s-strequ.ads s-strequ.adb
+ +
+ + s-strops.o : system.ads s-strops.ads s-strops.adb
+ +
+ + s-tasoli.o : system.ads s-taspda.ads s-tasoli.ads s-tasoli.adb
+ +
+ + s-taspda.o : system.ads s-secsta.ads s-taspda.ads s-taspda.adb \
+ + s-tasoli.ads unchconv.ads unchconv.adb unchdeal.ads unchdeal.adb
+ +
+ + scans.o : scans.ads scans.adb system.ads types.ads unchdeal.ads \
+ + unchdeal.adb
+ +
+ + scn.o : alloc.ads atree.ads casing.ads csets.ads debug.ads einfo.ads \
+ + errout.ads get_targ.ads lib.ads limits.ads namet.ads opt.ads osint.ads \
+ + output.ads scans.ads scn.ads scn.adb scn-nlit.adb scn-slit.adb \
+ + sinfo.ads sinput.ads snames.ads stringt.ads style.ads system.ads \
+ + s-assert.ads table.ads table.adb ttypes.ads types.ads uintp.ads \
+ + unchdeal.ads unchdeal.adb urealp.ads widechar.ads
+ +
+ + sdefault.o : sdefault.ads sdefault.adb
+ +
+ + sem.o : alloc.ads atree.ads casing.ads comperr.ads debug.ads debug_a.ads \
+ + einfo.ads errout.ads exp_util.ads expand.ads lib.ads limits.ads \
+ + namet.ads nlists.ads opt.ads osint.ads output.ads rtsfind.ads sem.ads \
+ + sem.adb sem_attr.ads sem_ch10.ads sem_ch11.ads sem_ch12.ads \
+ + sem_ch13.ads sem_ch3.ads sem_ch4.ads sem_ch5.ads sem_ch6.ads \
+ + sem_ch7.ads sem_ch8.ads sem_ch9.ads sem_prag.ads sem_util.ads sinfo.ads \
+ + snames.ads stand.ads system.ads s-assert.ads table.ads table.adb \
+ + types.ads unchdeal.ads unchdeal.adb
+ +
+ + sem_aggr.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads errout.ads \
+ + exp_util.ads get_targ.ads itypes.ads limits.ads namet.ads nlists.ads \
+ + nmake.ads opt.ads osint.ads output.ads rtsfind.ads sem.ads sem_aggr.ads \
+ + sem_aggr.adb sem_ch3.ads sem_ch5.ads sem_eval.ads sem_res.ads \
+ + sem_type.ads sem_util.ads sinfo.ads snames.ads stand.ads system.ads \
+ + table.ads table.adb tbuild.ads ttypes.ads types.ads uintp.ads \
+ + unchdeal.ads unchdeal.adb
+ +
+ + sem_attr.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ + excep.ads get_targ.ads limits.ads namet.ads nlists.ads nmake.ads \
+ + opt.ads osint.ads output.ads rtsfind.ads sem.ads sem_attr.ads \
+ + sem_attr.adb sem_ch4.ads sem_ch6.ads sem_ch8.ads sem_eval.ads \
+ + sem_res.ads sem_type.ads sem_util.ads sinfo.ads sinput.ads snames.ads \
+ + stand.ads stringt.ads system.ads s-assert.ads table.ads table.adb \
+ + tbuild.ads ttypef.ads ttypes.ads types.ads uintp.ads unchdeal.ads \
+ + unchdeal.adb urealp.ads
+ +
+ + sem_ch10.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ + lib.ads limits.ads namet.ads nlists.ads nmake.ads opt.ads osint.ads \
+ + output.ads sem.ads sem_ch10.ads sem_ch10.adb sem_ch6.ads sem_ch7.ads \
+ + sem_ch8.ads sem_util.ads sinfo.ads sinfo-cn.ads sinput.ads snames.ads \
+ + stand.ads stringt.ads system.ads table.ads table.adb tbuild.ads \
+ + types.ads uname.ads unchdeal.ads unchdeal.adb
+ +
+ + sem_ch11.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ + lib.ads limits.ads namet.ads nlists.ads opt.ads osint.ads output.ads \
+ + sem.ads sem_ch11.ads sem_ch11.adb sem_ch5.ads sem_ch8.ads sem_util.ads \
+ + sinfo.ads snames.ads stand.ads system.ads table.ads table.adb types.ads \
+ + unchdeal.ads unchdeal.adb
+ +
+ + sem_ch12.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads elists.ads \
+ + errout.ads excep.ads exp_util.ads lib.ads limits.ads namet.ads \
+ + nlists.ads nmake.ads opt.ads osint.ads output.ads rtsfind.ads sem.ads \
+ + sem_ch10.ads sem_ch12.ads sem_ch12.adb sem_ch13.ads sem_ch3.ads \
+ + sem_ch6.ads sem_ch7.ads sem_ch8.ads sem_res.ads sem_util.ads sinfo.ads \
+ + sinfo-cn.ads snames.ads stand.ads system.ads s-assert.ads table.ads \
+ + table.adb tbuild.ads types.ads uname.ads unchdeal.ads unchdeal.adb
+ +
+ + sem_ch13.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads errout.ads \
+ + excep.ads exp_util.ads get_targ.ads itypes.ads limits.ads namet.ads \
+ + nlists.ads nmake.ads opt.ads osint.ads output.ads rtsfind.ads sem.ads \
+ + sem_ch13.ads sem_ch13.adb sem_ch3.ads sem_ch8.ads sem_eval.ads \
+ + sem_res.ads sem_util.ads sinfo.ads snames.ads stand.ads system.ads \
+ + table.ads table.adb ttypes.ads types.ads uintp.ads unchdeal.ads \
+ + unchdeal.adb
+ +
+ + sem_ch3.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads errout.ads \
+ + exp_ch3.ads exp_util.ads get_targ.ads itypes.ads limits.ads namet.ads \
+ + nlists.ads nmake.ads opt.ads osint.ads output.ads rtsfind.ads sem.ads \
+ + sem_ch12.ads sem_ch13.ads sem_ch3.ads sem_ch3.adb sem_ch5.ads \
+ + sem_ch6.ads sem_ch7.ads sem_ch8.ads sem_eval.ads sem_res.ads \
+ + sem_type.ads sem_util.ads sinfo.ads snames.ads stand.ads system.ads \
+ + s-assert.ads table.ads table.adb tbuild.ads ttypes.ads types.ads \
+ + uintp.ads unchdeal.ads unchdeal.adb urealp.ads
+ +
+ + sem_ch4.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads exp_ch4.ads \
+ + itypes.ads limits.ads namet.ads nlists.ads nmake.ads opt.ads osint.ads \
+ + output.ads sem.ads sem_ch3.ads sem_ch4.ads sem_ch4.adb sem_ch8.ads \
+ + sem_type.ads sem_util.ads sinfo.ads snames.ads stand.ads system.ads \
+ + table.ads table.adb tbuild.ads types.ads unchdeal.ads unchdeal.adb
+ +
+ + sem_ch5.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads exp_ch7.ads \
+ + get_targ.ads itypes.ads limits.ads namet.ads nlists.ads opt.ads \
+ + osint.ads output.ads sem.ads sem_ch3.ads sem_ch5.ads sem_ch5.adb \
+ + sem_ch8.ads sem_disp.ads sem_eval.ads sem_res.ads sem_type.ads \
+ + sem_util.ads sinfo.ads snames.ads stand.ads system.ads s-assert.ads \
+ + table.ads table.adb ttypes.ads types.ads uintp.ads unchdeal.ads \
+ + unchdeal.adb
+ +
+ + sem_ch6.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ + exp_ch7.ads exp_util.ads lib.ads limits.ads namet.ads nlists.ads \
+ + nmake.ads opt.ads osint.ads output.ads rtsfind.ads sem.ads sem_ch12.ads \
+ + sem_ch3.ads sem_ch4.ads sem_ch6.ads sem_ch6.adb sem_ch8.ads \
+ + sem_disp.ads sem_res.ads sem_util.ads sinfo.ads sinfo-cn.ads sinput.ads \
+ + snames.ads stand.ads stringt.ads system.ads table.ads table.adb \
+ + tbuild.ads treepr.ads types.ads unchdeal.ads unchdeal.adb
+ +
+ + sem_ch7.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads elists.ads \
+ + errout.ads excep.ads exp_util.ads itypes.ads lib.ads limits.ads \
+ + namet.ads nlists.ads opt.ads osint.ads output.ads rtsfind.ads sem.ads \
+ + sem_ch12.ads sem_ch13.ads sem_ch3.ads sem_ch7.ads sem_ch7.adb \
+ + sem_ch8.ads sem_util.ads sinfo.ads sinput.ads snames.ads stand.ads \
+ + system.ads table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+ +
+ + sem_ch8.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads limits.ads \
+ + namet.ads nlists.ads nmake.ads opt.ads osint.ads output.ads sem.ads \
+ + sem_attr.ads sem_ch3.ads sem_ch4.ads sem_ch5.ads sem_ch6.ads \
+ + sem_ch8.ads sem_ch8.adb sem_res.ads sem_type.ads sem_util.ads sinfo.ads \
+ + sinfo-cn.ads snames.ads stand.ads system.ads s-assert.ads table.ads \
+ + table.adb tbuild.ads types.ads unchdeal.ads unchdeal.adb
+ +
+ + sem_ch9.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads exp_ch7.ads \
+ + exp_ch9.ads get_targ.ads limits.ads namet.ads nlists.ads nmake.ads \
+ + opt.ads osint.ads output.ads sem.ads sem_ch3.ads sem_ch4.ads \
+ + sem_ch5.ads sem_ch6.ads sem_ch8.ads sem_ch9.ads sem_ch9.adb sem_res.ads \
+ + sem_util.ads sinfo.ads snames.ads stand.ads system.ads table.ads \
+ + table.adb tbuild.ads ttypes.ads types.ads uintp.ads unchdeal.ads \
+ + unchdeal.adb
+ +
+ + sem_disp.o : alloc.ads atree.ads debug.ads einfo.ads elists.ads errout.ads \
+ + exp_ch6.ads nlists.ads output.ads sem_disp.ads sem_disp.adb \
+ + sem_util.ads sinfo.ads system.ads table.ads table.adb types.ads \
+ + unchdeal.ads unchdeal.adb
+ +
+ + sem_eval.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads \
+ + get_targ.ads itypes.ads limits.ads namet.ads nlists.ads nmake.ads \
+ + opt.ads osint.ads output.ads sem.ads sem_eval.ads sem_eval.adb \
+ + sem_res.ads sem_util.ads sinfo.ads snames.ads stand.ads stringt.ads \
+ + system.ads s-assert.ads table.ads table.adb tbuild.ads ttypes.ads \
+ + types.ads uintp.ads unchdeal.ads unchdeal.adb urealp.ads
+ +
+ + sem_intr.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads \
+ + get_targ.ads limits.ads namet.ads output.ads sem_ch13.ads sem_intr.ads \
+ + sem_intr.adb sinfo.ads snames.ads stand.ads system.ads table.ads \
+ + table.adb ttypes.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+ +
+ + sem_prag.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ + excep.ads exp_util.ads get_targ.ads lib.ads limits.ads namet.ads \
+ + nlists.ads nmake.ads opt.ads osint.ads output.ads rtsfind.ads sem.ads \
+ + sem_ch8.ads sem_eval.ads sem_intr.ads sem_prag.ads sem_prag.adb \
+ + sem_res.ads sem_util.ads sinfo.ads snames.ads stand.ads stringt.ads \
+ + system.ads table.ads table.adb tbuild.ads ttypes.ads types.ads \
+ + uintp.ads unchdeal.ads unchdeal.adb
+ +
+ + sem_res.o : alloc.ads atree.ads debug.ads debug_a.ads einfo.ads elists.ads \
+ + errout.ads exp_util.ads expand.ads get_targ.ads itypes.ads limits.ads \
+ + namet.ads nlists.ads nmake.ads opt.ads osint.ads output.ads rtsfind.ads \
+ + sem.ads sem_aggr.ads sem_attr.ads sem_ch13.ads sem_ch3.ads sem_ch4.ads \
+ + sem_ch5.ads sem_ch8.ads sem_disp.ads sem_eval.ads sem_res.ads \
+ + sem_res.adb sem_type.ads sem_util.ads sinfo.ads snames.ads stand.ads \
+ + stringt.ads system.ads s-assert.ads table.ads table.adb tbuild.ads \
+ + treepr.ads ttypes.ads types.ads uintp.ads unchdeal.ads unchdeal.adb
+ +
+ + sem_type.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads limits.ads \
+ + namet.ads output.ads sem_ch6.ads sem_ch8.ads sem_type.ads sem_type.adb \
+ + sem_util.ads sinfo.ads snames.ads stand.ads system.ads s-assert.ads \
+ + table.ads table.adb types.ads unchdeal.ads unchdeal.adb
+ +
+ + sem_util.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ + get_targ.ads itypes.ads limits.ads namet.ads nlists.ads nmake.ads \
+ + opt.ads osint.ads output.ads scans.ads scn.ads sem.ads sem_eval.ads \
+ + sem_res.ads sem_type.ads sem_util.ads sem_util.adb sinfo.ads sinput.ads \
+ + snames.ads stand.ads style.ads system.ads s-assert.ads s-secsta.ads \
+ + s-strcon.ads s-tasoli.ads table.ads table.adb tbuild.ads ttypes.ads \
+ + types.ads uintp.ads unchdeal.ads unchdeal.adb urealp.ads
+ +
+ + sinfo-cn.o : alloc.ads atree.ads debug.ads einfo.ads output.ads sinfo.ads \
+ + sinfo-cn.ads sinfo-cn.adb system.ads table.ads table.adb types.ads \
+ + unchdeal.ads unchdeal.adb
+ +
+ + sinfo.o : alloc.ads atree.ads debug.ads einfo.ads output.ads sinfo.ads \
+ + sinfo.adb system.ads s-assert.ads table.ads table.adb types.ads \
+ + unchdeal.ads unchdeal.adb
+ +
+ + sinput.o : alloc.ads casing.ads debug.ads limits.ads namet.ads osint.ads \
+ + output.ads sinput.ads sinput.adb system.ads s-assert.ads table.ads \
+ + table.adb types.ads unchdeal.ads unchdeal.adb
+ +
+ + snames.o : debug.ads limits.ads namet.ads output.ads snames.ads snames.adb \
+ + system.ads s-assert.ads table.ads table.adb types.ads unchdeal.ads \
+ + unchdeal.adb
+ +
+ + sprint.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads get_targ.ads \
+ + itypes.ads lib.ads limits.ads namet.ads nlists.ads output.ads \
+ + sem_util.ads sinfo.ads sprint.ads sprint.adb stand.ads stringt.ads \
+ + system.ads table.ads table.adb ttypes.ads types.ads uintp.ads uname.ads \
+ + unchdeal.ads unchdeal.adb urealp.ads
+ +
+ + stand.o : alloc.ads atree.ads csets.ads debug.ads einfo.ads get_targ.ads \
+ + gnatvsn.ads limits.ads namet.ads nlists.ads nmake.ads opt.ads osint.ads \
+ + output.ads sem_util.ads sinfo.ads snames.ads stand.ads stand.adb \
+ + system.ads s-assert.ads table.ads table.adb ttypef.ads ttypes.ads \
+ + types.ads uintp.ads unchdeal.ads unchdeal.adb
+ +
+ + stringt.o : alloc.ads debug.ads output.ads stringt.ads stringt.adb \
+ + system.ads s-assert.ads table.ads table.adb types.ads unchdeal.ads \
+ + unchdeal.adb
+ +
+ + style.o : alloc.ads atree.ads casing.ads csets.ads debug.ads einfo.ads \
+ + errout.ads limits.ads namet.ads output.ads scans.ads sinfo.ads \
+ + sinput.ads style.ads style.adb system.ads table.ads table.adb types.ads \
+ + unchdeal.ads unchdeal.adb
+ +
+ + switch.o : debug.ads opt.ads osint.ads output.ads switch.ads switch.adb \
+ + system.ads types.ads unchdeal.ads unchdeal.adb
+ +
+ + system.o : system.ads
+ +
+ + tbuild.o : alloc.ads atree.ads debug.ads einfo.ads errout.ads limits.ads \
+ + namet.ads nlists.ads nmake.ads output.ads sinfo.ads stand.ads \
+ + system.ads s-assert.ads table.ads table.adb tbuild.ads tbuild.adb \
+ + types.ads unchdeal.ads unchdeal.adb
+ +
+ + treepr.o : alloc.ads atree.ads casing.ads comperr.ads csets.ads debug.ads \
+ + einfo.ads elists.ads get_targ.ads itypes.ads lib.ads limits.ads \
+ + namet.ads nlists.ads output.ads sem_util.ads sinfo.ads sinput.ads \
+ + stand.ads stringt.ads system.ads table.ads table.adb treepr.ads \
+ + treepr.adb treeprs.ads ttypes.ads types.ads uintp.ads uname.ads \
+ + unchdeal.ads unchdeal.adb urealp.ads
+ +
+ + treeprs.o : sinfo.ads system.ads treeprs.ads types.ads unchdeal.ads \
+ + unchdeal.adb
+ +
+ + ttypef.o : ttypef.ads
+ +
+ + ttypes.o : get_targ.ads system.ads ttypes.ads types.ads unchdeal.ads \
+ + unchdeal.adb
+ +
+ + types.o : system.ads types.ads types.adb unchdeal.ads unchdeal.adb
+ +
+ + uintp.o : alloc.ads debug.ads get_targ.ads limits.ads namet.ads output.ads \
+ + system.ads s-assert.ads table.ads table.adb ttypes.ads types.ads \
+ + uintp.ads uintp.adb unchdeal.ads unchdeal.adb
+ +
+ + uname.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads lib.ads \
+ + limits.ads namet.ads nlists.ads output.ads sinfo.ads sinput.ads \
+ + system.ads s-assert.ads table.ads table.adb types.ads uname.ads \
+ + uname.adb unchdeal.ads unchdeal.adb
+ +
+ + unixlib.o : system.ads types.ads unchdeal.ads unchdeal.adb unixlib.ads \
+ + unixlib.adb
+ +
+ + urealp.o : alloc.ads debug.ads get_targ.ads nlists.ads nmake.ads \
+ + output.ads sinfo.ads system.ads s-assert.ads table.ads table.adb \
+ + ttypes.ads types.ads uintp.ads unchdeal.ads unchdeal.adb urealp.ads \
+ + urealp.adb
+ +
+ + usage.o : osint.ads output.ads system.ads s-assert.ads types.ads \
+ + unchdeal.ads unchdeal.adb usage.ads usage.adb
+ +
+ + widechar.o : system.ads s-assert.ads types.ads unchdeal.ads unchdeal.adb \
+ + widechar.ads widechar.adb
+ +
+ + xref.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads elists.ads \
+ + lib.ads limits.ads namet.ads nlists.ads opt.ads osint.ads output.ads \
+ + sinfo.ads sinput.ads sprint.ads stand.ads system.ads s-assert.ads \
+ + table.ads table.adb types.ads unchdeal.ads unchdeal.adb xref.ads \
+ + xref.adb xref_tab.ads
+ +
+ + xref_tab.o : alloc.ads atree.ads casing.ads debug.ads einfo.ads errout.ads \
+ + lib.ads limits.ads namet.ads osint.ads output.ads sinfo.ads sinput.ads \
+ + stand.ads system.ads s-secsta.ads s-strcon.ads s-tasoli.ads table.ads \
+ + table.adb types.ads unchdeal.ads unchdeal.adb xref_tab.ads xref_tab.adb
+ +
+ +
+ # To make a configuration always use collect2, set USE_COLLECT2 to ld.
+ ld: collect2
+ rm -f ld
+ ***************
+ *** 933,939 ****
+ tree.o : tree.c $(CONFIG_H) $(TREE_H) gvarargs.h flags.h function.h
+ print-tree.o : print-tree.c $(CONFIG_H) $(TREE_H)
+ stor-layout.o : stor-layout.c $(CONFIG_H) $(TREE_H) function.h
+ ! fold-const.o : fold-const.c $(CONFIG_H) $(TREE_H) flags.h
+ toplev.o : toplev.c $(CONFIG_H) $(TREE_H) $(RTL_H) flags.h input.h \
+ insn-attr.h xcoffout.h defaults.h
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ --- 1972,1978 ----
+ tree.o : tree.c $(CONFIG_H) $(TREE_H) gvarargs.h flags.h function.h
+ print-tree.o : print-tree.c $(CONFIG_H) $(TREE_H)
+ stor-layout.o : stor-layout.c $(CONFIG_H) $(TREE_H) function.h
+ ! fold-const.o : fold-const.c $(CONFIG_H) $(TREE_H) flags.h
+ toplev.o : toplev.c $(CONFIG_H) $(TREE_H) $(RTL_H) flags.h input.h \
+ insn-attr.h xcoffout.h defaults.h
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ ***************
+ *** 960,966 ****
+ typeclass.h bytecode.h bc-opcode.h bc-typecd.h bc-typecd.def bc-optab.h \
+ bc-emit.h modemap.def
+ calls.o : calls.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h expr.h insn-codes.h \
+ ! insn-flags.h gvarargs.h
+ expmed.o : expmed.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h \
+ insn-flags.h insn-config.h insn-codes.h expr.h recog.h real.h
+ explow.o : explow.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h hard-reg-set.h \
+ --- 1999,2005 ----
+ typeclass.h bytecode.h bc-opcode.h bc-typecd.h bc-typecd.def bc-optab.h \
+ bc-emit.h modemap.def
+ calls.o : calls.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h expr.h insn-codes.h \
+ ! insn-flags.h gvarargs.h
+ expmed.o : expmed.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h \
+ insn-flags.h insn-config.h insn-codes.h expr.h recog.h real.h
+ explow.o : explow.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h hard-reg-set.h \
+ ***************
+ *** 1050,1056 ****
+ -c `echo $(srcdir)/alloca.c | sed 's,^\./,,'`
+ $(ALLOCA_FINISH)
+
+ ! # Generate header and source files from the machine description,
+ # and compile them.
+
+ .PRECIOUS: insn-config.h insn-flags.h insn-codes.h \
+ --- 2089,2095 ----
+ -c `echo $(srcdir)/alloca.c | sed 's,^\./,,'`
+ $(ALLOCA_FINISH)
+
+ ! # Generate header and source files from the machine description,
+ # and compile them.
+
+ .PRECIOUS: insn-config.h insn-flags.h insn-codes.h \
+ ***************
+ *** 1181,1187 ****
+ # even if GCC is being compiled to run on some other machine.
+
+ # $(CONFIG_H) is omitted from the deps of the gen*.o
+ ! # because these programs don't really depend on anything
+ # about the target machine. They do depend on config.h itself,
+ # since that describes the host machine.
+
+ --- 2220,2226 ----
+ # even if GCC is being compiled to run on some other machine.
+
+ # $(CONFIG_H) is omitted from the deps of the gen*.o
+ ! # because these programs don't really depend on anything
+ # about the target machine. They do depend on config.h itself,
+ # since that describes the host machine.
+
+ ***************
+ *** 1305,1311 ****
+
+ # This satisfies the dependency that we get if you cross-compile a compiler
+ # that does not need to compile alloca, malloc or whatever.
+ ! $(HOST_PREFIX_1):
+ touch $(HOST_PREFIX_1)
+
+ # Remake bytecode files.
+ --- 2344,2350 ----
+
+ # This satisfies the dependency that we get if you cross-compile a compiler
+ # that does not need to compile alloca, malloc or whatever.
+ ! $(HOST_PREFIX_1):
+ touch $(HOST_PREFIX_1)
+
+ # Remake bytecode files.
+ ***************
+ *** 1647,1660 ****
+ # $(MAKEINFO) `echo $(srcdir)/gplus.texi | sed 's,^\./,,'`
+
+ $(srcdir)/gcc.info: gcc.texi extend.texi install.texi invoke.texi \
+ ! md.texi rtl.texi tm.texi
+ cd $(srcdir); $(MAKEINFO) gcc.texi
+
+ dvi: $(srcdir)/gcc.dvi $(srcdir)/cpp.dvi
+
+ # This works with GNU Make's default rule.
+ $(srcdir)/gcc.dvi: gcc.texi extend.texi install.texi invoke.texi \
+ ! md.texi rtl.texi tm.texi
+ $(TEXI2DVI) $<
+
+ # This works with GNU Make's default rule.
+ --- 2686,2699 ----
+ # $(MAKEINFO) `echo $(srcdir)/gplus.texi | sed 's,^\./,,'`
+
+ $(srcdir)/gcc.info: gcc.texi extend.texi install.texi invoke.texi \
+ ! md.texi rtl.texi tm.texi
+ cd $(srcdir); $(MAKEINFO) gcc.texi
+
+ dvi: $(srcdir)/gcc.dvi $(srcdir)/cpp.dvi
+
+ # This works with GNU Make's default rule.
+ $(srcdir)/gcc.dvi: gcc.texi extend.texi install.texi invoke.texi \
+ ! md.texi rtl.texi tm.texi
+ $(TEXI2DVI) $<
+
+ # This works with GNU Make's default rule.
+ ***************
+ *** 1687,1693 ****
+ # Delete the temporary source copies for cross compilation.
+ -rm -f $(HOST_PREFIX_1)rtl.c $(HOST_PREFIX_1)rtlanal.c
+ -rm -f $(HOST_PREFIX_1)alloca.c $(HOST_PREFIX_1)malloc.c
+ ! -rm -f $(HOST_PREFIX_1)obstack.c
+ # Delete the temp files made in the course of building libgcc.a.
+ -rm -f tmplibgcc* tmpcopy xlimits.h
+ for name in $(LIB1FUNCS); do rm -f $${name}.c; done
+ --- 2726,2732 ----
+ # Delete the temporary source copies for cross compilation.
+ -rm -f $(HOST_PREFIX_1)rtl.c $(HOST_PREFIX_1)rtlanal.c
+ -rm -f $(HOST_PREFIX_1)alloca.c $(HOST_PREFIX_1)malloc.c
+ ! -rm -f $(HOST_PREFIX_1)obstack.c
+ # Delete the temp files made in the course of building libgcc.a.
+ -rm -f tmplibgcc* tmpcopy xlimits.h
+ for name in $(LIB1FUNCS); do rm -f $${name}.c; done
+ ***************
+ *** 1717,1723 ****
+ clean: mostlyclean bytecode.clean
+ # It may not be quite desirable to delete unprotoize.c here,
+ # but the spec for `make clean' requires it.
+ ! # Using unprotoize.c is not quite right in the first place,
+ # but what better way is there?
+ -rm -f libgcc.a libgcc1.a libgcc2.a libgcc2.ready libgcc1.null
+ -rm -f *.dvi
+ --- 2756,2762 ----
+ clean: mostlyclean bytecode.clean
+ # It may not be quite desirable to delete unprotoize.c here,
+ # but the spec for `make clean' requires it.
+ ! # Using unprotoize.c is not quite right in the first place,
+ # but what better way is there?
+ -rm -f libgcc.a libgcc1.a libgcc2.a libgcc2.ready libgcc1.null
+ -rm -f *.dvi
+ ***************
+ *** 1760,1766 ****
+ -rm -f cp-parse.c cp-parse.h cp-parse.output
+ -rm -f objc-parse.c objc-parse.output
+ -rm -f c-parse.c c-parse.h c-parse.output
+ ! -rm -f cexp.c cexp.output TAGS
+ -rm -f cpp.info* cpp.??s cpp.*aux
+ -rm -f gcc.info* gcc.??s gcc.*aux
+ -rm -f gplus.info* gplus.??s gplus.*aux
+ --- 2799,2805 ----
+ -rm -f cp-parse.c cp-parse.h cp-parse.output
+ -rm -f objc-parse.c objc-parse.output
+ -rm -f c-parse.c c-parse.h c-parse.output
+ ! -rm -f cexp.c cexp.output TAGS
+ -rm -f cpp.info* cpp.??s cpp.*aux
+ -rm -f gcc.info* gcc.??s gcc.*aux
+ -rm -f gplus.info* gplus.??s gplus.*aux
+ ***************
+ *** 1861,1866 ****
+ --- 2900,2926 ----
+ rm -f $(bindir)/$(target)-gcc-1; \
+ $(HARDLINK) $(bindir)/gcc $(bindir)/$(target)-gcc-1; \
+ mv $(bindir)/$(target)-gcc-1 $(bindir)/$(target)-gcc; \
+ + if [ -f gnat1 ] ; then \
+ + rm -f $(bindir)/gnatbind; \
+ + $(INSTALL_PROGRAM) gnatbind $(bindir)/gnatbind; \
+ + chmod a+x $(bindir)/gnatbind; \
+ + rm -f $(bindir)/gnatchop; \
+ + $(INSTALL_PROGRAM) gnatchop $(bindir)/gnatchop; \
+ + chmod a+x $(bindir)/gnatchop; \
+ + rm -f $(bindir)/gnatchp; \
+ + $(INSTALL_PROGRAM) gnatchp $(bindir)/gnatchp; \
+ + chmod a+x $(bindir)/gnatchp; \
+ + rm -f $(bindir)/gnatbl; \
+ + $(INSTALL_PROGRAM) gnatbl $(bindir)/gnatbl; \
+ + chmod a+x $(bindir)/gnatbl; \
+ + rm -f $(bindir)/gnatf; \
+ + $(INSTALL_PROGRAM) gnatf $(bindir)/gnatf; \
+ + chmod a+x $(bindir)/gnatf; \
+ + rm -f $(bindir)/gnatk8; \
+ + $(INSTALL_PROGRAM) gnatk8 $(bindir)/gnatk8; \
+ + chmod a+x $(bindir)/gnatk8; \
+ + $(MAKE) install-gnatlib; \
+ + fi; \
+ if [ -f cc1plus ] ; then \
+ rm -f $(bindir)/g++; \
+ $(INSTALL_PROGRAM) g++ $(bindir)/g++; \
+ ***************
+ *** 1883,1888 ****
+ --- 2943,2981 ----
+ -rm -f $(libsubdir)/cpp
+ $(INSTALL_PROGRAM) cpp $(libsubdir)/cpp
+
+ + # Note that in the below rules, when we install the Ada runtime files, we
+ + # use "cp -p" to preserve the dates.
+ +
+ + install-gnatlib:
+ + # rm -rf tmp-adainclude stamp-pthreads
+ + # $(MAKE) tmp-adainclude
+ + # $(MAKE) stamp-pthreads
+ + rm -rf $(ADA_RTL_OBJ_DIR)
+ + mkdir $(ADA_RTL_OBJ_DIR)
+ + cp -p tmp-adainclude/*.o tmp-adainclude/*.ali tmp-adainclude/*.a \
+ + threads/lib/libpthreads.a $(ADA_RTL_OBJ_DIR)
+ + (cd $(ADA_RTL_OBJ_DIR) ; rm -f $(LIBGNAT_OBJS))
+ + rm -rf $(ADA_INCLUDE_DIR)
+ + mkdir $(ADA_INCLUDE_DIR)
+ + cp -p tmp-adainclude/*.ad[bs] $(ADA_INCLUDE_DIR)
+ + if $(RANLIB_TEST) ; then $(RANLIB) $(ADA_RTL_OBJ_DIR)/*.a; \
+ + else true; fi
+ +
+ + # Note that in the below rules, when we make the copy of the Ada runtime
+ + # source files in the tmp directory, we use "cp -p" to preserve the dates
+ + # so as to not make previously compiled objects become needlessly out-of-date.
+ +
+ + tmp-adainclude:
+ + rm -rf tmp-tmp-adainclude
+ + mkdir tmp-tmp-adainclude
+ + for file in $(ADA_INCLUDE_SRCS) $(LIBGNAT_SRCS); do \
+ + cp -p $$file tmp-tmp-adainclude/$$file; \
+ + done
+ + (cd tmp-tmp-adainclude; $(MAKE) CC="../xgcc -B../" CFLAGS="" \
+ + -f ../Makefile ada-runtime)
+ + rm -rf tmp-adainclude
+ + mv tmp-tmp-adainclude tmp-adainclude
+ +
+ # Install the info files.
+ install-info: doc install-dir
+ -rm -f $(infodir)/cpp.info* $(infodir)/gcc.info*
+ ***************
+ *** 2039,2045 ****
+ $$1 " " $$2 " " $$3 != "This directory contains"' \
+ version=$(version) README > tmp.README
+ mv tmp.README README
+ ! -rm -rf gcc-$(version) tmp
+ # Put all the files in a temporary subdirectory
+ # which has the name that we want to have in the tar file.
+ mkdir tmp
+ --- 3132,3138 ----
+ $$1 " " $$2 " " $$3 != "This directory contains"' \
+ version=$(version) README > tmp.README
+ mv tmp.README README
+ ! -rm -rf gcc-$(version) tmp
+ # Put all the files in a temporary subdirectory
+ # which has the name that we want to have in the tar file.
+ mkdir tmp
+ ***************
+ *** 2072,2078 ****
+ # Get rid of everything we don't want in the distribution.
+ cd gcc-$(version); make -f Makefile.in extraclean
+
+ ! # make diff oldversion=M.N
+ # creates a diff file between an older distribution and this one.
+ # The -P option assumes this is GNU diff.
+ diff:
+ --- 3165,3171 ----
+ # Get rid of everything we don't want in the distribution.
+ cd gcc-$(version); make -f Makefile.in extraclean
+
+ ! # make diff oldversion=M.N
+ # creates a diff file between an older distribution and this one.
+ # The -P option assumes this is GNU diff.
+ diff:
+ ***************
+ *** 2084,2090 ****
+
+ # do make -f ../gcc/Makefile maketest DIR=../gcc
+ # in the intended test directory to make it a suitable test directory.
+ ! # THIS IS OBSOLETE; use the -srcdir operand in configure instead.
+ maketest:
+ cp $(DIR)/*.[chy] .
+ cp $(DIR)/configure .
+ --- 3177,3183 ----
+
+ # do make -f ../gcc/Makefile maketest DIR=../gcc
+ # in the intended test directory to make it a suitable test directory.
+ ! # THIS IS OBSOLETE; use the -srcdir operand in configure instead.
+ maketest:
+ cp $(DIR)/*.[chy] .
+ cp $(DIR)/configure .
+ ***************
+ *** 2173,2178 ****
+ --- 3266,3319 ----
+ -rm -f stage4/libgcc.a
+ -cp libgcc.a stage4
+ -if $(RANLIB_TEST) ; then $(RANLIB) stage4/libgcc.a; else true; fi
+ +
+ + # gnat bootstrapping targets - use the same stage directories
+ + gnatboot: force
+ + $(MAKE) gnat1 CC="$(CC)" CFLAGS="$(CFLAGS)" ADA_CC="$(ADA_CC)" ADAFLAGS="$(ADAFLAGS)"
+ + $(MAKE) gnatbind CC="$(CC)" CFLAGS="$(CFLAGS)" ADA_CC="$(ADA_CC)" ADAFLAGS="$(ADAFLAGS)"
+ + $(MAKE) gnatstage1
+ + $(MAKE) CC="gcc -Bstage1/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage1/gnatbind gnat1
+ + $(MAKE) CC="gcc -Bstage1/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage1/gnatbind gnatbind
+ + $(MAKE) gnatstage2
+ + $(MAKE) CC="gcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage2/gnatbind gnat1
+ + $(MAKE) CC="gcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage2/gnatbind gnatbind
+ +
+ + gnatboot2: force
+ + $(MAKE) CC="gcc -Bstage1/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage1/gnatbind gnat1
+ + $(MAKE) CC="gcc -Bstage1/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage1/gnatbind gnatbind
+ + $(MAKE) gnatstage2
+ + $(MAKE) CC="gcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage2/gnatbind gnat1
+ + $(MAKE) CC="gcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage2/gnatbind gnatbind
+ +
+ + gnatboot3: force
+ + $(MAKE) CC="gcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage2/gnatbind gnat1
+ + $(MAKE) CC="gcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" ADAFLAGS="$(BOOT_ADAFLAGS)" LDFLAGS="$(BOOT_LDFLAGS)" GNATBIND=stage2/gnatbind gnatbind
+ +
+ + gnatcompare: force
+ + for file in $(GNAT1_ADA_OBJS); do \
+ + tail +16c $$file > tmp-foo1; \
+ + tail +16c stage2/$$file > tmp-foo2 2>/dev/null \
+ + && (cmp tmp-foo1 tmp-foo2 || echo $$file differs); \
+ + done
+ + -rm -f tmp-foo*
+ +
+ + gnatstage1: force
+ + -if [ -d stage1 ] ; then true ; else mkdir stage1 ; fi
+ + -for file in *.ali; do \
+ + mv -f $$file `echo $$file | sed -e 's+.ali$$+.o+'` stage1 ; \
+ + done
+ + -mv -f gnat1 gnatbind stage1
+ +
+ + gnatstage2: force
+ + -if [ -d stage2 ] ; then true ; else mkdir stage2 ; fi
+ + -for file in *.ali; do \
+ + mv -f $$file `echo $$file | sed -e 's+.ali$$+.o+'` stage2 ; \
+ + done
+ + -mv -f gnat1 gnatbind stage2
+ +
+ + gnatclean: force
+ + rm -f $(GNAT1_OBJS) $(GNATF_OBJS) $(GNATBIND_OBJS) $(GNATK8_OBJS) \
+ + $(GNAT_RTL_OBJS) *.ali gnat1 gnatbind
+
+ # Copy just the executable files from a particular stage into a subdirectory,
+ # and delete the object files. Use this if you're just verifying a version
+ diff -rc gcc-2.5.8/config/i386/xm-dos.h gcc-2.5.8-ada/config/i386/xm-dos.h
+ *** gcc-2.5.8/config/i386/xm-dos.h Fri Apr 9 21:40:56 1993
+ --- gcc-2.5.8-ada/config/i386/xm-dos.h Fri Jul 1 15:21:36 1994
+ ***************
+ *** 6,11 ****
+ --- 6,14 ----
+ /* Use semicolons to separate elements of a path. */
+ #define PATH_SEPARATOR ';'
+
+ + /* Use backslashs to separate levels of directory. */
+ + #define DIR_SEPARATOR '\\'
+ +
+ /* Suffix for executable file names. */
+ #define EXECUTABLE_SUFFIX ".exe"
+
+ diff -rc gcc-2.5.8/config/m68k/m68k.md gcc-2.5.8-ada/config/m68k/m68k.md
+ *** gcc-2.5.8/config/m68k/m68k.md Tue Feb 22 11:22:53 1994
+ --- gcc-2.5.8-ada/config/m68k/m68k.md Fri Jul 1 15:15:28 1994
+ ***************
+ *** 933,939 ****
+ of several bytes a byte at a time. */
+ if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC
+ ! && XEXP (XEXP (operands[0], 0), 0) == stack_pointer_rtx)
+ {
+ xoperands[1] = operands[1];
+ xoperands[2]
+ --- 933,940 ----
+ of several bytes a byte at a time. */
+ if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC
+ ! && XEXP (XEXP (operands[0], 0), 0) == stack_pointer_rtx
+ ! && ! ADDRESS_REG_P (operands[1]))
+ {
+ xoperands[1] = operands[1];
+ xoperands[2]
+ diff -rc gcc-2.5.8/config/m68k/next.h gcc-2.5.8-ada/config/m68k/next.h
+ *** gcc-2.5.8/config/m68k/next.h Sat Oct 2 08:20:32 1993
+ --- gcc-2.5.8-ada/config/m68k/next.h Fri Jul 1 15:16:37 1994
+ ***************
+ *** 175,181 ****
+
+ #undef GO_IF_INDEXABLE_BASE(X, ADDR)
+ #define GO_IF_INDEXABLE_BASE(X, ADDR) \
+ ! { if (GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X)) goto ADDR; }
+
+ /* This accounts for the return pc and saved fp on the m68k. */
+
+ --- 175,181 ----
+
+ #undef GO_IF_INDEXABLE_BASE(X, ADDR)
+ #define GO_IF_INDEXABLE_BASE(X, ADDR) \
+ ! { if (LEGITIMATE_BASE_REG_P (X)) goto ADDR; }
+
+ /* This accounts for the return pc and saved fp on the m68k. */
+
+ diff -rc gcc-2.5.8/config/rs6000/rs6000.md gcc-2.5.8-ada/config/rs6000/rs6000.md
+ *** gcc-2.5.8/config/rs6000/rs6000.md Tue Dec 21 00:25:10 1993
+ --- gcc-2.5.8-ada/config/rs6000/rs6000.md Fri Jul 1 15:17:07 1994
+ ***************
+ *** 3191,3197 ****
+ ;; are preferred. Otherwise, we'd try to reload the output instead of
+ ;; giving the SCRATCH mq.
+ (define_insn ""
+ ! [(set (match_operand:TI 0 "reg_or_mem_operand" "=Q,m,r,r,r")
+ (match_operand:TI 1 "reg_or_mem_operand" "r,r,r,Q,m"))
+ (clobber (match_scratch:SI 2 "=q,q#X,X,X,X"))]
+ "TARGET_POWER && (gpc_reg_operand (operands[0], TImode)
+ --- 3191,3197 ----
+ ;; are preferred. Otherwise, we'd try to reload the output instead of
+ ;; giving the SCRATCH mq.
+ (define_insn ""
+ ! [(set (match_operand:TI 0 "reg_or_mem_operand" "=Q,m,????r,????r,????r")
+ (match_operand:TI 1 "reg_or_mem_operand" "r,r,r,Q,m"))
+ (clobber (match_scratch:SI 2 "=q,q#X,X,X,X"))]
+ "TARGET_POWER && (gpc_reg_operand (operands[0], TImode)
+ diff -rc gcc-2.5.8/config/sparc/sparc.c gcc-2.5.8-ada/config/sparc/sparc.c
+ *** gcc-2.5.8/config/sparc/sparc.c Fri Dec 3 11:34:04 1993
+ --- gcc-2.5.8-ada/config/sparc/sparc.c Fri Jul 1 15:13:39 1994
+ ***************
+ *** 2876,2881 ****
+ --- 2876,2885 ----
+ abort ();
+ }
+
+ + /* Return the value of a code used in the .proc pseudo-op that says
+ + what kind of result this function returns. For non-C types, we pick
+ + the closest C type. */
+ +
+ #ifndef CHAR_TYPE_SIZE
+ #define CHAR_TYPE_SIZE BITS_PER_UNIT
+ #endif
+ ***************
+ *** 2947,2952 ****
+ --- 2951,2957 ----
+ return (qualifiers | 8);
+
+ case UNION_TYPE:
+ + case QUAL_UNION_TYPE:
+ return (qualifiers | 9);
+
+ case ENUMERAL_TYPE:
+ ***************
+ *** 2965,3042 ****
+ }
+
+ /* Carefully distinguish all the standard types of C,
+ ! without messing up if the language is not C.
+ ! Note that we check only for the names that contain spaces;
+ ! other names might occur by coincidence in other languages. */
+ ! if (TYPE_NAME (type) != 0
+ ! && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
+ ! && DECL_NAME (TYPE_NAME (type)) != 0
+ ! && TREE_CODE (DECL_NAME (TYPE_NAME (type))) == IDENTIFIER_NODE)
+ ! {
+ ! char *name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
+ !
+ ! if (!strcmp (name, "unsigned char"))
+ ! return (qualifiers | 12);
+ ! if (!strcmp (name, "signed char"))
+ ! return (qualifiers | 2);
+ ! if (!strcmp (name, "unsigned int"))
+ ! return (qualifiers | 14);
+ ! if (!strcmp (name, "short int"))
+ ! return (qualifiers | 3);
+ ! if (!strcmp (name, "short unsigned int"))
+ ! return (qualifiers | 13);
+ ! if (!strcmp (name, "long int"))
+ ! return (qualifiers | 5);
+ ! if (!strcmp (name, "long unsigned int"))
+ ! return (qualifiers | 15);
+ ! if (!strcmp (name, "long long int"))
+ ! return (qualifiers | 5); /* Who knows? */
+ ! if (!strcmp (name, "long long unsigned int"))
+ ! return (qualifiers | 15); /* Who knows? */
+ ! }
+
+ ! /* Most integer types will be sorted out above, however, for the
+ ! sake of special `array index' integer types, the following code
+ ! is also provided. */
+
+ ! if (TYPE_PRECISION (type) == INT_TYPE_SIZE)
+ return (qualifiers | (TREE_UNSIGNED (type) ? 14 : 4));
+
+ ! if (TYPE_PRECISION (type) == LONG_TYPE_SIZE)
+ ! return (qualifiers | (TREE_UNSIGNED (type) ? 15 : 5));
+ !
+ ! if (TYPE_PRECISION (type) == LONG_LONG_TYPE_SIZE)
+ return (qualifiers | (TREE_UNSIGNED (type) ? 15 : 5));
+
+ - if (TYPE_PRECISION (type) == SHORT_TYPE_SIZE)
+ - return (qualifiers | (TREE_UNSIGNED (type) ? 13 : 3));
+ -
+ - if (TYPE_PRECISION (type) == CHAR_TYPE_SIZE)
+ - return (qualifiers | (TREE_UNSIGNED (type) ? 12 : 2));
+ -
+ - abort ();
+ -
+ case REAL_TYPE:
+ /* Carefully distinguish all the standard types of C,
+ without messing up if the language is not C. */
+ ! if (TYPE_NAME (type) != 0
+ ! && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
+ ! && DECL_NAME (TYPE_NAME (type)) != 0
+ ! && TREE_CODE (DECL_NAME (TYPE_NAME (type))) == IDENTIFIER_NODE)
+ ! {
+ ! char *name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
+ !
+ ! if (!strcmp (name, "long double"))
+ ! return (qualifiers | 7); /* Who knows? */
+ ! }
+ !
+ ! if (TYPE_PRECISION (type) == DOUBLE_TYPE_SIZE)
+ ! return (qualifiers | 7);
+ if (TYPE_PRECISION (type) == FLOAT_TYPE_SIZE)
+ return (qualifiers | 6);
+ ! if (TYPE_PRECISION (type) == LONG_DOUBLE_TYPE_SIZE)
+ ! return (qualifiers | 7); /* Who knows? */
+ ! abort ();
+
+ case COMPLEX_TYPE: /* GNU Fortran COMPLEX type. */
+ /* ??? We need to distinguish between double and float complex types,
+ --- 2970,3006 ----
+ }
+
+ /* Carefully distinguish all the standard types of C,
+ ! without messing up if the language is not C. We do this by
+ ! testing TYPE_PRECISION and TREE_UNSIGNED. The old code used to
+ ! look at both the names and the above fields, but that's redundant.
+ ! Any type whose size is between two C types will be considered
+ ! to be the wider of the two types. Also, we do not have a
+ ! special code to use for "long long", so anything wider than
+ ! long is treated the same. Note that we can't distinguish
+ ! between "int" and "long" in this code if they are the same
+ ! size, but that's fine, since neither can the assembler. */
+ !
+ ! if (TYPE_PRECISION (type) <= CHAR_TYPE_SIZE)
+ ! return (qualifiers | (TREE_UNSIGNED (type) ? 12 : 2));
+
+ ! else if (TYPE_PRECISION (type) <= SHORT_TYPE_SIZE)
+ ! return (qualifiers | (TREE_UNSIGNED (type) ? 13 : 3));
+
+ ! else if (TYPE_PRECISION (type) <= INT_TYPE_SIZE)
+ return (qualifiers | (TREE_UNSIGNED (type) ? 14 : 4));
+
+ ! else
+ return (qualifiers | (TREE_UNSIGNED (type) ? 15 : 5));
+
+ case REAL_TYPE:
+ /* Carefully distinguish all the standard types of C,
+ without messing up if the language is not C. */
+ !
+ if (TYPE_PRECISION (type) == FLOAT_TYPE_SIZE)
+ return (qualifiers | 6);
+ !
+ ! else
+ ! return (qualifiers | 7);
+
+ case COMPLEX_TYPE: /* GNU Fortran COMPLEX type. */
+ /* ??? We need to distinguish between double and float complex types,
+ diff -rc gcc-2.5.8/configure.bat gcc-2.5.8-ada/configure.bat
+ *** gcc-2.5.8/configure.bat Sun Dec 12 11:11:55 1993
+ --- gcc-2.5.8-ada/configure.bat Fri Jul 1 15:14:26 1994
+ ***************
+ *** 49,54 ****
+ --- 49,60 ----
+ echo "s/tmp-/t-/g ">> config.sed
+
+ sed -e "s/^\"//" -e "s/\"$//" -e "s/[ ]*$//" config.sed > config2.sed
+ +
+ + echo s/echo "\(.*\)"/echo \1/ >>config2.sed
+ + echo s/"\\"$(ADA_RTL_OBJ_DIR)\\""/\\"$(ADA_RTL_OBJ_DIR)\\"/ >>config2.sed
+ + echo s/return \\"$(ADA_INCLUDE_DIR)\/\\"/return "$(ADA_INCLUDE_DIR)\/"/ >>config2.sed
+ + echo s/return \\"$(ADA_RTL_OBJ_DIR)\/\\"/return "$(ADA_RTL_OBJ_DIR)\/"/ >>config2.sed
+ +
+ sed -f config2.sed Makefile.in >> Makefile
+ del config.sed
+ del config2.sed
+ diff -rc gcc-2.5.8/expr.c gcc-2.5.8-ada/expr.c
+ *** gcc-2.5.8/expr.c Tue Jan 11 00:26:14 1994
+ --- gcc-2.5.8-ada/expr.c Tue Jul 5 08:50:38 1994
+ ***************
+ *** 8223,8228 ****
+ --- 8223,8229 ----
+ rtx comparison = 0;
+ int i;
+ tree type;
+ + enum machine_mode mode;
+
+ emit_queue ();
+
+ ***************
+ *** 8299,8305 ****
+ && TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST
+ && TYPE_PRECISION (TREE_TYPE (exp)) <= HOST_BITS_PER_WIDE_INT
+ && (i = floor_log2 (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1)))) >= 0
+ ! && (type = type_for_size (i + 1, 1)) != 0
+ && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (exp))
+ && (cmp_optab->handlers[(int) TYPE_MODE (type)].insn_code
+ != CODE_FOR_nothing))
+ --- 8300,8307 ----
+ && TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST
+ && TYPE_PRECISION (TREE_TYPE (exp)) <= HOST_BITS_PER_WIDE_INT
+ && (i = floor_log2 (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1)))) >= 0
+ ! && (mode = mode_for_size (i + 1, MODE_INT, 0)) != BLKmode
+ ! && (type = type_for_mode (mode, 1)) != 0
+ && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (exp))
+ && (cmp_optab->handlers[(int) TYPE_MODE (type)].insn_code
+ != CODE_FOR_nothing))
+ diff -rc gcc-2.5.8/stmt.c gcc-2.5.8-ada/stmt.c
+ *** gcc-2.5.8/stmt.c Thu Nov 25 23:07:56 1993
+ --- gcc-2.5.8-ada/stmt.c Fri Jul 1 15:17:59 1994
+ ***************
+ *** 497,502 ****
+ --- 497,503 ----
+ {
+ /* We are not currently within any block, conditional, loop or case. */
+ block_stack = 0;
+ + stack_block_stack = 0;
+ loop_stack = 0;
+ case_stack = 0;
+ cond_stack = 0;
+ diff -rc gcc-2.5.8/stor-layout.c gcc-2.5.8-ada/stor-layout.c
+ *** gcc-2.5.8/stor-layout.c Wed Sep 22 18:27:58 1993
+ --- gcc-2.5.8-ada/stor-layout.c Fri Jul 1 15:18:32 1994
+ ***************
+ *** 82,96 ****
+ variable_size (size)
+ tree size;
+ {
+ - size = save_expr (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)
+ return size;
+
+ ! else if (global_bindings_p ())
+ {
+ if (TREE_CONSTANT (size))
+ error ("type size can't be explicitly evaluated");
+ --- 82,96 ----
+ variable_size (size)
+ tree 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)
+ return size;
+
+ ! size = save_expr (size);
+ !
+ ! if (global_bindings_p ())
+ {
+ if (TREE_CONSTANT (size))
+ error ("type size can't be explicitly evaluated");
+ diff -rc gcc-2.5.8/tree.c gcc-2.5.8-ada/tree.c
+ *** gcc-2.5.8/tree.c Tue Feb 22 11:24:31 1994
+ --- gcc-2.5.8-ada/tree.c Fri Jul 1 15:19:11 1994
+ ***************
+ *** 1826,1833 ****
+ {
+ switch (TREE_CODE (arg))
+ {
+ - case VAR_DECL:
+ case FUNCTION_DECL:
+ return TREE_STATIC (arg) || DECL_EXTERNAL (arg);
+
+ case CONSTRUCTOR:
+ --- 1826,1838 ----
+ {
+ switch (TREE_CODE (arg))
+ {
+ case FUNCTION_DECL:
+ + /* Nested functions aren't static. Since taking their address
+ + involves a trampoline. */
+ + if (decl_function_context (arg) != 0)
+ + return 0;
+ + /* ... fall through ... */
+ + case VAR_DECL:
+ return TREE_STATIC (arg) || DECL_EXTERNAL (arg);
+
+ case CONSTRUCTOR:
+ ***************
+ *** 3606,3618 ****
+ tree c, type;
+ {
+ if (TREE_UNSIGNED (type))
+ ! return (!INT_CST_LT_UNSIGNED (TYPE_MAX_VALUE (type), c)
+ ! && !INT_CST_LT_UNSIGNED (c, TYPE_MIN_VALUE (type))
+ ! && (TREE_INT_CST_HIGH (c) >= 0 || TREE_UNSIGNED (TREE_TYPE (c))));
+ else
+ ! return (!INT_CST_LT (TYPE_MAX_VALUE (type), c)
+ ! && !INT_CST_LT (c, TYPE_MIN_VALUE (type))
+ ! && (TREE_INT_CST_HIGH (c) >= 0 || !TREE_UNSIGNED (TREE_TYPE (c))));
+ }
+
+ /* Return the innermost context enclosing DECL that is
+ --- 3611,3625 ----
+ tree c, type;
+ {
+ if (TREE_UNSIGNED (type))
+ ! return (! (TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST
+ ! && INT_CST_LT_UNSIGNED (TYPE_MAX_VALUE (type), c))
+ ! && ! (TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST
+ ! && INT_CST_LT_UNSIGNED (c, TYPE_MIN_VALUE (type))));
+ else
+ ! return (! (TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST
+ ! && INT_CST_LT (TYPE_MAX_VALUE (type), c))
+ ! && ! (TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST
+ ! && INT_CST_LT (c, TYPE_MIN_VALUE (type))));
+ }
+
+ /* Return the innermost context enclosing DECL that is
+ diff -rc gcc-2.5.8/varasm.c gcc-2.5.8-ada/varasm.c
+ *** gcc-2.5.8/varasm.c Tue Jan 11 00:17:55 1994
+ --- gcc-2.5.8-ada/varasm.c Fri Jul 1 15:19:35 1994
+ ***************
+ *** 3269,3274 ****
+ --- 3269,3284 ----
+ if (size == 0)
+ return;
+
+ + /* Eliminate the NON_LVALUE_EXPR_EXPR that makes a cast not be an lvalue.
+ + That way we get the constant (we hope) inside it. Also, strip
+ + off any NOP_EXPR that converts between two record or union types. */
+ + while ((TREE_CODE (exp) == NOP_EXPR
+ + && (TREE_TYPE (exp) == TREE_TYPE (TREE_OPERAND (exp, 0))
+ + || TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
+ + || TREE_CODE (TREE_TYPE (exp)) == UNION_TYPE
+ + || TREE_CODE (TREE_TYPE (exp)) == QUAL_UNION_TYPE))
+ + || TREE_CODE (exp) == NON_LVALUE_EXPR)
+ + exp = TREE_OPERAND (exp, 0);
+ /* Allow a constructor with no elements for any data type.
+ This means to fill the space with zeros. */
+ if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
+ ***************
+ *** 3279,3290 ****
+ assemble_zeros (size);
+ return;
+ }
+ -
+ - /* Eliminate the NOP_EXPR that makes a cast not be an lvalue.
+ - That way we get the constant (we hope) inside it. */
+ - if (TREE_CODE (exp) == NOP_EXPR
+ - && TREE_TYPE (exp) == TREE_TYPE (TREE_OPERAND (exp, 0)))
+ - exp = TREE_OPERAND (exp, 0);
+
+ switch (code)
+ {
+ --- 3289,3294 ----
diff -rc --new-file /src/baseline/gnat-1.80/examples/Makefile gnat-1.80/examples/Makefile
*** /src/baseline/gnat-1.80/examples/Makefile Fri Jun 10 15:40:51 1994
--- gnat-1.80/examples/Makefile Thu Jul 7 10:46:57 1994
***************
*** 52,61 ****
% : %.o
gnatbl $@.ali -o $@ $($@_DEP)
! ./$@
clean : force
! @/bin/rm -f *.$o *.ali b_*.c *.s $(LIST_EXEC)
force :
--- 52,61 ----
% : %.o
gnatbl $@.ali -o $@ $($@_DEP)
! # ./$@
clean : force
! rm -f *.$o *.ali b_*.c *.s $(LIST_EXEC)
force :
diff -rc --new-file /src/baseline/gnat-1.80/src/Makefile.os2 gnat-1.80/src/Makefile.os2
*** /src/baseline/gnat-1.80/src/Makefile.os2 Fri Jun 10 15:44:44 1994
--- gnat-1.80/src/Makefile.os2 Thu Jun 23 14:52:13 1994
***************
*** 561,566 ****
--- 561,567 ----
a-textio.obj \
a-teioau.obj calendar.obj interfac.obj ioexcept.obj \
i-c.obj \
+ i-cstrin.obj \
system.obj \
s-addima.obj \
s-pooglo.obj \
***************
*** 723,731 ****
s-posrte.ads s-posrte.adb \
s-postim.ads s-postim.adb \
s-pthrea.ads s-pthrea.adb \
- s-reatim.ads s-reatim.adb \
- s-retico.ads s-retico.adb \
- s-retide.ads s-retide.adb \
s-secsta.ads s-secsta.adb \
s-stalib.ads \
s-std.ads s-std.adb \
--- 724,729 ----
***************
*** 935,941 ****
# File containing patches to be applied.
PATCH_FILE = patches-gcc258.os2
FILES_TO_BE_PATCHED = gcc.c cccp.c toplev.c tree.c stor-layout.c varasm.c \
! $(srcdir)\config\i386\os2.h $(srcdir)\config\i386\xm-os2.h
!IFDEF PATCH_FILE
$(FILES_TO_BE_PATCHED): $(PATCH_FILE)
$(PATCH) < $(PATCH_FILE)
--- 933,940 ----
# File containing patches to be applied.
PATCH_FILE = patches-gcc258.os2
FILES_TO_BE_PATCHED = gcc.c cccp.c toplev.c tree.c stor-layout.c varasm.c \
! $(srcdir)\config\i386\os2.h $(srcdir)\config\i386\xm-os2.h \
! $(srcdir)\config\i386\i386.h
!IFDEF PATCH_FILE
$(FILES_TO_BE_PATCHED): $(PATCH_FILE)
$(PATCH) < $(PATCH_FILE)
diff -rc --new-file /src/baseline/gnat-1.80/src/README.OS2 gnat-1.80/src/README.OS2
*** /src/baseline/gnat-1.80/src/README.OS2 Fri Jun 10 15:44:53 1994
--- gnat-1.80/src/README.OS2 Thu Jun 23 14:56:10 1994
***************
*** 13,26 ****
2) Make the root directory of the drive on which you installed the executables
of GNAT for OS/2 the current directory.
! 3) Unzip the file containing the latest version of the sources for GNAT
! (available at the ftp site mentioned above) with the command
! UNZIP drive:path\zipfilename
! where "drive" and "path" is the drive and path in which the file
! zipfilename resides. This will create a directory called
! gnat-version_number, where version_number is the version number of the GNAT
! sources. This directory will contain all the source code for GNAT.
! (If you are reading this file, you have presumably already done this step.)
4) Copy the sources for GNAT to the directory in which the sources for gcc
reside with the command
--- 13,22 ----
2) Make the root directory of the drive on which you installed the executables
of GNAT for OS/2 the current directory.
! 3) To unpack the file containing the latest version of the sources for GNAT
! (available at the ftp site mentioned above), follow the instructions in the
! README file available at the same ftp site. (If you are reading this file,
! you have presumably already done this step.)
4) Copy the sources for GNAT to the directory in which the sources for gcc
reside with the command
diff -rc --new-file /src/baseline/gnat-1.80/src/alloc.ads gnat-1.80/src/alloc.ads
*** /src/baseline/gnat-1.80/src/alloc.ads Fri Jun 10 15:42:40 1994
--- gnat-1.80/src/alloc.ads Wed Jul 6 16:56:49 1994
***************
*** 75,81 ****
Alloc_Nodes_Initial : constant := 8_000;
-- Initial allocation in nodes for tree (Atree)
! Alloc_Nodes_Increment : constant := 200;
-- Incremental allocation for nodes table (Atree)
Alloc_String_Chars_Initial : constant := 64_000;
--- 75,81 ----
Alloc_Nodes_Initial : constant := 8_000;
-- Initial allocation in nodes for tree (Atree)
! Alloc_Nodes_Increment : constant := 150;
-- Incremental allocation for nodes table (Atree)
Alloc_String_Chars_Initial : constant := 64_000;
diff -rc --new-file /src/baseline/gnat-1.80/src/atree.adb gnat-1.80/src/atree.adb
*** /src/baseline/gnat-1.80/src/atree.adb Fri Jun 10 15:42:42 1994
--- gnat-1.80/src/atree.adb Wed Jul 6 16:56:58 1994
***************
*** 1147,2813 ****
package body Unchecked_Access is
! function Field1 (N : Node_Id) return Union_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Field1;
! end Field1;
! function Field2 (N : Node_Id) return Union_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Field2;
! end Field2;
! function Field3 (N : Node_Id) return Union_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Field3;
! end Field3;
! function Field4 (N : Node_Id) return Union_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Field4;
! end Field4;
! function Field5 (N : Node_Id) return Union_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Field5;
! end Field5;
! function Field6 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Field6;
! end Field6;
! function Field7 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Field7;
! end Field7;
! function Field8 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Field8;
! end Field8;
! function Field9 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Field9;
! end Field9;
! function Field10 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Field10;
! end Field10;
! function Field11 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Field11;
! end Field11;
! function Field12 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Field12;
! end Field12;
! function Field13 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Field6;
! end Field13;
! function Field14 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Field7;
! end Field14;
! function Field15 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Field8;
! end Field15;
! function Field16 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Field9;
! end Field16;
! function Field17 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Field10;
! end Field17;
! function Field18 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Field11;
! end Field18;
! function Field19 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Field12;
! end Field19;
! function Node1 (N : Node_Id) return Node_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Node_Id (Nodes.Table (N).Field1);
! end Node1;
! function Node2 (N : Node_Id) return Node_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Node_Id (Nodes.Table (N).Field2);
! end Node2;
! function Node3 (N : Node_Id) return Node_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Node_Id (Nodes.Table (N).Field3);
! end Node3;
! function Node4 (N : Node_Id) return Node_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Node_Id (Nodes.Table (N).Field4);
! end Node4;
! function Node5 (N : Node_Id) return Node_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Node_Id (Nodes.Table (N).Field5);
! end Node5;
! function Node6 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 1).Field6);
! end Node6;
! function Node7 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 1).Field7);
! end Node7;
! function Node8 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 1).Field8);
! end Node8;
! function Node9 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 1).Field9);
! end Node9;
! function Node10 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 1).Field10);
! end Node10;
! function Node11 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 1).Field11);
! end Node11;
! function Node12 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 1).Field12);
! end Node12;
! function Node13 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 2).Field6);
! end Node13;
! function Node14 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 2).Field7);
! end Node14;
! function Node15 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 2).Field8);
! end Node15;
! function Node16 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 2).Field9);
! end Node16;
! function Node17 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 2).Field10);
! end Node17;
! function Node18 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 2).Field11);
! end Node18;
! function Node19 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 2).Field12);
! end Node19;
! function List1 (N : Node_Id) return List_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return List_Id (Nodes.Table (N).Field1);
! end List1;
! function List2 (N : Node_Id) return List_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return List_Id (Nodes.Table (N).Field2);
! end List2;
! function List3 (N : Node_Id) return List_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return List_Id (Nodes.Table (N).Field3);
! end List3;
! function List4 (N : Node_Id) return List_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return List_Id (Nodes.Table (N).Field4);
! end List4;
! function List5 (N : Node_Id) return List_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return List_Id (Nodes.Table (N).Field5);
! end List5;
! function Elist6 (N : Node_Id) return Elist_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Elist_Id (Nodes.Table (N + 1).Field6);
! end Elist6;
! function Elist13 (N : Node_Id) return Elist_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Elist_Id (Nodes.Table (N + 2).Field6);
! end Elist13;
!
! function Name1 (N : Node_Id) return Name_Id is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! return Name_Id (Nodes.Table (N).Field1);
! end Name1;
! function Name2 (N : Node_Id) return Name_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Name_Id (Nodes.Table (N).Field2);
! end Name2;
! function Str3 (N : Node_Id) return String_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return String_Id (Nodes.Table (N).Field3);
! end Str3;
! function Char_Code2 (N : Node_Id) return Char_Code is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Char_Code (Nodes.Table (N).Field2 - Char_Code_Bias);
! end Char_Code2;
! function Uint3 (N : Node_Id) return Uint is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Uint (Nodes.Table (N).Field3);
! end Uint3;
! function Uint4 (N : Node_Id) return Uint is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Uint (Nodes.Table (N).Field4);
! end Uint4;
! function Uint9 (N : Node_Id) return Uint is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Uint (Nodes.Table (N + 1).Field9);
! end Uint9;
! function Uint11 (N : Node_Id) return Uint is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Uint (Nodes.Table (N + 1).Field11);
! end Uint11;
! function Uint12 (N : Node_Id) return Uint is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Uint (Nodes.Table (N + 1).Field12);
! end Uint12;
! function Uint15 (N : Node_Id) return Uint is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Uint (Nodes.Table (N + 2).Field8);
! end Uint15;
! function Ureal3 (N : Node_Id) return Ureal is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Ureal (Nodes.Table (N).Field3);
! end Ureal3;
! function Ureal6 (N : Node_Id) return Ureal is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Ureal (Nodes.Table (N + 1).Field6);
! end Ureal6;
! function Ureal7 (N : Node_Id) return Ureal is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Ureal (Nodes.Table (N + 1).Field7);
! end Ureal7;
! function Flag1 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag1;
! end Flag1;
! function Flag2 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag2;
! end Flag2;
! function Flag3 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag3;
! end Flag3;
! function Flag4 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag4;
! end Flag4;
! function Flag5 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag5;
! end Flag5;
! function Flag6 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag6;
! end Flag6;
! function Flag7 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag7;
! end Flag7;
! function Flag8 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag8;
! end Flag8;
! function Flag9 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag9;
! end Flag9;
! function Flag10 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag10;
! end Flag10;
! function Flag11 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag11;
! end Flag11;
! function Flag12 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag12;
! end Flag12;
! function Flag13 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag13;
! end Flag13;
! function Flag14 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag14;
! end Flag14;
! function Flag15 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag15;
! end Flag15;
! function Flag16 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag16;
! end Flag16;
! function Flag17 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag17;
! end Flag17;
! function Flag18 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag18;
! end Flag18;
! function Flag19 (N : Node_Id) return Boolean is
begin
! pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).In_List;
! end Flag19;
! function Flag20 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Rewrite_Sub;
! end Flag20;
! function Flag21 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Rewrite_Ins;
! end Flag21;
! function Flag22 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag1;
! end Flag22;
! function Flag23 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag2;
! end Flag23;
! function Flag24 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag3;
! end Flag24;
! function Flag25 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag4;
! end Flag25;
! function Flag26 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag5;
! end Flag26;
!
! function Flag27 (N : Node_Id) return Boolean is
! begin
! pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag6;
! end Flag27;
! function Flag28 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag7;
! end Flag28;
! function Flag29 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag8;
! end Flag29;
! function Flag30 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag9;
! end Flag30;
! function Flag31 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag10;
! end Flag31;
! function Flag32 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag11;
! end Flag32;
! function Flag33 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag12;
! end Flag33;
! function Flag34 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag13;
! end Flag34;
! function Flag35 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag14;
! end Flag35;
! function Flag36 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag15;
! end Flag36;
! function Flag37 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag16;
! end Flag37;
! function Flag38 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag17;
! end Flag38;
! function Flag39 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag18;
! end Flag39;
! function Flag40 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).In_List;
! end Flag40;
! function Flag41 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Rewrite_Sub;
! end Flag41;
! function Flag42 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Rewrite_Ins;
! end Flag42;
! function Flag43 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag1;
! end Flag43;
! function Flag44 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag2;
! end Flag44;
! function Flag45 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag3;
! end Flag45;
! function Flag46 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag4;
! end Flag46;
! function Flag47 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag5;
! end Flag47;
! function Flag48 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag6;
! end Flag48;
! function Flag49 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag7;
! end Flag49;
! function Flag50 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag8;
! end Flag50;
! function Flag51 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag9;
! end Flag51;
! function Flag52 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag10;
! end Flag52;
! function Flag53 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag11;
! end Flag53;
! function Flag54 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag12;
! end Flag54;
! function Flag55 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag13;
! end Flag55;
! function Flag56 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag14;
! end Flag56;
! function Flag57 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag15;
! end Flag57;
! function Flag58 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag16;
! end Flag58;
! function Flag59 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag17;
! end Flag59;
! function Flag60 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag18;
! end Flag60;
! function Flag61 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Pflag1;
! end Flag61;
! function Flag62 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Pflag2;
! end Flag62;
! function Flag63 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Pflag1;
! end Flag63;
! function Flag64 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Pflag2;
! end Flag64;
! function Flag65 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag65;
! end Flag65;
! function Flag66 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag66;
! end Flag66;
! function Flag67 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag67;
! end Flag67;
! function Flag68 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag68;
! end Flag68;
! function Flag69 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag69;
! end Flag69;
! function Flag70 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag70;
! end Flag70;
! function Flag71 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag71;
! end Flag71;
! function Flag72 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag72;
! end Flag72;
! procedure Set_Nkind (N : Node_Id; Val : Node_Kind) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Nkind := Val;
! end Set_Nkind;
! procedure Set_Field1 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field1 := Val;
! end Set_Field1;
! procedure Set_Field2 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field2 := Val;
! end Set_Field2;
! procedure Set_Field3 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field3 := Val;
! end Set_Field3;
! procedure Set_Field4 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field4 := Val;
! end Set_Field4;
! procedure Set_Field5 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field5 := Val;
! end Set_Field5;
! procedure Set_Field6 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field6 := Val;
! end Set_Field6;
! procedure Set_Field7 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field7 := Val;
! end Set_Field7;
! procedure Set_Field8 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field8 := Val;
! end Set_Field8;
! procedure Set_Field9 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field9 := Val;
! end Set_Field9;
! procedure Set_Field10 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field10 := Val;
! end Set_Field10;
! procedure Set_Field11 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field11 := Val;
! end Set_Field11;
! procedure Set_Field12 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field12 := Val;
! end Set_Field12;
! procedure Set_Field13 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field6 := Val;
! end Set_Field13;
! procedure Set_Field14 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field7 := Val;
! end Set_Field14;
! procedure Set_Field15 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field8 := Val;
! end Set_Field15;
! procedure Set_Field16 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field9 := Val;
! end Set_Field16;
! procedure Set_Field17 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field10 := Val;
! end Set_Field17;
! procedure Set_Field18 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field11 := Val;
! end Set_Field18;
! procedure Set_Field19 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field12 := Val;
! end Set_Field19;
! procedure Set_Node1 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field1 := Union_Id (Val);
! end Set_Node1;
! procedure Set_Node2 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field2 := Union_Id (Val);
! end Set_Node2;
! procedure Set_Node3 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field3 := Union_Id (Val);
! end Set_Node3;
! procedure Set_Node4 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field4 := Union_Id (Val);
! end Set_Node4;
! procedure Set_Node5 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field5 := Union_Id (Val);
! end Set_Node5;
! procedure Set_Node6 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field6 := Union_Id (Val);
! end Set_Node6;
! procedure Set_Node7 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field7 := Union_Id (Val);
! end Set_Node7;
! procedure Set_Node8 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field8 := Union_Id (Val);
! end Set_Node8;
! procedure Set_Node9 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field9 := Union_Id (Val);
! end Set_Node9;
! procedure Set_Node10 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field10 := Union_Id (Val);
! end Set_Node10;
! procedure Set_Node11 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field11 := Union_Id (Val);
! end Set_Node11;
! procedure Set_Node12 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field12 := Union_Id (Val);
! end Set_Node12;
! procedure Set_Node13 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field6 := Union_Id (Val);
! end Set_Node13;
! procedure Set_Node14 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field7 := Union_Id (Val);
! end Set_Node14;
! procedure Set_Node15 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field8 := Union_Id (Val);
! end Set_Node15;
! procedure Set_Node16 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field9 := Union_Id (Val);
! end Set_Node16;
! procedure Set_Node17 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field10 := Union_Id (Val);
! end Set_Node17;
! procedure Set_Node18 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field11 := Union_Id (Val);
! end Set_Node18;
! procedure Set_Node19 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field12 := Union_Id (Val);
! end Set_Node19;
! procedure Set_List1 (N : Node_Id; Val : List_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field1 := Union_Id (Val);
! end Set_List1;
! procedure Set_List2 (N : Node_Id; Val : List_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field2 := Union_Id (Val);
! end Set_List2;
! procedure Set_List3 (N : Node_Id; Val : List_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field3 := Union_Id (Val);
! end Set_List3;
! procedure Set_List4 (N : Node_Id; Val : List_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field4 := Union_Id (Val);
! end Set_List4;
! procedure Set_List5 (N : Node_Id; Val : List_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field5 := Union_Id (Val);
! end Set_List5;
! procedure Set_Elist6 (N : Node_Id; Val : Elist_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field6 := Union_Id (Val);
! end Set_Elist6;
! procedure Set_Elist13 (N : Node_Id; Val : Elist_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field6 := Union_Id (Val);
! end Set_Elist13;
! procedure Set_Name1 (N : Node_Id; Val : Name_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field1 := Union_Id (Val);
! end Set_Name1;
! procedure Set_Name2 (N : Node_Id; Val : Name_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field2 := Union_Id (Val);
! end Set_Name2;
! procedure Set_Str3 (N : Node_Id; Val : String_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field3 := Union_Id (Val);
! end Set_Str3;
! procedure Set_Uint3 (N : Node_Id; Val : Uint) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field3 := Union_Id (Val);
! end Set_Uint3;
! procedure Set_Uint4 (N : Node_Id; Val : Uint) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field4 := Union_Id (Val);
! end Set_Uint4;
! procedure Set_Uint9 (N : Node_Id; Val : Uint) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field9 := Union_Id (Val);
! end Set_Uint9;
! procedure Set_Uint11 (N : Node_Id; Val : Uint) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field11 := Union_Id (Val);
! end Set_Uint11;
! procedure Set_Uint12 (N : Node_Id; Val : Uint) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field12 := Union_Id (Val);
! end Set_Uint12;
! procedure Set_Uint15 (N : Node_Id; Val : Uint) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field8 := Union_Id (Val);
! end Set_Uint15;
! procedure Set_Ureal3 (N : Node_Id; Val : Ureal) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field3 := Union_Id (Val);
! end Set_Ureal3;
! procedure Set_Ureal6 (N : Node_Id; Val : Ureal) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field6 := Union_Id (Val);
! end Set_Ureal6;
! procedure Set_Ureal7 (N : Node_Id; Val : Ureal) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field7 := Union_Id (Val);
! end Set_Ureal7;
!
! procedure Set_Char_Code2 (N : Node_Id; Val : Char_Code) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field2 := Union_Id (Val) + Char_Code_Bias;
! end Set_Char_Code2;
!
! procedure Set_Flag1 (N : Node_Id; Val : Boolean) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag1 := Val;
! end Set_Flag1;
! procedure Set_Flag2 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag2 := Val;
! end Set_Flag2;
! procedure Set_Flag3 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag3 := Val;
! end Set_Flag3;
! procedure Set_Flag4 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag4 := Val;
! end Set_Flag4;
! procedure Set_Flag5 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag5 := Val;
! end Set_Flag5;
! procedure Set_Flag6 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag6 := Val;
! end Set_Flag6;
! procedure Set_Flag7 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag7 := Val;
! end Set_Flag7;
! procedure Set_Flag8 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag8 := Val;
! end Set_Flag8;
! procedure Set_Flag9 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag9 := Val;
! end Set_Flag9;
! procedure Set_Flag10 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag10 := Val;
! end Set_Flag10;
! procedure Set_Flag11 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag11 := Val;
! end Set_Flag11;
! procedure Set_Flag12 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag12 := Val;
! end Set_Flag12;
! procedure Set_Flag13 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag13 := Val;
! end Set_Flag13;
! procedure Set_Flag14 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag14 := Val;
! end Set_Flag14;
! procedure Set_Flag15 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag15 := Val;
! end Set_Flag15;
! procedure Set_Flag16 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag16 := Val;
! end Set_Flag16;
! procedure Set_Flag17 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag17 := Val;
! end Set_Flag17;
! procedure Set_Flag18 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag18 := Val;
! end Set_Flag18;
! procedure Set_Flag19 (N : Node_Id; Val : Boolean) is
begin
! pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).In_List := Val;
! end Set_Flag19;
! procedure Set_Flag20 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Rewrite_Sub := Val;
! end Set_Flag20;
! procedure Set_Flag21 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Rewrite_Ins := Val;
! end Set_Flag21;
! procedure Set_Flag22 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag1 := Val;
! end Set_Flag22;
! procedure Set_Flag23 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag2 := Val;
! end Set_Flag23;
! procedure Set_Flag24 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag3 := Val;
! end Set_Flag24;
! procedure Set_Flag25 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag4 := Val;
! end Set_Flag25;
! procedure Set_Flag26 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag5 := Val;
! end Set_Flag26;
! procedure Set_Flag27 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag6 := Val;
! end Set_Flag27;
! procedure Set_Flag28 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag7 := Val;
! end Set_Flag28;
! procedure Set_Flag29 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag8 := Val;
! end Set_Flag29;
! procedure Set_Flag30 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag9 := Val;
! end Set_Flag30;
! procedure Set_Flag31 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag10 := Val;
! end Set_Flag31;
! procedure Set_Flag32 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag11 := Val;
! end Set_Flag32;
! procedure Set_Flag33 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag12 := Val;
! end Set_Flag33;
! procedure Set_Flag34 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag13 := Val;
! end Set_Flag34;
! procedure Set_Flag35 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag14 := Val;
! end Set_Flag35;
! procedure Set_Flag36 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag15 := Val;
! end Set_Flag36;
! procedure Set_Flag37 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag16 := Val;
! end Set_Flag37;
! procedure Set_Flag38 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag17 := Val;
! end Set_Flag38;
! procedure Set_Flag39 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag18 := Val;
! end Set_Flag39;
! procedure Set_Flag40 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).In_List := Val;
! end Set_Flag40;
! procedure Set_Flag41 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Rewrite_Sub := Val;
! end Set_Flag41;
! procedure Set_Flag42 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Rewrite_Ins := Val;
! end Set_Flag42;
! procedure Set_Flag43 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag1 := Val;
! end Set_Flag43;
! procedure Set_Flag44 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag2 := Val;
! end Set_Flag44;
! procedure Set_Flag45 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag3 := Val;
! end Set_Flag45;
! procedure Set_Flag46 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag4 := Val;
! end Set_Flag46;
! procedure Set_Flag47 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag5 := Val;
! end Set_Flag47;
! procedure Set_Flag48 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag6 := Val;
! end Set_Flag48;
! procedure Set_Flag49 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag7 := Val;
! end Set_Flag49;
! procedure Set_Flag50 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag8 := Val;
! end Set_Flag50;
! procedure Set_Flag51 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag9 := Val;
! end Set_Flag51;
! procedure Set_Flag52 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag10 := Val;
! end Set_Flag52;
! procedure Set_Flag53 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag11 := Val;
! end Set_Flag53;
! procedure Set_Flag54 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag12 := Val;
! end Set_Flag54;
! procedure Set_Flag55 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag13 := Val;
! end Set_Flag55;
! procedure Set_Flag56 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag14 := Val;
! end Set_Flag56;
! procedure Set_Flag57 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag15 := Val;
! end Set_Flag57;
! procedure Set_Flag58 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag16 := Val;
! end Set_Flag58;
! procedure Set_Flag59 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag17 := Val;
! end Set_Flag59;
! procedure Set_Flag60 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag18 := Val;
! end Set_Flag60;
! procedure Set_Flag61 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Pflag1 := Val;
! end Set_Flag61;
! procedure Set_Flag62 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Pflag2 := Val;
! end Set_Flag62;
! procedure Set_Flag63 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Pflag1 := Val;
! end Set_Flag63;
! procedure Set_Flag64 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Pflag2 := Val;
! end Set_Flag64;
! procedure Set_Flag65 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
! (Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag65 := Val;
! end Set_Flag65;
! procedure Set_Flag66 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
(Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag66 := Val;
! end Set_Flag66;
! procedure Set_Flag67 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
(Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag67 := Val;
! end Set_Flag67;
! procedure Set_Flag68 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
(Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag68 := Val;
! end Set_Flag68;
! procedure Set_Flag69 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
(Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag69 := Val;
! end Set_Flag69;
! procedure Set_Flag70 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
(Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag70 := Val;
! end Set_Flag70;
! procedure Set_Flag71 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
(Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag71 := Val;
! end Set_Flag71;
! procedure Set_Flag72 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
(Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag72 := Val;
! end Set_Flag72;
!
! procedure Set_Node1_With_Parent (N : Node_Id; Val : Node_Id) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val > Error then Set_Parent (Val, N); end if;
! Set_Node1 (N, Val);
! end Set_Node1_With_Parent;
!
! procedure Set_Node2_With_Parent (N : Node_Id; Val : Node_Id) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val > Error then Set_Parent (Val, N); end if;
! Set_Node2 (N, Val);
! end Set_Node2_With_Parent;
!
! procedure Set_Node3_With_Parent (N : Node_Id; Val : Node_Id) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val > Error then Set_Parent (Val, N); end if;
! Set_Node3 (N, Val);
! end Set_Node3_With_Parent;
!
! procedure Set_Node4_With_Parent (N : Node_Id; Val : Node_Id) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val > Error then Set_Parent (Val, N); end if;
! Set_Node4 (N, Val);
! end Set_Node4_With_Parent;
!
! procedure Set_Node5_With_Parent (N : Node_Id; Val : Node_Id) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val > Error then Set_Parent (Val, N); end if;
! Set_Node5 (N, Val);
! end Set_Node5_With_Parent;
!
! procedure Set_List1_With_Parent (N : Node_Id; Val : List_Id) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val /= No_List and then Val /= Error_List then
! Set_Parent (Val, N);
! end if;
! Set_List1 (N, Val);
! end Set_List1_With_Parent;
!
! procedure Set_List2_With_Parent (N : Node_Id; Val : List_Id) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val /= No_List and then Val /= Error_List then
! Set_Parent (Val, N);
! end if;
! Set_List2 (N, Val);
! end Set_List2_With_Parent;
!
! procedure Set_List3_With_Parent (N : Node_Id; Val : List_Id) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val /= No_List and then Val /= Error_List then
! Set_Parent (Val, N);
! end if;
! Set_List3 (N, Val);
! end Set_List3_With_Parent;
!
! procedure Set_List4_With_Parent (N : Node_Id; Val : List_Id) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val /= No_List and then Val /= Error_List then
! Set_Parent (Val, N);
! end if;
! Set_List4 (N, Val);
! end Set_List4_With_Parent;
! procedure Set_List5_With_Parent (N : Node_Id; Val : List_Id) is
begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val /= No_List and then Val /= Error_List then
! Set_Parent (Val, N);
! end if;
! Set_List5 (N, Val);
! end Set_List5_With_Parent;
end Unchecked_Access;
--- 1147,2848 ----
package body Unchecked_Access is
!
! procedure Set_Nkind (N : Node_Id; Val : Node_Kind) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Nkind := Val;
! end Set_Nkind;
! procedure Set_Field1 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field1 := Val;
! end Set_Field1;
! procedure Set_Field2 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field2 := Val;
! end Set_Field2;
! procedure Set_Field3 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field3 := Val;
! end Set_Field3;
! procedure Set_Field4 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field4 := Val;
! end Set_Field4;
! procedure Set_Field5 (N : Node_Id; Val : Union_Id) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field5 := Val;
! end Set_Field5;
!
! procedure Set_Field6 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field6 := Val;
! end Set_Field6;
! procedure Set_Field7 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field7 := Val;
! end Set_Field7;
! procedure Set_Field8 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field8 := Val;
! end Set_Field8;
! procedure Set_Field9 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field9 := Val;
! end Set_Field9;
! procedure Set_Field10 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field10 := Val;
! end Set_Field10;
! procedure Set_Field11 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field11 := Val;
! end Set_Field11;
! procedure Set_Field12 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field12 := Val;
! end Set_Field12;
! procedure Set_Field13 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field6 := Val;
! end Set_Field13;
! procedure Set_Field14 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field7 := Val;
! end Set_Field14;
! procedure Set_Field15 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field8 := Val;
! end Set_Field15;
! procedure Set_Field16 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field9 := Val;
! end Set_Field16;
! procedure Set_Field17 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field10 := Val;
! end Set_Field17;
! procedure Set_Field18 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field11 := Val;
! end Set_Field18;
! procedure Set_Field19 (N : Node_Id; Val : Union_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field12 := Val;
! end Set_Field19;
! procedure Set_Node1 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field1 := Union_Id (Val);
! end Set_Node1;
! procedure Set_Node2 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field2 := Union_Id (Val);
! end Set_Node2;
! procedure Set_Node3 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field3 := Union_Id (Val);
! end Set_Node3;
! procedure Set_Node4 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field4 := Union_Id (Val);
! end Set_Node4;
! procedure Set_Node5 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field5 := Union_Id (Val);
! end Set_Node5;
! procedure Set_Node6 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field6 := Union_Id (Val);
! end Set_Node6;
! procedure Set_Node7 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field7 := Union_Id (Val);
! end Set_Node7;
! procedure Set_Node8 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field8 := Union_Id (Val);
! end Set_Node8;
! procedure Set_Node9 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field9 := Union_Id (Val);
! end Set_Node9;
! procedure Set_Node10 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field10 := Union_Id (Val);
! end Set_Node10;
! procedure Set_Node11 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field11 := Union_Id (Val);
! end Set_Node11;
! procedure Set_Node12 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field12 := Union_Id (Val);
! end Set_Node12;
! procedure Set_Node13 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field6 := Union_Id (Val);
! end Set_Node13;
! procedure Set_Node14 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field7 := Union_Id (Val);
! end Set_Node14;
! procedure Set_Node15 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field8 := Union_Id (Val);
! end Set_Node15;
! procedure Set_Node16 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field9 := Union_Id (Val);
! end Set_Node16;
! procedure Set_Node17 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field10 := Union_Id (Val);
! end Set_Node17;
! procedure Set_Node18 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field11 := Union_Id (Val);
! end Set_Node18;
! procedure Set_Node19 (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field12 := Union_Id (Val);
! end Set_Node19;
! procedure Set_List1 (N : Node_Id; Val : List_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field1 := Union_Id (Val);
! end Set_List1;
! procedure Set_List2 (N : Node_Id; Val : List_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field2 := Union_Id (Val);
! end Set_List2;
! procedure Set_List3 (N : Node_Id; Val : List_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field3 := Union_Id (Val);
! end Set_List3;
! procedure Set_List4 (N : Node_Id; Val : List_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field4 := Union_Id (Val);
! end Set_List4;
! procedure Set_List5 (N : Node_Id; Val : List_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field5 := Union_Id (Val);
! end Set_List5;
! procedure Set_Elist6 (N : Node_Id; Val : Elist_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field6 := Union_Id (Val);
! end Set_Elist6;
! procedure Set_Elist13 (N : Node_Id; Val : Elist_Id) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field6 := Union_Id (Val);
! end Set_Elist13;
! procedure Set_Name1 (N : Node_Id; Val : Name_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field1 := Union_Id (Val);
! end Set_Name1;
! procedure Set_Name2 (N : Node_Id; Val : Name_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field2 := Union_Id (Val);
! end Set_Name2;
! procedure Set_Str3 (N : Node_Id; Val : String_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field3 := Union_Id (Val);
! end Set_Str3;
! procedure Set_Uint3 (N : Node_Id; Val : Uint) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field3 := Union_Id (Val);
! end Set_Uint3;
! procedure Set_Uint4 (N : Node_Id; Val : Uint) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field4 := Union_Id (Val);
! end Set_Uint4;
! procedure Set_Uint9 (N : Node_Id; Val : Uint) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field9 := Union_Id (Val);
! end Set_Uint9;
! procedure Set_Uint11 (N : Node_Id; Val : Uint) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field11 := Union_Id (Val);
! end Set_Uint11;
! procedure Set_Uint12 (N : Node_Id; Val : Uint) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field12 := Union_Id (Val);
! end Set_Uint12;
! procedure Set_Uint15 (N : Node_Id; Val : Uint) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Field8 := Union_Id (Val);
! end Set_Uint15;
! procedure Set_Ureal3 (N : Node_Id; Val : Ureal) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field3 := Union_Id (Val);
! end Set_Ureal3;
! procedure Set_Ureal6 (N : Node_Id; Val : Ureal) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field6 := Union_Id (Val);
! end Set_Ureal6;
! procedure Set_Ureal7 (N : Node_Id; Val : Ureal) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Field7 := Union_Id (Val);
! end Set_Ureal7;
! procedure Set_Char_Code2 (N : Node_Id; Val : Char_Code) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Field2 := Union_Id (Val) + Char_Code_Bias;
! end Set_Char_Code2;
! procedure Set_Flag1 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag1 := Val;
! end Set_Flag1;
! procedure Set_Flag2 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag2 := Val;
! end Set_Flag2;
! procedure Set_Flag3 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag3 := Val;
! end Set_Flag3;
! procedure Set_Flag4 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag4 := Val;
! end Set_Flag4;
! procedure Set_Flag5 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag5 := Val;
! end Set_Flag5;
! procedure Set_Flag6 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag6 := Val;
! end Set_Flag6;
! procedure Set_Flag7 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag7 := Val;
! end Set_Flag7;
! procedure Set_Flag8 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag8 := Val;
! end Set_Flag8;
! procedure Set_Flag9 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag9 := Val;
! end Set_Flag9;
! procedure Set_Flag10 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag10 := Val;
! end Set_Flag10;
! procedure Set_Flag11 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag11 := Val;
! end Set_Flag11;
! procedure Set_Flag12 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag12 := Val;
! end Set_Flag12;
! procedure Set_Flag13 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag13 := Val;
! end Set_Flag13;
! procedure Set_Flag14 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag14 := Val;
! end Set_Flag14;
! procedure Set_Flag15 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag15 := Val;
! end Set_Flag15;
! procedure Set_Flag16 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag16 := Val;
! end Set_Flag16;
! procedure Set_Flag17 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag17 := Val;
! end Set_Flag17;
! procedure Set_Flag18 (N : Node_Id; Val : Boolean) is
begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! Nodes.Table (N).Flag18 := Val;
! end Set_Flag18;
! procedure Set_Flag19 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).In_List := Val;
! end Set_Flag19;
! procedure Set_Flag20 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Rewrite_Sub := Val;
! end Set_Flag20;
! procedure Set_Flag21 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Rewrite_Ins := Val;
! end Set_Flag21;
! procedure Set_Flag22 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag1 := Val;
! end Set_Flag22;
! procedure Set_Flag23 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag2 := Val;
! end Set_Flag23;
! procedure Set_Flag24 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag3 := Val;
! end Set_Flag24;
! procedure Set_Flag25 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag4 := Val;
! end Set_Flag25;
! procedure Set_Flag26 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag5 := Val;
! end Set_Flag26;
! procedure Set_Flag27 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag6 := Val;
! end Set_Flag27;
! procedure Set_Flag28 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag7 := Val;
! end Set_Flag28;
! procedure Set_Flag29 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag8 := Val;
! end Set_Flag29;
! procedure Set_Flag30 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag9 := Val;
! end Set_Flag30;
! procedure Set_Flag31 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag10 := Val;
! end Set_Flag31;
! procedure Set_Flag32 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag11 := Val;
! end Set_Flag32;
! procedure Set_Flag33 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag12 := Val;
! end Set_Flag33;
! procedure Set_Flag34 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag13 := Val;
! end Set_Flag34;
! procedure Set_Flag35 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag14 := Val;
! end Set_Flag35;
! procedure Set_Flag36 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag15 := Val;
! end Set_Flag36;
! procedure Set_Flag37 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag16 := Val;
! end Set_Flag37;
! procedure Set_Flag38 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag17 := Val;
! end Set_Flag38;
! procedure Set_Flag39 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Flag18 := Val;
! end Set_Flag39;
! procedure Set_Flag40 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).In_List := Val;
! end Set_Flag40;
! procedure Set_Flag41 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Rewrite_Sub := Val;
! end Set_Flag41;
! procedure Set_Flag42 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Rewrite_Ins := Val;
! end Set_Flag42;
! procedure Set_Flag43 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag1 := Val;
! end Set_Flag43;
! procedure Set_Flag44 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag2 := Val;
! end Set_Flag44;
! procedure Set_Flag45 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag3 := Val;
! end Set_Flag45;
! procedure Set_Flag46 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag4 := Val;
! end Set_Flag46;
! procedure Set_Flag47 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag5 := Val;
! end Set_Flag47;
! procedure Set_Flag48 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag6 := Val;
! end Set_Flag48;
! procedure Set_Flag49 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag7 := Val;
! end Set_Flag49;
! procedure Set_Flag50 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag8 := Val;
! end Set_Flag50;
! procedure Set_Flag51 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag9 := Val;
! end Set_Flag51;
! procedure Set_Flag52 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag10 := Val;
! end Set_Flag52;
! procedure Set_Flag53 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag11 := Val;
! end Set_Flag53;
! procedure Set_Flag54 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag12 := Val;
! end Set_Flag54;
! procedure Set_Flag55 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag13 := Val;
! end Set_Flag55;
! procedure Set_Flag56 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag14 := Val;
! end Set_Flag56;
! procedure Set_Flag57 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag15 := Val;
! end Set_Flag57;
! procedure Set_Flag58 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag16 := Val;
! end Set_Flag58;
! procedure Set_Flag59 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag17 := Val;
! end Set_Flag59;
! procedure Set_Flag60 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Flag18 := Val;
! end Set_Flag60;
! procedure Set_Flag61 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Pflag1 := Val;
! end Set_Flag61;
! procedure Set_Flag62 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 1).Pflag2 := Val;
! end Set_Flag62;
! procedure Set_Flag63 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Pflag1 := Val;
! end Set_Flag63;
!
! procedure Set_Flag64 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! Nodes.Table (N + 2).Pflag2 := Val;
! end Set_Flag64;
! procedure Set_Flag65 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
! (Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag65 := Val;
! end Set_Flag65;
! procedure Set_Flag66 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
! (Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag66 := Val;
! end Set_Flag66;
! procedure Set_Flag67 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
! (Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag67 := Val;
! end Set_Flag67;
! procedure Set_Flag68 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
! (Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag68 := Val;
! end Set_Flag68;
! procedure Set_Flag69 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
! (Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag69 := Val;
! end Set_Flag69;
! procedure Set_Flag70 (N : Node_Id; Val : Boolean) is
begin
pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
! (Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag70 := Val;
! end Set_Flag70;
! procedure Set_Flag71 (N : Node_Id; Val : Boolean) is
! begin
! pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
! (Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag71 := Val;
! end Set_Flag71;
!
! procedure Set_Flag72 (N : Node_Id; Val : Boolean) is
! begin
! pragma Assert (Nkind (N) in N_Entity);
! To_Flag_Byte_Ptr
! (Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag72 := Val;
! end Set_Flag72;
!
! procedure Set_Node1_With_Parent (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val > Error then Set_Parent (Val, N); end if;
! Set_Node1 (N, Val);
! end Set_Node1_With_Parent;
! procedure Set_Node2_With_Parent (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val > Error then Set_Parent (Val, N); end if;
! Set_Node2 (N, Val);
! end Set_Node2_With_Parent;
! procedure Set_Node3_With_Parent (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val > Error then Set_Parent (Val, N); end if;
! Set_Node3 (N, Val);
! end Set_Node3_With_Parent;
! procedure Set_Node4_With_Parent (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val > Error then Set_Parent (Val, N); end if;
! Set_Node4 (N, Val);
! end Set_Node4_With_Parent;
! procedure Set_Node5_With_Parent (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val > Error then Set_Parent (Val, N); end if;
! Set_Node5 (N, Val);
! end Set_Node5_With_Parent;
! procedure Set_List1_With_Parent (N : Node_Id; Val : List_Id) is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val /= No_List and then Val /= Error_List then
! Set_Parent (Val, N);
! end if;
! Set_List1 (N, Val);
! end Set_List1_With_Parent;
! procedure Set_List2_With_Parent (N : Node_Id; Val : List_Id) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val /= No_List and then Val /= Error_List then
! Set_Parent (Val, N);
! end if;
! Set_List2 (N, Val);
! end Set_List2_With_Parent;
!
! procedure Set_List3_With_Parent (N : Node_Id; Val : List_Id) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val /= No_List and then Val /= Error_List then
! Set_Parent (Val, N);
! end if;
! Set_List3 (N, Val);
! end Set_List3_With_Parent;
!
! procedure Set_List4_With_Parent (N : Node_Id; Val : List_Id) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val /= No_List and then Val /= Error_List then
! Set_Parent (Val, N);
! end if;
! Set_List4 (N, Val);
! end Set_List4_With_Parent;
!
! procedure Set_List5_With_Parent (N : Node_Id; Val : List_Id) is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! if Val /= No_List and then Val /= Error_List then
! Set_Parent (Val, N);
! end if;
! Set_List5 (N, Val);
! end Set_List5_With_Parent;
!
!
! function Field1 (N : Node_Id) return Union_Id is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Field1;
! end Field1;
!
! function Field2 (N : Node_Id) return Union_Id is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Field2;
! end Field2;
!
! function Field3 (N : Node_Id) return Union_Id is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Field3;
! end Field3;
!
! function Field4 (N : Node_Id) return Union_Id is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Field4;
! end Field4;
!
! function Field5 (N : Node_Id) return Union_Id is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Field5;
! end Field5;
!
! function Field6 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Field6;
! end Field6;
! function Field7 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Field7;
! end Field7;
! function Field8 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Field8;
! end Field8;
! function Field9 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Field9;
! end Field9;
! function Field10 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Field10;
! end Field10;
! function Field11 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Field11;
! end Field11;
! function Field12 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Field12;
! end Field12;
! function Field13 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Field6;
! end Field13;
! function Field14 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Field7;
! end Field14;
! function Field15 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Field8;
! end Field15;
! function Field16 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Field9;
! end Field16;
! function Field17 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Field10;
! end Field17;
! function Field18 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Field11;
! end Field18;
! function Field19 (N : Node_Id) return Union_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Field12;
! end Field19;
! function Node1 (N : Node_Id) return Node_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Node_Id (Nodes.Table (N).Field1);
! end Node1;
! function Node2 (N : Node_Id) return Node_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Node_Id (Nodes.Table (N).Field2);
! end Node2;
! function Node3 (N : Node_Id) return Node_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Node_Id (Nodes.Table (N).Field3);
! end Node3;
! function Node4 (N : Node_Id) return Node_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Node_Id (Nodes.Table (N).Field4);
! end Node4;
! function Node5 (N : Node_Id) return Node_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Node_Id (Nodes.Table (N).Field5);
! end Node5;
! function Node6 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 1).Field6);
! end Node6;
! function Node7 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 1).Field7);
! end Node7;
! function Node8 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 1).Field8);
! end Node8;
! function Node9 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 1).Field9);
! end Node9;
! function Node10 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 1).Field10);
! end Node10;
! function Node11 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 1).Field11);
! end Node11;
! function Node12 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 1).Field12);
! end Node12;
! function Node13 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 2).Field6);
! end Node13;
! function Node14 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 2).Field7);
! end Node14;
! function Node15 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 2).Field8);
! end Node15;
! function Node16 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 2).Field9);
! end Node16;
! function Node17 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 2).Field10);
! end Node17;
! function Node18 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 2).Field11);
! end Node18;
! function Node19 (N : Node_Id) return Node_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Node_Id (Nodes.Table (N + 2).Field12);
! end Node19;
! function List1 (N : Node_Id) return List_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return List_Id (Nodes.Table (N).Field1);
! end List1;
! function List2 (N : Node_Id) return List_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return List_Id (Nodes.Table (N).Field2);
! end List2;
! function List3 (N : Node_Id) return List_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return List_Id (Nodes.Table (N).Field3);
! end List3;
! function List4 (N : Node_Id) return List_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return List_Id (Nodes.Table (N).Field4);
! end List4;
! function List5 (N : Node_Id) return List_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return List_Id (Nodes.Table (N).Field5);
! end List5;
! function Elist6 (N : Node_Id) return Elist_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Elist_Id (Nodes.Table (N + 1).Field6);
! end Elist6;
! function Elist13 (N : Node_Id) return Elist_Id is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Elist_Id (Nodes.Table (N + 2).Field6);
! end Elist13;
! function Name1 (N : Node_Id) return Name_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Name_Id (Nodes.Table (N).Field1);
! end Name1;
! function Name2 (N : Node_Id) return Name_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Name_Id (Nodes.Table (N).Field2);
! end Name2;
! function Str3 (N : Node_Id) return String_Id is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return String_Id (Nodes.Table (N).Field3);
! end Str3;
! function Char_Code2 (N : Node_Id) return Char_Code is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Char_Code (Nodes.Table (N).Field2 - Char_Code_Bias);
! end Char_Code2;
! function Uint3 (N : Node_Id) return Uint is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Uint (Nodes.Table (N).Field3);
! end Uint3;
! function Uint4 (N : Node_Id) return Uint is
! begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! return Uint (Nodes.Table (N).Field4);
! end Uint4;
!
! function Uint9 (N : Node_Id) return Uint is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Uint (Nodes.Table (N + 1).Field9);
! end Uint9;
! function Uint11 (N : Node_Id) return Uint is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Uint (Nodes.Table (N + 1).Field11);
! end Uint11;
! function Uint12 (N : Node_Id) return Uint is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Uint (Nodes.Table (N + 1).Field12);
! end Uint12;
! function Uint15 (N : Node_Id) return Uint is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Uint (Nodes.Table (N + 2).Field8);
! end Uint15;
! function Ureal3 (N : Node_Id) return Ureal is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Ureal (Nodes.Table (N).Field3);
! end Ureal3;
! function Ureal6 (N : Node_Id) return Ureal is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Ureal (Nodes.Table (N + 1).Field6);
! end Ureal6;
! function Ureal7 (N : Node_Id) return Ureal is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Ureal (Nodes.Table (N + 1).Field7);
! end Ureal7;
! function Flag1 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag1;
! end Flag1;
! function Flag2 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag2;
! end Flag2;
! function Flag3 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag3;
! end Flag3;
! function Flag4 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag4;
! end Flag4;
! function Flag5 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag5;
! end Flag5;
! function Flag6 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag6;
! end Flag6;
! function Flag7 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag7;
! end Flag7;
! function Flag8 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag8;
! end Flag8;
! function Flag9 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag9;
! end Flag9;
! function Flag10 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag10;
! end Flag10;
! function Flag11 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag11;
! end Flag11;
! function Flag12 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag12;
! end Flag12;
! function Flag13 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag13;
! end Flag13;
! function Flag14 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag14;
! end Flag14;
! function Flag15 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag15;
! end Flag15;
! function Flag16 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag16;
! end Flag16;
! function Flag17 (N : Node_Id) return Boolean is
begin
pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag17;
! end Flag17;
! function Flag18 (N : Node_Id) return Boolean is
begin
! pragma Assert (N in Nodes.First .. Nodes.Last);
! return Nodes.Table (N).Flag18;
! end Flag18;
! function Flag19 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).In_List;
! end Flag19;
! function Flag20 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Rewrite_Sub;
! end Flag20;
! function Flag21 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Rewrite_Ins;
! end Flag21;
! function Flag22 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag1;
! end Flag22;
! function Flag23 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag2;
! end Flag23;
! function Flag24 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag3;
! end Flag24;
! function Flag25 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag4;
! end Flag25;
! function Flag26 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag5;
! end Flag26;
! function Flag27 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag6;
! end Flag27;
! function Flag28 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag7;
! end Flag28;
! function Flag29 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag8;
! end Flag29;
! function Flag30 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag9;
! end Flag30;
! function Flag31 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag10;
! end Flag31;
! function Flag32 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag11;
! end Flag32;
! function Flag33 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag12;
! end Flag33;
! function Flag34 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag13;
! end Flag34;
! function Flag35 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag14;
! end Flag35;
! function Flag36 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag15;
! end Flag36;
! function Flag37 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag16;
! end Flag37;
! function Flag38 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag17;
! end Flag38;
! function Flag39 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Flag18;
! end Flag39;
! function Flag40 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).In_List;
! end Flag40;
! function Flag41 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Rewrite_Sub;
! end Flag41;
! function Flag42 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Rewrite_Ins;
! end Flag42;
! function Flag43 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag1;
! end Flag43;
! function Flag44 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag2;
! end Flag44;
! function Flag45 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag3;
! end Flag45;
! function Flag46 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag4;
! end Flag46;
! function Flag47 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag5;
! end Flag47;
! function Flag48 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag6;
! end Flag48;
! function Flag49 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag7;
! end Flag49;
! function Flag50 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag8;
! end Flag50;
! function Flag51 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag9;
! end Flag51;
! function Flag52 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag10;
! end Flag52;
! function Flag53 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag11;
! end Flag53;
! function Flag54 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag12;
! end Flag54;
! function Flag55 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag13;
! end Flag55;
! function Flag56 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag14;
! end Flag56;
! function Flag57 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag15;
! end Flag57;
! function Flag58 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag16;
! end Flag58;
! function Flag59 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag17;
! end Flag59;
! function Flag60 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Flag18;
! end Flag60;
! function Flag61 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Pflag1;
! end Flag61;
! function Flag62 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 1).Pflag2;
! end Flag62;
! function Flag63 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Pflag1;
! end Flag63;
! function Flag64 (N : Node_Id) return Boolean is
begin
pragma Assert (Nkind (N) in N_Entity);
! return Nodes.Table (N + 2).Pflag2;
! end Flag64;
! function Flag65 (N : Node_Id) return Boolean is
begin
+ -- pragma Assert (Nkind (N) in N_Entity);
+ -- return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag65;
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte_Ptr
(Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag65;
! end Flag65;
! function Flag66 (N : Node_Id) return Boolean is
begin
+ -- pragma Assert (Nkind (N) in N_Entity);
+ -- return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag66;
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte_Ptr
(Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag66;
! end Flag66;
! function Flag67 (N : Node_Id) return Boolean is
begin
+ -- pragma Assert (Nkind (N) in N_Entity);
+ -- return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag67;
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte_Ptr
(Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag67;
! end Flag67;
! function Flag68 (N : Node_Id) return Boolean is
begin
+ -- pragma Assert (Nkind (N) in N_Entity);
+ -- return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag68;
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte_Ptr
(Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag68;
! end Flag68;
! function Flag69 (N : Node_Id) return Boolean is
begin
+ -- pragma Assert (Nkind (N) in N_Entity);
+ -- return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag69;
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte_Ptr
(Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag69;
! end Flag69;
! function Flag70 (N : Node_Id) return Boolean is
begin
+ -- pragma Assert (Nkind (N) in N_Entity);
+ -- return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag70;
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte_Ptr
(Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag70;
! end Flag70;
! function Flag71 (N : Node_Id) return Boolean is
begin
+ -- pragma Assert (Nkind (N) in N_Entity);
+ -- return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag71;
pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte_Ptr
(Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag71;
! end Flag71;
! function Flag72 (N : Node_Id) return Boolean is
begin
! -- pragma Assert (Nkind (N) in N_Entity);
! -- return To_Flag_Byte (Nodes.Table (N + 2).Nkind).Flag72;
! pragma Assert (Nkind (N) in N_Entity);
! return To_Flag_Byte_Ptr
! (Node_Kind_Ptr'
! (Nodes.Table (N + 2).Nkind'Unrestricted_Access)).Flag72;
! end Flag72;
end Unchecked_Access;
diff -rc --new-file /src/baseline/gnat-1.80/src/bindgen.adb gnat-1.80/src/bindgen.adb
*** /src/baseline/gnat-1.80/src/bindgen.adb Fri Jun 10 15:42:28 1994
--- gnat-1.80/src/bindgen.adb Wed Jul 6 16:57:06 1994
***************
*** 252,260 ****
end;
-- Generate main
if ALIs.Table (ALIs.First).Main_Program = Proc then
! Write_Binder_Info ("void main (argc, argv)");
else
Write_Binder_Info ("int main (argc, argv)");
end if;
--- 252,262 ----
end;
-- Generate main
+ -- Note: main() should always be return type int, so I've hacked
+ -- this code to meet that ANSI requirement. -fnf
if ALIs.Table (ALIs.First).Main_Program = Proc then
! Write_Binder_Info ("int main (argc, argv)");
else
Write_Binder_Info ("int main (argc, argv)");
end if;
diff -rc --new-file /src/baseline/gnat-1.80/src/gnatbl.c gnat-1.80/src/gnatbl.c
*** /src/baseline/gnat-1.80/src/gnatbl.c Fri Jun 10 15:42:23 1994
--- gnat-1.80/src/gnatbl.c Wed Jul 6 16:57:25 1994
***************
*** 51,56 ****
--- 51,60 ----
#define DIR_SEPARATOR '/'
#endif
+ #if __amigados__
+ #define fork vfork /* AmigaDOS doesn't have a true fork() */
+ #endif
+
static void proc_bind_file (char *aliname);
static int is_regular_file (char *name);
static void port_spawn (char *args[]);
***************
*** 207,212 ****
--- 211,223 ----
strcpy (tmppathval, ".;");
pathval = strcat (tmppathval, pathval);
#endif
+ #if defined(__amigados__)
+ /* Provide a default PATH if not was found. Perhaps this should be
+ done for all machines using a value derived from $(bindir) in the
+ Makefile? */
+ if (!pathval)
+ pathval = "/gnu/bin";
+ #endif
process_args (&argc , argv);
***************
*** 400,412 ****
#else
pid = fork ();
if (pid == -1) {
! fprintf (stderr, "Error starting %s\n", args [0]);
exit (1);
}
if (pid == 0) {
/* The child */
execv (args [0], args);
! fprintf (stderr, "Failed to exec %s\n", args [0]);
exit (1);
}
--- 411,423 ----
#else
pid = fork ();
if (pid == -1) {
! fprintf (stderr, "Error starting %s, fork() failed\n", args [0]);
exit (1);
}
if (pid == 0) {
/* The child */
execv (args [0], args);
! fprintf (stderr, "Failed to exec %s, execv() failed\n", args [0]);
exit (1);
}
diff -rc --new-file /src/baseline/gnat-1.80/src/patches-gcc258.os2 gnat-1.80/src/patches-gcc258.os2
*** /src/baseline/gnat-1.80/src/patches-gcc258.os2 Fri Jun 10 15:44:45 1994
--- gnat-1.80/src/patches-gcc258.os2 Thu Jun 23 14:54:05 1994
***************
*** 1,5 ****
*** gcc.c.old Thu Dec 23 17:50:02 1993
! --- gcc.c Mon Jan 24 19:16:34 1994
***************
*** 34,40 ****
--- 34,42 ----
--- 1,5 ----
*** gcc.c.old Thu Dec 23 17:50:02 1993
! --- gcc.c Sat Jun 11 03:05:52 1994
***************
*** 34,40 ****
--- 34,42 ----
***************
*** 387,392 ****
--- 387,438 ----
if (access (name, mode))
{
***************
+ *** 2131,2134 ****
+ --- 2258,2289 ----
+
+ temp = getenv ("COMPILER_PATH");
+ + #ifdef OS2
+ + {
+ + /* Append current directory and value of PATH environment variable to
+ + COMPILER_PATH. */
+ + char *newtemp, *path;
+ + /* Make sure string pointed to by temp is not overwritten by call to getenv
+ + below. */
+ + if (temp) newtemp = strdup (temp);
+ + if (newtemp) {
+ + temp = newtemp;
+ + path = getenv ("PATH");
+ + newtemp = malloc ((temp?strlen(temp):0) + (path?strlen(path):0) + 4);
+ + if (newtemp) {
+ + int lastchar;
+ + if (temp) strcpy (newtemp, temp);
+ + else *newtemp = '\0';
+ + temp = newtemp;
+ + lastchar = strlen (temp);
+ + if (lastchar > 0 && temp[lastchar-1] != PATH_SEPARATOR)
+ + temp[lastchar++] = PATH_SEPARATOR;
+ + temp[lastchar++] = '.';
+ + temp[lastchar++] = PATH_SEPARATOR;
+ + temp[lastchar++] = '\0';
+ + if (path) strcat (temp, path);
+ + }
+ + }
+ + }
+ + #endif
+ if (temp)
+ {
+ ***************
+ *** 2422,2427 ****
+ --- 2577,2584 ----
+ /* Use 2 as fourth arg meaning try just the machine as a suffix,
+ as well as trying the machine and the version. */
+ + #ifndef OS2
+ add_prefix (&exec_prefix, standard_exec_prefix, 0, 2, NULL_PTR);
+ add_prefix (&exec_prefix, standard_exec_prefix_1, 0, 2, NULL_PTR);
+ + #endif
+
+ add_prefix (&startfile_prefix, standard_exec_prefix, 0, 1, NULL_PTR);
+ ***************
*** 3689,3695 ****
--- 3816,3826 ----
char *p;
***************
*** 481,487 ****
/* More 'friendly' abort that prints the line and file.
*** cccp.c.old Fri Nov 5 17:28:28 1993
! --- cccp.c Wed Dec 1 18:16:51 1993
***************
*** 1091,1097 ****
--- 1091,1101 ----
--- 527,556 ----
/* More 'friendly' abort that prints the line and file.
*** cccp.c.old Fri Nov 5 17:28:28 1993
! --- cccp.c Sat Jun 11 03:38:50 1994
! ***************
! *** 570,573 ****
! --- 570,574 ----
! { TOOL_INCLUDE_DIR, 0},
! #else /* not CROSS_COMPILE */
! + #ifndef OS2
! /* This should be /use/local/include and should come before
! the fixincludes-fixed header files. */
! ***************
! *** 579,587 ****
! --- 580,591 ----
! the files that we fix. */
! { GCC_INCLUDE_DIR, 0},
! + #endif
! /* Some systems have an extra dir of include files. */
! #ifdef SYSTEM_INCLUDE_DIR
! { SYSTEM_INCLUDE_DIR, 0},
! #endif
! + #ifndef OS2
! { STANDARD_INCLUDE_DIR, 0},
! + #endif
! #endif /* not CROSS_COMPILE */
! { 0, 0}
***************
*** 1091,1097 ****
--- 1091,1101 ----
***************
*** 513,519 ****
#ifdef RLIMIT_STACK
*** tree.c.old Fri Feb 4 07:32:25 1994
! --- tree.c Mon Feb 7 17:09:52 1994
*************** int_fits_type_p (c, type)
*** 3607,3617 ****
{
--- 582,608 ----
#ifdef RLIMIT_STACK
*** tree.c.old Fri Feb 4 07:32:25 1994
! --- tree.c Tue Jun 7 06:43:25 1994
! *************** staticp (arg)
! *** 1827,1832 ****
! switch (TREE_CODE (arg))
! {
! - case VAR_DECL:
! case FUNCTION_DECL:
! return TREE_STATIC (arg) || DECL_EXTERNAL (arg);
!
! --- 1827,1837 ----
! switch (TREE_CODE (arg))
! {
! case FUNCTION_DECL:
! + /* Nested functions aren't static. Since taking their address
! + involves a trampoline. */
! + if (decl_function_context (arg) != 0)
! + return 0;
! + /* ... fall through ... */
! + case VAR_DECL:
! return TREE_STATIC (arg) || DECL_EXTERNAL (arg);
!
*************** int_fits_type_p (c, type)
*** 3607,3617 ****
{
***************
*** 527,533 ****
! && (TREE_INT_CST_HIGH (c) >= 0 || !TREE_UNSIGNED (TREE_TYPE (c))));
}
! --- 3607,3619 ----
{
if (TREE_UNSIGNED (type))
! return (! (TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST
--- 616,622 ----
! && (TREE_INT_CST_HIGH (c) >= 0 || !TREE_UNSIGNED (TREE_TYPE (c))));
}
! --- 3612,3624 ----
{
if (TREE_UNSIGNED (type))
! return (! (TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST
***************
*** 570,576 ****
*** varasm.c.old Sun Feb 27 08:51:17 1994
--- varasm.c Tue Mar 1 18:22:54 1994
*************** output_constant (exp, size)
! *** 3324,3327 ****
--- 3324,3338 ----
return;
--- 659,665 ----
*** varasm.c.old Sun Feb 27 08:51:17 1994
--- varasm.c Tue Mar 1 18:22:54 1994
*************** output_constant (exp, size)
! *** 3270,3273 ****
--- 3324,3338 ----
return;
***************
*** 588,594 ****
/* Allow a constructor with no elements for any data type.
This means to fill the space with zeros. */
*************** output_constant (exp, size)
! *** 3334,3343 ****
return;
}
-
--- 677,683 ----
/* Allow a constructor with no elements for any data type.
This means to fill the space with zeros. */
*************** output_constant (exp, size)
! *** 3280,3289 ****
return;
}
-
***************
*** 601,631 ****
switch (code)
--- 3345,3348 ----
*** config/i386/os2.h.old Mon Jan 24 19:59:36 1994
! --- config/i386/os2.h Thu Feb 17 21:25:54 1994
*************** the Free Software Foundation, 675 Mass A
! *** 23,26 ****
! --- 23,32 ----
#define DEFAULT_TARGET_MACHINE "i386-os2"
#endif
! + #ifndef LINK_SPEC
! + #define LINK_SPEC "/st:1048576/pm:vio/noi/a:16/e/bas:65536/nol"
! + #endif
! + #ifndef LIB_SPEC
! + #define LIB_SPEC "libc"
! + #endif
! #ifndef STARTFILE_SPEC
! #define STARTFILE_SPEC ""
! *************** the Free Software Foundation, 675 Mass A
! *** 34,41 ****
! #ifndef LOCAL_INCLUDE_DIR
! #define LOCAL_INCLUDE_DIR "\\gcc\\include"
! - #endif
! -
! - #ifndef PATH_SEPARATOR
! - #define PATH_SEPARATOR ';'
#endif
- --- 40,43 ----
*** config/i386/xm-os2.h.old Thu Nov 04 14:59:30 1993
--- config/i386/xm-os2.h Fri Feb 18 03:28:50 1994
***************
--- 690,730 ----
switch (code)
--- 3345,3348 ----
*** config/i386/os2.h.old Mon Jan 24 19:59:36 1994
! --- config/i386/os2.h Sat Jun 11 04:09:00 1994
*************** the Free Software Foundation, 675 Mass A
! *** 23,41 ****
#define DEFAULT_TARGET_MACHINE "i386-os2"
#endif
! ! #ifndef STARTFILE_SPEC
! ! #define STARTFILE_SPEC ""
! ! #endif
! ! #ifndef MD_EXEC_PREFIX
! ! #define MD_EXEC_PREFIX "\\gcc\\bin\\"
! #endif
! ! #ifndef STANDARD_STARTFILE_PREFIX
! ! #define STANDARD_STARTFILE_PREFIX "\\gcc\\lib\\"
! #endif
! ! #ifndef LOCAL_INCLUDE_DIR
! ! #define LOCAL_INCLUDE_DIR "\\gcc\\include"
! ! #endif
! !
! ! #ifndef PATH_SEPARATOR
! ! #define PATH_SEPARATOR ';'
! #endif
!
! --- 23,34 ----
! #define DEFAULT_TARGET_MACHINE "i386-os2"
! #endif
! ! #ifndef LINK_SPEC
! ! #define LINK_SPEC "/st:1048576/pm:vio/noi/a:16/e/bas:65536/nol"
! #endif
! ! #ifndef LIB_SPEC
! ! #define LIB_SPEC "libgcc libc"
! #endif
! ! #ifndef STARTFILE_SPEC
! ! #define STARTFILE_SPEC ""
#endif
*** config/i386/xm-os2.h.old Thu Nov 04 14:59:30 1993
--- config/i386/xm-os2.h Fri Feb 18 03:28:50 1994
***************
***************
*** 652,654 ****
--- 751,772 ----
+ #endif
#define EXECUTABLE_SUFFIX ".exe"
+ *** config/i386/i386.h.old Mon Apr 25 14:43:48 1994
+ --- config/i386/i386.h Tue May 3 19:16:46 1994
+ ***************
+ *** 254,257 ****
+ --- 254,267 ----
+ { 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
+
+ + /* Order in which to allocate registers. First allocate registers
+ + for which no insn operand demands that register, next those that are
+ + demanded by the least number of insns. List frame pointer late and fixed
+ + egisters last. Note that, in general, we want to put nonsaved registers
+ + late, but we put bx relatively early since it is not demanded by
+ + any insn operand. */
+ + #define REG_ALLOC_ORDER \
+ + /*si,di,bx,cx,dx,ax,bp,sp,st,st1,st2,st3,st4,st5,st6,st7,arg*/ \
+ + { 4, 5, 3, 2, 1, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
+ +
+ /* Macro to conditionally modify fixed_regs/call_used_regs. */
+ #define CONDITIONAL_REGISTER_USAGE \
diff -rc --new-file /src/baseline/gnat-1.80/src/s-reatim.adb gnat-1.80/src/s-reatim.adb
*** /src/baseline/gnat-1.80/src/s-reatim.adb Thu Jan 1 00:00:00 1970
--- gnat-1.80/src/s-reatim.adb Mon Jul 4 16:30:25 1994
***************
*** 0 ****
--- 1,382 ----
+ ------------------------------------------------------------------------------
+ -- --
+ -- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+ -- --
+ -- S Y S T E M . R E A L _ T I M E --
+ -- --
+ -- B o d y --
+ -- --
+ -- $Revision: 1.7 $ --
+ -- --
+ -- Copyright (c) 1991,1992,1993, FSU, All Rights Reserved --
+ -- --
+ -- GNARL is free software; you can redistribute it and/or modify it under --
+ -- terms of the GNU Library General Public License as published by the --
+ -- Free Software Foundation; either version 2, or (at your option) any --
+ -- later version. GNARL is distributed in the hope that it will be use- --
+ -- ful, but but WITHOUT ANY WARRANTY; without even the implied warranty of --
+ -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Gen- --
+ -- eral Library Public License for more details. You should have received --
+ -- a copy of the GNU Library General Public License along with GNARL; see --
+ -- file COPYING. If not, write to the Free Software Foundation, 675 Mass --
+ -- Ave, Cambridge, MA 02139, USA. --
+ -- --
+ ------------------------------------------------------------------------------
+
+ pragma Checks_On;
+ -- We require checks on for this body, because we rely on the constraint
+ -- error to keep System.Real_Time.Time values within representable range.
+
+ with System.Compiler_Exceptions;
+ -- Uses, function Current_Exceptions
+
+ with System.Task_Timer_Service;
+ -- Uses, object Objects
+ -- procedure Service_Entries
+
+ with System.Tasking;
+
+ with Unchecked_Conversion;
+
+ package body System.Real_Time is
+
+ use Task_Clock;
+ -- Using it for arithmetic operations
+
+ use Tasking.Protected_Objects;
+ use Tasking;
+
+ package Timer renames System.Task_Timer_Service.Timer;
+
+ function To_Access is new
+ Unchecked_Conversion (System.Address, Protection_Access);
+
+ -----------
+ -- Clock --
+ -----------
+
+ function Clock return Time is
+ begin
+ return Time (Task_Clock.Machine_Specifics.Clock);
+ end Clock;
+
+ ---------
+ -- "<" --
+ ---------
+
+ function "<" (Left, Right : Time) return Boolean is
+ begin
+ return Task_Clock.Stimespec (Left) < Task_Clock.Stimespec (Right);
+ end "<";
+
+ function "<" (Left, Right : Time_Span) return Boolean is
+ begin
+ return Task_Clock.Stimespec (Left) < Task_Clock.Stimespec (Right);
+ end "<";
+
+ ---------
+ -- ">" --
+ ---------
+
+ function ">" (Left, Right : Time) return Boolean is
+ begin
+ return Right < Left;
+ end ">";
+
+ function ">" (Left, Right : Time_Span) return Boolean is
+ begin
+ return Right < Left;
+ end ">";
+
+ ----------
+ -- "<=" --
+ ----------
+
+ function "<=" (Left, Right : Time) return Boolean is
+ begin
+ return not (Left > Right);
+ end "<=";
+
+ function "<=" (Left, Right : Time_Span) return Boolean is
+ begin
+ return not (Left > Right);
+ end "<=";
+
+ ----------
+ -- ">=" --
+ ----------
+
+ function ">=" (Left, Right : Time) return Boolean is
+ begin
+ return not (Left < Right);
+ end ">=";
+
+ function ">=" (Left, Right : Time_Span) return Boolean is
+ begin
+ return not (Left < Right);
+ end ">=";
+
+ ---------
+ -- "+" --
+ ---------
+
+ -- Note that Constraint_Error may be propagated
+
+ function "+" (Left : Time; Right : Time_Span) return Time is
+ begin
+ return Time (Task_Clock.Stimespec (Left) + Task_Clock.Stimespec (Right));
+ end "+";
+
+ function "+" (Left : Time_Span; Right : Time) return Time is
+ begin
+ return Right + Left;
+ end "+";
+
+ function "+" (Left, Right : Time_Span) return Time_Span is
+ begin
+ return Time_Span (Time (Right) + Left);
+ end "+";
+
+ ---------
+ -- "-" --
+ ---------
+
+ -- Note that Constraint_Error may be propagated
+
+ function "-" (Left : Time; Right : Time_Span) return Time is
+ begin
+ return Time (Task_Clock.Stimespec (Left) - Task_Clock.Stimespec (Right));
+ end "-";
+
+ function "-" (Left, Right : Time) return Time_Span is
+ begin
+ return Time_Span (Left - Time_Span (Right));
+ end "-";
+
+ function "-" (Left, Right : Time_Span) return Time_Span is
+ begin
+ return Time_Span (Time (Left) - Right);
+ end "-";
+
+ function "-" (Right : Time_Span) return Time_Span is
+ begin
+ return Time_Span (-(Task_Clock.Stimespec (Right)));
+ end "-";
+
+ ---------
+ -- "/" --
+ ---------
+
+ -- Note that Constraint_Error may be propagated
+
+ function "/" (Left, Right : Time_Span) return integer is
+ Temp_TV : Task_Clock.Stimespec;
+
+ begin
+ Temp_TV := Task_Clock.Stimespec (Left) / Task_Clock.Stimespec (Right);
+
+ if not (Temp_TV < Task_Clock.Stimespec_Zero) then
+ return Task_Clock.Stimespec_Seconds (Temp_TV);
+ end if;
+
+ Temp_TV := -Temp_TV;
+ return -Task_Clock.Stimespec_Seconds (Temp_TV);
+ end "/";
+
+ function "/" (Left : Time_Span; Right : Integer) return Time_Span is
+ begin
+ return Time_Span (Task_Clock.Stimespec (Left) / Right);
+ end "/";
+
+ ---------
+ -- "*" --
+ ---------
+
+ -- Note that Constraint_Error may be propagated
+
+ function "*" (Left : Time_Span; Right : Integer) return Time_Span is
+ begin
+ return Time_Span (Task_Clock.Stimespec (Left) * Right);
+ end "*";
+
+ function "*" (Left : Integer; Right : Time_Span) return Time_Span is
+ begin
+ return Right * Left;
+ end "*";
+
+ -----------
+ -- "abs" --
+ -----------
+
+ -- Note that Constraint_Error may be propagated
+
+ function "abs" (Right : Time_Span) return Time_Span is
+ begin
+ if Right < Time_Span_Zero then
+ return -Right;
+ end if;
+
+ return Right;
+ end "abs";
+
+ -----------------
+ -- To_Duration --
+ -----------------
+
+ function To_Duration (FD : Time_Span) return Duration is
+ begin
+ return Task_Clock.Stimespec_To_Duration (Task_Clock.Stimespec (FD));
+ end To_Duration;
+
+ ------------------
+ -- To_Time_Span --
+ ------------------
+
+ function To_Time_Span (D : Duration) return Time_Span is
+ begin
+ return Time_Span (Task_Clock.Duration_To_Stimespec (D));
+ end To_Time_Span;
+
+ -----------------
+ -- Nanoseconds --
+ -----------------
+
+ function Nanoseconds (NS : integer) return Time_Span is
+ begin
+ return Time_Span_Unit * NS;
+ end Nanoseconds;
+
+ ------------------
+ -- Microseconds --
+ ------------------
+
+ function Microseconds (US : integer) return Time_Span is
+ begin
+ return Nanoseconds (US) * 1000;
+ end Microseconds;
+
+ -------------------
+ -- Milliseconds --
+ -------------------
+
+ function Milliseconds (MS : integer) return Time_Span is
+ begin
+ return Microseconds (MS) * 1000;
+ end Milliseconds;
+
+ ------------------
+ -- Delay_Object --
+ ------------------
+
+ -- Hand translated code will be provided here
+ -- until the GNAT compiler can accomodate the protected objects. ???
+
+ package body Delay_Object is
+
+ procedure Service_Entries (Pending_Serviced : out Boolean) is
+ P : System.Address;
+
+ subtype PO_Entry_Index is Protected_Entry_Index
+ range Null_Protected_Entry .. 1;
+
+ Barriers : Barrier_Vector (1 .. 1) := (others => true);
+ -- No barriers. always true barrier
+
+ E : PO_Entry_Index;
+
+ PS : Boolean;
+
+ Cumulative_PS : Boolean := False;
+
+ begin
+ loop
+ -- Get the next queued entry or the pending call
+ -- (if no barriers are true)
+
+ Next_Entry_Call (To_Access (Object'Address), Barriers, P, E);
+
+ begin
+ case E is
+ when Null_Protected_Entry => -- no call to serve
+ exit;
+
+ when 1 =>
+
+ -- Lock the object before requeueing
+
+ Lock (To_Access (Timer.Object'Address));
+
+ -- 9X code ???
+ -- requeue Timer.Enqueue (clock.Clock+Time (FD)) with abort;
+
+ begin
+ Requeue_Protected_Entry (
+ Object => To_Access (Object'Address),
+ New_Object => To_Access (Timer.Object'Address),
+ E => 1,
+ With_Abort => true);
+
+ -- Requeue on the timer for the service. Parameter is
+ -- passed along as Object.Call_In_Progress.Param
+
+ Timer.Service_Entries (PS);
+
+ -- Neither Requeue nor Service_Entries should raise
+ -- an exception; the exception should be saved. ???
+
+ -- exception
+ -- when others =>
+ -- Timer.Service_Entries(PS);
+ -- raise;
+ end;
+ end case;
+
+ exception
+ when others =>
+ Tasking.Protected_Objects.Exceptional_Complete_Entry_Body (
+ Object => To_Access (Object'Address),
+ Ex => Compiler_Exceptions.Current_Exception,
+ Pending_Serviced => PS);
+ end;
+
+ Cumulative_PS := Cumulative_PS or PS;
+
+ end loop;
+
+ Pending_Serviced := Cumulative_PS;
+ end Service_Entries;
+
+ begin
+ Initialize_Protection (
+ To_Access (Object'Address),
+ Tasking.Unspecified_Priority);
+ end Delay_Object;
+
+ -----------
+ -- Split --
+ -----------
+
+ -- D is nonnegative Time_Span
+
+ procedure Split (T : Time; S : out Seconds; D : out Time_Span) is
+ Temp_S : Seconds;
+
+ begin
+ Temp_S :=
+ Seconds (Task_Clock.Stimespec_Seconds (Task_Clock.Stimespec (T)));
+ S := Temp_S;
+ D := Time_Span (T) -
+ (integer (Temp_S) * Time_Span (Task_Clock.Stimespec_Sec_Unit));
+ end Split;
+
+ -------------
+ -- Time_Of --
+ -------------
+
+ function Time_Of (S : Seconds; D : Time_Span) return Time is
+ begin
+ return Time (integer (S) *
+ Time_Span (Task_Clock.Stimespec_Sec_Unit) + D);
+ end Time_Of;
+
+ end System.Real_Time;
diff -rc --new-file /src/baseline/gnat-1.80/src/s-reatim.ads gnat-1.80/src/s-reatim.ads
*** /src/baseline/gnat-1.80/src/s-reatim.ads Thu Jan 1 00:00:00 1970
--- gnat-1.80/src/s-reatim.ads Mon Jul 4 16:30:26 1994
***************
*** 0 ****
--- 1,158 ----
+ ------------------------------------------------------------------------------
+ -- --
+ -- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+ -- --
+ -- S Y S T E M . R E A L _ T I M E --
+ -- --
+ -- S p e c --
+ -- --
+ -- $Revision: 1.8 $ --
+ -- --
+ -- Copyright (c) 1991,1992,1993, FSU, All Rights Reserved --
+ -- --
+ -- GNARL is free software; you can redistribute it and/or modify it under --
+ -- terms of the GNU Library General Public License as published by the --
+ -- Free Software Foundation; either version 2, or (at your option) any --
+ -- later version. GNARL is distributed in the hope that it will be use- --
+ -- ful, but but WITHOUT ANY WARRANTY; without even the implied warranty of --
+ -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Gen- --
+ -- eral Library Public License for more details. You should have received --
+ -- a copy of the GNU Library General Public License along with GNARL; see --
+ -- file COPYING. If not, write to the Free Software Foundation, 675 Mass --
+ -- Ave, Cambridge, MA 02139, USA. --
+ -- --
+ ------------------------------------------------------------------------------
+
+
+ with System.Task_Clock;
+
+ with System.Task_Clock.Machine_Specifics;
+
+ with System.Tasking.Protected_Objects;
+
+ package System.Real_Time is
+
+ -- The following part should be private. For now, they are public
+ -- (compiler error) ???
+
+ -- private
+
+ type Time is new Task_Clock.Stimespec;
+
+ Time_First : constant Time := Time (Task_Clock.Stimespec_First);
+
+ Time_Last : constant Time := Time (Task_Clock.Stimespec_Last);
+
+ type Time_Span is new Task_Clock.Stimespec;
+
+ Time_Span_First : constant Time_Span :=
+ Time_Span (Task_Clock.Stimespec_First);
+
+ Time_Span_Last : constant Time_Span :=
+ Time_Span (Task_Clock.Stimespec_Last);
+
+ Time_Span_Zero : constant Time_Span :=
+ Time_Span (Task_Clock.Stimespec_Zero);
+
+ Time_Span_Unit : constant Time_Span :=
+ Time_Span (Task_Clock.Stimespec_Unit);
+
+ Tick : constant Time_Span :=
+ Time_Span (Task_Clock.Machine_Specifics.Stimespec_Ticks);
+
+ -- Following has to be re-activated once the private part is used. ???
+
+ -- type Time is private;
+ -- Time_First : constant Time;
+ -- Time_Last : constant Time;
+
+ -- type Time_Span is private;
+ -- Time_Span_First : constant Time_Span;
+ -- Time_Span_Last : constant Time_Span;
+ -- Time_Span_Zero : constant Time_Span;
+ -- Time_Span_Unit : constant Time_Span;
+ -- Ticks : constant Time_Span;
+
+ Time_Unit : constant := 10#1.0#E-9;
+
+ function Clock return Time;
+
+ function "+" (Left : Time; Right : Time_Span) return Time;
+ function "+" (Left : Time_Span; Right : Time) return Time;
+ function "-" (Left : Time; Right : Time_Span) return Time;
+ function "-" (Left, Right : Time) return Time_Span;
+
+ function "<" (Left, Right : Time) return Boolean;
+ function "<=" (Left, Right : Time) return Boolean;
+ function ">" (Left, Right : Time) return Boolean;
+ function ">=" (Left, Right : Time) return Boolean;
+
+ function "+" (Left, Right : Time_Span) return Time_Span;
+ function "-" (Left, Right : Time_Span) return Time_Span;
+ function "-" (Right : Time_Span) return Time_Span;
+
+ function "/" (Left, Right : Time_Span) return Integer;
+
+ function "/" (Left : Time_Span; Right : Integer) return Time_Span;
+ function "*" (Left : Time_Span; Right : Integer) return Time_Span;
+ function "*" (Left : Integer; Right : Time_Span) return Time_Span;
+
+ function "<" (Left, Right : Time_Span) return Boolean;
+ function "<=" (Left, Right : Time_Span) return Boolean;
+ function ">" (Left, Right : Time_Span) return Boolean;
+ function ">=" (Left, Right : Time_Span) return Boolean;
+
+ function "abs" (Right : Time_Span) return Time_Span;
+
+ function To_Duration (FD : Time_Span) return Duration;
+ function To_Time_Span (D : Duration) return Time_Span;
+
+ function Nanoseconds (NS : integer) return Time_Span;
+ function Microseconds (US : integer) return Time_Span;
+ function Milliseconds (MS : integer) return Time_Span;
+
+ -- Hand translation code will be provided here for now.
+ -- Until the GNAT compiler can accomodate the protected objects. ???
+
+ package Delay_Object is
+ Object : aliased Tasking.Protection (Num_Entries => 1);
+
+ type Params is record
+ Param : Time_Span;
+ end record;
+
+ procedure Service_Entries (Pending_Serviced : out Boolean);
+ end Delay_Object;
+
+ type Seconds is new integer range -integer'Last .. integer'Last;
+ -- Seconds is signed entity
+
+ procedure Split (T : Time; S : out Seconds; D : out Time_Span);
+ function Time_Of (S : Seconds; D : Time_Span) return Time;
+
+ -- private
+
+ -- type Time is new Task_Clock.Stimespec;
+
+ -- Time_First : constant Time := Time (Task_Clock.Stimespec_First);
+
+ -- Time_Last : constant Time := Time (Task_Clock.Stimespec_Last);
+
+ -- type Time_Span is new Task_Clock.Stimespec;
+
+ -- Time_Span_First : constant Time_Span :=
+ -- Time_Span (Task_Clock.Stimespec_First);
+
+ -- Time_Span_Last : constant Time_Span :=
+ -- Time_Span (Task_Clock.Stimespec_Last);
+
+ -- Time_Span_Zero : constant Time_Span :=
+ -- Time_Span (Task_Clock.Stimespec_Zero);
+
+ -- Time_Span_Unit : constant Time_Span :=
+ -- Time_Span (Task_Clock.Stimespec_Unit);
+
+ -- Ticks : constant Time_Span :=
+ -- Time_Span (Task_Clock.Stimespec_Ticks);
+
+ end System.Real_Time;
diff -rc --new-file /src/baseline/gnat-1.80/src/s-retico.adb gnat-1.80/src/s-retico.adb
*** /src/baseline/gnat-1.80/src/s-retico.adb Thu Jan 1 00:00:00 1970
--- gnat-1.80/src/s-retico.adb Mon Jul 4 16:30:56 1994
***************
*** 0 ****
--- 1,76 ----
+ ------------------------------------------------------------------------------
+ -- --
+ -- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+ -- --
+ -- S Y S T E M . R E A L _ T I M E . C O N V --
+ -- --
+ -- B o d y --
+ -- --
+ -- $Revision: 1.4 $ --
+ -- --
+ -- Copyright (c) 1991,1992,1993, FSU, All Rights Reserved --
+ -- --
+ -- GNARL is free software; you can redistribute it and/or modify it under --
+ -- terms of the GNU Library General Public License as published by the --
+ -- Free Software Foundation; either version 2, or (at your option) any --
+ -- later version. GNARL is distributed in the hope that it will be use- --
+ -- ful, but but WITHOUT ANY WARRANTY; without even the implied warranty of --
+ -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Gen- --
+ -- eral Library Public License for more details. You should have received --
+ -- a copy of the GNU Library General Public License along with GNARL; see --
+ -- file COPYING. If not, write to the Free Software Foundation, 675 Mass --
+ -- Ave, Cambridge, MA 02139, USA. --
+ -- --
+ ------------------------------------------------------------------------------
+
+ package body System.Real_Time.Conv is
+
+ -----------------------
+ -- Time_To_Stimespec --
+ -----------------------
+
+ function Time_To_Stimespec
+ (T : Real_Time.time)
+ return Task_Clock.Stimespec
+ is
+ begin
+ return Task_Clock.Stimespec (T);
+ end Time_To_Stimespec;
+
+ -----------------------
+ -- Stimespec_To_Time --
+ -----------------------
+
+ function Stimespec_To_Time
+ (T : Task_Clock.Stimespec)
+ return Real_Time.Time
+ is
+ begin
+ return Real_Time.Time (T);
+ end Stimespec_To_Time;
+
+ ----------------------------
+ -- Time_Span_To_Stimespec --
+ ----------------------------
+
+ function Time_Span_To_Stimespec
+ (T : Real_Time.Time_Span)
+ return Task_Clock.Stimespec
+ is
+ begin
+ return Task_Clock.Stimespec (T);
+ end Time_Span_To_Stimespec;
+
+ ----------------------------
+ -- Stimespec_To_Time_Span --
+ ----------------------------
+
+ function Stimespec_To_Time_Span
+ (T : Task_Clock.Stimespec)
+ return Real_Time.Time_Span
+ is
+ begin
+ return Real_Time.Time_Span (T);
+ end Stimespec_To_Time_Span;
+
+ end System.Real_Time.Conv;
diff -rc --new-file /src/baseline/gnat-1.80/src/s-retico.ads gnat-1.80/src/s-retico.ads
*** /src/baseline/gnat-1.80/src/s-retico.ads Thu Jan 1 00:00:00 1970
--- gnat-1.80/src/s-retico.ads Mon Jul 4 16:30:57 1994
***************
*** 0 ****
--- 1,50 ----
+ ------------------------------------------------------------------------------
+ -- --
+ -- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+ -- --
+ -- S Y S T E M . R E A L _ T I M E . C O N V --
+ -- --
+ -- S p e c --
+ -- --
+ -- $Revision: 1.4 $ --
+ -- --
+ -- Copyright (c) 1991,1992,1993, FSU, All Rights Reserved --
+ -- --
+ -- GNARL is free software; you can redistribute it and/or modify it under --
+ -- terms of the GNU Library General Public License as published by the --
+ -- Free Software Foundation; either version 2, or (at your option) any --
+ -- later version. GNARL is distributed in the hope that it will be use- --
+ -- ful, but but WITHOUT ANY WARRANTY; without even the implied warranty of --
+ -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Gen- --
+ -- eral Library Public License for more details. You should have received --
+ -- a copy of the GNU Library General Public License along with GNARL; see --
+ -- file COPYING. If not, write to the Free Software Foundation, 675 Mass --
+ -- Ave, Cambridge, MA 02139, USA. --
+ -- --
+ ------------------------------------------------------------------------------
+
+ -- Provides conversion between Task_Clock.time and Real_Time.Time
+ -- and Real_Time.Time_Span
+
+ with System.Task_Clock;
+ -- Uses, Type : Stimespec
+
+ package System.Real_Time.Conv is
+
+ function Time_To_Stimespec
+ (T : Real_Time.time)
+ return Task_Clock.Stimespec;
+
+ function Stimespec_To_Time
+ (T : Task_Clock.Stimespec)
+ return Real_Time.Time;
+
+ function Time_Span_To_Stimespec
+ (T : Real_Time.Time_Span)
+ return Task_Clock.Stimespec;
+
+ function Stimespec_To_Time_Span
+ (T : Task_Clock.Stimespec)
+ return Real_Time.Time_Span;
+
+ end System.Real_Time.Conv;
diff -rc --new-file /src/baseline/gnat-1.80/src/s-retide.adb gnat-1.80/src/s-retide.adb
*** /src/baseline/gnat-1.80/src/s-retide.adb Thu Jan 1 00:00:00 1970
--- gnat-1.80/src/s-retide.adb Mon Jul 4 16:31:28 1994
***************
*** 0 ****
--- 1,134 ----
+ ------------------------------------------------------------------------------
+ -- --
+ -- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+ -- --
+ -- S Y S T E M . R E A L _ T I M E . D E L A Y S --
+ -- --
+ -- B o d y --
+ -- --
+ -- $Revision: 1.4 $ --
+ -- --
+ -- Copyright (c) 1991,1992,1993, FSU, All Rights Reserved --
+ -- --
+ -- GNARL is free software; you can redistribute it and/or modify it under --
+ -- terms of the GNU Library General Public License as published by the --
+ -- Free Software Foundation; either version 2, or (at your option) any --
+ -- later version. GNARL is distributed in the hope that it will be use- --
+ -- ful, but but WITHOUT ANY WARRANTY; without even the implied warranty of --
+ -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Gen- --
+ -- eral Library Public License for more details. You should have received --
+ -- a copy of the GNU Library General Public License along with GNARL; see --
+ -- file COPYING. If not, write to the Free Software Foundation, 675 Mass --
+ -- Ave, Cambridge, MA 02139, USA. --
+ -- --
+ ------------------------------------------------------------------------------
+
+ with System.Compiler_Exceptions;
+ -- Uses, function Current_Exceptions
+
+ with System.Task_Timer_Service;
+ -- Uses, object Objects
+ -- procedure Service_Entries
+
+ with System.Tasking;
+
+ with Unchecked_Conversion;
+
+ package body System.Real_Time.Delays is
+
+ use Tasking.Protected_Objects;
+ use Tasking;
+
+ package Timer renames System.Task_Timer_Service.Timer;
+
+ function To_Access is new
+ Unchecked_Conversion (System.Address, Protection_Access);
+
+ package body Delay_Until_Object is
+
+ procedure Service_Entries (Pending_Serviced : out Boolean) is
+
+ P : System.Address;
+
+ subtype PO_Entry_Index is Protected_Entry_Index
+ range Null_Protected_Entry .. 1;
+
+ Barriers : Tasking.Barrier_Vector (1 .. 1) := (others => true);
+ -- No barriers. always true barrier
+
+ E : PO_Entry_Index;
+
+ PS : Boolean;
+
+ Cumulative_PS : Boolean := False;
+
+ begin
+ loop
+ -- Get the next queued entry or the pending call
+ -- (if no barriers are true)
+
+ Tasking.Protected_Objects.Next_Entry_Call
+ (To_Access (Object'Address), Barriers, P, E);
+
+ begin
+ case E is
+
+ -- No pending call to serve
+
+ when Null_Protected_Entry =>
+ exit;
+
+ -- Call to be served
+
+ when 1 =>
+
+ -- Lock the object before requeueing
+ Tasking.Protected_Objects.Lock
+ (To_Access (Timer.Object'Address));
+
+ begin
+ -- Requeue on the timer for the service. Parameter is
+ -- passed along as Object.Call_In_Progress.Param
+
+ Requeue_Protected_Entry (
+ Object => To_Access (Object'Address),
+ New_Object => To_Access (Timer.Object'Address),
+ E => 3,
+ With_Abort => True);
+ Timer.Service_Entries (PS);
+ Tasking.Protected_Objects.Unlock
+ (To_Access (Timer.Object'Address));
+
+ -- Neither Requeue nor Service_Entries should raise
+ -- an exception; the exception should be saved. ???
+
+ -- exception
+ -- when others =>
+ -- Timer.Service_Entries;
+ -- raise;
+ end;
+ end case;
+
+ exception
+ when others =>
+ Tasking.Protected_Objects.Exceptional_Complete_Entry_Body (
+ Object => To_Access (Object'Address),
+ Ex => Compiler_Exceptions.Current_Exception,
+ Pending_Serviced => PS);
+ end;
+
+ Cumulative_PS := Cumulative_PS or PS;
+ end loop;
+
+ Pending_Serviced := Cumulative_PS;
+ end Service_Entries;
+
+ -- Initialization for package body of Delay_Until_Object
+
+ begin
+ Initialize_Protection
+ (To_Access (Object'Address), Tasking.Unspecified_Priority);
+
+ end Delay_Until_Object;
+
+ end System.Real_Time.Delays;
diff -rc --new-file /src/baseline/gnat-1.80/src/s-retide.ads gnat-1.80/src/s-retide.ads
*** /src/baseline/gnat-1.80/src/s-retide.ads Thu Jan 1 00:00:00 1970
--- gnat-1.80/src/s-retide.ads Mon Jul 4 16:31:28 1994
***************
*** 0 ****
--- 1,45 ----
+ ------------------------------------------------------------------------------
+ -- --
+ -- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+ -- --
+ -- S Y S T E M . R E A L _ T I M E . D E L A Y S --
+ -- --
+ -- S p e c --
+ -- --
+ -- $Revision: 1.5 $ --
+ -- --
+ -- Copyright (c) 1991,1992,1993, FSU, All Rights Reserved --
+ -- --
+ -- GNARL is free software; you can redistribute it and/or modify it under --
+ -- terms of the GNU Library General Public License as published by the --
+ -- Free Software Foundation; either version 2, or (at your option) any --
+ -- later version. GNARL is distributed in the hope that it will be use- --
+ -- ful, but but WITHOUT ANY WARRANTY; without even the implied warranty of --
+ -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Gen- --
+ -- eral Library Public License for more details. You should have received --
+ -- a copy of the GNU Library General Public License along with GNARL; see --
+ -- file COPYING. If not, write to the Free Software Foundation, 675 Mass --
+ -- Ave, Cambridge, MA 02139, USA. --
+ -- --
+ ------------------------------------------------------------------------------
+
+ -- Implements real_time.time delays using a protected object
+
+ with System.Tasking.Protected_Objects;
+ -- Uses, type: Protection
+
+ package System.Real_Time.Delays is
+
+ package Delay_Until_Object is
+
+ Object : aliased Tasking.Protection (Num_Entries => 1);
+
+ type Params is record
+ Param : Real_Time.Time;
+ end record;
+
+ procedure Service_Entries (Pending_Serviced : out Boolean);
+
+ end Delay_Until_Object;
+
+ end System.Real_Time.Delays;
diff -rc --new-file /src/baseline/gnat-1.80/src/s-taruty.adb gnat-1.80/src/s-taruty.adb
*** /src/baseline/gnat-1.80/src/s-taruty.adb Thu Jan 1 00:00:00 1970
--- gnat-1.80/src/s-taruty.adb Mon Jul 4 16:32:01 1994
***************
*** 0 ****
--- 1,69 ----
+ ------------------------------------------------------------------------------
+ -- --
+ -- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+ -- --
+ -- S Y S T E M . T A S K I N G . R U N T Y P E _ T Y P E S --
+ -- --
+ -- S p e c --
+ -- --
+ -- $Revision: 1.4 $ --
+ -- --
+ -- Copyright (c) 1991,1992,1993, FSU, All Rights Reserved --
+ -- --
+ -- GNARL is free software; you can redistribute it and/or modify it under --
+ -- terms of the GNU Library General Public License as published by the --
+ -- Free Software Foundation; either version 2, or (at your option) any --
+ -- later version. GNARL is distributed in the hope that it will be use- --
+ -- ful, but but WITHOUT ANY WARRANTY; without even the implied warranty of --
+ -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Gen- --
+ -- eral Library Public License for more details. You should have received --
+ -- a copy of the GNU Library General Public License along with GNARL; see --
+ -- file COPYING. If not, write to the Free Software Foundation, 675 Mass --
+ -- Ave, Cambridge, MA 02139, USA. --
+ -- --
+ ------------------------------------------------------------------------------
+
+ with System.Task_Primitives; use System.Task_Primitives;
+
+ package body System.Tasking.Runtime_Types is
+
+ ------------------------------------
+ -- Vulnerable_Complete_Activation --
+ ------------------------------------
+
+ -- WARNING : Only call this procedure with priority already boosted.
+ -- That's why the name has "Vulnerable" in it.
+
+ procedure Vulnerable_Complete_Activation
+ (T : ATCB_Ptr)
+ is
+ This_Task : ATCB_Ptr := ID_To_ATCB (Self);
+ Activator : ATCB_Ptr;
+
+ begin
+ Activator := T.Activator;
+
+ -- Decrement the count of tasks to be activated by the activator and
+ -- wake it up so it can check to see if all tasks have been activated.
+ -- Note that the locks of the activator and created task are locked
+ -- here. This is necessary because C.Stage and
+ -- T.Activation_Count have to be synchronized. This is also
+ -- done in Activate_Tasks and Init_Abortion. So long as the
+ -- activator lock is always locked first, this cannot lead to deadlock.
+
+ Write_Lock (Activator.L);
+ Write_Lock (T.L);
+
+ if T.Stage = Can_Activate then
+ T.Stage := Active;
+ Activator.Activation_Count := Activator.Activation_Count - 1;
+ end if;
+
+ Unlock (T.L);
+
+ Cond_Signal (Activator.Cond);
+ Unlock (Activator.L);
+
+ end Vulnerable_Complete_Activation;
+
+ end System.Tasking.Runtime_Types;
diff -rc --new-file /src/baseline/gnat-1.80/src/s-taruty.ads gnat-1.80/src/s-taruty.ads
*** /src/baseline/gnat-1.80/src/s-taruty.ads Thu Jan 1 00:00:00 1970
--- gnat-1.80/src/s-taruty.ads Mon Jul 4 16:32:01 1994
***************
*** 0 ****
--- 1,406 ----
+ ------------------------------------------------------------------------------
+ -- --
+ -- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+ -- --
+ -- S Y S T E M . T A S K I N G . R U N T Y P E _ T Y P E S --
+ -- --
+ -- S p e c --
+ -- --
+ -- $Revision: 1.6 $ --
+ -- --
+ -- Copyright (c) 1991,1992,1993, FSU, All Rights Reserved --
+ -- --
+ -- GNARL is free software; you can redistribute it and/or modify it under --
+ -- terms of the GNU Library General Public License as published by the --
+ -- Free Software Foundation; either version 2, or (at your option) any --
+ -- later version. GNARL is distributed in the hope that it will be use- --
+ -- ful, but but WITHOUT ANY WARRANTY; without even the implied warranty of --
+ -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Gen- --
+ -- eral Library Public License for more details. You should have received --
+ -- a copy of the GNU Library General Public License along with GNARL; see --
+ -- file COPYING. If not, write to the Free Software Foundation, 675 Mass --
+ -- Ave, Cambridge, MA 02139, USA. --
+ -- --
+ ------------------------------------------------------------------------------
+
+ with Unchecked_Conversion;
+
+ package System.Tasking.Runtime_Types is
+
+ -- Entry queue related types
+
+ type Server_Kind is (Task_Server, PO_Server);
+
+ type Server_Record (Kind : Server_Kind := Task_Server) is record
+ case Kind is
+ when Task_Server =>
+ Called_Task : Task_ID;
+ Acceptor_Prev_Call : Entry_Call_Link;
+
+ Acceptor_Prev_Priority : Rendezvous_Priority;
+ -- For a task servicing a task entry call,
+ -- information about the most recent prior call being serviced.
+ -- Not used for protected entry calls;
+ -- this function should be performed by GNULLI ceiling locking.
+
+ when PO_Server =>
+ Called_PO : Protection_Access;
+
+ end case;
+ end record;
+
+ -- Protected Objects related definitions
+
+ Null_PO : constant Protection_Access := null;
+
+ -- ATCB type defintions
+
+ type Ada_Task_Control_Block (Entry_Num : Task_Entry_Index);
+
+ type ATCB_Ptr is access Ada_Task_Control_Block;
+
+ All_Tasks_List : ATCB_Ptr;
+ All_Tasks_L : Task_Primitives.Lock;
+
+ function ID_To_ATCB is new
+ Unchecked_Conversion (Task_ID, ATCB_Ptr);
+
+ function ATCB_To_ID is new
+ Unchecked_Conversion (ATCB_Ptr, Task_ID);
+
+ function ATCB_To_Address is new
+ Unchecked_Conversion (ATCB_Ptr, System.Address);
+
+ type Task_Stage is (
+ Created,
+ -- Task has been created but has not begun activation.
+
+ Can_Activate,
+ -- Task has begin activation.
+
+ Active,
+ -- Task has completed activation and is executing the task body.
+
+ Await_Dependents,
+ -- Task is waiting for all of its dependents to become passive (be
+ -- complete, terminated, or be waiting on a terminate alternative).
+
+ Passive,
+ -- The task is passive.
+
+ Completing,
+ -- The task is committed to becoming complete, but has not yet
+ -- satisfied all of the conditions for completion. This
+ -- acts as a claim to completion; once Stage is set to this value,
+ -- no other task can continue with completion.
+
+ Complete,
+ -- The task is complete. The task and all of its dependents are
+ -- passive; some dependents may still be waiting on terminate
+ -- alternatives.
+
+ Terminated);
+ -- The task is terminated. All dependents waiting on terminate
+ -- alternatives have been awakened and have terminated themselves.
+
+ type Accepting_State is (
+ Not_Accepting, -- task is not ready to accept any entry call
+ Trivial_Accept, -- "accept E;"
+ Simple_Accept, -- "accept E do ... end E;"
+ Select_Wait); -- most general case
+
+ type Entry_Call_Array is array (ATC_Level_Index) of
+ aliased Entry_Call_Record;
+
+ type Entry_Queue_Array is array (Task_Entry_Index range <>) of Entry_Queue;
+
+ -- Notes on protection (synchronization) of TRTS data structures.
+
+ -- Any field of the TCB can be written by the activator of a task when the
+ -- task is created, since no other task can access the new task's
+ -- state until creation is complete.
+
+ -- The protection for each field is described in a comment starting with
+ -- "Protection:".
+
+ -- When a lock is used to protect an ATCB field, this lock is simply named.
+
+ -- Some protection is described in terms of tasks related to the
+ -- ATCB being protected. These are:
+
+ -- Self: The task which is controlled by this ATCB.
+ -- Acceptor: A task accepting a call from Self.
+ -- Caller: A task calling an entry of Self.
+ -- Parent: The task executing the master on which Self depends.
+ -- Dependent: A task dependent on Self.
+ -- Activator: The task that created Self and initiated its activation.
+ -- Created: A task created and activated by Self.
+
+ type Ada_Task_Control_Block (Entry_Num : Task_Entry_Index) is record
+
+ LL_TCB : aliased Task_Primitives.Task_Control_Block;
+ -- Control block used by the underlying low-level tasking service
+ -- (GNULLI).
+ -- Protection: This is used only by the GNULLI implementation, which
+ -- takes care of all of its synchronization.
+
+ Task_Entry_Point : Init_State;
+ -- Information needed to call the procedure containing the code for
+ -- the body of this task.
+ -- Protection: Part of the synchronization between Self and
+ -- Activator. Activator writes it, once, before Self starts
+ -- executing. Self reads it, once, as part of its execution.
+
+ Task_Arg : System.Address;
+ -- The argument to to task procedure. Currently unused; this will
+ -- provide a handle for discriminant information.
+ -- Protection: Part of the synchronization between Self and
+ -- Activator. Activator writes it, once, before Self starts
+ -- executing. Thereafter, Self only reads it.
+
+ Stack_Size : Size_Type;
+ -- Requested stack size.
+ -- Protection: Only used by Self.
+
+ Current_Priority : System.Priority;
+ -- Active priority, except that the effects of protected object
+ -- priority ceilings are not reflected. This only reflects explicit
+ -- priority changes and priority inherited through task activation
+ -- and rendezvous.
+ -- Ada 9X notes: In Ada 9X, this field will be transferred to the
+ -- Priority field of an Entry_Calls componant when an entry call
+ -- is initiated. The Priority of the Entry_Calls componant will not
+ -- change for the duration of the call. The accepting task can
+ -- use it to boost its own priority without fear of its changing in
+ -- the meantime.
+ -- This can safely be used in the priority ordering
+ -- of entry queues. Once a call is queued, its priority does not
+ -- change.
+ -- Since an entry call cannot be made while executing
+ -- a protected action, the priority of a task will never reflect a
+ -- priority ceiling change at the point of an entry call.
+ -- Protection: Only written by Self, and only accessed when Acceptor
+ -- accepts an entry or when Created activates, at which points Self is
+ -- suspended.
+
+ L : Task_Primitives.Lock;
+ -- General purpose lock; protects most fields in the ATCB.
+
+ Compiler_Data : System.Address;
+ -- Untyped task-specific data needed by the compiler to store
+ -- per-task structures.
+ -- Protection: Only accessed by Self.
+
+ -- the following declarations are for Rendezvous
+
+ Cond : Task_Primitives.Condition_Variable;
+ Rend_Cond : Task_Primitives.Condition_Variable;
+ -- Rend_Cond is used by the task owning this ATCB for waits involved in
+ -- rendezvous, and Cond is used for all other waits. There is currently
+ -- no overlap in the use of these condition variables; see comment to
+ -- Abort_Tasks in Task_Stages.
+ -- Protection: Condition variables are always associated with a lock.
+ -- The runtime places no restrictions on which lock is used, except
+ -- that it must protection the condition opon which the task is waiting.
+ -- Currently, Cond is always associated with Self.L, and Rend_Cond
+ -- is always associated with Acceptor.L.
+
+ All_Tasks_Link : ATCB_Ptr;
+ -- Used to link this task to the list of all tasks in the system.
+ -- Protection: All_Tasks.L.
+
+ Activation_Link : ATCB_Ptr;
+ -- Used to link this task to a list of tasks to be activated.
+ -- Protection: Only used by Activator.
+
+ Open_Accepts : Accept_List_Access;
+ -- This points to the Open_Accepts array of accept alternatives passed
+ -- to the RTS by the compiler-generated code to Selective_Wait.
+ -- Protection: Self.L.
+
+ Exception_To_Raise : Exception_ID;
+ Exception_Address : System.Address;
+ -- An exception which should be raised by this task when it regains
+ -- control, and the address at which it should be raised.
+ -- Protection: Read only by Self, under circumstances where it will
+ -- be notified by the writer when it is safe to read it:
+ -- 1. Written by Acceptor, when Self is suspended.
+ -- 2. Written by Notify_Exception, executed by Self through a
+ -- synchronous signal handler, which redirects control to a
+ -- routine to read it and raise the exception.
+
+ Chosen_Index : Select_Index;
+ -- The index in Open_Accepts of the entry call accepted by a selective
+ -- wait executed by this task.
+ -- Protection: Written by both Self and Caller. Usually protected
+ -- by Self.L. However, once the selection is known to have been
+ -- written it can be accessed without protection. This happens
+ -- after Self has updated it itself using information from a suspended
+ -- Caller, or after Caller has updated it and awakened Self.
+
+ Call : Entry_Call_Link;
+ -- The entry call that has been accepted by this task.
+ -- Protection: Self.L. Self will modify this field
+ -- when Self.Accepting is False, and will not need the mutex to do so.
+ -- Once a task sets Stage=Completing, no other task can access this
+ -- field.
+
+ -- The following fields are used to manage the task's life cycle.
+
+ Activator : ATCB_Ptr;
+ -- The task that created this task, either by declaring it as a task
+ -- object or by executing a task allocator.
+ -- Protection: Set by Activator before Self is activated, and
+ -- read after Self is activated.
+
+ Parent : ATCB_Ptr;
+ Master_of_Task : Master_ID;
+ -- The task executing the master of this task, and the ID of this task's
+ -- master (unique only among masters currently active within Parent).
+ -- Protection: Set by Activator before Self is activated, and
+ -- read after Self is activated.
+
+ Master_Within : Master_ID;
+ -- The ID of the master currently executing within this task; that is,
+ -- the most deeply nested currently active master.
+ -- Protection: Only written by Self, and only read by Self or by
+ -- dependents when Self is attempting to exit a master. Since Self
+ -- will not write this field until the master is complete, the
+ -- synchronization should be adequate to prevent races.
+
+ Activation_Count : Integer;
+ -- This is the number of tasks that this task is activating, i.e. the
+ -- children that have started activation but have not completed it.
+ -- Protection: Self.L and Created.L. Both mutexes must be locked,
+ -- since Self.Activation_Count and Created.Stage must be synchronized.
+
+ Awake_Count : Integer;
+ -- Number of tasks dependent on this task (including this task) that are
+ -- still "awake": not terminated and not waiting on a terminate
+ -- alternative.
+ -- Protection: Self.L. Parent.L must also be locked when this is
+ -- updated, so that it can be synchronized with
+ -- Parent.Awaited_Dependent_Count, except under special circumstances
+ -- where we know that the two can be out of sync without allowing the
+ -- parent to terminate before its dependents.
+
+ Awaited_Dependent_Count : Integer;
+ -- This is the awake count of a master being completed by this task.
+ -- Protection: Self.L. Dependent.L must also be locked so that
+ -- this field and Dependent.Awake_Count can be synchronized, except
+ -- under special circumstances where we know that the two can be out
+ -- of sync without allowing the parent to terminate before its
+ -- dependents.
+
+ Terminating_Dependent_Count : Integer;
+ -- This is the count of tasks dependent on a master being completed by
+ -- this task which are waiting on a terminate alternative. Only valid
+ -- when there none of the dependents are awake.
+ -- Protection: Self.L.
+
+ Pending_ATC_Level : ATC_Level_Base;
+ -- The ATC level to which this task is currently being aborted.
+ -- Protection: Self.L.
+
+ ATC_Nesting_Level : ATC_Level;
+ -- The dynamic level of ATC nesting (currently executing nested
+ -- asynchronous select statements) in this task.
+ -- Protection: This is only used by Self. However, decrementing it
+ -- in effect deallocates an Entry_Calls componant, and care must be
+ -- taken that all references to that componant are eliminated before
+ -- doing the decrement. This in turn will probably required locking
+ -- a protected object (for a protected entry call) or the Acceptor's
+ -- lock (for a task entry call). However, ATC_Nesting_Level itself can
+ -- be accessed without a lock.
+
+ Deferral_Level : Natural;
+ -- This is the number of times that Defer_Abortion has been called by
+ -- this task without a matching Undefer_Abortion call. Abortion is
+ -- only allowed when this zero.
+ -- Protection: Only updated by Self; access assumed to be atomic.
+
+ Elaborated : Access_Boolean;
+ -- Pointer to a flag indicating that this task's body has been
+ -- elaborted. The flag is created and managed by the
+ -- compiler-generated code.
+ -- Protection: The field itself is only accessed by Activator. The flag
+ -- that it points to is updated by Master and read by Activator; access
+ -- is assumed to be atomic.
+
+ Stage : Task_Stage;
+ -- The general stage of the task in it's life cycle.
+ -- Protection: Self.L.
+
+ -- beginning of flags
+
+ Cancel_Was_Successful : Boolean;
+ -- This indicates that the last attempt to cancel an entry call was
+ -- successful. It needs to be accurate between a call to
+ -- *Cancel_*_Entry_Call and the following call to Complete_*_Entry_Call.
+ -- These calls cannot be nested; that is, there can be no intervening
+ -- *Cancel_*_Entry_Call, so this single field is adequate.
+ -- Protection: Accessed only by Self.
+
+ Accepting : Accepting_State;
+ -- The ability of this task to accept an entry call.
+ -- Protection: Self.L.
+
+ Aborting : Boolean;
+ -- Self is in the process of aborting. While set, prevents multiple
+ -- abortion signals from being sent by different aborter while abortion
+ -- is acted upon. This is essential since an aborter which calls
+ -- Abort_To_Level could set the Pending_ATC_Level to yet a lower level
+ -- (than the current level), may be preempted and would send the
+ -- abortion signal when resuming execution. At this point, the abortee
+ -- may have completed abortion to the proper level such that the
+ -- signal (and resulting abortion exception) are not handled anymore.
+ -- In other words, the flag prevents a race between multiple aborters
+ -- and the abortee.
+ -- Protection: Self.L.
+
+ Suspended_Abortably : Boolean;
+ -- Task is suspended with (low-level) abortion deferred, but is
+ -- abortable. This means that the task must be awakened to perform
+ -- its own abortion.
+ -- Protection: Self.L.
+
+ -- end of flags
+
+ Entry_Calls : Entry_Call_Array;
+ -- An array of Ada 9X entry calls.
+ -- Protection: The elements of this array are on entry call queues
+ -- associated with protected objects or task entries, and are protected
+ -- by the protected object lock or Acceptor.L, respecively.
+
+ Entry_Queues : Entry_Queue_Array (1 .. Entry_Num);
+ -- An array of task entry queues.
+ -- Protection: Self.L. Once a task has set Self.Stage to Completing, it
+ -- has exclusive access to this field.
+
+ Aborter_Link : ATCB_Ptr;
+ -- Link to the list of tasks which tries to abort this task but
+ -- blocked by another aborter who has already been aborting the task.
+
+ end record;
+
+ -- The following record holds the information used to initialize a task
+
+
+ type ATCB_Init is record
+ Task_Entry_Point : Init_State;
+ Task_Arg : System.Address;
+ Stack_Size : Size_Type;
+ Activator : ATCB_Ptr;
+ Parent : ATCB_Ptr;
+ Master_of_Task : Master_ID;
+ Elaborated : Access_Boolean;
+ Entry_Num : Task_Entry_Index;
+ end record;
+
+ procedure Vulnerable_Complete_Activation
+ (T : ATCB_Ptr);
+ -- Completes the activation by signalling its children.
+ -- Does not defer abortion (unlike Complete_Activation) and assumes
+ -- that priority is already boosted.
+
+ end System.Tasking.Runtime_Types;
diff -rc --new-file /src/baseline/gnat-1.80/src/threads/src/Makefile gnat-1.80/src/threads/src/Makefile
*** /src/baseline/gnat-1.80/src/threads/src/Makefile Fri Apr 29 15:46:52 1994
--- gnat-1.80/src/threads/src/Makefile Wed Jul 6 16:58:33 1994
***************
*** 136,142 ****
COMP_C2 = $(CC) $(INC1) $(INC2) $(CCFLAGS2) -c $*.c
AR = ar
! RANLIB = /usr/bin/ranlib
LINTFLAGS = -u $(CFLAGS)
--- 136,142 ----
COMP_C2 = $(CC) $(INC1) $(INC2) $(CCFLAGS2) -c $*.c
AR = ar
! RANLIB = /bin/ranlib
LINTFLAGS = -u $(CFLAGS)
diff -rc --new-file /src/baseline/gnat-1.80/src/uintp.adb gnat-1.80/src/uintp.adb
*** /src/baseline/gnat-1.80/src/uintp.adb Fri Jun 10 15:43:45 1994
--- gnat-1.80/src/uintp.adb Wed Jul 6 16:57:40 1994
***************
*** 231,236 ****
--- 231,238 ----
procedure Init_Operand (UI : Uint; Vec : out UI_Vector) is
Loc : Int;
+ -- AmigaDOS hack
+ tempa : Int;
begin
if UI <= Uint_Direct_Last then
***************
*** 239,245 ****
Loc := Uints.Table (UI).Loc;
for J in 1 .. Uints.Table (UI).Length loop
! Vec (J) := Udigits.Table (Loc + J - 1);
end loop;
end if;
end Init_Operand;
--- 241,249 ----
Loc := Uints.Table (UI).Loc;
for J in 1 .. Uints.Table (UI).Length loop
! -- AmigaDOS hack
! tempa := Loc + J - 1;
! Vec (J) := Udigits.Table (tempa);
end loop;
end if;
end Init_Operand;
***************
*** 693,698 ****
--- 697,704 ----
declare
Length : Int := Uints.Table (Right).Length;
Loc : Int := Uints.Table (Right).Loc;
+ -- AmigaDOS hack
+ tempa, tempb : Int;
begin
Uints.Increment_Last;
***************
*** 704,710 ****
for Idx in 2 .. Length loop
Udigits.Increment_Last;
! Udigits.Table (Udigits.Last) := Udigits.Table (Loc + Idx - 1);
end loop;
return Uints.Last;
--- 710,719 ----
for Idx in 2 .. Length loop
Udigits.Increment_Last;
! -- AmigaDOS hack
! tempa := Udigits.Last;
! tempb := Loc + Idx - 1;
! Udigits.Table (tempa) := Udigits.Table (tempb);
end loop;
return Uints.Last;