diff --git a/gcc/f/gbe/2.7.2.2.diff b/gcc/f/gbe/2.7.2.2.diff
deleted file mode 100644
index e99ba67..0000000
--- a/gcc/f/gbe/2.7.2.2.diff
+++ /dev/null
@@ -1,11296 +0,0 @@
-IMPORTANT: After applying this patch, you must rebuild the
-Info documentation derived from the Texinfo files in the
-gcc distribution, as this patch does not include patches
-to any derived files (due to differences in the way gcc
-version 2.7.2.2 is obtained by users).  Use the following
-command sequence after applying this patch:
-
-  cd gcc-2.7.2.2; make -f Makefile.in gcc.info
-
-If that fails due to `makeinfo' not being installed, obtain
-texinfo-3.11.tar.gz from a GNU distribution site, unpack,
-build, and install it, and try the above command sequence
-again.
-
-
-diff -rcp2N gcc-2.7.2.2/ChangeLog g77-new/ChangeLog
-*** gcc-2.7.2.2/ChangeLog	Thu Feb 20 19:24:10 1997
---- g77-new/ChangeLog	Mon Aug 11 06:48:02 1997
-***************
-*** 1,2 ****
---- 1,244 ----
-+ Sun Aug 10 18:14:24 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	Integrate C front end part of patch for better alias
-+ 	handling from John Carr <jfc@mit.edu>:
-+ 	* c-decl.c (grokdeclarator): Check for RID_RESTRICT
-+ 	flag; diagnose certain misuses; set DECL_RESTRICT as
-+ 	appropriate.
-+ 	* c-lex.c (init_lex): Set up RID_RESTRICT pointer.
-+ 	Unset `restrict' as reserved word.
-+ 	* c-lex.h: Replace RID_NOALIAS with RID_RESTRICT.
-+ 	* c-parse.gperf: Add `restrict' and `__restrict'
-+ 	keywords.
-+ 	* tree.h: Add DECL_RESTRICT flag.
-+ 
-+ Sun Aug 10 14:50:30 1997  Jim Wilson  <wilson@cygnus.com>
-+ 
-+ 	* sdbout.c (plain_type_1, case ARRAY_TYPE): Verify that TYPE_DOMAIN
-+ 	has integer TYPE_{MAX,MIN}_VALUE before using them.
-+ 
-+ Mon Jul 28 15:35:38 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* combine.c (num_sign_bit_copies): Speed up the 961126-1.c
-+ 	case of repeated (neg (neg (neg ...))) so c-torture runs
-+ 	in less time.
-+ 
-+ 	* reload.c (find_reloads_toplev, find_reloads_address):
-+ 	These now return whether replacement by a constant, so
-+ 	caller can know to do other replacements.  Currently if
-+ 	caller doesn't want that info and such replacement would
-+ 	happen, we crash so as to investigate the problem and
-+ 	learn more about it.  All callers updated.
-+ 	(find_reloads): If pseudo replaced by constant, always
-+ 	update duplicates of it.
-+ 
-+ Mon Jul 21 00:00:24 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* fold-const.c (size_binop): Make sure overflows
-+ 	are flagged properly, so as to avoid silently generating
-+ 	bad code for, e.g., a too-large array.
-+ 
-+ Sun Jul 13 22:23:14 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* stmt.c (expand_expr_stmt): Must generate code for
-+ 	statements within an expression (gcc's `({ ... )}')
-+ 	even if -fsyntax-only.
-+ 
-+ Mon Jun 30 17:23:07 1997  Michael Meissner  <meissner@cygnus.com>
-+ 
-+ 	* gcc.c (process_command): If -save-temps and -pipe were specified
-+ 	together, don't do -pipe.
-+ 
-+ Thu Jun 26 05:40:46 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* stor-layout.c (get_best_mode): Handle negative bitpos
-+ 	correctly, so caller doesn't get into infinite recursion
-+ 	trying to cope with a spurious VOIDmode.
-+ 
-+ Tue Jun 24 19:46:31 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* varasm.c (assemble_variable): If low part of size
-+ 	doesn't fit in an int, variable is too large.
-+ 
-+ Sat Jun 21 12:09:00 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* toplev.c (rest_of_compilation): Also temporarily set
-+ 	flag_unroll_all_loops to 0 during first of two calls
-+ 	to loop_optimize, and clean up code a bit to make it
-+ 	easier to read.
-+ 
-+ 	* expr.c (safe_from_p_1, safe_from_p): Fix these to use
-+ 	TREE_SET_CODE instead of TREE_CODE.
-+ 
-+ Thu Jun 19 19:30:47 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* config/alpha/alpha.c: Don't include <stamp.h> on
-+ 	GNU Linux machines.
-+ 
-+ 	* config/alpha/elf.c: New file for ELF systems.
-+ 
-+ 	* config/alpha/xm-alpha.h: Don't declare alloca()
-+ 	if it's already a macro (probably defined in stdlib.h).
-+ 
-+ 	* config/alpha/xm-linux.h (HAVE_STRERROR): #define
-+ 	this, according to what various people suggest.
-+ 
-+ 	* config.guess, configure: Make some (hopefully safe)
-+ 	changes, based mostly on gcc-2.8.0-in-development,
-+ 	in the hopes that these make some systems configure
-+ 	"out of the box" more easily, especially Alpha systems.
-+ 
-+ Mon Jun  9 04:26:53 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* expr.c (safe_from_p): Don't examine a given SAVE_EXPR
-+ 	node more than once, to avoid combinatorial explosion
-+ 	in complex expressions.  Fortran case that triggered
-+ 	this had a complicated *and* complex expression with
-+ 	293 unique nodes, resulting in 28 minutes of compile
-+ 	time mostly spent in a single top-level safe_from_p()
-+ 	call due to all the redundant SAVE_EXPR traversals.
-+ 	This change reduced the time to around 2 seconds.
-+ 	(safe_from_p_1): New helper function that does almost
-+ 	exactly what the old safe_from_p() did.
-+ 
-+ Sun May 18 21:18:48 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* fold-const.c (fold): Clarify why TRUNC_DIV_EXPR
-+ 	and FLOOR_DIV_EXPR aren't rewritten to EXACT_DIV_EXPR,
-+ 	clean up related code.
-+ 
-+ Sat May  3 13:53:00 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* config.sub: Change all `i[345]' to `i[3456]' to
-+ 	support Pentium Pro (this change was already made
-+ 	in configure for gcc-2.7.2.2).
-+ 
-+ 	From Toon Moene <toon@moene.indiv.nluug.nl>:
-+ 	* toplev.c (rest_of_compilation): Unroll loops
-+ 	only the final time through loop optimization.
-+ 
-+ Sun Apr 20 10:45:35 1997  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
-+ 
-+ 	* final.c (profile_function): Only call ASM_OUTPUT_REG_{PUSH,POP}
-+ 	if defined.
-+ 
-+ Wed Apr 16 22:26:16 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* alias.c, cse.c, loop.c, rtl.c, rtl.h, sched.c:
-+ 	Make changes submitted by <jfc@mit.edu>.
-+ 
-+ Sun Apr 13 19:32:53 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* fold-const.c (fold): If extra warnings enabled,
-+ 	warn about integer division by zero.
-+ 
-+ Sun Apr 13 08:15:31 1997  Bernd Schmidt  <crux@Pool.Informatik.RWTH-Aachen.DE>
-+ 
-+ 	* final.c (profile_function): Save the static chain register
-+ 	around the call to the profiler function.
-+ 
-+ Sat Apr 12 14:56:42 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* unroll.c (find_splittable_givs): Permit more cases
-+ 	of mult_val/add_val to agree by using rtx_equal_p
-+ 	to compare them instead of requiring them to be
-+ 	integers with the same value.  Also don't bother
-+ 	checking if ADDRESS_COST not defined (they will be
-+ 	equal in that case).
-+ 
-+ Fri Apr 11 03:30:04 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* unroll.c (find_splittable_givs): Must create a new
-+ 	register if the mult_val and add_val fields don't
-+ 	agree.
-+ 
-+ Fri Apr  4 23:00:55 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* fold-const.c (fold): Don't call multiple_of_p if
-+ 	arg1 is constant zero, to avoid crashing; simplify
-+ 	code accordingly.
-+ 
-+ Wed Feb 26 13:09:33 1997  Michael Meissner  <meissner@cygnus.com>
-+ 
-+ 	* reload.c (debug_reload): Fix format string to print
-+ 	reload_nocombine[r].
-+ 
-+ Sun Feb 23 15:26:53 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* fold-const.c (multiple_of_p): Clean up and improve.
-+ 	(fold): Clean up invocation of multiple_of_p.
-+ 
-+ Sat Feb  8 04:53:27 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	From <jfc@jfc.tiac.net> Fri, 07 Feb 1997 22:02:21 -0500:
-+ 	* alias.c (init_alias_analysis): Reduce amount of time
-+ 	needed to simplify the reg_base_value array in the
-+ 	typical case (especially involving function inlining).
-+ 
-+ Fri Jan 10 17:22:17 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	Minor improvements/fixes to better alias handling:
-+ 	* Makefile.in (alias.o): Fix typo in rule (was RLT_H).
-+ 	* cse.c, sched.c: Fix up some indenting.
-+ 	* toplev.c: Add -fargument-alias flag, so Fortran users
-+ 	can turn C-style aliasing on once g77 defaults to
-+ 	-fargument-noalias-global.
-+ 
-+ 	Integrate patch for better alias handling from
-+ 	John Carr <jfc@mit.edu>:
-+ 	* Makefile.in (OBJS, alias.o): New module and rule.
-+ 	* alias.c: New source module.
-+ 	* calls.c (expand_call): Recognize alias status of calls
-+ 	to malloc().
-+ 	* combine.c (distribute_notes): New REG_NOALIAS note.
-+ 	* rtl.h (REG_NOALIAS): Ditto.
-+ 	Many other changes for new alias.c module.
-+ 	* cse.c: Many changes, and much code moved into alias.c.
-+ 	* flags.h (flag_alias_check, flag_argument_noalias):
-+ 	New flags.
-+ 	* toplev.c: New flags and related options.
-+ 	* local-alloc.c (validate_equiv_mem_from_store):
-+ 	Caller of true_dependence changed.
-+ 	* loop.c (NUM_STORES): Increase to 50 from 20.
-+ 	(prescan_loop): "const" functions don't alter unknown addresses.
-+ 	(invariant_p): Caller of true_dependence changed.
-+ 	(record_giv): Zero new unrolled and shared flags.
-+ 	(emit_iv_add_mult): Record base value for register.
-+ 	* sched.c: Many changes, mostly moving code to alias.c.
-+ 	(sched_note_set): SCHED_SORT macro def form, but not function,
-+ 	inexplicably changed.
-+ 	* unroll.c: Record base values for registers, etc.
-+ 
-+ Fri Jan  3 04:01:00 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* loop.c (check_final_value): Handle insns with no luid's
-+ 	appropriately, instead of crashing on INSN_LUID macro
-+ 	invocations.
-+ 
-+ Mon Dec 23 00:49:19 1996  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* config/alpha/alpha.md: Fix pattern that matches if_then_else
-+ 	involving DF target, DF comparison, SF source.
-+ 
-+ Fri Dec 20 15:42:52 1996  Craig Burley  <burley@gnu.ai.mit.edu>
-+ 
-+ 	* fold-const.c (multiple_of_p): New function.
-+ 	(fold): Use new function to turn *_DIV_EXPR into EXACT_DIV_EXPR.
-+ 
-+ Tue Oct 22 18:32:20 1996  Jim Wilson  <wilson@cygnus.com>
-+ 
-+ 	* unroll.c (unroll_loop): Always reject loops with unbalanced blocks.
-+ 
-+ Tue Sep 24 19:37:00 1996  Jim Wilson  <wilson@cygnus.com>
-+ 
-+ 	* reload.c (push_secondary_reload): Do strip paradoxical SUBREG
-+ 	even if reload_class is CLASS_CANNOT_CHANGE_SIZE.  Change reload_mode
-+ 	to mode in SECONDARY_MEMORY_NEEDED and get_secondary_mem calls.
-+ 
-+ Mon Aug  5 16:53:36 1996  Doug Evans  <dje@fallis.cygnus.com>
-+ 
-+ 	* stor-layout.c (layout_record): Correct overflow test for 0 sized
-+ 	fields.
-+ 
-  Sat Jun 29 12:33:39 1996  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
-  
-*************** Tue Jun 11 20:18:03 1996  Per Bothner <b
-*** 8,11 ****
---- 250,259 ----
-  	* alpha.h (FIXPROTO_INIT):  Define new macro.
-  
-+ Sat May 18 20:17:27 1996  Jim Wilson  <wilson@cygnus.com>
-+ 
-+ 	* unroll.c (copy_loop_body): When update split DEST_ADDR giv,
-+ 	check to make sure it was split.
-+ 	(find_splittable_givs): Fix reversed test of verify_addresses result.
-+ 
-  Fri May 10 18:35:00 1996  Richard Kenner  (kenner@vlsi1.ultra.nyu.edu)
-  
-*************** Mon Feb 19 07:35:07 1996  Torbjorn Granl
-*** 66,69 ****
---- 314,322 ----
-          * rs6000.md (not:SI with assign and compare): Fix typo.
-  
-+ Tue Feb 13 17:43:46 1996  Jim Wilson  <wilson@cygnus.com>
-+ 
-+ 	* integrate.c (save_constants_in_decl_trees): New function.
-+ 	(save_for_inline_copying, save_for_inline_nocopy): Call it.
-+ 
-  Wed Jan 24 18:00:12 1996  Brendan Kehoe  <brendan@lisa.cygnus.com>
-  
-*************** Tue Jan 16 06:01:28 1996  Thomas Graiche
-*** 81,88 ****
---- 334,357 ----
-  	* i386/freebsd.h (ASM_WEAKEN_LABEL): Deleted; not supported.
-  
-+ Mon Jan 15 07:22:59 1996  Michel Delval  (mfd@ccv.fr)
-+ 
-+ 	* reload.c (find_equiv_reg): Apply single_set, not PATTERN, to WHERE.
-+ 
-  Sun Jan  7 17:11:11 1996  David Edelsohn  <edelsohn@mhpcc.edu>
-  
-  	* collect2.c (scan_libraries): Correct Import File ID interpretation.
-  
-+ Mon Jan  1 09:05:07 1996  Richard Kenner  (kenner@vlsi1.ultra.nyu.edu)
-+ 
-+         * local-alloc.c (reg_equiv_replacement): New variable.
-+         (memref_referenced_p, case REG): Check for reg_equiv_replacement.
-+         (update_equiv_regs): reg_equiv_replacement now file-scope.
-+ 
-+ Fri Dec 22 17:29:42 1995  Richard Kenner  (kenner@vlsi1.ultra.nyu.edu)
-+ 
-+ 	* reload.c (find_valid_class): New function.
-+ 	(push_reload): Use it in cases where a SUBREG and its contents
-+ 	both need to be reloaded.
-+ 
-  Thu Dec 28 22:24:53 1995  Michael Meissner  <meissner@tiktok.cygnus.com>
-  
-*************** Mon Dec 18 18:40:34 1995  Jim Wilson  <w
-*** 99,102 ****
---- 368,376 ----
-  	above.
-  
-+ Sun Dec 17 06:37:00 1995  Richard Kenner  (kenner@vlsi1.ultra.nyu.edu)
-+ 
-+ 	* reload.c (push_secondary_reload): Don't strip paradoxical SUBREG
-+ 	if reload_class is CLASS_CANNOT_CHANGE_SIZE.
-+ 
-  Sat Dec 16 07:03:33 1995  Philippe De Muyter (phdm@info.ucl.ac.be)
-  
-*************** Sat Dec  9 18:05:03 1995  Jim Wilson  <w
-*** 113,116 ****
---- 387,395 ----
-  	* expr.c (expand_expr, case INDIRECT_REF): Correct typo in May 8
-  	change.
-+ 
-+ Fri Dec  8 19:17:30 1995  Mike Meissner  <meissner@beauty.cygnus.com>
-+ 
-+ 	* rs6000/rs6000.c (input_operand): Allow any integer constant, not
-+ 	just integers that fit in 1 instruction.
-  
-  Sun Nov 26 14:47:42 1995  Richard Kenner  <kenner@mole.gnu.ai.mit.edu>
-diff -rcp2N gcc-2.7.2.2/Makefile.in g77-new/Makefile.in
-*** gcc-2.7.2.2/Makefile.in	Sun Nov 26 14:44:25 1995
---- g77-new/Makefile.in	Sun Aug 10 18:46:06 1997
-*************** OBJS = toplev.o version.o tree.o print-t
-*** 519,523 ****
-   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 $(out_object_file) getpwd.o convert.o $(EXTRA_OBJS)
---- 519,523 ----
-   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 alias.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 $(out_object_file) getpwd.o convert.o $(EXTRA_OBJS)
-*************** LIB2FUNCS = _muldi3 _divdi3 _moddi3 _udi
-*** 570,574 ****
-      _fixxfdi _fixunsxfdi _floatdixf _fixunsxfsi \
-      _fixtfdi _fixunstfdi _floatditf \
-!     __gcc_bcmp _varargs _eprintf _op_new _op_vnew _new_handler _op_delete \
-      _op_vdel _bb _shtab _clear_cache _trampoline __main _exit _ctors _eh \
-      _pure
---- 570,575 ----
-      _fixxfdi _fixunsxfdi _floatdixf _fixunsxfsi \
-      _fixtfdi _fixunstfdi _floatditf \
-!     __gcc_bcmp _varargs __dummy _eprintf \
-!     _op_new _op_vnew _new_handler _op_delete \
-      _op_vdel _bb _shtab _clear_cache _trampoline __main _exit _ctors _eh \
-      _pure
-*************** expr.o : expr.c $(CONFIG_H) $(RTL_H) $(T
-*** 1179,1183 ****
-     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
---- 1180,1184 ----
-     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 hard-reg-set.h
-  calls.o : calls.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h expr.h insn-codes.h \
-     insn-flags.h
-*************** reorg.o : reorg.c $(CONFIG_H) $(RTL_H) c
-*** 1238,1241 ****
---- 1239,1243 ----
-     basic-block.h regs.h insn-config.h insn-attr.h insn-flags.h recog.h \
-     flags.h output.h
-+ alias.o : $(CONFIG_H) $(RTL_H) flags.h hard-reg-set.h regs.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
-diff -rcp2N gcc-2.7.2.2/alias.c g77-new/alias.c
-*** gcc-2.7.2.2/alias.c	Wed Dec 31 19:00:00 1969
---- g77-new/alias.c	Thu Jul 10 20:08:43 1997
-***************
-*** 0 ****
---- 1,996 ----
-+ /* Alias analysis for GNU C, by John Carr (jfc@mit.edu).
-+    Derived in part from sched.c  */
-+ #include "config.h"
-+ #include "rtl.h"
-+ #include "expr.h"
-+ #include "regs.h"
-+ #include "hard-reg-set.h"
-+ #include "flags.h"
-+ 
-+ static rtx canon_rtx			PROTO((rtx));
-+ static int rtx_equal_for_memref_p	PROTO((rtx, rtx));
-+ static rtx find_symbolic_term		PROTO((rtx));
-+ static int memrefs_conflict_p		PROTO((int, rtx, int, rtx,
-+ 					       HOST_WIDE_INT));
-+ 
-+ /* Set up all info needed to perform alias analysis on memory references.  */
-+ 
-+ #define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
-+ 
-+ /* reg_base_value[N] gives an address to which register N is related.
-+    If all sets after the first add or subtract to the current value
-+    or otherwise modify it so it does not point to a different top level
-+    object, reg_base_value[N] is equal to the address part of the source
-+    of the first set.  The value will be a SYMBOL_REF, a LABEL_REF, or
-+    (address (reg)) to indicate that the address is derived from an
-+    argument or fixed register.  */
-+ rtx *reg_base_value;
-+ unsigned int reg_base_value_size;	/* size of reg_base_value array */
-+ #define REG_BASE_VALUE(X) \
-+ 	(REGNO (X) < reg_base_value_size ? reg_base_value[REGNO (X)] : 0)
-+ 
-+ /* Vector indexed by N giving the initial (unchanging) value known
-+    for pseudo-register N.  */
-+ rtx *reg_known_value;
-+ 
-+ /* Indicates number of valid entries in reg_known_value.  */
-+ static int reg_known_value_size;
-+ 
-+ /* Vector recording for each reg_known_value whether it is due to a
-+    REG_EQUIV note.  Future passes (viz., reload) may replace the
-+    pseudo with the equivalent expression and so we account for the
-+    dependences that would be introduced if that happens. */
-+ /* ??? This is a problem only on the Convex.  The REG_EQUIV notes created in
-+    assign_parms mention the arg pointer, and there are explicit insns in the
-+    RTL that modify the arg pointer.  Thus we must ensure that such insns don't
-+    get scheduled across each other because that would invalidate the REG_EQUIV
-+    notes.  One could argue that the REG_EQUIV notes are wrong, but solving
-+    the problem in the scheduler will likely give better code, so we do it
-+    here.  */
-+ char *reg_known_equiv_p;
-+ 
-+ /* Inside SRC, the source of a SET, find a base address.  */
-+ 
-+ /* When copying arguments into pseudo-registers, record the (ADDRESS)
-+    expression for the argument directly so that even if the argument
-+    register is changed later (e.g. for a function call) the original
-+    value is noted.  */
-+ static int copying_arguments;
-+ 
-+ static rtx
-+ find_base_value (src)
-+      register rtx src;
-+ {
-+   switch (GET_CODE (src))
-+     {
-+     case SYMBOL_REF:
-+     case LABEL_REF:
-+       return src;
-+ 
-+     case REG:
-+       if (copying_arguments && REGNO (src) < FIRST_PSEUDO_REGISTER)
-+ 	return reg_base_value[REGNO (src)];
-+       return src;
-+ 
-+     case MEM:
-+       /* Check for an argument passed in memory.  Only record in the
-+ 	 copying-arguments block; it is too hard to track changes
-+ 	 otherwise.  */
-+       if (copying_arguments
-+ 	  && (XEXP (src, 0) == arg_pointer_rtx
-+ 	      || (GET_CODE (XEXP (src, 0)) == PLUS
-+ 		  && XEXP (XEXP (src, 0), 0) == arg_pointer_rtx)))
-+ 	return gen_rtx (ADDRESS, VOIDmode, src);
-+       return 0;
-+ 
-+     case CONST:
-+       src = XEXP (src, 0);
-+       if (GET_CODE (src) != PLUS && GET_CODE (src) != MINUS)
-+ 	break;
-+       /* fall through */
-+     case PLUS:
-+     case MINUS:
-+       /* Guess which operand to set the register equivalent to.  */
-+       /* If the first operand is a symbol or the second operand is
-+ 	 an integer, the first operand is the base address.  */
-+       if (GET_CODE (XEXP (src, 0)) == SYMBOL_REF
-+ 	  || GET_CODE (XEXP (src, 0)) == LABEL_REF
-+ 	  || GET_CODE (XEXP (src, 1)) == CONST_INT)
-+ 	return XEXP (src, 0);
-+       /* If an operand is a register marked as a pointer, it is the base.  */
-+       if (GET_CODE (XEXP (src, 0)) == REG
-+ 	  && REGNO_POINTER_FLAG (REGNO (XEXP (src, 0))))
-+ 	src = XEXP (src, 0);
-+       else if (GET_CODE (XEXP (src, 1)) == REG
-+ 	  && REGNO_POINTER_FLAG (REGNO (XEXP (src, 1))))
-+ 	src = XEXP (src, 1);
-+       else
-+ 	return 0;
-+       if (copying_arguments && REGNO (src) < FIRST_PSEUDO_REGISTER)
-+ 	return reg_base_value[REGNO (src)];
-+       return src;
-+ 
-+     case AND:
-+       /* If the second operand is constant set the base
-+ 	 address to the first operand. */
-+       if (GET_CODE (XEXP (src, 1)) == CONST_INT
-+ 	  && GET_CODE (XEXP (src, 0)) == REG)
-+ 	{
-+ 	  src = XEXP (src, 0);
-+ 	  if (copying_arguments && REGNO (src) < FIRST_PSEUDO_REGISTER)
-+ 	    return reg_base_value[REGNO (src)];
-+ 	  return src;
-+ 	}
-+       return 0;
-+ 
-+     case HIGH:
-+       return XEXP (src, 0);
-+     }
-+ 
-+   return 0;
-+ }
-+ 
-+ /* Called from init_alias_analysis indirectly through note_stores.  */
-+ 
-+ /* while scanning insns to find base values, reg_seen[N] is nonzero if
-+    register N has been set in this function.  */
-+ static char *reg_seen;
-+ 
-+ static
-+ void record_set (dest, set)
-+      rtx dest, set;
-+ {
-+   register int regno;
-+   rtx src;
-+ 
-+   if (GET_CODE (dest) != REG)
-+     return;
-+ 
-+   regno = REGNO (dest);
-+ 
-+   if (set)
-+     {
-+       /* A CLOBBER wipes out any old value but does not prevent a previously
-+ 	 unset register from acquiring a base address (i.e. reg_seen is not
-+ 	 set).  */
-+       if (GET_CODE (set) == CLOBBER)
-+ 	{
-+ 	  reg_base_value[regno] = 0;
-+ 	  return;
-+ 	}
-+       src = SET_SRC (set);
-+     }
-+   else
-+     {
-+       static int unique_id;
-+       if (reg_seen[regno])
-+ 	{
-+ 	  reg_base_value[regno] = 0;
-+ 	  return;
-+ 	}
-+       reg_seen[regno] = 1;
-+       reg_base_value[regno] = gen_rtx (ADDRESS, Pmode,
-+ 				       GEN_INT (unique_id++));
-+       return;
-+     }
-+ 
-+   /* This is not the first set.  If the new value is not related to the
-+      old value, forget the base value. Note that the following code is
-+      not detected:
-+      extern int x, y;  int *p = &x; p += (&y-&x);
-+      ANSI C does not allow computing the difference of addresses
-+      of distinct top level objects.  */
-+   if (reg_base_value[regno])
-+     switch (GET_CODE (src))
-+       {
-+       case PLUS:
-+       case MINUS:
-+ 	if (XEXP (src, 0) != dest && XEXP (src, 1) != dest)
-+ 	  reg_base_value[regno] = 0;
-+ 	break;
-+       case AND:
-+ 	if (XEXP (src, 0) != dest || GET_CODE (XEXP (src, 1)) != CONST_INT)
-+ 	  reg_base_value[regno] = 0;
-+ 	break;
-+       case LO_SUM:
-+ 	if (XEXP (src, 0) != dest)
-+ 	  reg_base_value[regno] = 0;
-+ 	break;
-+       default:
-+ 	reg_base_value[regno] = 0;
-+ 	break;
-+       }
-+   /* If this is the first set of a register, record the value.  */
-+   else if ((regno >= FIRST_PSEUDO_REGISTER || ! fixed_regs[regno])
-+ 	   && ! reg_seen[regno] && reg_base_value[regno] == 0)
-+     reg_base_value[regno] = find_base_value (src);
-+ 
-+   reg_seen[regno] = 1;
-+ }
-+ 
-+ /* Called from loop optimization when a new pseudo-register is created.  */
-+ void
-+ record_base_value (regno, val)
-+      int regno;
-+      rtx val;
-+ {
-+   if (!flag_alias_check || regno >= reg_base_value_size)
-+     return;
-+   if (GET_CODE (val) == REG)
-+     {
-+       if (REGNO (val) < reg_base_value_size)
-+ 	reg_base_value[regno] = reg_base_value[REGNO (val)];
-+       return;
-+     }
-+   reg_base_value[regno] = find_base_value (val);
-+ }
-+ 
-+ static rtx
-+ canon_rtx (x)
-+      rtx x;
-+ {
-+   /* Recursively look for equivalences.  */
-+   if (GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER
-+       && REGNO (x) < reg_known_value_size)
-+     return reg_known_value[REGNO (x)] == x
-+       ? x : canon_rtx (reg_known_value[REGNO (x)]);
-+   else if (GET_CODE (x) == PLUS)
-+     {
-+       rtx x0 = canon_rtx (XEXP (x, 0));
-+       rtx x1 = canon_rtx (XEXP (x, 1));
-+ 
-+       if (x0 != XEXP (x, 0) || x1 != XEXP (x, 1))
-+ 	{
-+ 	  /* We can tolerate LO_SUMs being offset here; these
-+ 	     rtl are used for nothing other than comparisons.  */
-+ 	  if (GET_CODE (x0) == CONST_INT)
-+ 	    return plus_constant_for_output (x1, INTVAL (x0));
-+ 	  else if (GET_CODE (x1) == CONST_INT)
-+ 	    return plus_constant_for_output (x0, INTVAL (x1));
-+ 	  return gen_rtx (PLUS, GET_MODE (x), x0, x1);
-+ 	}
-+     }
-+   /* This gives us much better alias analysis when called from
-+      the loop optimizer.   Note we want to leave the original
-+      MEM alone, but need to return the canonicalized MEM with
-+      all the flags with their original values.  */
-+   else if (GET_CODE (x) == MEM)
-+     {
-+       rtx addr = canon_rtx (XEXP (x, 0));
-+       if (addr != XEXP (x, 0))
-+ 	{
-+ 	  rtx new = gen_rtx (MEM, GET_MODE (x), addr);
-+ 	  MEM_VOLATILE_P (new) = MEM_VOLATILE_P (x);
-+ 	  RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x);
-+ 	  MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (x);
-+ 	  x = new;
-+ 	}
-+     }
-+   return x;
-+ }
-+ 
-+ /* Return 1 if X and Y are identical-looking rtx's.
-+ 
-+    We use the data in reg_known_value above to see if two registers with
-+    different numbers are, in fact, equivalent.  */
-+ 
-+ static int
-+ rtx_equal_for_memref_p (x, y)
-+      rtx x, y;
-+ {
-+   register int i;
-+   register int j;
-+   register enum rtx_code code;
-+   register char *fmt;
-+ 
-+   if (x == 0 && y == 0)
-+     return 1;
-+   if (x == 0 || y == 0)
-+     return 0;
-+   x = canon_rtx (x);
-+   y = canon_rtx (y);
-+ 
-+   if (x == y)
-+     return 1;
-+ 
-+   code = GET_CODE (x);
-+   /* Rtx's of different codes cannot be equal.  */
-+   if (code != GET_CODE (y))
-+     return 0;
-+ 
-+   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
-+      (REG:SI x) and (REG:HI x) are NOT equivalent.  */
-+ 
-+   if (GET_MODE (x) != GET_MODE (y))
-+     return 0;
-+ 
-+   /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively.  */
-+ 
-+   if (code == REG)
-+     return REGNO (x) == REGNO (y);
-+   if (code == LABEL_REF)
-+     return XEXP (x, 0) == XEXP (y, 0);
-+   if (code == SYMBOL_REF)
-+     return XSTR (x, 0) == XSTR (y, 0);
-+ 
-+   /* For commutative operations, the RTX match if the operand match in any
-+      order.  Also handle the simple binary and unary cases without a loop.  */
-+   if (code == EQ || code == NE || GET_RTX_CLASS (code) == 'c')
-+     return ((rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
-+ 	     && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)))
-+ 	    || (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 1))
-+ 		&& rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 0))));
-+   else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == '2')
-+     return (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
-+ 	    && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)));
-+   else if (GET_RTX_CLASS (code) == '1')
-+     return rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0));
-+ 
-+   /* Compare the elements.  If any pair of corresponding elements
-+      fail to match, return 0 for the whole things.  */
-+ 
-+   fmt = GET_RTX_FORMAT (code);
-+   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
-+     {
-+       switch (fmt[i])
-+ 	{
-+ 	case 'w':
-+ 	  if (XWINT (x, i) != XWINT (y, i))
-+ 	    return 0;
-+ 	  break;
-+ 
-+ 	case 'n':
-+ 	case 'i':
-+ 	  if (XINT (x, i) != XINT (y, i))
-+ 	    return 0;
-+ 	  break;
-+ 
-+ 	case 'V':
-+ 	case 'E':
-+ 	  /* Two vectors must have the same length.  */
-+ 	  if (XVECLEN (x, i) != XVECLEN (y, i))
-+ 	    return 0;
-+ 
-+ 	  /* And the corresponding elements must match.  */
-+ 	  for (j = 0; j < XVECLEN (x, i); j++)
-+ 	    if (rtx_equal_for_memref_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
-+ 	      return 0;
-+ 	  break;
-+ 
-+ 	case 'e':
-+ 	  if (rtx_equal_for_memref_p (XEXP (x, i), XEXP (y, i)) == 0)
-+ 	    return 0;
-+ 	  break;
-+ 
-+ 	case 'S':
-+ 	case 's':
-+ 	  if (strcmp (XSTR (x, i), XSTR (y, i)))
-+ 	    return 0;
-+ 	  break;
-+ 
-+ 	case 'u':
-+ 	  /* These are just backpointers, so they don't matter.  */
-+ 	  break;
-+ 
-+ 	case '0':
-+ 	  break;
-+ 
-+ 	  /* It is believed that rtx's at this level will never
-+ 	     contain anything but integers and other rtx's,
-+ 	     except for within LABEL_REFs and SYMBOL_REFs.  */
-+ 	default:
-+ 	  abort ();
-+ 	}
-+     }
-+   return 1;
-+ }
-+ 
-+ /* Given an rtx X, find a SYMBOL_REF or LABEL_REF within
-+    X and return it, or return 0 if none found.  */
-+ 
-+ static rtx
-+ find_symbolic_term (x)
-+      rtx x;
-+ {
-+   register int i;
-+   register enum rtx_code code;
-+   register char *fmt;
-+ 
-+   code = GET_CODE (x);
-+   if (code == SYMBOL_REF || code == LABEL_REF)
-+     return x;
-+   if (GET_RTX_CLASS (code) == 'o')
-+     return 0;
-+ 
-+   fmt = GET_RTX_FORMAT (code);
-+   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
-+     {
-+       rtx t;
-+ 
-+       if (fmt[i] == 'e')
-+ 	{
-+ 	  t = find_symbolic_term (XEXP (x, i));
-+ 	  if (t != 0)
-+ 	    return t;
-+ 	}
-+       else if (fmt[i] == 'E')
-+ 	break;
-+     }
-+   return 0;
-+ }
-+ 
-+ static rtx
-+ find_base_term (x)
-+      register rtx x;
-+ {
-+   switch (GET_CODE (x))
-+     {
-+     case REG:
-+       return REG_BASE_VALUE (x);
-+ 
-+     case HIGH:
-+       return find_base_term (XEXP (x, 0));
-+ 
-+     case CONST:
-+       x = XEXP (x, 0);
-+       if (GET_CODE (x) != PLUS && GET_CODE (x) != MINUS)
-+ 	return 0;
-+       /* fall through */
-+     case LO_SUM:
-+     case PLUS:
-+     case MINUS:
-+       {
-+ 	rtx tmp = find_base_term (XEXP (x, 0));
-+ 	if (tmp)
-+ 	  return tmp;
-+ 	return find_base_term (XEXP (x, 1));
-+       }
-+ 
-+     case AND:
-+       if (GET_CODE (XEXP (x, 0)) == REG && GET_CODE (XEXP (x, 1)) == CONST_INT)
-+ 	return REG_BASE_VALUE (XEXP (x, 0));
-+       return 0;
-+ 
-+     case SYMBOL_REF:
-+     case LABEL_REF:
-+       return x;
-+ 
-+     default:
-+       return 0;
-+     }
-+ }
-+ 
-+ /* Return 0 if the addresses X and Y are known to point to different
-+    objects, 1 if they might be pointers to the same object.  */
-+ 
-+ static int
-+ base_alias_check (x, y)
-+      rtx x, y;
-+ {
-+   rtx x_base = find_base_term (x);
-+   rtx y_base = find_base_term (y);
-+ 
-+   /* If either base address is unknown or the base addresses are equal,
-+      nothing is known about aliasing.  */
-+ 
-+   if (x_base == 0 || y_base == 0 || rtx_equal_p (x_base, y_base))
-+     return 1;
-+ 
-+   /* The base addresses of the read and write are different
-+      expressions.  If they are both symbols there is no
-+      conflict.  */
-+   if (GET_CODE (x_base) != ADDRESS && GET_CODE (y_base) != ADDRESS)
-+     return 0;
-+ 
-+   /* If one address is a stack reference there can be no alias:
-+      stack references using different base registers do not alias,
-+      a stack reference can not alias a parameter, and a stack reference
-+      can not alias a global.  */
-+   if ((GET_CODE (x_base) == ADDRESS && GET_MODE (x_base) == Pmode)
-+       || (GET_CODE (y_base) == ADDRESS && GET_MODE (y_base) == Pmode))
-+     return 0;
-+ 
-+   if (! flag_argument_noalias)
-+     return 1;
-+ 
-+   if (flag_argument_noalias > 1)
-+     return 0;
-+ 
-+   /* Weak noalias assertion (arguments are distinct, but may match globals). */
-+   return ! (GET_MODE (x_base) == VOIDmode && GET_MODE (y_base) == VOIDmode);
-+ }
-+ 
-+ /* Return nonzero if X and Y (memory addresses) could reference the
-+    same location in memory.  C is an offset accumulator.  When
-+    C is nonzero, we are testing aliases between X and Y + C.
-+    XSIZE is the size in bytes of the X reference,
-+    similarly YSIZE is the size in bytes for Y.
-+ 
-+    If XSIZE or YSIZE is zero, we do not know the amount of memory being
-+    referenced (the reference was BLKmode), so make the most pessimistic
-+    assumptions.
-+ 
-+    We recognize the following cases of non-conflicting memory:
-+ 
-+ 	(1) addresses involving the frame pointer cannot conflict
-+ 	    with addresses involving static variables.
-+ 	(2) static variables with different addresses cannot conflict.
-+ 
-+    Nice to notice that varying addresses cannot conflict with fp if no
-+    local variables had their addresses taken, but that's too hard now.  */
-+ 
-+ 
-+ static int
-+ memrefs_conflict_p (xsize, x, ysize, y, c)
-+      register rtx x, y;
-+      int xsize, ysize;
-+      HOST_WIDE_INT c;
-+ {
-+   if (GET_CODE (x) == HIGH)
-+     x = XEXP (x, 0);
-+   else if (GET_CODE (x) == LO_SUM)
-+     x = XEXP (x, 1);
-+   else
-+     x = canon_rtx (x);
-+   if (GET_CODE (y) == HIGH)
-+     y = XEXP (y, 0);
-+   else if (GET_CODE (y) == LO_SUM)
-+     y = XEXP (y, 1);
-+   else
-+     y = canon_rtx (y);
-+ 
-+   if (rtx_equal_for_memref_p (x, y))
-+     {
-+       if (xsize == 0 || ysize == 0)
-+ 	return 1;
-+       if (c >= 0 && xsize > c)
-+ 	return 1;
-+       if (c < 0 && ysize+c > 0)
-+ 	return 1;
-+       return 0;
-+     }
-+ 
-+   if (y == frame_pointer_rtx || y == hard_frame_pointer_rtx
-+       || y == stack_pointer_rtx)
-+     {
-+       rtx t = y;
-+       int tsize = ysize;
-+       y = x; ysize = xsize;
-+       x = t; xsize = tsize;
-+     }
-+ 
-+   if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
-+       || x == stack_pointer_rtx)
-+     {
-+       rtx y1;
-+ 
-+       if (CONSTANT_P (y))
-+ 	return 0;
-+ 
-+       if (GET_CODE (y) == PLUS
-+ 	  && canon_rtx (XEXP (y, 0)) == x
-+ 	  && (y1 = canon_rtx (XEXP (y, 1)))
-+ 	  && GET_CODE (y1) == CONST_INT)
-+ 	{
-+ 	  c += INTVAL (y1);
-+ 	  return (xsize == 0 || ysize == 0
-+ 		  || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
-+ 	}
-+ 
-+       if (GET_CODE (y) == PLUS
-+ 	  && (y1 = canon_rtx (XEXP (y, 0)))
-+ 	  && CONSTANT_P (y1))
-+ 	return 0;
-+ 
-+       return 1;
-+     }
-+ 
-+   if (GET_CODE (x) == PLUS)
-+     {
-+       /* The fact that X is canonicalized means that this
-+ 	 PLUS rtx is canonicalized.  */
-+       rtx x0 = XEXP (x, 0);
-+       rtx x1 = XEXP (x, 1);
-+ 
-+       if (GET_CODE (y) == PLUS)
-+ 	{
-+ 	  /* The fact that Y is canonicalized means that this
-+ 	     PLUS rtx is canonicalized.  */
-+ 	  rtx y0 = XEXP (y, 0);
-+ 	  rtx y1 = XEXP (y, 1);
-+ 
-+ 	  if (rtx_equal_for_memref_p (x1, y1))
-+ 	    return memrefs_conflict_p (xsize, x0, ysize, y0, c);
-+ 	  if (rtx_equal_for_memref_p (x0, y0))
-+ 	    return memrefs_conflict_p (xsize, x1, ysize, y1, c);
-+ 	  if (GET_CODE (x1) == CONST_INT)
-+ 	    if (GET_CODE (y1) == CONST_INT)
-+ 	      return memrefs_conflict_p (xsize, x0, ysize, y0,
-+ 					 c - INTVAL (x1) + INTVAL (y1));
-+ 	    else
-+ 	      return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
-+ 	  else if (GET_CODE (y1) == CONST_INT)
-+ 	    return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
-+ 
-+ 	  /* Handle case where we cannot understand iteration operators,
-+ 	     but we notice that the base addresses are distinct objects.  */
-+ 	  /* ??? Is this still necessary? */
-+ 	  x = find_symbolic_term (x);
-+ 	  if (x == 0)
-+ 	    return 1;
-+ 	  y = find_symbolic_term (y);
-+ 	  if (y == 0)
-+ 	    return 1;
-+ 	  return rtx_equal_for_memref_p (x, y);
-+ 	}
-+       else if (GET_CODE (x1) == CONST_INT)
-+ 	return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
-+     }
-+   else if (GET_CODE (y) == PLUS)
-+     {
-+       /* The fact that Y is canonicalized means that this
-+ 	 PLUS rtx is canonicalized.  */
-+       rtx y0 = XEXP (y, 0);
-+       rtx y1 = XEXP (y, 1);
-+ 
-+       if (GET_CODE (y1) == CONST_INT)
-+ 	return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
-+       else
-+ 	return 1;
-+     }
-+ 
-+   if (GET_CODE (x) == GET_CODE (y))
-+     switch (GET_CODE (x))
-+       {
-+       case MULT:
-+ 	{
-+ 	  /* Handle cases where we expect the second operands to be the
-+ 	     same, and check only whether the first operand would conflict
-+ 	     or not.  */
-+ 	  rtx x0, y0;
-+ 	  rtx x1 = canon_rtx (XEXP (x, 1));
-+ 	  rtx y1 = canon_rtx (XEXP (y, 1));
-+ 	  if (! rtx_equal_for_memref_p (x1, y1))
-+ 	    return 1;
-+ 	  x0 = canon_rtx (XEXP (x, 0));
-+ 	  y0 = canon_rtx (XEXP (y, 0));
-+ 	  if (rtx_equal_for_memref_p (x0, y0))
-+ 	    return (xsize == 0 || ysize == 0
-+ 		    || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
-+ 
-+ 	  /* Can't properly adjust our sizes.  */
-+ 	  if (GET_CODE (x1) != CONST_INT)
-+ 	    return 1;
-+ 	  xsize /= INTVAL (x1);
-+ 	  ysize /= INTVAL (x1);
-+ 	  c /= INTVAL (x1);
-+ 	  return memrefs_conflict_p (xsize, x0, ysize, y0, c);
-+ 	}
-+       }
-+ 
-+   /* Treat an access through an AND (e.g. a subword access on an Alpha)
-+      as an access with indeterminate size.  */
-+   if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT)
-+     return memrefs_conflict_p (0, XEXP (x, 0), ysize, y, c);
-+   if (GET_CODE (y) == AND && GET_CODE (XEXP (y, 1)) == CONST_INT)
-+     return memrefs_conflict_p (xsize, x, 0, XEXP (y, 0), c);
-+ 
-+   if (CONSTANT_P (x))
-+     {
-+       if (GET_CODE (x) == CONST_INT && GET_CODE (y) == CONST_INT)
-+ 	{
-+ 	  c += (INTVAL (y) - INTVAL (x));
-+ 	  return (xsize == 0 || ysize == 0
-+ 		  || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
-+ 	}
-+ 
-+       if (GET_CODE (x) == CONST)
-+ 	{
-+ 	  if (GET_CODE (y) == CONST)
-+ 	    return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
-+ 				       ysize, canon_rtx (XEXP (y, 0)), c);
-+ 	  else
-+ 	    return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
-+ 				       ysize, y, c);
-+ 	}
-+       if (GET_CODE (y) == CONST)
-+ 	return memrefs_conflict_p (xsize, x, ysize,
-+ 				   canon_rtx (XEXP (y, 0)), c);
-+ 
-+       if (CONSTANT_P (y))
-+ 	return (rtx_equal_for_memref_p (x, y)
-+ 		&& (xsize == 0 || ysize == 0
-+ 		    || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)));
-+ 
-+       return 1;
-+     }
-+   return 1;
-+ }
-+ 
-+ /* Functions to compute memory dependencies.
-+ 
-+    Since we process the insns in execution order, we can build tables
-+    to keep track of what registers are fixed (and not aliased), what registers
-+    are varying in known ways, and what registers are varying in unknown
-+    ways.
-+ 
-+    If both memory references are volatile, then there must always be a
-+    dependence between the two references, since their order can not be
-+    changed.  A volatile and non-volatile reference can be interchanged
-+    though. 
-+ 
-+    A MEM_IN_STRUCT reference at a non-QImode varying address can never
-+    conflict with a non-MEM_IN_STRUCT reference at a fixed address.   We must
-+    allow QImode aliasing because the ANSI C standard allows character
-+    pointers to alias anything.  We are assuming that characters are
-+    always QImode here.  */
-+ 
-+ /* Read dependence: X is read after read in MEM takes place.  There can
-+    only be a dependence here if both reads are volatile.  */
-+ 
-+ int
-+ read_dependence (mem, x)
-+      rtx mem;
-+      rtx x;
-+ {
-+   return MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem);
-+ }
-+ 
-+ /* True dependence: X is read after store in MEM takes place.  */
-+ 
-+ int
-+ true_dependence (mem, mem_mode, x, varies)
-+      rtx mem;
-+      enum machine_mode mem_mode;
-+      rtx x;
-+      int (*varies)();
-+ {
-+   rtx x_addr, mem_addr;
-+ 
-+   if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
-+     return 1;
-+ 
-+   x_addr = XEXP (x, 0);
-+   mem_addr = XEXP (mem, 0);
-+ 
-+   if (flag_alias_check && ! base_alias_check (x_addr, mem_addr))
-+     return 0;
-+ 
-+   /* If X is an unchanging read, then it can't possibly conflict with any
-+      non-unchanging store.  It may conflict with an unchanging write though,
-+      because there may be a single store to this address to initialize it.
-+      Just fall through to the code below to resolve the case where we have
-+      both an unchanging read and an unchanging write.  This won't handle all
-+      cases optimally, but the possible performance loss should be
-+      negligible.  */
-+   if (RTX_UNCHANGING_P (x) && ! RTX_UNCHANGING_P (mem))
-+     return 0;
-+ 
-+   x_addr = canon_rtx (x_addr);
-+   mem_addr = canon_rtx (mem_addr);
-+   if (mem_mode == VOIDmode)
-+     mem_mode = GET_MODE (mem);
-+ 
-+   if (! memrefs_conflict_p (mem_mode, mem_addr, SIZE_FOR_MODE (x), x_addr, 0))
-+     return 0;
-+ 
-+   /* If both references are struct references, or both are not, nothing
-+      is known about aliasing.
-+ 
-+      If either reference is QImode or BLKmode, ANSI C permits aliasing.
-+ 
-+      If both addresses are constant, or both are not, nothing is known
-+      about aliasing.  */
-+   if (MEM_IN_STRUCT_P (x) == MEM_IN_STRUCT_P (mem)
-+       || mem_mode == QImode || mem_mode == BLKmode
-+       || GET_MODE (x) == QImode || GET_MODE (mem) == BLKmode
-+       || varies (x_addr) == varies (mem_addr))
-+     return 1;
-+ 
-+   /* One memory reference is to a constant address, one is not.
-+      One is to a structure, the other is not.
-+ 
-+      If either memory reference is a variable structure the other is a
-+      fixed scalar and there is no aliasing.  */
-+   if ((MEM_IN_STRUCT_P (mem) && varies (mem_addr))
-+       || (MEM_IN_STRUCT_P (x) && varies (x)))
-+     return 0;
-+ 
-+   return 1;
-+ }
-+ 
-+ /* Anti dependence: X is written after read in MEM takes place.  */
-+ 
-+ int
-+ anti_dependence (mem, x)
-+      rtx mem;
-+      rtx x;
-+ {
-+   if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
-+     return 1;
-+ 
-+   if (flag_alias_check && ! base_alias_check (XEXP (x, 0), XEXP (mem, 0)))
-+     return 0;
-+ 
-+   /* If MEM is an unchanging read, then it can't possibly conflict with
-+      the store to X, because there is at most one store to MEM, and it must
-+      have occurred somewhere before MEM.  */
-+   x = canon_rtx (x);
-+   mem = canon_rtx (mem);
-+   if (RTX_UNCHANGING_P (mem))
-+     return 0;
-+ 
-+   return (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
-+ 			      SIZE_FOR_MODE (x), XEXP (x, 0), 0)
-+ 	  && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
-+ 		&& GET_MODE (mem) != QImode
-+ 		&& ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
-+ 	  && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
-+ 		&& GET_MODE (x) != QImode
-+ 		&& ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)));
-+ }
-+ 
-+ /* Output dependence: X is written after store in MEM takes place.  */
-+ 
-+ int
-+ output_dependence (mem, x)
-+      register rtx mem;
-+      register rtx x;
-+ {
-+   if (MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
-+     return 1;
-+ 
-+   if (flag_alias_check && !base_alias_check (XEXP (x, 0), XEXP (mem, 0)))
-+     return 0;
-+ 
-+   x = canon_rtx (x);
-+   mem = canon_rtx (mem);
-+   return (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
-+ 			      SIZE_FOR_MODE (x), XEXP (x, 0), 0)
-+ 	  && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
-+ 		&& GET_MODE (mem) != QImode
-+ 		&& ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
-+ 	  && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
-+ 		&& GET_MODE (x) != QImode
-+ 		&& ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem)));
-+ }
-+ 
-+ void
-+ init_alias_analysis ()
-+ {
-+   int maxreg = max_reg_num ();
-+   int changed;
-+   register int i;
-+   register rtx insn;
-+   rtx note;
-+   rtx set;
-+ 
-+   reg_known_value_size = maxreg;
-+ 
-+   reg_known_value
-+     = (rtx *) oballoc ((maxreg - FIRST_PSEUDO_REGISTER) * sizeof (rtx))
-+     - FIRST_PSEUDO_REGISTER;
-+   reg_known_equiv_p =
-+     oballoc (maxreg - FIRST_PSEUDO_REGISTER) - FIRST_PSEUDO_REGISTER;
-+   bzero ((char *) (reg_known_value + FIRST_PSEUDO_REGISTER),
-+ 	 (maxreg-FIRST_PSEUDO_REGISTER) * sizeof (rtx));
-+   bzero (reg_known_equiv_p + FIRST_PSEUDO_REGISTER,
-+ 	 (maxreg - FIRST_PSEUDO_REGISTER) * sizeof (char));
-+ 
-+   if (flag_alias_check)
-+     {
-+       /* Overallocate reg_base_value to allow some growth during loop
-+ 	 optimization.  Loop unrolling can create a large number of
-+ 	 registers.  */
-+       reg_base_value_size = maxreg * 2;
-+       reg_base_value = (rtx *)oballoc (reg_base_value_size * sizeof (rtx));
-+       reg_seen = (char *)alloca (reg_base_value_size);
-+       bzero (reg_base_value, reg_base_value_size * sizeof (rtx));
-+       bzero (reg_seen, reg_base_value_size);
-+ 
-+       /* Mark all hard registers which may contain an address.
-+ 	 The stack, frame and argument pointers may contain an address.
-+ 	 An argument register which can hold a Pmode value may contain
-+ 	 an address even if it is not in BASE_REGS.
-+ 
-+ 	 The address expression is VOIDmode for an argument and
-+ 	 Pmode for other registers.  */
-+ #ifndef OUTGOING_REGNO
-+ #define OUTGOING_REGNO(N) N
-+ #endif
-+       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-+ 	/* Check whether this register can hold an incoming pointer
-+ 	   argument.  FUNCTION_ARG_REGNO_P tests outgoing register
-+ 	   numbers, so translate if necessary due to register windows. */
-+ 	if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (i)) && HARD_REGNO_MODE_OK (i, Pmode))
-+ 	  reg_base_value[i] = gen_rtx (ADDRESS, VOIDmode,
-+ 				       gen_rtx (REG, Pmode, i));
-+ 
-+       reg_base_value[STACK_POINTER_REGNUM]
-+ 	= gen_rtx (ADDRESS, Pmode, stack_pointer_rtx);
-+       reg_base_value[ARG_POINTER_REGNUM]
-+ 	= gen_rtx (ADDRESS, Pmode, arg_pointer_rtx);
-+       reg_base_value[FRAME_POINTER_REGNUM]
-+ 	= gen_rtx (ADDRESS, Pmode, frame_pointer_rtx);
-+       reg_base_value[HARD_FRAME_POINTER_REGNUM]
-+ 	= gen_rtx (ADDRESS, Pmode, hard_frame_pointer_rtx);
-+     }
-+ 
-+   copying_arguments = 1;
-+   /* Fill in the entries with known constant values.  */
-+   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
-+     {
-+       if (flag_alias_check && GET_RTX_CLASS (GET_CODE (insn)) == 'i')
-+ 	{
-+ 	  /* If this insn has a noalias note, process it,  Otherwise,
-+ 	     scan for sets.  A simple set will have no side effects
-+ 	     which could change the base value of any other register. */
-+ 	  rtx noalias_note;
-+ 	  if (GET_CODE (PATTERN (insn)) == SET
-+ 	      && (noalias_note = find_reg_note (insn, REG_NOALIAS, NULL_RTX)))
-+ 	      record_set (SET_DEST (PATTERN (insn)), 0);
-+ 	  else
-+ 	    note_stores (PATTERN (insn), record_set);
-+ 	}
-+       else if (GET_CODE (insn) == NOTE
-+ 	       && NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_BEG)
-+ 	copying_arguments = 0;
-+ 
-+       if ((set = single_set (insn)) != 0
-+ 	  && GET_CODE (SET_DEST (set)) == REG
-+ 	  && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
-+ 	  && (((note = find_reg_note (insn, REG_EQUAL, 0)) != 0
-+ 	       && reg_n_sets[REGNO (SET_DEST (set))] == 1)
-+ 	      || (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != 0)
-+ 	  && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
-+ 	{
-+ 	  int regno = REGNO (SET_DEST (set));
-+ 	  reg_known_value[regno] = XEXP (note, 0);
-+ 	  reg_known_equiv_p[regno] = REG_NOTE_KIND (note) == REG_EQUIV;
-+ 	}
-+     }
-+ 
-+   /* Fill in the remaining entries.  */
-+   for (i = FIRST_PSEUDO_REGISTER; i < maxreg; i++)
-+     if (reg_known_value[i] == 0)
-+       reg_known_value[i] = regno_reg_rtx[i];
-+ 
-+   if (! flag_alias_check)
-+     return;
-+ 
-+   /* Simplify the reg_base_value array so that no register refers to
-+      another register, except to special registers indirectly through
-+      ADDRESS expressions.
-+ 
-+      In theory this loop can take as long as O(registers^2), but unless
-+      there are very long dependency chains it will run in close to linear
-+      time.  */
-+   do
-+     {
-+       changed = 0;
-+       for (i = FIRST_PSEUDO_REGISTER; i < reg_base_value_size; i++)
-+ 	{
-+ 	  rtx base = reg_base_value[i];
-+ 	  if (base && GET_CODE (base) == REG)
-+ 	    {
-+ 	      int base_regno = REGNO (base);
-+ 	      if (base_regno == i)		/* register set from itself */
-+ 		reg_base_value[i] = 0;
-+ 	      else
-+ 		reg_base_value[i] = reg_base_value[base_regno];
-+ 	      changed = 1;
-+ 	    }
-+ 	}
-+     }
-+   while (changed);
-+ 
-+   reg_seen = 0;
-+ }
-+ 
-+ void
-+ end_alias_analysis ()
-+ {
-+   reg_known_value = 0;
-+   reg_base_value = 0;
-+   reg_base_value_size = 0;
-+ }
-diff -rcp2N gcc-2.7.2.2/c-decl.c g77-new/c-decl.c
-*** gcc-2.7.2.2/c-decl.c	Fri Oct 27 05:44:43 1995
---- g77-new/c-decl.c	Sun Aug 10 18:46:24 1997
-*************** init_decl_processing ()
-*** 3207,3210 ****
---- 3207,3223 ----
-    builtin_function ("__builtin_cosl", ldouble_ftype_ldouble, 
-  		    BUILT_IN_COS, "cosl");
-+   builtin_function ("__builtin_setjmp",
-+ 		    build_function_type (integer_type_node,
-+ 					 tree_cons (NULL_TREE,
-+ 						    ptr_type_node, endlink)),
-+ 		    BUILT_IN_SETJMP, NULL_PTR);
-+   builtin_function ("__builtin_longjmp",
-+ 		    build_function_type
-+ 		    (void_type_node,
-+ 		     tree_cons (NULL, ptr_type_node,
-+ 				tree_cons (NULL_TREE,
-+ 					   integer_type_node,
-+ 					   endlink))),
-+ 		    BUILT_IN_LONGJMP, NULL_PTR);
-  
-    /* In an ANSI C program, it is okay to supply built-in meanings
-*************** grokdeclarator (declarator, declspecs, d
-*** 4049,4052 ****
---- 4062,4066 ----
-    int volatilep;
-    int inlinep;
-+   int restrictp;
-    int explicit_int = 0;
-    int explicit_char = 0;
-*************** grokdeclarator (declarator, declspecs, d
-*** 4342,4349 ****
---- 4356,4366 ----
-    volatilep = !! (specbits & 1 << (int) RID_VOLATILE) + TYPE_VOLATILE (type);
-    inlinep = !! (specbits & (1 << (int) RID_INLINE));
-+   restrictp = !! (specbits & (1 << (int) RID_RESTRICT));
-    if (constp > 1)
-      pedwarn ("duplicate `const'");
-    if (volatilep > 1)
-      pedwarn ("duplicate `volatile'");
-+   if (restrictp)
-+     error ("`restrict' used in non-parameter or non-pointer type declaration");
-    if (! flag_gen_aux_info && (TYPE_READONLY (type) || TYPE_VOLATILE (type)))
-      type = TYPE_MAIN_VARIANT (type);
-*************** grokdeclarator (declarator, declspecs, d
-*** 4693,4696 ****
---- 4710,4715 ----
-  		  else if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_VOLATILE])
-  		    volatilep++;
-+ 		  else if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_RESTRICT])
-+ 		    restrictp++;
-  		  else if (!erred)
-  		    {
-*************** grokdeclarator (declarator, declspecs, d
-*** 4703,4706 ****
---- 4722,4727 ----
-  	      if (volatilep > 1)
-  		pedwarn ("duplicate `volatile'");
-+ 	      if (restrictp > 1)
-+ 		pedwarn ("duplicate `restrict'");
-  	    }
-  
-*************** grokdeclarator (declarator, declspecs, d
-*** 4844,4847 ****
---- 4865,4875 ----
-  	  }
-  
-+ 	if (restrictp)
-+ 	  {
-+ 	    if (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE)
-+ 	      error ("`restrict' applied to non-pointer");
-+ 	    DECL_RESTRICT (decl) = 1;
-+ 	  }
-+ 
-  	DECL_ARG_TYPE_AS_WRITTEN (decl) = type_as_written;
-        }
-*************** start_struct (code, name)
-*** 5365,5368 ****
---- 5393,5397 ----
-    pushtag (name, ref);
-    C_TYPE_BEING_DEFINED (ref) = 1;
-+   TYPE_PACKED (ref) = flag_pack_struct;
-    return ref;
-  }
-*************** start_enum (name)
-*** 5806,5809 ****
---- 5835,5841 ----
-    enum_overflow = 0;
-  
-+   if (flag_short_enums)
-+     TYPE_PACKED (enumtype) = 1;
-+ 
-    return enumtype;
-  }
-*************** finish_enum (enumtype, values, attribute
-*** 5862,5867 ****
-    precision = MAX (lowprec, highprec);
-  
-!   if (flag_short_enums || TYPE_PACKED (enumtype)
-!       || precision > TYPE_PRECISION (integer_type_node))
-      /* Use the width of the narrowest normal C type which is wide enough.  */
-      TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size (precision, 1));
---- 5894,5898 ----
-    precision = MAX (lowprec, highprec);
-  
-!   if (TYPE_PACKED (enumtype) || precision > TYPE_PRECISION (integer_type_node))
-      /* Use the width of the narrowest normal C type which is wide enough.  */
-      TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size (precision, 1));
-diff -rcp2N gcc-2.7.2.2/c-gperf.h g77-new/c-gperf.h
-*** gcc-2.7.2.2/c-gperf.h	Fri Mar  4 14:15:53 1994
---- g77-new/c-gperf.h	Mon Aug 11 02:58:47 1997
-***************
-*** 1,15 ****
-  /* C code produced by gperf version 2.5 (GNU C++ version) */
-! /* Command-line: gperf -p -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,$ c-parse.gperf  */
-  struct resword { char *name; short token; enum rid rid; };
-  
-! #define TOTAL_KEYWORDS 79
-  #define MIN_WORD_LENGTH 2
-  #define MAX_WORD_LENGTH 20
-! #define MIN_HASH_VALUE 10
-! #define MAX_HASH_VALUE 144
-! /* maximum key range = 135, duplicates = 0 */
-  
-  #ifdef __GNUC__
-! __inline
-  #endif
-  static unsigned int
---- 1,16 ----
-  /* C code produced by gperf version 2.5 (GNU C++ version) */
-! /* Command-line: gperf -p -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,$ ../g77-new/c-parse.gperf  */
-! /* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf  */ 
-  struct resword { char *name; short token; enum rid rid; };
-  
-! #define TOTAL_KEYWORDS 81
-  #define MIN_WORD_LENGTH 2
-  #define MAX_WORD_LENGTH 20
-! #define MIN_HASH_VALUE 11
-! #define MAX_HASH_VALUE 157
-! /* maximum key range = 147, duplicates = 0 */
-  
-  #ifdef __GNUC__
-! inline
-  #endif
-  static unsigned int
-*************** hash (str, len)
-*** 20,36 ****
-    static unsigned char asso_values[] =
-      {
-!      145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
-!      145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
-!      145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
-!      145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
-!      145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
-!      145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
-!      145, 145, 145, 145,  25, 145, 145, 145, 145, 145,
-!      145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
-!      145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
-!      145, 145, 145, 145, 145,   1, 145,  46,   8,  15,
-!       61,   6,  36,  48,   3,   5, 145,  18,  63,  25,
-!       29,  76,   1, 145,  13,   2,   1,  51,  37,   9,
-!        9,   1,   3, 145, 145, 145, 145, 145,
-      };
-    register int hval = len;
---- 21,37 ----
-    static unsigned char asso_values[] =
-      {
-!      158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-!      158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-!      158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-!      158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-!      158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-!      158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-!      158, 158, 158, 158,   2, 158, 158, 158, 158, 158,
-!      158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-!      158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-!      158, 158, 158, 158, 158,   1, 158,  18,   1,  58,
-!       56,   6,  44,  64,  13,  45, 158,   4,  26,  68,
-!        2,  74,   1, 158,   2,  13,   1,  33,  48,   5,
-!        5,   3,  12, 158, 158, 158, 158, 158,
-      };
-    register int hval = len;
-*************** hash (str, len)
-*** 44,47 ****
---- 45,49 ----
-        case 1:
-          hval += asso_values[str[0]];
-+         break;
-      }
-    return hval + asso_values[str[len - 1]];
-*************** hash (str, len)
-*** 50,166 ****
-  static struct resword wordlist[] =
-  {
-!   {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
-!   {"",}, 
-!   {"int",  TYPESPEC, RID_INT},
-!   {"",}, {"",}, 
-!   {"__typeof__",  TYPEOF, NORID},
-!   {"__signed__",  TYPESPEC, RID_SIGNED},
-!   {"__imag__",  IMAGPART, NORID},
-!   {"switch",  SWITCH, NORID},
-!   {"__inline__",  SCSPEC, RID_INLINE},
-!   {"else",  ELSE, NORID},
-!   {"__iterator__",  SCSPEC, RID_ITERATOR},
-!   {"__inline",  SCSPEC, RID_INLINE},
-!   {"__extension__",  EXTENSION, NORID},
-!   {"struct",  STRUCT, NORID},
-!   {"__real__",  REALPART, NORID},
-!   {"__const",  TYPE_QUAL, RID_CONST},
-!   {"while",  WHILE, NORID},
-!   {"__const__",  TYPE_QUAL, RID_CONST},
-!   {"case",  CASE, NORID},
-!   {"__complex__",  TYPESPEC, RID_COMPLEX},
-!   {"__iterator",  SCSPEC, RID_ITERATOR},
-!   {"bycopy",  TYPE_QUAL, RID_BYCOPY},
-!   {"",}, {"",}, {"",}, 
-!   {"__complex",  TYPESPEC, RID_COMPLEX},
-!   {"",}, 
-!   {"in",  TYPE_QUAL, RID_IN},
-!   {"break",  BREAK, NORID},
-!   {"@defs",  DEFS, NORID},
-!   {"",}, {"",}, {"",}, 
-!   {"extern",  SCSPEC, RID_EXTERN},
-!   {"if",  IF, NORID},
-!   {"typeof",  TYPEOF, NORID},
-!   {"typedef",  SCSPEC, RID_TYPEDEF},
-!   {"__typeof",  TYPEOF, NORID},
-!   {"sizeof",  SIZEOF, NORID},
-!   {"",}, 
-!   {"return",  RETURN, NORID},
-!   {"const",  TYPE_QUAL, RID_CONST},
-!   {"__volatile__",  TYPE_QUAL, RID_VOLATILE},
-!   {"@private",  PRIVATE, NORID},
-!   {"@selector",  SELECTOR, NORID},
-!   {"__volatile",  TYPE_QUAL, RID_VOLATILE},
-!   {"__asm__",  ASM_KEYWORD, NORID},
-!   {"",}, {"",}, 
-!   {"continue",  CONTINUE, NORID},
-!   {"__alignof__",  ALIGNOF, NORID},
-!   {"__imag",  IMAGPART, NORID},
-!   {"__attribute__",  ATTRIBUTE, NORID},
-!   {"",}, {"",}, 
-!   {"__attribute",  ATTRIBUTE, NORID},
-!   {"for",  FOR, NORID},
-!   {"",}, 
-!   {"@encode",  ENCODE, NORID},
-!   {"id",  OBJECTNAME, RID_ID},
-!   {"static",  SCSPEC, RID_STATIC},
-!   {"@interface",  INTERFACE, NORID},
-!   {"",}, 
-!   {"__signed",  TYPESPEC, RID_SIGNED},
-!   {"",}, 
-!   {"__label__",  LABEL, NORID},
-!   {"",}, {"",}, 
-!   {"__asm",  ASM_KEYWORD, NORID},
-!   {"char",  TYPESPEC, RID_CHAR},
-!   {"",}, 
-!   {"inline",  SCSPEC, RID_INLINE},
-!   {"out",  TYPE_QUAL, RID_OUT},
-!   {"register",  SCSPEC, RID_REGISTER},
-!   {"__real",  REALPART, NORID},
-!   {"short",  TYPESPEC, RID_SHORT},
-!   {"",}, 
-!   {"enum",  ENUM, NORID},
-!   {"inout",  TYPE_QUAL, RID_INOUT},
-!   {"",}, 
-!   {"oneway",  TYPE_QUAL, RID_ONEWAY},
-!   {"union",  UNION, NORID},
-!   {"",}, 
-!   {"__alignof",  ALIGNOF, NORID},
-!   {"",}, 
-!   {"@implementation",  IMPLEMENTATION, NORID},
-!   {"",}, 
-!   {"@class",  CLASS, NORID},
-!   {"",}, 
-!   {"@public",  PUBLIC, NORID},
-!   {"asm",  ASM_KEYWORD, NORID},
-!   {"",}, {"",}, {"",}, {"",}, {"",}, 
-!   {"default",  DEFAULT, NORID},
-!   {"",}, 
-!   {"void",  TYPESPEC, RID_VOID},
-!   {"",}, 
-!   {"@protected",  PROTECTED, NORID},
-!   {"@protocol",  PROTOCOL, NORID},
-!   {"",}, {"",}, {"",}, 
-!   {"volatile",  TYPE_QUAL, RID_VOLATILE},
-!   {"",}, {"",}, 
-!   {"signed",  TYPESPEC, RID_SIGNED},
-!   {"float",  TYPESPEC, RID_FLOAT},
-!   {"@end",  END, NORID},
-!   {"",}, {"",}, 
-!   {"unsigned",  TYPESPEC, RID_UNSIGNED},
-!   {"@compatibility_alias",  ALIAS, NORID},
-!   {"double",  TYPESPEC, RID_DOUBLE},
-!   {"",}, {"",}, 
-!   {"auto",  SCSPEC, RID_AUTO},
-!   {"",}, 
-!   {"goto",  GOTO, NORID},
-!   {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
-!   {"do",  DO, NORID},
-!   {"",}, {"",}, {"",}, {"",}, 
-!   {"long",  TYPESPEC, RID_LONG},
-  };
-  
-  #ifdef __GNUC__
-! __inline
-  #endif
-  struct resword *
---- 52,167 ----
-  static struct resword wordlist[] =
-  {
-!       {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
-!       {"",}, {"",}, 
-!       {"return",  RETURN, NORID},
-!       {"__real__",  REALPART, NORID},
-!       {"__typeof__",  TYPEOF, NORID},
-!       {"__restrict",  TYPE_QUAL, RID_RESTRICT},
-!       {"extern",  SCSPEC, RID_EXTERN},
-!       {"break",  BREAK, NORID},
-!       {"@encode",  ENCODE, NORID},
-!       {"@private",  PRIVATE, NORID},
-!       {"@selector",  SELECTOR, NORID},
-!       {"@interface",  INTERFACE, NORID},
-!       {"__extension__",  EXTENSION, NORID},
-!       {"struct",  STRUCT, NORID},
-!       {"",}, 
-!       {"restrict",  TYPE_QUAL, RID_RESTRICT},
-!       {"__signed__",  TYPESPEC, RID_SIGNED},
-!       {"@defs",  DEFS, NORID},
-!       {"__asm__",  ASM_KEYWORD, NORID},
-!       {"",}, 
-!       {"else",  ELSE, NORID},
-!       {"",}, 
-!       {"__alignof__",  ALIGNOF, NORID},
-!       {"",}, 
-!       {"__attribute__",  ATTRIBUTE, NORID},
-!       {"",}, 
-!       {"__real",  REALPART, NORID},
-!       {"__attribute",  ATTRIBUTE, NORID},
-!       {"__label__",  LABEL, NORID},
-!       {"",}, 
-!       {"@protocol",  PROTOCOL, NORID},
-!       {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
-!       {"@class",  CLASS, NORID},
-!       {"",}, 
-!       {"in",  TYPE_QUAL, RID_IN},
-!       {"int",  TYPESPEC, RID_INT},
-!       {"for",  FOR, NORID},
-!       {"typeof",  TYPEOF, NORID},
-!       {"typedef",  SCSPEC, RID_TYPEDEF},
-!       {"__typeof",  TYPEOF, NORID},
-!       {"__imag__",  IMAGPART, NORID},
-!       {"",}, 
-!       {"__inline__",  SCSPEC, RID_INLINE},
-!       {"__iterator",  SCSPEC, RID_ITERATOR},
-!       {"__iterator__",  SCSPEC, RID_ITERATOR},
-!       {"__inline",  SCSPEC, RID_INLINE},
-!       {"while",  WHILE, NORID},
-!       {"__volatile__",  TYPE_QUAL, RID_VOLATILE},
-!       {"",}, 
-!       {"@end",  END, NORID},
-!       {"__volatile",  TYPE_QUAL, RID_VOLATILE},
-!       {"const",  TYPE_QUAL, RID_CONST},
-!       {"__const",  TYPE_QUAL, RID_CONST},
-!       {"bycopy",  TYPE_QUAL, RID_BYCOPY},
-!       {"__const__",  TYPE_QUAL, RID_CONST},
-!       {"@protected",  PROTECTED, NORID},
-!       {"__complex__",  TYPESPEC, RID_COMPLEX},
-!       {"__alignof",  ALIGNOF, NORID},
-!       {"__complex",  TYPESPEC, RID_COMPLEX},
-!       {"continue",  CONTINUE, NORID},
-!       {"sizeof",  SIZEOF, NORID},
-!       {"register",  SCSPEC, RID_REGISTER},
-!       {"switch",  SWITCH, NORID},
-!       {"__signed",  TYPESPEC, RID_SIGNED},
-!       {"out",  TYPE_QUAL, RID_OUT},
-!       {"",}, 
-!       {"case",  CASE, NORID},
-!       {"char",  TYPESPEC, RID_CHAR},
-!       {"inline",  SCSPEC, RID_INLINE},
-!       {"",}, 
-!       {"union",  UNION, NORID},
-!       {"",}, 
-!       {"@implementation",  IMPLEMENTATION, NORID},
-!       {"volatile",  TYPE_QUAL, RID_VOLATILE},
-!       {"oneway",  TYPE_QUAL, RID_ONEWAY},
-!       {"",}, 
-!       {"if",  IF, NORID},
-!       {"__asm",  ASM_KEYWORD, NORID},
-!       {"short",  TYPESPEC, RID_SHORT},
-!       {"",}, 
-!       {"static",  SCSPEC, RID_STATIC},
-!       {"long",  TYPESPEC, RID_LONG},
-!       {"auto",  SCSPEC, RID_AUTO},
-!       {"",}, {"",}, 
-!       {"@public",  PUBLIC, NORID},
-!       {"double",  TYPESPEC, RID_DOUBLE},
-!       {"",}, 
-!       {"id",  OBJECTNAME, RID_ID},
-!       {"",}, {"",}, {"",}, {"",}, 
-!       {"default",  DEFAULT, NORID},
-!       {"@compatibility_alias",  ALIAS, NORID},
-!       {"unsigned",  TYPESPEC, RID_UNSIGNED},
-!       {"enum",  ENUM, NORID},
-!       {"",}, {"",}, {"",}, {"",}, 
-!       {"__imag",  IMAGPART, NORID},
-!       {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
-!       {"float",  TYPESPEC, RID_FLOAT},
-!       {"inout",  TYPE_QUAL, RID_INOUT},
-!       {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
-!       {"do",  DO, NORID},
-!       {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
-!       {"signed",  TYPESPEC, RID_SIGNED},
-!       {"",}, {"",}, {"",}, 
-!       {"goto",  GOTO, NORID},
-!       {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, 
-!       {"void",  TYPESPEC, RID_VOID},
-!       {"",}, {"",}, {"",}, 
-!       {"asm",  ASM_KEYWORD, NORID},
-  };
-  
-  #ifdef __GNUC__
-! inline
-  #endif
-  struct resword *
-diff -rcp2N gcc-2.7.2.2/c-lex.c g77-new/c-lex.c
-*** gcc-2.7.2.2/c-lex.c	Thu Jun 15 07:11:39 1995
---- g77-new/c-lex.c	Sun Aug 10 18:46:49 1997
-*************** init_lex ()
-*** 173,176 ****
---- 173,177 ----
-    ridpointers[(int) RID_CONST] = get_identifier ("const");
-    ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile");
-+   ridpointers[(int) RID_RESTRICT] = get_identifier ("restrict");
-    ridpointers[(int) RID_AUTO] = get_identifier ("auto");
-    ridpointers[(int) RID_STATIC] = get_identifier ("static");
-*************** init_lex ()
-*** 206,209 ****
---- 207,211 ----
-        UNSET_RESERVED_WORD ("iterator");
-        UNSET_RESERVED_WORD ("complex");
-+       UNSET_RESERVED_WORD ("restrict");
-      }
-    if (flag_no_asm)
-*************** init_lex ()
-*** 214,217 ****
---- 216,220 ----
-        UNSET_RESERVED_WORD ("iterator");
-        UNSET_RESERVED_WORD ("complex");
-+       UNSET_RESERVED_WORD ("restrict");
-      }
-  }
-*************** yylex ()
-*** 1433,1437 ****
-  	    /* Create a node with determined type and value.  */
-  	    if (imag)
-! 	      yylval.ttype = build_complex (convert (type, integer_zero_node),
-  					    build_real (type, value));
-  	    else
---- 1436,1441 ----
-  	    /* Create a node with determined type and value.  */
-  	    if (imag)
-! 	      yylval.ttype = build_complex (NULL_TREE,
-! 					    convert (type, integer_zero_node),
-  					    build_real (type, value));
-  	    else
-*************** yylex ()
-*** 1624,1629 ****
-  		    <= TYPE_PRECISION (integer_type_node))
-  		  yylval.ttype
-! 		    = build_complex (integer_zero_node,
-! 				     convert (integer_type_node, yylval.ttype));
-  		else
-  		  error ("complex integer constant is too wide for `complex int'");
---- 1628,1634 ----
-  		    <= TYPE_PRECISION (integer_type_node))
-  		  yylval.ttype
-! 		    = build_complex (NULL_TREE, integer_zero_node,
-! 				     convert (integer_type_node,
-! 					      yylval.ttype));
-  		else
-  		  error ("complex integer constant is too wide for `complex int'");
-diff -rcp2N gcc-2.7.2.2/c-lex.h g77-new/c-lex.h
-*** gcc-2.7.2.2/c-lex.h	Thu Jun 15 07:12:22 1995
---- g77-new/c-lex.h	Sun Aug 10 18:10:55 1997
-*************** enum rid
-*** 43,47 ****
-    RID_VOLATILE,
-    RID_INLINE,
-!   RID_NOALIAS,
-    RID_ITERATOR,
-    RID_COMPLEX,
---- 43,47 ----
-    RID_VOLATILE,
-    RID_INLINE,
-!   RID_RESTRICT,
-    RID_ITERATOR,
-    RID_COMPLEX,
-diff -rcp2N gcc-2.7.2.2/c-parse.gperf g77-new/c-parse.gperf
-*** gcc-2.7.2.2/c-parse.gperf	Fri Apr  9 19:00:44 1993
---- g77-new/c-parse.gperf	Sun Aug 10 18:10:55 1997
-*************** __label__, LABEL, NORID
-*** 36,39 ****
---- 36,40 ----
-  __real, REALPART, NORID
-  __real__, REALPART, NORID
-+ __restrict, TYPE_QUAL, RID_RESTRICT
-  __signed, TYPESPEC, RID_SIGNED
-  __signed__, TYPESPEC, RID_SIGNED
-*************** oneway, TYPE_QUAL, RID_ONEWAY
-*** 69,72 ****
---- 70,74 ----
-  out, TYPE_QUAL, RID_OUT
-  register, SCSPEC, RID_REGISTER
-+ restrict, TYPE_QUAL, RID_RESTRICT
-  return, RETURN, NORID
-  short, TYPESPEC, RID_SHORT
-diff -rcp2N gcc-2.7.2.2/c-typeck.c g77-new/c-typeck.c
-*** gcc-2.7.2.2/c-typeck.c	Thu Feb 20 19:24:11 1997
---- g77-new/c-typeck.c	Sun Aug 10 18:46:29 1997
-*************** pointer_int_sum (resultcode, ptrop, into
-*** 2681,2686 ****
-       so the multiply won't overflow spuriously.  */
-  
-!   if (TYPE_PRECISION (TREE_TYPE (intop)) != POINTER_SIZE)
-!     intop = convert (type_for_size (POINTER_SIZE, 0), intop);
-  
-    /* Replace the integer argument with a suitable product by the object size.
---- 2681,2688 ----
-       so the multiply won't overflow spuriously.  */
-  
-!   if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype)
-!       || TREE_UNSIGNED (TREE_TYPE (intop)) != TREE_UNSIGNED (sizetype))
-!     intop = convert (type_for_size (TYPE_PRECISION (sizetype), 
-! 				    TREE_UNSIGNED (sizetype)), intop);
-  
-    /* Replace the integer argument with a suitable product by the object size.
-diff -rcp2N gcc-2.7.2.2/calls.c g77-new/calls.c
-*** gcc-2.7.2.2/calls.c	Thu Oct 26 21:53:43 1995
---- g77-new/calls.c	Sun Aug 10 18:46:16 1997
-*************** expand_call (exp, target, ignore)
-*** 564,567 ****
---- 564,569 ----
-    /* Nonzero if it is plausible that this is a call to alloca.  */
-    int may_be_alloca;
-+   /* Nonzero if this is a call to malloc or a related function. */
-+   int is_malloc;
-    /* Nonzero if this is a call to setjmp or a related function.  */
-    int returns_twice;
-*************** expand_call (exp, target, ignore)
-*** 741,745 ****
-  	  if (stack_arg_under_construction || i >= 0)
-  	    {
-! 	      rtx insn = NEXT_INSN (before_call), seq;
-  
-  	      /* Look for a call in the inline function code.
---- 743,749 ----
-  	  if (stack_arg_under_construction || i >= 0)
-  	    {
-! 	      rtx first_insn
-! 		= before_call ? NEXT_INSN (before_call) : get_insns ();
-! 	      rtx insn, seq;
-  
-  	      /* Look for a call in the inline function code.
-*************** expand_call (exp, target, ignore)
-*** 749,753 ****
-  
-  	      if (OUTGOING_ARGS_SIZE (DECL_SAVED_INSNS (fndecl)) == 0)
-! 		for (; insn; insn = NEXT_INSN (insn))
-  		  if (GET_CODE (insn) == CALL_INSN)
-  		    break;
---- 753,757 ----
-  
-  	      if (OUTGOING_ARGS_SIZE (DECL_SAVED_INSNS (fndecl)) == 0)
-! 		for (insn = first_insn; insn; insn = NEXT_INSN (insn))
-  		  if (GET_CODE (insn) == CALL_INSN)
-  		    break;
-*************** expand_call (exp, target, ignore)
-*** 781,785 ****
-  		  seq = get_insns ();
-  		  end_sequence ();
-! 		  emit_insns_before (seq, NEXT_INSN (before_call));
-  		  emit_stack_restore (SAVE_BLOCK, old_stack_level, NULL_RTX);
-  		}
---- 785,789 ----
-  		  seq = get_insns ();
-  		  end_sequence ();
-! 		  emit_insns_before (seq, first_insn);
-  		  emit_stack_restore (SAVE_BLOCK, old_stack_level, NULL_RTX);
-  		}
-*************** expand_call (exp, target, ignore)
-*** 852,855 ****
---- 856,860 ----
-    returns_twice = 0;
-    is_longjmp = 0;
-+   is_malloc = 0;
-  
-    if (name != 0 && IDENTIFIER_LENGTH (DECL_NAME (fndecl)) <= 15)
-*************** expand_call (exp, target, ignore)
-*** 891,894 ****
---- 896,903 ----
-  	       && ! strcmp (tname, "longjmp"))
-  	is_longjmp = 1;
-+       /* Only recognize malloc when alias analysis is enabled.  */
-+       else if (tname[0] == 'm' && flag_alias_check
-+ 	       && ! strcmp(tname, "malloc"))
-+ 	is_malloc = 1;
-      }
-  
-*************** expand_call (exp, target, ignore)
-*** 1087,1090 ****
---- 1096,1100 ----
-  
-  	      store_expr (args[i].tree_value, copy, 0);
-+ 	      is_const = 0;
-  
-  	      args[i].tree_value = build1 (ADDR_EXPR,
-*************** expand_call (exp, target, ignore)
-*** 1363,1367 ****
-    /* Now we are about to start emitting insns that can be deleted
-       if a libcall is deleted.  */
-!   if (is_const)
-      start_sequence ();
-  
---- 1373,1377 ----
-    /* Now we are about to start emitting insns that can be deleted
-       if a libcall is deleted.  */
-!   if (is_const || is_malloc)
-      start_sequence ();
-  
-*************** expand_call (exp, target, ignore)
-*** 1951,1954 ****
---- 1961,1978 ----
-        end_sequence ();
-        emit_insns (insns);
-+     }
-+   else if (is_malloc)
-+     {
-+       rtx temp = gen_reg_rtx (GET_MODE (valreg));
-+       rtx last, insns;
-+ 
-+       emit_move_insn (temp, valreg);
-+       last = get_last_insn ();
-+       REG_NOTES (last) = 
-+ 	gen_rtx (EXPR_LIST, REG_NOALIAS, temp, REG_NOTES (last));
-+       insns = get_insns ();
-+       end_sequence ();
-+       emit_insns (insns);
-+       valreg = temp;
-      }
-  
-diff -rcp2N gcc-2.7.2.2/cccp.c g77-new/cccp.c
-*** gcc-2.7.2.2/cccp.c	Thu Oct 26 18:07:26 1995
---- g77-new/cccp.c	Sun Aug 10 18:45:53 1997
-*************** initialize_builtins (inp, outp)
-*** 9626,9629 ****
---- 9626,9630 ----
-      so that it is present only when truly compiling with GNU C.  */
-  /*  install ((U_CHAR *) "__GNUC__", -1, T_CONST, "2", -1);  */
-+   install ((U_CHAR *) "__HAVE_BUILTIN_SETJMP__", -1, T_CONST, "1", -1);
-  
-    if (debug_output)
-diff -rcp2N gcc-2.7.2.2/combine.c g77-new/combine.c
-*** gcc-2.7.2.2/combine.c	Sun Nov 26 14:32:07 1995
---- g77-new/combine.c	Mon Jul 28 21:44:17 1997
-*************** num_sign_bit_copies (x, mode)
-*** 7326,7329 ****
---- 7326,7335 ----
-  
-      case NEG:
-+       while (GET_MODE (XEXP (x, 0)) == GET_MODE (x)
-+ 	     && GET_CODE (XEXP (x, 0)) == NEG
-+ 	     && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
-+ 	     && GET_CODE (XEXP (XEXP (x, 0), 0)) == NEG)
-+ 	x = XEXP (XEXP (x, 0), 0);	/* Speed up 961126-1.c */
-+ 
-        /* In general, this subtracts one sign bit copy.  But if the value
-  	 is known to be positive, the number of sign bit copies is the
-*************** distribute_notes (notes, from_insn, i3, 
-*** 10648,10651 ****
---- 10654,10658 ----
-  	case REG_EQUIV:
-  	case REG_NONNEG:
-+ 	case REG_NOALIAS:
-  	  /* These notes say something about results of an insn.  We can
-  	     only support them if they used to be on I3 in which case they
-diff -rcp2N gcc-2.7.2.2/config/alpha/alpha.c g77-new/config/alpha/alpha.c
-*** gcc-2.7.2.2/config/alpha/alpha.c	Thu Feb 20 19:24:11 1997
---- g77-new/config/alpha/alpha.c	Thu Jul 10 20:08:47 1997
-*************** direct_return ()
-*** 1239,1243 ****
-     cross-compiler.  Otherwise, use the versions in /usr/include/stamp.h.  */
-  
-! #if !defined(CROSS_COMPILE) && !defined(_WIN32)
-  #include <stamp.h>
-  #endif
---- 1239,1243 ----
-     cross-compiler.  Otherwise, use the versions in /usr/include/stamp.h.  */
-  
-! #if !defined(CROSS_COMPILE) && !defined(_WIN32) && !defined(__linux__)
-  #include <stamp.h>
-  #endif
-*************** output_prolog (file, size)
-*** 1370,1373 ****
---- 1370,1378 ----
-  
-    alpha_function_needs_gp = 0;
-+ #ifdef __linux__
-+   if(profile_flag) {
-+       alpha_function_needs_gp = 1;
-+   }
-+ #endif
-    for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
-      if ((GET_CODE (insn) == CALL_INSN)
-diff -rcp2N gcc-2.7.2.2/config/alpha/alpha.h g77-new/config/alpha/alpha.h
-*** gcc-2.7.2.2/config/alpha/alpha.h	Thu Feb 20 19:24:12 1997
---- g77-new/config/alpha/alpha.h	Sun Aug 10 19:21:39 1997
-*************** extern int target_flags;
-*** 112,116 ****
---- 112,118 ----
-      {"", TARGET_DEFAULT | TARGET_CPU_DEFAULT} }
-  
-+ #ifndef TARGET_DEFAULT
-  #define TARGET_DEFAULT 3
-+ #endif
-  
-  #ifndef TARGET_CPU_DEFAULT
-*************** extern int target_flags;
-*** 252,255 ****
---- 254,260 ----
-  /* No data type wants to be aligned rounder than this.  */
-  #define BIGGEST_ALIGNMENT 64
-+ 
-+ /* For atomic access to objects, must have at least 32-bit alignment.  */
-+ #define MINIMUM_ATOMIC_ALIGNMENT 32
-  
-  /* Make strings word-aligned so strcpy from constants will be faster.  */
-diff -rcp2N gcc-2.7.2.2/config/alpha/alpha.md g77-new/config/alpha/alpha.md
-*** gcc-2.7.2.2/config/alpha/alpha.md	Fri Oct 27 06:49:59 1995
---- g77-new/config/alpha/alpha.md	Thu Jul 10 20:08:48 1997
-***************
-*** 1746,1752 ****
-  	(if_then_else:DF 
-  	 (match_operator 3 "signed_comparison_operator"
-! 			 [(match_operand:DF 1 "reg_or_fp0_operand" "fG,fG")
-  			  (match_operand:DF 2 "fp0_operand" "G,G")])
-! 	 (float_extend:DF (match_operand:SF 4 "reg_or_fp0_operand" "fG,0"))
-  	 (match_operand:DF 5 "reg_or_fp0_operand" "0,fG")))]
-    "TARGET_FP"
---- 1746,1752 ----
-  	(if_then_else:DF 
-  	 (match_operator 3 "signed_comparison_operator"
-! 			 [(match_operand:DF 4 "reg_or_fp0_operand" "fG,fG")
-  			  (match_operand:DF 2 "fp0_operand" "G,G")])
-! 	 (float_extend:DF (match_operand:SF 1 "reg_or_fp0_operand" "fG,0"))
-  	 (match_operand:DF 5 "reg_or_fp0_operand" "0,fG")))]
-    "TARGET_FP"
-diff -rcp2N gcc-2.7.2.2/config/alpha/elf.h g77-new/config/alpha/elf.h
-*** gcc-2.7.2.2/config/alpha/elf.h	Wed Dec 31 19:00:00 1969
---- g77-new/config/alpha/elf.h	Thu Jul 10 20:08:49 1997
-***************
-*** 0 ****
---- 1,522 ----
-+ /* Definitions of target machine for GNU compiler, for DEC Alpha w/ELF.
-+    Copyright (C) 1996 Free Software Foundation, Inc.
-+    Contributed by Richard Henderson (rth@tamu.edu).
-+ 
-+ 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, 59 Temple Place - Suite 330,
-+ Boston, MA 02111-1307, USA.    */
-+ 
-+ /* This is used on Alpha platforms that use the ELF format.
-+ Currently only Linux uses this. */
-+ 
-+ #include "alpha/linux.h"
-+ 
-+ #undef TARGET_VERSION
-+ #define TARGET_VERSION fprintf (stderr, " (Alpha Linux/ELF)");
-+ 
-+ #undef OBJECT_FORMAT_COFF
-+ #undef EXTENDED_COFF
-+ #define OBJECT_FORMAT_ELF
-+ 
-+ #define SDB_DEBUGGING_INFO
-+ 
-+ #undef ASM_FINAL_SPEC
-+ 
-+ #undef CPP_PREDEFINES
-+ #define CPP_PREDEFINES "\
-+ -D__alpha -D__alpha__ -D__linux__ -D__linux -D_LONGLONG -Dlinux -Dunix \
-+ -Asystem(linux) -Acpu(alpha) -Amachine(alpha) -D__ELF__"
-+ 
-+ #undef LINK_SPEC
-+ #define LINK_SPEC "-m elf64alpha -G 8 %{O*:-O3} %{!O*:-O1}	\
-+   %{shared:-shared}						\
-+   %{!shared:							\
-+     %{!static:							\
-+       %{rdynamic:-export-dynamic}				\
-+       %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}		\
-+     %{static:-static}}"
-+ 
-+ /* Output at beginning of assembler file.  */
-+ 
-+ #undef ASM_FILE_START
-+ #define ASM_FILE_START(FILE)					\
-+ {								\
-+   alpha_write_verstamp (FILE);					\
-+   output_file_directive (FILE, main_input_filename);		\
-+   fprintf (FILE, "\t.version\t\"01.01\"\n");			\
-+   fprintf (FILE, "\t.set noat\n");				\
-+ }
-+ 
-+ #define ASM_OUTPUT_SOURCE_LINE(STREAM, LINE)			\
-+   alpha_output_lineno (STREAM, LINE)
-+ extern void alpha_output_lineno ();
-+ 
-+ extern void output_file_directive ();
-+ 
-+ /* Attach a special .ident directive to the end of the file to identify
-+    the version of GCC which compiled this code.  The format of the
-+    .ident string is patterned after the ones produced by native svr4
-+    C compilers.  */
-+ 
-+ #define IDENT_ASM_OP ".ident"
-+ 
-+ #ifdef IDENTIFY_WITH_IDENT
-+ #define ASM_IDENTIFY_GCC(FILE) /* nothing */
-+ #define ASM_IDENTIFY_LANGUAGE(FILE)				\
-+  fprintf(FILE, "\t%s \"GCC (%s) %s\"\n", IDENT_ASM_OP,		\
-+ 	 lang_identify(), version_string)
-+ #else
-+ #define ASM_FILE_END(FILE)					\
-+ do {				 				\
-+      fprintf ((FILE), "\t%s\t\"GCC: (GNU) %s\"\n",		\
-+ 	      IDENT_ASM_OP, version_string);			\
-+    } while (0)
-+ #endif
-+ 
-+ /* Allow #sccs in preprocessor.  */
-+ 
-+ #define SCCS_DIRECTIVE
-+ 
-+ /* Output #ident as a .ident.  */
-+ 
-+ #define ASM_OUTPUT_IDENT(FILE, NAME) \
-+   fprintf (FILE, "\t%s\t\"%s\"\n", IDENT_ASM_OP, NAME);
-+ 
-+ /* This is how to allocate empty space in some section.  The .zero
-+    pseudo-op is used for this on most svr4 assemblers.  */
-+ 
-+ #define SKIP_ASM_OP	".zero"
-+ 
-+ #undef ASM_OUTPUT_SKIP
-+ #define ASM_OUTPUT_SKIP(FILE,SIZE) \
-+   fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE))
-+ 
-+ /* Output the label which precedes a jumptable.  Note that for all svr4
-+    systems where we actually generate jumptables (which is to say every
-+    svr4 target except i386, where we use casesi instead) we put the jump-
-+    tables into the .rodata section and since other stuff could have been
-+    put into the .rodata section prior to any given jumptable, we have to
-+    make sure that the location counter for the .rodata section gets pro-
-+    perly re-aligned prior to the actual beginning of the jump table.  */
-+ 
-+ #define ALIGN_ASM_OP ".align"
-+ 
-+ #ifndef ASM_OUTPUT_BEFORE_CASE_LABEL
-+ #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \
-+   ASM_OUTPUT_ALIGN ((FILE), 2);
-+ #endif
-+ 
-+ #undef ASM_OUTPUT_CASE_LABEL
-+ #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE)		\
-+   do {									\
-+     ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE)		\
-+     ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM);			\
-+   } while (0)
-+ 
-+ /* The standard SVR4 assembler seems to require that certain builtin
-+    library routines (e.g. .udiv) be explicitly declared as .globl
-+    in each assembly file where they are referenced.  */
-+ 
-+ #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN)				\
-+   ASM_GLOBALIZE_LABEL (FILE, XSTR (FUN, 0))
-+ 
-+ /* This says how to output assembler code to declare an
-+    uninitialized external linkage data object.  Under SVR4,
-+    the linker seems to want the alignment of data objects
-+    to depend on their types.  We do exactly that here.  */
-+ 
-+ #define COMMON_ASM_OP	".comm"
-+ 
-+ #undef ASM_OUTPUT_ALIGNED_COMMON
-+ #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)		\
-+ do {									\
-+   fprintf ((FILE), "\t%s\t", COMMON_ASM_OP);				\
-+   assemble_name ((FILE), (NAME));					\
-+   fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT);	\
-+ } while (0)
-+ 
-+ /* This says how to output assembler code to declare an
-+    uninitialized internal linkage data object.  Under SVR4,
-+    the linker seems to want the alignment of data objects
-+    to depend on their types.  We do exactly that here.  */
-+ 
-+ #define LOCAL_ASM_OP	".local"
-+ 
-+ #undef ASM_OUTPUT_ALIGNED_LOCAL
-+ #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)		\
-+ do {									\
-+   fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP);				\
-+   assemble_name ((FILE), (NAME));					\
-+   fprintf ((FILE), "\n");						\
-+   ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN);			\
-+ } while (0)
-+ 
-+ /* This is the pseudo-op used to generate a 64-bit word of data with a
-+    specific value in some section.    */
-+ 
-+ #define INT_ASM_OP		".quad"
-+ 
-+ /* This is the pseudo-op used to generate a contiguous sequence of byte
-+    values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
-+    AUTOMATICALLY APPENDED.  This is the same for most svr4 assemblers.  */
-+ 
-+ #undef ASCII_DATA_ASM_OP
-+ #define ASCII_DATA_ASM_OP	".ascii"
-+ 
-+ /* Support const sections and the ctors and dtors sections for g++.
-+    Note that there appears to be two different ways to support const
-+    sections at the moment.  You can either #define the symbol
-+    READONLY_DATA_SECTION (giving it some code which switches to the
-+    readonly data section) or else you can #define the symbols
-+    EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
-+    SELECT_RTX_SECTION.  We do both here just to be on the safe side.  */
-+ 
-+ #define USE_CONST_SECTION	1
-+ 
-+ #define CONST_SECTION_ASM_OP	".section\t.rodata"
-+ 
-+ /* Define the pseudo-ops used to switch to the .ctors and .dtors sections.
-+ 
-+    Note that we want to give these sections the SHF_WRITE attribute
-+    because these sections will actually contain data (i.e. tables of
-+    addresses of functions in the current root executable or shared library
-+    file) and, in the case of a shared library, the relocatable addresses
-+    will have to be properly resolved/relocated (and then written into) by
-+    the dynamic linker when it actually attaches the given shared library
-+    to the executing process.  (Note that on SVR4, you may wish to use the
-+    `-z text' option to the ELF linker, when building a shared library, as
-+    an additional check that you are doing everything right.  But if you do
-+    use the `-z text' option when building a shared library, you will get
-+    errors unless the .ctors and .dtors sections are marked as writable
-+    via the SHF_WRITE attribute.)  */
-+ 
-+ #define CTORS_SECTION_ASM_OP	".section\t.ctors,\"aw\""
-+ #define DTORS_SECTION_ASM_OP	".section\t.dtors,\"aw\""
-+ 
-+ /* On svr4, we *do* have support for the .init and .fini sections, and we
-+    can put stuff in there to be executed before and after `main'.  We let
-+    crtstuff.c and other files know this by defining the following symbols.
-+    The definitions say how to change sections to the .init and .fini
-+    sections.  This is the same for all known svr4 assemblers.  */
-+ 
-+ #define INIT_SECTION_ASM_OP	".section\t.init"
-+ #define FINI_SECTION_ASM_OP	".section\t.fini"
-+ 
-+ /* Support non-common, uninitialized data in the .bss section.  */
-+ 
-+ #define BSS_SECTION_ASM_OP	".section\t.bss"
-+ 
-+ /* A default list of other sections which we might be "in" at any given
-+    time.  For targets that use additional sections (e.g. .tdesc) you
-+    should override this definition in the target-specific file which
-+    includes this file.  */
-+ 
-+ #undef EXTRA_SECTIONS
-+ #define EXTRA_SECTIONS in_const, in_ctors, in_dtors, in_bss
-+ 
-+ /* A default list of extra section function definitions.  For targets
-+    that use additional sections (e.g. .tdesc) you should override this
-+    definition in the target-specific file which includes this file.  */
-+ 
-+ #undef EXTRA_SECTION_FUNCTIONS
-+ #define EXTRA_SECTION_FUNCTIONS						\
-+   CONST_SECTION_FUNCTION						\
-+   CTORS_SECTION_FUNCTION						\
-+   DTORS_SECTION_FUNCTION						\
-+   BSS_SECTION_FUNCTION
-+ 
-+ #undef READONLY_DATA_SECTION
-+ #define READONLY_DATA_SECTION() const_section ()
-+ 
-+ extern void text_section ();
-+ 
-+ #define CONST_SECTION_FUNCTION						\
-+ void									\
-+ const_section ()							\
-+ {									\
-+   if (!USE_CONST_SECTION)						\
-+     text_section();							\
-+   else if (in_section != in_const)					\
-+     {									\
-+       fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP);		\
-+       in_section = in_const;						\
-+     }									\
-+ }
-+ 
-+ #define CTORS_SECTION_FUNCTION						\
-+ void									\
-+ ctors_section ()							\
-+ {									\
-+   if (in_section != in_ctors)						\
-+     {									\
-+       fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP);		\
-+       in_section = in_ctors;						\
-+     }									\
-+ }
-+ 
-+ #define DTORS_SECTION_FUNCTION						\
-+ void									\
-+ dtors_section ()							\
-+ {									\
-+   if (in_section != in_dtors)						\
-+     {									\
-+       fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP);		\
-+       in_section = in_dtors;						\
-+     }									\
-+ }
-+ 
-+ #define BSS_SECTION_FUNCTION						\
-+ void									\
-+ bss_section ()								\
-+ {									\
-+   if (in_section != in_bss)						\
-+     {									\
-+       fprintf (asm_out_file, "%s\n", BSS_SECTION_ASM_OP);		\
-+       in_section = in_bss;						\
-+     }									\
-+ }
-+ 
-+ 
-+ /* Switch into a generic section.
-+    This is currently only used to support section attributes.
-+ 
-+    We make the section read-only and executable for a function decl,
-+    read-only for a const data decl, and writable for a non-const data decl.  */
-+ #define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME) \
-+   fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, \
-+ 	   (DECL) && TREE_CODE (DECL) == FUNCTION_DECL ? "ax" : \
-+ 	   (DECL) && TREE_READONLY (DECL) ? "a" : "aw")
-+ 
-+ 
-+ /* A C statement (sans semicolon) to output an element in the table of
-+    global constructors.  */
-+ #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)				\
-+   do {									\
-+     ctors_section ();							\
-+     fprintf (FILE, "\t%s\t ", INT_ASM_OP);				\
-+     assemble_name (FILE, NAME);						\
-+     fprintf (FILE, "\n");						\
-+   } while (0)
-+ 
-+ /* A C statement (sans semicolon) to output an element in the table of
-+    global destructors.  */
-+ #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)       				\
-+   do {									\
-+     dtors_section ();                   				\
-+     fprintf (FILE, "\t%s\t ", INT_ASM_OP);				\
-+     assemble_name (FILE, NAME);              				\
-+     fprintf (FILE, "\n");						\
-+   } while (0)
-+ 
-+ /* A C statement or statements to switch to the appropriate
-+    section for output of DECL.  DECL is either a `VAR_DECL' node
-+    or a constant of some sort.  RELOC indicates whether forming
-+    the initial value of DECL requires link-time relocations.  */
-+ 
-+ #define SELECT_SECTION(DECL,RELOC)					\
-+ {									\
-+   if (TREE_CODE (DECL) == STRING_CST)					\
-+     {									\
-+       if (! flag_writable_strings)					\
-+ 	const_section ();						\
-+       else								\
-+ 	data_section ();						\
-+     }									\
-+   else if (TREE_CODE (DECL) == VAR_DECL)				\
-+     {									\
-+       if ((flag_pic && RELOC)						\
-+ 	  || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)		\
-+ 	  || !DECL_INITIAL (DECL)					\
-+ 	  || (DECL_INITIAL (DECL) != error_mark_node			\
-+ 	      && !TREE_CONSTANT (DECL_INITIAL (DECL))))			\
-+         {								\
-+           if (DECL_COMMON (DECL)					\
-+ 	      && !DECL_INITIAL (DECL))					\
-+ 	          /* || DECL_INITIAL (DECL) == error_mark_node)) */	\
-+ 	    bss_section();						\
-+ 	  else								\
-+ 	    data_section ();						\
-+ 	}								\
-+       else								\
-+ 	const_section ();						\
-+     }									\
-+   else									\
-+     const_section ();							\
-+ }
-+ 
-+ /* A C statement or statements to switch to the appropriate
-+    section for output of RTX in mode MODE.  RTX is some kind
-+    of constant in RTL.  The argument MODE is redundant except
-+    in the case of a `const_int' rtx.  Currently, these always
-+    go into the const section.  */
-+ 
-+ #undef SELECT_RTX_SECTION
-+ #define SELECT_RTX_SECTION(MODE,RTX) const_section()
-+ 
-+ /* Define the strings used for the special svr4 .type and .size directives.
-+    These strings generally do not vary from one system running svr4 to
-+    another, but if a given system (e.g. m88k running svr) needs to use
-+    different pseudo-op names for these, they may be overridden in the
-+    file which includes this one.  */
-+ 
-+ #define TYPE_ASM_OP	".type"
-+ #define SIZE_ASM_OP	".size"
-+ 
-+ /* This is how we tell the assembler that a symbol is weak.  */
-+ 
-+ #define ASM_WEAKEN_LABEL(FILE,NAME) \
-+   do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
-+        fputc ('\n', FILE); } while (0)
-+ 
-+ /* This is how we tell the assembler that two symbols have the same value.  */
-+ 
-+ #define ASM_OUTPUT_DEF(FILE,NAME1,NAME2) \
-+   do { assemble_name(FILE, NAME1); 	 \
-+        fputs(" = ", FILE);		 \
-+        assemble_name(FILE, NAME2);	 \
-+        fputc('\n', FILE); } while (0)
-+ 
-+ /* The following macro defines the format used to output the second
-+    operand of the .type assembler directive.  Different svr4 assemblers
-+    expect various different forms for this operand.  The one given here
-+    is just a default.  You may need to override it in your machine-
-+    specific tm.h file (depending upon the particulars of your assembler).  */
-+ 
-+ #define TYPE_OPERAND_FMT	"@%s"
-+ 
-+ /* Write the extra assembler code needed to declare a function's result.
-+    Most svr4 assemblers don't require any special declaration of the
-+    result value, but there are exceptions.  */
-+ 
-+ #ifndef ASM_DECLARE_RESULT
-+ #define ASM_DECLARE_RESULT(FILE, RESULT)
-+ #endif
-+ 
-+ /* These macros generate the special .type and .size directives which
-+    are used to set the corresponding fields of the linker symbol table
-+    entries in an ELF object file under SVR4.  These macros also output
-+    the starting labels for the relevant functions/objects.  */
-+ 
-+ /* Write the extra assembler code needed to declare an object properly.  */
-+ 
-+ #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)			\
-+   do {									\
-+     fprintf (FILE, "\t%s\t ", TYPE_ASM_OP);				\
-+     assemble_name (FILE, NAME);						\
-+     putc (',', FILE);							\
-+     fprintf (FILE, TYPE_OPERAND_FMT, "object");				\
-+     putc ('\n', FILE);							\
-+     size_directive_output = 0;						\
-+     if (!flag_inhibit_size_directive && DECL_SIZE (DECL))		\
-+       {									\
-+ 	size_directive_output = 1;					\
-+ 	fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);				\
-+ 	assemble_name (FILE, NAME);					\
-+ 	fprintf (FILE, ",%d\n",  int_size_in_bytes (TREE_TYPE (DECL)));	\
-+       }									\
-+     ASM_OUTPUT_LABEL(FILE, NAME);					\
-+   } while (0)
-+ 
-+ /* Output the size directive for a decl in rest_of_decl_compilation
-+    in the case where we did not do so before the initializer.
-+    Once we find the error_mark_node, we know that the value of
-+    size_directive_output was set
-+    by ASM_DECLARE_OBJECT_NAME when it was run for the same decl.  */
-+ 
-+ #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END)	 \
-+ do {									 \
-+      char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0);			 \
-+      if (!flag_inhibit_size_directive && DECL_SIZE (DECL)		 \
-+          && ! AT_END && TOP_LEVEL					 \
-+ 	 && DECL_INITIAL (DECL) == error_mark_node			 \
-+ 	 && !size_directive_output)					 \
-+        {								 \
-+ 	 size_directive_output = 1;					 \
-+ 	 fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);			 \
-+ 	 assemble_name (FILE, name);					 \
-+ 	 fprintf (FILE, ",%d\n",  int_size_in_bytes (TREE_TYPE (DECL))); \
-+        }								 \
-+    } while (0)
-+ 
-+ /* A table of bytes codes used by the ASM_OUTPUT_ASCII and
-+    ASM_OUTPUT_LIMITED_STRING macros.  Each byte in the table
-+    corresponds to a particular byte value [0..255].  For any
-+    given byte value, if the value in the corresponding table
-+    position is zero, the given character can be output directly.
-+    If the table value is 1, the byte must be output as a \ooo
-+    octal escape.  If the tables value is anything else, then the
-+    byte value should be output as a \ followed by the value
-+    in the table.  Note that we can use standard UN*X escape
-+    sequences for many control characters, but we don't use
-+    \a to represent BEL because some svr4 assemblers (e.g. on
-+    the i386) don't know about that.  Also, we don't use \v
-+    since some versions of gas, such as 2.2 did not accept it.  */
-+ 
-+ #define ESCAPES \
-+ "\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
-+ \0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-+ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\
-+ \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\
-+ \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
-+ \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
-+ \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
-+ \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"
-+ 
-+ /* Some svr4 assemblers have a limit on the number of characters which
-+    can appear in the operand of a .string directive.  If your assembler
-+    has such a limitation, you should define STRING_LIMIT to reflect that
-+    limit.  Note that at least some svr4 assemblers have a limit on the
-+    actual number of bytes in the double-quoted string, and that they
-+    count each character in an escape sequence as one byte.  Thus, an
-+    escape sequence like \377 would count as four bytes.
-+ 
-+    If your target assembler doesn't support the .string directive, you
-+    should define this to zero.
-+ */
-+ 
-+ #define STRING_LIMIT	((unsigned) 256)
-+ 
-+ #define STRING_ASM_OP	".string"
-+ 
-+ /*
-+  * We always use gas here, so we don't worry about ECOFF assembler problems.
-+  */
-+ #undef TARGET_GAS
-+ #define TARGET_GAS	(1)
-+ 
-+ #undef PREFERRED_DEBUGGING_TYPE
-+ #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
-+ 
-+ /* Provide a STARTFILE_SPEC appropriate for Linux.  Here we add
-+    the Linux magical crtbegin.o file (see crtstuff.c) which
-+    provides part of the support for getting C++ file-scope static
-+    object constructed before entering `main'. */
-+    
-+ #undef	STARTFILE_SPEC
-+ #define STARTFILE_SPEC \
-+   "%{!shared: \
-+      %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}\
-+    crti.o%s crtbegin.o%s"
-+ 
-+ /* Provide a ENDFILE_SPEC appropriate for Linux.  Here we tack on
-+    the Linux magical crtend.o file (see crtstuff.c) which
-+    provides part of the support for getting C++ file-scope static
-+    object constructed before entering `main', followed by a normal
-+    Linux "finalizer" file, `crtn.o'.  */
-+ 
-+ #undef	ENDFILE_SPEC
-+ #define ENDFILE_SPEC \
-+   "crtend.o%s crtn.o%s"
-diff -rcp2N gcc-2.7.2.2/config/alpha/linux.h g77-new/config/alpha/linux.h
-*** gcc-2.7.2.2/config/alpha/linux.h	Wed Dec 31 19:00:00 1969
---- g77-new/config/alpha/linux.h	Thu Jul 10 20:08:49 1997
-***************
-*** 0 ****
---- 1,72 ----
-+ /* Definitions of target machine for GNU compiler, for Alpha Linux,
-+    using ECOFF.
-+    Copyright (C) 1995 Free Software Foundation, Inc.
-+    Contributed by Bob Manson.
-+    Derived from work contributed by Cygnus Support,
-+    (c) 1993 Free Software Foundation.
-+ 
-+ 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.  */
-+ 
-+ #define TARGET_DEFAULT (3 | MASK_GAS)
-+ 
-+ #include "alpha/alpha.h"
-+ 
-+ #undef TARGET_VERSION
-+ #define TARGET_VERSION fprintf (stderr, " (Linux/Alpha)");
-+ 
-+ #undef CPP_PREDEFINES
-+ #define CPP_PREDEFINES "\
-+ -D__alpha -D__alpha__ -D__linux__ -D__linux -D_LONGLONG -Dlinux -Dunix \
-+ -Asystem(linux) -Acpu(alpha) -Amachine(alpha)"
-+ 
-+ /* We don't actually need any of these; the MD_ vars are ignored
-+    anyway for cross-compilers, and the other specs won't get picked up
-+    'coz the user is supposed to do ld -r (hmm, perhaps that should be
-+    the default).  In any case, setting them thus will catch some
-+    common user errors. */
-+ 
-+ #undef	MD_EXEC_PREFIX
-+ #undef	MD_STARTFILE_PREFIX
-+ 
-+ #undef	LIB_SPEC
-+ #define LIB_SPEC "%{pg:-lgmon} %{pg:-lc_p} %{!pg:-lc}"
-+ 
-+ #undef	LINK_SPEC
-+ #define LINK_SPEC  \
-+   "-G 8 %{O*:-O3} %{!O*:-O1}"
-+ 
-+ #undef ASM_SPEC
-+ #define ASM_SPEC "-nocpp"
-+ 
-+ /* Can't do stabs */
-+ #undef SDB_DEBUGGING_INFO
-+ 
-+ /* Prefer dbx.  */
-+ #undef PREFERRED_DEBUGGING_TYPE
-+ #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
-+ 
-+ #undef FUNCTION_PROFILER
-+ 
-+ #define FUNCTION_PROFILER(FILE, LABELNO)			\
-+     do {							\
-+ 	fputs ("\tlda $27,_mcount\n", (FILE));			\
-+ 	fputs ("\tjsr $26,($27),_mcount\n", (FILE));		\
-+ 	fputs ("\tldgp $29,0($26)\n", (FILE));			\
-+     } while (0);
-+ 
-+ /* Generate calls to memcpy, etc., not bcopy, etc. */
-+ #define TARGET_MEM_FUNCTIONS
-diff -rcp2N gcc-2.7.2.2/config/alpha/t-linux g77-new/config/alpha/t-linux
-*** gcc-2.7.2.2/config/alpha/t-linux	Wed Dec 31 19:00:00 1969
---- g77-new/config/alpha/t-linux	Thu Jul 10 20:08:49 1997
-***************
-*** 0 ****
---- 1,3 ----
-+ # Our header files are supposed to be correct, nein?
-+ FIXINCLUDES = 
-+ STMP_FIXPROTO =
-diff -rcp2N gcc-2.7.2.2/config/alpha/x-linux g77-new/config/alpha/x-linux
-*** gcc-2.7.2.2/config/alpha/x-linux	Wed Dec 31 19:00:00 1969
---- g77-new/config/alpha/x-linux	Thu Jul 10 20:08:49 1997
-***************
-*** 0 ****
---- 1 ----
-+ CLIB=-lbfd -liberty
-diff -rcp2N gcc-2.7.2.2/config/alpha/xm-alpha.h g77-new/config/alpha/xm-alpha.h
-*** gcc-2.7.2.2/config/alpha/xm-alpha.h	Thu Aug 31 17:52:27 1995
---- g77-new/config/alpha/xm-alpha.h	Thu Jul 10 20:08:49 1997
-*************** Boston, MA 02111-1307, USA.  */
-*** 46,51 ****
---- 46,53 ----
-  #include <alloca.h>
-  #else
-+ #ifndef alloca
-  extern void *alloca ();
-  #endif
-+ #endif
-  
-  /* The host compiler has problems with enum bitfields since it makes
-*************** extern void *malloc (), *realloc (), *ca
-*** 68,72 ****
---- 70,76 ----
-  /* OSF/1 has vprintf.  */
-  
-+ #ifndef linux  /* 1996/02/22 mauro@craftwork.com -- unreliable with Linux */
-  #define HAVE_VPRINTF
-+ #endif
-  
-  /* OSF/1 has putenv.  */
-diff -rcp2N gcc-2.7.2.2/config/alpha/xm-linux.h g77-new/config/alpha/xm-linux.h
-*** gcc-2.7.2.2/config/alpha/xm-linux.h	Wed Dec 31 19:00:00 1969
---- g77-new/config/alpha/xm-linux.h	Thu Jul 10 20:08:49 1997
-***************
-*** 0 ****
---- 1,10 ----
-+ #ifndef _XM_LINUX_H
-+ #define _XM_LINUX_H
-+ 
-+ #include "xm-alpha.h"
-+ 
-+ #define HAVE_STRERROR
-+ 
-+ #define DONT_DECLARE_SYS_SIGLIST
-+ #define USE_BFD
-+ #endif
-diff -rcp2N gcc-2.7.2.2/config/i386/i386.c g77-new/config/i386/i386.c
-*** gcc-2.7.2.2/config/i386/i386.c	Sun Oct 22 07:13:21 1995
---- g77-new/config/i386/i386.c	Sun Aug 10 18:46:09 1997
-*************** standard_80387_constant_p (x)
-*** 1290,1294 ****
-    set_float_handler (handler);
-    REAL_VALUE_FROM_CONST_DOUBLE (d, x);
-!   is0 = REAL_VALUES_EQUAL (d, dconst0);
-    is1 = REAL_VALUES_EQUAL (d, dconst1);
-    set_float_handler (NULL_PTR);
---- 1290,1294 ----
-    set_float_handler (handler);
-    REAL_VALUE_FROM_CONST_DOUBLE (d, x);
-!   is0 = REAL_VALUES_EQUAL (d, dconst0) && !REAL_VALUE_MINUS_ZERO (d);
-    is1 = REAL_VALUES_EQUAL (d, dconst1);
-    set_float_handler (NULL_PTR);
-diff -rcp2N gcc-2.7.2.2/config/mips/mips.c g77-new/config/mips/mips.c
-*** gcc-2.7.2.2/config/mips/mips.c	Thu Feb 20 19:24:13 1997
---- g77-new/config/mips/mips.c	Sun Aug 10 18:45:43 1997
-*************** expand_block_move (operands)
-*** 2360,2365 ****
-  
-    else if (constp && bytes <= 2*MAX_MOVE_BYTES)
-!     emit_insn (gen_movstrsi_internal (gen_rtx (MEM, BLKmode, dest_reg),
-! 				      gen_rtx (MEM, BLKmode, src_reg),
-  				      bytes_rtx, align_rtx));
-  
---- 2360,2367 ----
-  
-    else if (constp && bytes <= 2*MAX_MOVE_BYTES)
-!     emit_insn (gen_movstrsi_internal (change_address (operands[0],
-! 						      BLKmode, dest_reg),
-! 				      change_address (orig_src, BLKmode,
-! 						      src_reg),
-  				      bytes_rtx, align_rtx));
-  
-diff -rcp2N gcc-2.7.2.2/config/mips/mips.h g77-new/config/mips/mips.h
-*** gcc-2.7.2.2/config/mips/mips.h	Thu Nov  9 11:23:09 1995
---- g77-new/config/mips/mips.h	Sun Aug 10 18:46:44 1997
-*************** typedef struct mips_args {
-*** 2160,2170 ****
-      }									    \
-  									    \
-!   /* Flush the instruction cache.  */					    \
-!   /* ??? Are the modes right? Maybe they should depend on -mint64/-mlong64? */\
-    /* ??? Should check the return value for errors.  */			    \
-!   emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "cacheflush"),		    \
-  		     0, VOIDmode, 3, addr, Pmode,			    \
-  		     GEN_INT (TRAMPOLINE_SIZE), SImode,  		    \
-! 		     GEN_INT (1), SImode);				    \
-  }
-  
---- 2160,2170 ----
-      }									    \
-  									    \
-!   /* Flush both caches.  We need to flush the data cache in case	    \
-!      the system has a write-back cache.  */				    \
-    /* ??? Should check the return value for errors.  */			    \
-!   emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "_flush_cache"),	    \
-  		     0, VOIDmode, 3, addr, Pmode,			    \
-  		     GEN_INT (TRAMPOLINE_SIZE), SImode,  		    \
-! 		     GEN_INT (3), TYPE_MODE (integer_type_node));	    \
-  }
-  
-*************** typedef struct mips_args {
-*** 2388,2392 ****
-    ((GET_CODE (X) != CONST_DOUBLE					\
-      || mips_const_double_ok (X, GET_MODE (X)))				\
-!    && ! (GET_CODE (X) == CONST && ABI_64BIT))
-  
-  /* A C compound statement that attempts to replace X with a valid
---- 2388,2393 ----
-    ((GET_CODE (X) != CONST_DOUBLE					\
-      || mips_const_double_ok (X, GET_MODE (X)))				\
-!    && ! (GET_CODE (X) == CONST						\
-! 	 && (ABI_64BIT || GET_CODE (XEXP (X, 0)) == MINUS)))
-  
-  /* A C compound statement that attempts to replace X with a valid
-diff -rcp2N gcc-2.7.2.2/config/mips/sni-gas.h g77-new/config/mips/sni-gas.h
-*** gcc-2.7.2.2/config/mips/sni-gas.h	Wed Dec 31 19:00:00 1969
---- g77-new/config/mips/sni-gas.h	Sun Aug 10 18:46:33 1997
-***************
-*** 0 ****
---- 1,43 ----
-+ #include "mips/sni-svr4.h"
-+ 
-+ /* Enable debugging.  */
-+ #define DBX_DEBUGGING_INFO
-+ #define SDB_DEBUGGING_INFO
-+ #define MIPS_DEBUGGING_INFO
-+ 
-+ #define DWARF_DEBUGGING_INFO
-+ #undef PREFERRED_DEBUGGING_TYPE
-+ #define PREFERRED_DEBUGGING_TYPE DWARF_DEBUG
-+ 
-+ /* We need to use .esize and .etype instead of .size and .type to
-+    avoid conflicting with ELF directives.  These are only recognized
-+    by gas, anyhow, not the native assembler.  */
-+ #undef PUT_SDB_SIZE
-+ #define PUT_SDB_SIZE(a)                                       \
-+ do {                                                  \
-+   extern FILE *asm_out_text_file;                     \
-+   fprintf (asm_out_text_file, "\t.esize\t%d;", (a));  \
-+ } while (0)
-+ 
-+ #undef PUT_SDB_TYPE
-+ #define PUT_SDB_TYPE(a)                                       \
-+ do {                                                  \
-+   extern FILE *asm_out_text_file;                     \
-+   fprintf (asm_out_text_file, "\t.etype\t0x%x;", (a));        \
-+ } while (0)
-+ 
-+ 
-+ /* This is how to equate one symbol to another symbol.  The syntax used is
-+    `SYM1=SYM2'.  Note that this is different from the way equates are done
-+    with most svr4 assemblers, where the syntax is `.set SYM1,SYM2'.  */
-+ 
-+ #define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2)				\
-+  do {	fprintf ((FILE), "\t");						\
-+ 	assemble_name (FILE, LABEL1);					\
-+ 	fprintf (FILE, " = ");						\
-+ 	assemble_name (FILE, LABEL2);					\
-+ 	fprintf (FILE, "\n");						\
-+   } while (0)
-+ 
-+ 
-+ 
-diff -rcp2N gcc-2.7.2.2/config/mips/sni-svr4.h g77-new/config/mips/sni-svr4.h
-*** gcc-2.7.2.2/config/mips/sni-svr4.h	Wed Dec 31 19:00:00 1969
---- g77-new/config/mips/sni-svr4.h	Sun Aug 10 18:46:33 1997
-***************
-*** 0 ****
---- 1,103 ----
-+ /* Definitions of target machine for GNU compiler.  SNI SINIX version.
-+    Copyright (C) 1996 Free Software Foundation, Inc.
-+    Contributed by Marco Walther (Marco.Walther@mch.sni.de).
-+ 
-+ 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.  */
-+ 
-+ #define MIPS_SVR4
-+ 
-+ #define CPP_PREDEFINES "\
-+ -Dmips -Dunix -Dhost_mips -DMIPSEB -DR3000 -DSYSTYPE_SVR4 \
-+ -D_mips -D_unix -D_host_mips -D_MIPSEB -D_R3000 -D_SYSTYPE_SVR4 \
-+ -Asystem(unix) -Asystem(svr4) -Acpu(mips) -Amachine(mips)"
-+ 
-+ #define CPP_SPEC "\
-+ %{.cc:	-D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS} \
-+ %{.cxx:	-D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS} \
-+ %{.C:	-D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS} \
-+ %{.m:	-D__LANGUAGE_OBJECTIVE_C -D_LANGUAGE_OBJECTIVE_C} \
-+ %{.S:	-D__LANGUAGE_ASSEMBLY -D_LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY}} \
-+ %{.s:	-D__LANGUAGE_ASSEMBLY -D_LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY}} \
-+ %{!.S:%{!.s:	-D__LANGUAGE_C -D_LANGUAGE_C %{!ansi:-DLANGUAGE_C}}} \
-+ -D__SIZE_TYPE__=unsigned\\ int -D__PTRDIFF_TYPE__=int"
-+ 
-+ #define LINK_SPEC "\
-+ %{G*} \
-+ %{!mgas: \
-+ 	%{dy} %{dn}}"
-+ 		    
-+ #define LIB_SPEC "\
-+ 	%{p:-lprof1} \
-+ 	%{!p:%{pg:-lprof1} \
-+ 	     %{!pg:-L/usr/ccs/lib/ -lc /usr/ccs/lib/crtn.o%s}}"
-+ 
-+ #define STARTFILE_SPEC "\
-+ 	%{pg:gcrt0.o%s} \
-+ 	%{!pg:%{p:mcrt0.o%s} \
-+ 	       %{!p:/usr/ccs/lib/crt1.o /usr/ccs/lib/crti.o /usr/ccs/lib/values-Xt.o%s}}"
-+ 
-+ /* Mips System V.4 doesn't have a getpagesize() function needed by the
-+    trampoline code, so use the POSIX sysconf function to get it.
-+    This is only done when compiling the trampoline code.  */
-+ 
-+ #ifdef  L_trampoline
-+ #include <unistd.h>
-+ 
-+ #define getpagesize()	sysconf(_SC_PAGE_SIZE)
-+ #endif /*  L_trampoline */
-+ 
-+ /* Use atexit for static constructors/destructors, instead of defining
-+    our own exit function.  */
-+ #define HAVE_ATEXIT
-+ 
-+ /* Generate calls to memcpy, etc., not bcopy, etc.  */
-+ #define TARGET_MEM_FUNCTIONS
-+ 
-+ #define OBJECT_FORMAT_ELF
-+ 
-+ #define	TARGET_DEFAULT	MASK_ABICALLS
-+ #define ABICALLS_ASM_OP ".option pic2"
-+ 
-+ #define MACHINE_TYPE "SNI running SINIX 5.42"
-+ 
-+ #define MIPS_DEFAULT_GVALUE	0
-+ 
-+ #define NM_FLAGS	"-p"
-+ 
-+ /* wir haben ein Problem, wenn in einem Assembler-File keine .text-section
-+    erzeugt wird. Dann landen diese Pseudo-Labels in irgendeiner anderen
-+    section, z.B. .reginfo. Das macht den ld sehr ungluecklich. */
-+ 
-+ #define ASM_IDENTIFY_GCC(mw_stream) \
-+ 	fprintf(mw_stream, "\t.ident \"gcc2_compiled.\"\n");
-+ 
-+ #define ASM_IDENTIFY_LANGUAGE(STREAM)
-+ 
-+ #define ASM_LONG	".word\t"
-+ #define ASM_GLOBAL	".rdata\n\t\t.globl\t"
-+ 
-+ #include "mips/mips.h"
-+ 
-+ /* We do not want to run mips-tfile!  */
-+ #undef ASM_FINAL_SPEC
-+ 
-+ #undef OBJECT_FORMAT_COFF
-+ 
-+ /* We don't support debugging info for now. */
-+ #undef DBX_DEBUGGING_INFO
-+ #undef SDB_DEBUGGING_INFO
-+ #undef MIPS_DEBUGGING_INFO
-diff -rcp2N gcc-2.7.2.2/config/mips/x-sni-svr4 g77-new/config/mips/x-sni-svr4
-*** gcc-2.7.2.2/config/mips/x-sni-svr4	Wed Dec 31 19:00:00 1969
---- g77-new/config/mips/x-sni-svr4	Sun Aug 10 18:46:33 1997
-***************
-*** 0 ****
---- 1,18 ----
-+ # Define CC and OLDCC as the same, so that the tests:
-+ #	if [ x"$(OLDCC)" = x"$(CC)" ] ...
-+ #
-+ # will succeed (if OLDCC != CC, it is assumed that GCC is
-+ # being used in secondary stage builds).
-+ # -Olimit is so the user can use -O2.  Down with fixed
-+ # size tables!
-+ 
-+ CC		= $(OLDCC)
-+ OPT		=
-+ OLDCC		= cc -Olimit 3000 $(OPT)
-+ 
-+ X_CFLAGS	= -DNO_SYS_SIGLIST
-+ 
-+ # Show we need to use the C version of ALLOCA
-+ # The SVR3 configurations have it, but the SVR4 configurations don't.
-+ # For now, just try using it for all SVR* configurations.
-+ ALLOCA		= alloca.o
-diff -rcp2N gcc-2.7.2.2/config/msdos/configur.bat g77-new/config/msdos/configur.bat
-*** gcc-2.7.2.2/config/msdos/configur.bat	Mon Aug 28 05:55:47 1995
---- g77-new/config/msdos/configur.bat	Sun Aug 10 19:08:05 1997
-*************** sed -f config/msdos/top.sed Makefile.in 
-*** 18,21 ****
---- 18,27 ----
-  set LANG=
-  
-+ if not exist ada\make-lang.in goto no_ada
-+ sed -f config/msdos/top.sed ada\make-lang.in >> Makefile
-+ sed -f config/msdos/top.sed ada\makefile.in > ada\Makefile
-+ set LANG=%LANG% ada.&	
-+ :no_ada
-+ 
-  if not exist cp\make-lang.in goto no_cp
-  sed -f config/msdos/top.sed cp\make-lang.in >> Makefile
-diff -rcp2N gcc-2.7.2.2/config/pa/pa.c g77-new/config/pa/pa.c
-*** gcc-2.7.2.2/config/pa/pa.c	Sun Oct 22 07:45:20 1995
---- g77-new/config/pa/pa.c	Sun Aug 10 18:45:44 1997
-*************** output_move_double (operands)
-*** 1344,1369 ****
-       do them in the other order.
-  
-!      RMS says "This happens only for registers;
-!      such overlap can't happen in memory unless the user explicitly
-!      sets it up, and that is an undefined circumstance."
-! 
-!      but it happens on the HP-PA when loading parameter registers,
-!      so I am going to define that circumstance, and make it work
-!      as expected.  */
-  
-!   if (optype0 == REGOP && (optype1 == MEMOP || optype1 == OFFSOP)
-! 	   && reg_overlap_mentioned_p (operands[0], XEXP (operands[1], 0)))
-      {
--       /* XXX THIS PROBABLY DOESN'T WORK.  */
-        /* Do the late half first.  */
-        if (addreg1)
-  	output_asm_insn ("ldo 4(%0),%0", &addreg1);
-        output_asm_insn (singlemove_string (latehalf), latehalf);
-        if (addreg1)
-  	output_asm_insn ("ldo -4(%0),%0", &addreg1);
--       /* Then clobber.  */
-        return singlemove_string (operands);
-      }
-  
-    if (optype0 == REGOP && optype1 == REGOP
-        && REGNO (operands[0]) == REGNO (operands[1]) + 1)
---- 1344,1377 ----
-       do them in the other order.
-  
-!      This can happen in two cases:
-  
-! 	mem -> register where the first half of the destination register
-!  	is the same register used in the memory's address.  Reload
-! 	can create such insns.
-! 
-! 	mem in this case will be either register indirect or register
-! 	indirect plus a valid offset. 
-! 
-! 	register -> register move where REGNO(dst) == REGNO(src + 1)
-! 	someone (Tim/Tege?) claimed this can happen for parameter loads. 
-! 
-!      Handle mem -> register case first.  */
-!   if (optype0 == REGOP
-!       && (optype1 == MEMOP || optype1 == OFFSOP)
-!       && refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1,
-! 			    operands[1], 0))
-      {
-        /* Do the late half first.  */
-        if (addreg1)
-  	output_asm_insn ("ldo 4(%0),%0", &addreg1);
-        output_asm_insn (singlemove_string (latehalf), latehalf);
-+ 
-+       /* Then clobber.  */
-        if (addreg1)
-  	output_asm_insn ("ldo -4(%0),%0", &addreg1);
-        return singlemove_string (operands);
-      }
-  
-+   /* Now handle register -> register case.  */
-    if (optype0 == REGOP && optype1 == REGOP
-        && REGNO (operands[0]) == REGNO (operands[1]) + 1)
-diff -rcp2N gcc-2.7.2.2/config/pa/pa.md g77-new/config/pa/pa.md
-*** gcc-2.7.2.2/config/pa/pa.md	Mon Aug 14 09:00:49 1995
---- g77-new/config/pa/pa.md	Sun Aug 10 18:45:45 1997
-***************
-*** 1828,1832 ****
-  (define_insn ""
-    [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand"
-! 			  "=f,*r,Q,?o,?Q,f,*&r,*&r")
-  	(match_operand:DF 1 "reg_or_0_or_nonsymb_mem_operand"
-  			  "fG,*rG,f,*r,*r,Q,o,Q"))]
---- 1828,1832 ----
-  (define_insn ""
-    [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand"
-! 			  "=f,*r,Q,?o,?Q,f,*r,*r")
-  	(match_operand:DF 1 "reg_or_0_or_nonsymb_mem_operand"
-  			  "fG,*rG,f,*r,*r,Q,o,Q"))]
-***************
-*** 1846,1850 ****
-  (define_insn ""
-    [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand"
-! 			  "=r,?o,?Q,&r,&r")
-  	(match_operand:DF 1 "reg_or_0_or_nonsymb_mem_operand"
-  			  "rG,r,r,o,Q"))]
---- 1846,1850 ----
-  (define_insn ""
-    [(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand"
-! 			  "=r,?o,?Q,r,r")
-  	(match_operand:DF 1 "reg_or_0_or_nonsymb_mem_operand"
-  			  "rG,r,r,o,Q"))]
-***************
-*** 2019,2023 ****
-  (define_insn ""
-    [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand"
-! 			  "=r,o,Q,&r,&r,&r,f,f,*T")
-  	(match_operand:DI 1 "general_operand"
-  			  "rM,r,r,o,Q,i,fM,*T,f"))]
---- 2019,2023 ----
-  (define_insn ""
-    [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand"
-! 			  "=r,o,Q,r,r,r,f,f,*T")
-  	(match_operand:DI 1 "general_operand"
-  			  "rM,r,r,o,Q,i,fM,*T,f"))]
-***************
-*** 2037,2041 ****
-  (define_insn ""
-    [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand"
-! 			  "=r,o,Q,&r,&r,&r")
-  	(match_operand:DI 1 "general_operand"
-  			  "rM,r,r,o,Q,i"))]
---- 2037,2041 ----
-  (define_insn ""
-    [(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand"
-! 			  "=r,o,Q,r,r,r")
-  	(match_operand:DI 1 "general_operand"
-  			  "rM,r,r,o,Q,i"))]
-diff -rcp2N gcc-2.7.2.2/config/rs6000/rs6000.c g77-new/config/rs6000/rs6000.c
-*** gcc-2.7.2.2/config/rs6000/rs6000.c	Thu Feb 20 19:24:14 1997
---- g77-new/config/rs6000/rs6000.c	Sun Aug 10 04:44:05 1997
-*************** input_operand (op, mode)
-*** 724,730 ****
-      return 1;
-  
-!   /* For HImode and QImode, any constant is valid. */
-!   if ((mode == HImode || mode == QImode)
-!       && GET_CODE (op) == CONST_INT)
-      return 1;
-  
---- 724,729 ----
-      return 1;
-  
-!   /* For integer modes, any constant is ok.  */
-!   if (GET_CODE (op) == CONST_INT)
-      return 1;
-  
-diff -rcp2N gcc-2.7.2.2/config/sparc/sol2.h g77-new/config/sparc/sol2.h
-*** gcc-2.7.2.2/config/sparc/sol2.h	Sat Aug 19 17:36:45 1995
---- g77-new/config/sparc/sol2.h	Sun Aug 10 18:45:53 1997
-*************** do {									\
-*** 166,168 ****
-  /* Define for support of TFmode long double and REAL_ARITHMETIC.
-     Sparc ABI says that long double is 4 words.  */
-! #define LONG_DOUBLE_TYPE_SIZE 128
---- 166,168 ----
-  /* Define for support of TFmode long double and REAL_ARITHMETIC.
-     Sparc ABI says that long double is 4 words.  */
-! #define LONG_DOUBLE_TYPE_SIZE 64
-diff -rcp2N gcc-2.7.2.2/config/sparc/sparc.c g77-new/config/sparc/sparc.c
-*** gcc-2.7.2.2/config/sparc/sparc.c	Tue Sep 12 18:32:24 1995
---- g77-new/config/sparc/sparc.c	Sun Aug 10 18:46:03 1997
-*************** Boston, MA 02111-1307, USA.  */
-*** 40,46 ****
-  /* 1 if the caller has placed an "unimp" insn immediately after the call.
-     This is used in v8 code when calling a function that returns a structure.
-!    v9 doesn't have this.  */
-  
-! #define SKIP_CALLERS_UNIMP_P (!TARGET_V9 && current_function_returns_struct)
-  
-  /* Global variables for machine-dependent things.  */
---- 40,51 ----
-  /* 1 if the caller has placed an "unimp" insn immediately after the call.
-     This is used in v8 code when calling a function that returns a structure.
-!    v9 doesn't have this.  Be careful to have this test be the same as that
-!    used on the call.  */
-  
-! #define SKIP_CALLERS_UNIMP_P  \
-! (!TARGET_V9 && current_function_returns_struct			\
-!  && ! integer_zerop (DECL_SIZE (DECL_RESULT (current_function_decl)))	\
-!  && (TREE_CODE (DECL_SIZE (DECL_RESULT (current_function_decl)))	\
-!      == INTEGER_CST))
-  
-  /* Global variables for machine-dependent things.  */
-diff -rcp2N gcc-2.7.2.2/config/sparc/sparc.h g77-new/config/sparc/sparc.h
-*** gcc-2.7.2.2/config/sparc/sparc.h	Thu Feb 20 19:24:15 1997
---- g77-new/config/sparc/sparc.h	Sun Aug 10 18:46:13 1997
-*************** extern int leaf_function;
-*** 1526,1533 ****
-  
-  /* Output assembler code to FILE to increment profiler label # LABELNO
-!    for profiling a function entry.  */
-  
-  #define FUNCTION_PROFILER(FILE, LABELNO)  			\
-    do {								\
-      fputs ("\tsethi %hi(", (FILE));				\
-      ASM_OUTPUT_INTERNAL_LABELREF (FILE, "LP", LABELNO);		\
---- 1526,1540 ----
-  
-  /* Output assembler code to FILE to increment profiler label # LABELNO
-!    for profiling a function entry.
-! 
-!    32 bit sparc uses %g2 as the STATIC_CHAIN_REGNUM which gets clobbered
-!    during profiling so we need to save/restore it around the call to mcount.
-!    We're guaranteed that a save has just been done, and we use the space
-!    allocated for intreg/fpreg value passing.  */
-  
-  #define FUNCTION_PROFILER(FILE, LABELNO)  			\
-    do {								\
-+     if (! TARGET_V9)					\
-+       fputs ("\tst %g2,[%fp-4]\n", FILE);			\
-      fputs ("\tsethi %hi(", (FILE));				\
-      ASM_OUTPUT_INTERNAL_LABELREF (FILE, "LP", LABELNO);		\
-*************** extern int leaf_function;
-*** 1539,1542 ****
---- 1546,1551 ----
-      ASM_OUTPUT_INTERNAL_LABELREF (FILE, "LP", LABELNO);		\
-      fputs ("),%o0,%o0\n", (FILE));				\
-+     if (! TARGET_V9)					\
-+       fputs ("\tld [%fp-4],%g2\n", FILE);			\
-    } while (0)
-  
-diff -rcp2N gcc-2.7.2.2/config/sparc/sparc.md g77-new/config/sparc/sparc.md
-*** gcc-2.7.2.2/config/sparc/sparc.md	Tue Sep 12 18:57:35 1995
---- g77-new/config/sparc/sparc.md	Sun Aug 10 18:46:27 1997
-***************
-*** 4799,4803 ****
-      abort ();
-  
-!  if (GET_CODE (XEXP (operands[0], 0)) == LABEL_REF)
-      {
-        /* This is really a PIC sequence.  We want to represent
---- 4799,4803 ----
-      abort ();
-  
-!   if (GET_CODE (XEXP (operands[0], 0)) == LABEL_REF)
-      {
-        /* This is really a PIC sequence.  We want to represent
-***************
-*** 4809,4824 ****
-  
-        if (! TARGET_V9 && INTVAL (operands[3]) != 0)
-! 	emit_jump_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (3,
-! 				 gen_rtx (SET, VOIDmode, pc_rtx,
-! 					  XEXP (operands[0], 0)),
-! 				 operands[3],
-! 				 gen_rtx (CLOBBER, VOIDmode,
-! 					  gen_rtx (REG, Pmode, 15)))));
-        else
-! 	emit_jump_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2,
-! 				 gen_rtx (SET, VOIDmode, pc_rtx,
-! 					  XEXP (operands[0], 0)),
-! 				 gen_rtx (CLOBBER, VOIDmode,
-! 					  gen_rtx (REG, Pmode, 15)))));
-        goto finish_call;
-      }
---- 4809,4828 ----
-  
-        if (! TARGET_V9 && INTVAL (operands[3]) != 0)
-! 	emit_jump_insn
-! 	  (gen_rtx (PARALLEL, VOIDmode,
-! 		    gen_rtvec (3,
-! 			       gen_rtx (SET, VOIDmode, pc_rtx,
-! 					XEXP (operands[0], 0)),
-! 			       GEN_INT (INTVAL (operands[3]) & 0xfff),
-! 			       gen_rtx (CLOBBER, VOIDmode,
-! 					gen_rtx (REG, Pmode, 15)))));
-        else
-! 	emit_jump_insn
-! 	  (gen_rtx (PARALLEL, VOIDmode,
-! 		    gen_rtvec (2,
-! 			       gen_rtx (SET, VOIDmode, pc_rtx,
-! 					XEXP (operands[0], 0)),
-! 			       gen_rtx (CLOBBER, VOIDmode,
-! 					gen_rtx (REG, Pmode, 15)))));
-        goto finish_call;
-      }
-***************
-*** 4839,4852 ****
-  
-    if (! TARGET_V9 && INTVAL (operands[3]) != 0)
-!     emit_call_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (3,
-! 			     gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx),
-! 			     operands[3],
-! 			     gen_rtx (CLOBBER, VOIDmode,
-! 					       gen_rtx (REG, Pmode, 15)))));
-    else
-!     emit_call_insn (gen_rtx (PARALLEL, VOIDmode, gen_rtvec (2,
-! 			     gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx),
-! 			     gen_rtx (CLOBBER, VOIDmode,
-! 					       gen_rtx (REG, Pmode, 15)))));
-  
-   finish_call:
---- 4843,4858 ----
-  
-    if (! TARGET_V9 && INTVAL (operands[3]) != 0)
-!     emit_call_insn
-!       (gen_rtx (PARALLEL, VOIDmode,
-! 		gen_rtvec (3, gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx),
-! 			   GEN_INT (INTVAL (operands[3]) & 0xfff),
-! 			   gen_rtx (CLOBBER, VOIDmode,
-! 				    gen_rtx (REG, Pmode, 15)))));
-    else
-!     emit_call_insn
-!       (gen_rtx (PARALLEL, VOIDmode,
-! 		gen_rtvec (2, gen_rtx (CALL, VOIDmode, fn_rtx, nregs_rtx),
-! 			   gen_rtx (CLOBBER, VOIDmode,
-! 				    gen_rtx (REG, Pmode, 15)))));
-  
-   finish_call:
-***************
-*** 4911,4915 ****
-     (clobber (reg:SI 15))]
-    ;;- Do not use operand 1 for most machines.
-!   "! TARGET_V9 && GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) > 0"
-    "call %a0,%1\;nop\;unimp %2"
-    [(set_attr "type" "call_no_delay_slot")])
---- 4917,4921 ----
-     (clobber (reg:SI 15))]
-    ;;- Do not use operand 1 for most machines.
-!   "! TARGET_V9 && GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 0"
-    "call %a0,%1\;nop\;unimp %2"
-    [(set_attr "type" "call_no_delay_slot")])
-***************
-*** 4923,4927 ****
-     (clobber (reg:SI 15))]
-    ;;- Do not use operand 1 for most machines.
-!   "! TARGET_V9 && GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) > 0"
-    "call %a0,%1\;nop\;unimp %2"
-    [(set_attr "type" "call_no_delay_slot")])
---- 4929,4933 ----
-     (clobber (reg:SI 15))]
-    ;;- Do not use operand 1 for most machines.
-!   "! TARGET_V9 && GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) >= 0"
-    "call %a0,%1\;nop\;unimp %2"
-    [(set_attr "type" "call_no_delay_slot")])
-***************
-*** 5178,5184 ****
-    emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
-    emit_insn (gen_rtx (USE, VOIDmode, static_chain_rtx));
--   emit_insn (gen_rtx (USE, VOIDmode, gen_rtx (REG, Pmode, 8)));
-    /* Return, restoring reg window and jumping to goto handler.  */
-    emit_insn (gen_goto_handler_and_restore ());
-    DONE;
-  }")
---- 5184,5190 ----
-    emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
-    emit_insn (gen_rtx (USE, VOIDmode, static_chain_rtx));
-    /* Return, restoring reg window and jumping to goto handler.  */
-    emit_insn (gen_goto_handler_and_restore ());
-+   emit_barrier ();
-    DONE;
-  }")
-***************
-*** 5192,5200 ****
-  
-  (define_insn "goto_handler_and_restore"
-!   [(unspec_volatile [(const_int 0)] 2)]
-    ""
-    "jmp %%o0+0\;restore"
-    [(set_attr "type" "misc")
-     (set_attr "length" "2")])
-  
-  ;; Special pattern for the FLUSH instruction.
---- 5198,5237 ----
-  
-  (define_insn "goto_handler_and_restore"
-!   [(unspec_volatile [(const_int 0)] 2)
-!    (use (reg:SI 8))]
-    ""
-    "jmp %%o0+0\;restore"
-    [(set_attr "type" "misc")
-     (set_attr "length" "2")])
-+ 
-+ ;; Pattern for use after a setjmp to store FP and the return register
-+ ;; into the stack area.
-+ 
-+ (define_expand "setjmp"
-+   [(const_int 0)]
-+   ""
-+   "
-+ {
-+   if (TARGET_V9)
-+     emit_insn (gen_setjmp_64 ());
-+   else
-+     emit_insn (gen_setjmp_32 ());
-+ 
-+   DONE;
-+ }")
-+ 
-+ (define_expand "setjmp_32"
-+   [(set (mem:SI (plus:SI (reg:SI 14) (const_int 56))) (match_dup 0))
-+    (set (mem:SI (plus:SI (reg:SI 14) (const_int 60))) (reg:SI 31))]
-+   ""
-+   "
-+ { operands[0] = frame_pointer_rtx; }")
-+ 
-+ (define_expand "setjmp_64"
-+   [(set (mem:DI (plus:DI (reg:DI 14) (const_int 112))) (match_dup 0))
-+    (set (mem:DI (plus:DI (reg:DI 14) (const_int 120))) (reg:DI 31))]
-+   ""
-+   "
-+ { operands[0] = frame_pointer_rtx; }")
-  
-  ;; Special pattern for the FLUSH instruction.
-diff -rcp2N gcc-2.7.2.2/config/x-linux g77-new/config/x-linux
-*** gcc-2.7.2.2/config/x-linux	Tue Mar 28 07:43:37 1995
---- g77-new/config/x-linux	Thu Jul 10 20:08:49 1997
-*************** BOOT_CFLAGS = -O $(CFLAGS) -Iinclude
-*** 13,14 ****
---- 13,17 ----
-  # Don't run fixproto
-  STMP_FIXPROTO =
-+ 
-+ # Don't install "assert.h" in gcc. We use the one in glibc.
-+ INSTALL_ASSERT_H =
-diff -rcp2N gcc-2.7.2.2/config/x-linux-aout g77-new/config/x-linux-aout
-*** gcc-2.7.2.2/config/x-linux-aout	Wed Dec 31 19:00:00 1969
---- g77-new/config/x-linux-aout	Thu Jul 10 20:08:49 1997
-***************
-*** 0 ****
---- 1,14 ----
-+ # It is defined in config/xm-linux.h.
-+ # X_CFLAGS = -DPOSIX
-+ 
-+ # The following is needed when compiling stages 2 and 3 because gcc's
-+ # limits.h must be picked up before /usr/include/limits.h.  This is because
-+ # each does an #include_next of the other if the other hasn't been included.
-+ # /usr/include/limits.h loses if it gets found first because /usr/include is
-+ # at the end of the search order.  When a new version of gcc is released,
-+ # gcc's limits.h hasn't been installed yet and hence isn't found.
-+ 
-+ BOOT_CFLAGS = -O $(CFLAGS) -Iinclude
-+ 
-+ # Don't run fixproto
-+ STMP_FIXPROTO =
-diff -rcp2N gcc-2.7.2.2/config.guess g77-new/config.guess
-*** gcc-2.7.2.2/config.guess	Thu Feb 20 19:24:32 1997
---- g77-new/config.guess	Thu Jul 10 20:08:50 1997
-*************** trap 'rm -f dummy.c dummy.o dummy; exit 
-*** 52,63 ****
-  
-  case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
--     alpha:OSF1:V*:*)
-- 	# After 1.2, OSF1 uses "V1.3" for uname -r.
-- 	echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^V//'`
-- 	exit 0 ;;
-      alpha:OSF1:*:*)
-  	# 1.2 uses "1.2" for uname -r.
-! 	echo alpha-dec-osf${UNAME_RELEASE}
-!         exit 0 ;;
-      21064:Windows_NT:50:3)
-  	echo alpha-dec-winnt3.5
---- 52,62 ----
-  
-  case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-      alpha:OSF1:*:*)
-+ 	# A Vn.n version is a released version.
-+ 	# A Tn.n version is a released field test version.
-+ 	# A Xn.n version is an unreleased experimental baselevel.
-  	# 1.2 uses "1.2" for uname -r.
-! 	echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//'`
-! 	exit 0 ;;
-      21064:Windows_NT:50:3)
-  	echo alpha-dec-winnt3.5
-*************** case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
-*** 154,161 ****
-  	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-  	exit 0 ;;
-!    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-  	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
-  	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
-!     i[34]86:AIX:*:*)
-  	echo i386-ibm-aix
-  	exit 0 ;;
---- 153,160 ----
-  	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-  	exit 0 ;;
-!     ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-  	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
-  	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
-!     i?86:AIX:*:*)
-  	echo i386-ibm-aix
-  	exit 0 ;;
-*************** EOF
-*** 220,224 ****
-  	    9000/31? )            HP_ARCH=m68000 ;;
-  	    9000/[34]?? )         HP_ARCH=m68k ;;
-! 	    9000/7?? | 9000/8?[79] ) HP_ARCH=hppa1.1 ;;
-  	    9000/8?? )            HP_ARCH=hppa1.0 ;;
-  	esac
---- 219,223 ----
-  	    9000/31? )            HP_ARCH=m68000 ;;
-  	    9000/[34]?? )         HP_ARCH=m68k ;;
-! 	    9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;;
-  	    9000/8?? )            HP_ARCH=hppa1.0 ;;
-  	esac
-*************** EOF
-*** 304,308 ****
-  	echo m68k-hp-netbsd${UNAME_RELEASE}
-  	exit 0 ;;
-!     i[34]86:BSD/386:*:* | *:BSD/OS:*:*)
-  	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-  	exit 0 ;;
---- 303,307 ----
-  	echo m68k-hp-netbsd${UNAME_RELEASE}
-  	exit 0 ;;
-!     i?86:BSD/386:*:* | *:BSD/OS:*:*)
-  	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-  	exit 0 ;;
-*************** EOF
-*** 314,318 ****
-  	exit 0 ;;
-      *:GNU:*:*)
-! 	echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-  	exit 0 ;;
-      *:Linux:*:*)
---- 313,317 ----
-  	exit 0 ;;
-      *:GNU:*:*)
-! 	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-  	exit 0 ;;
-      *:Linux:*:*)
-*************** EOF
-*** 320,330 ****
-  	# first see if it will tell us.
-  	ld_help_string=`ld --help 2>&1`
-! #	if echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: elf_i[345]86"; then
-  #	  echo "${UNAME_MACHINE}-unknown-linux" ; exit 0
-! 	if echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: i[345]86linux"; then
-  	  echo "${UNAME_MACHINE}-unknown-linuxaout" ; exit 0
-! 	elif echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: i[345]86coff"; then
-  	  echo "${UNAME_MACHINE}-unknown-linuxcoff" ; exit 0
-  	elif test "${UNAME_MACHINE}" = "alpha" ; then
-  	  echo alpha-unknown-linux ; exit 0
-  	else
---- 319,333 ----
-  	# first see if it will tell us.
-  	ld_help_string=`ld --help 2>&1`
-! #	if echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: elf_i?86"; then
-  #	  echo "${UNAME_MACHINE}-unknown-linux" ; exit 0
-! 	if echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: i?86linux"; then
-  	  echo "${UNAME_MACHINE}-unknown-linuxaout" ; exit 0
-! 	elif echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: i?86coff"; then
-  	  echo "${UNAME_MACHINE}-unknown-linuxcoff" ; exit 0
-  	elif test "${UNAME_MACHINE}" = "alpha" ; then
-+ 	  as_version_string=`as --version 2>&1`
-+ 	  if echo $as_version_string | grep >/dev/null 2>&1 " version 2.6 "; then
-+ 	    echo alpha-unknown-linuxoldas ; exit 0
-+ 	  fi
-  	  echo alpha-unknown-linux ; exit 0
-  	else
-*************** EOF
-*** 363,370 ****
-  # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions
-  # are messed up and put the nodename in both sysname and nodename.
-!     i[34]86:DYNIX/ptx:4*:*)
-  	echo i386-sequent-sysv4
-  	exit 0 ;;
-!     i[34]86:*:4.*:* | i[34]86:SYSTEM_V:4.*:*)
-  	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-  		echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
---- 366,373 ----
-  # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions
-  # are messed up and put the nodename in both sysname and nodename.
-!     i?86:DYNIX/ptx:4*:*)
-  	echo i386-sequent-sysv4
-  	exit 0 ;;
-!     i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
-  	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-  		echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
-*************** EOF
-*** 373,377 ****
-  	fi
-  	exit 0 ;;
-!     i[34]86:*:3.2:*)
-  	if test -f /usr/options/cb.name; then
-  		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
---- 376,380 ----
-  	fi
-  	exit 0 ;;
-!     i?86:*:3.2:*)
-  	if test -f /usr/options/cb.name; then
-  		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-*************** EOF
-*** 380,383 ****
---- 383,388 ----
-  		UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
-  		(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
-+ 		(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
-+ 			&& UNAME_MACHINE=i586
-  		echo ${UNAME_MACHINE}-unknown-sco$UNAME_REL
-  	else
-*************** EOF
-*** 402,406 ****
-  	echo m68010-convergent-sysv
-  	exit 0 ;;
-!     M680[234]0:*:R3V[567]*:*)
-  	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
-      3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0)
---- 407,411 ----
-  	echo m68010-convergent-sysv
-  	exit 0 ;;
-!     M68*:*:R3V[567]*:*)
-  	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
-      3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0)
-*************** EOF
-*** 410,414 ****
-          uname -p 2>/dev/null | grep 86 >/dev/null \
-            && echo i486-ncr-sysv4 && exit 0 ;;
-!     m680[234]0:LynxOS:2.[23]*:*)
-  	echo m68k-lynx-lynxos${UNAME_RELEASE}
-  	exit 0 ;;
---- 415,419 ----
-          uname -p 2>/dev/null | grep 86 >/dev/null \
-            && echo i486-ncr-sysv4 && exit 0 ;;
-!     m68*:LynxOS:2.*:*)
-  	echo m68k-lynx-lynxos${UNAME_RELEASE}
-  	exit 0 ;;
-*************** EOF
-*** 416,426 ****
-  	echo m68k-atari-sysv4
-  	exit 0 ;;
-!     i[34]86:LynxOS:2.[23]*:*)
-  	echo i386-lynx-lynxos${UNAME_RELEASE}
-  	exit 0 ;;
-!     TSUNAMI:LynxOS:2.[23]*:*)
-  	echo sparc-lynx-lynxos${UNAME_RELEASE}
-  	exit 0 ;;
-!     rs6000:LynxOS:2.[23]*:*)
-  	echo rs6000-lynx-lynxos${UNAME_RELEASE}
-  	exit 0 ;;
---- 421,431 ----
-  	echo m68k-atari-sysv4
-  	exit 0 ;;
-!     i?86:LynxOS:2.*:*)
-  	echo i386-lynx-lynxos${UNAME_RELEASE}
-  	exit 0 ;;
-!     TSUNAMI:LynxOS:2.*:*)
-  	echo sparc-lynx-lynxos${UNAME_RELEASE}
-  	exit 0 ;;
-!     rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
-  	echo rs6000-lynx-lynxos${UNAME_RELEASE}
-  	exit 0 ;;
-*************** main ()
-*** 479,483 ****
-    int version;
-    version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-!   printf ("%s-next-nextstep%s\n", __ARCHITECTURE__,  version==2 ? "2" : "3");
-    exit (0);
-  #endif
---- 484,488 ----
-    int version;
-    version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-!   printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-    exit (0);
-  #endif
-diff -rcp2N gcc-2.7.2.2/config.sub g77-new/config.sub
-*** gcc-2.7.2.2/config.sub	Thu Jun 15 17:01:49 1995
---- g77-new/config.sub	Thu Jul 10 20:08:50 1997
-*************** case $basic_machine in
-*** 130,134 ****
-  	# Recognize the basic CPU types without company name.
-  	# Some are omitted here because they have special meanings below.
-! 	tahoe | i[345]86 | i860 | m68k | m68000 | m88k | ns32k | arm \
-  		| arme[lb] | pyramid \
-  		| tron | a29k | 580 | i960 | h8300 | hppa1.0 | hppa1.1 \
---- 130,134 ----
-  	# Recognize the basic CPU types without company name.
-  	# Some are omitted here because they have special meanings below.
-! 	tahoe | i[3456]86 | i860 | m68k | m68000 | m88k | ns32k | arm \
-  		| arme[lb] | pyramid \
-  		| tron | a29k | 580 | i960 | h8300 | hppa1.0 | hppa1.1 \
-*************** case $basic_machine in
-*** 145,149 ****
-  		;;
-  	# Recognize the basic CPU types with company name.
-! 	vax-* | tahoe-* | i[345]86-* | i860-* | m68k-* | m68000-* | m88k-* \
-  	      | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
-  	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \
---- 145,149 ----
-  		;;
-  	# Recognize the basic CPU types with company name.
-! 	vax-* | tahoe-* | i[3456]86-* | i860-* | m68k-* | m68000-* | m88k-* \
-  	      | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
-  	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \
-*************** case $basic_machine in
-*** 309,325 ****
-  		;;
-  # I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-! 	i[345]86v32)
-  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
-  		os=-sysv32
-  		;;
-! 	i[345]86v4*)
-  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
-  		os=-sysv4
-  		;;
-! 	i[345]86v)
-  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
-  		os=-sysv
-  		;;
-! 	i[345]86sol2)
-  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
-  		os=-solaris2
---- 309,325 ----
-  		;;
-  # I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-! 	i[3456]86v32)
-  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
-  		os=-sysv32
-  		;;
-! 	i[3456]86v4*)
-  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
-  		os=-sysv4
-  		;;
-! 	i[3456]86v)
-  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
-  		os=-sysv
-  		;;
-! 	i[3456]86sol2)
-  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
-  		os=-solaris2
-diff -rcp2N gcc-2.7.2.2/configure g77-new/configure
-*** gcc-2.7.2.2/configure	Thu Feb 20 19:24:33 1997
---- g77-new/configure	Sun Aug 10 18:46:31 1997
-*************** exec_prefix='$(prefix)'
-*** 82,85 ****
---- 82,86 ----
-  # The default g++ include directory is $(libdir)/g++-include.
-  gxx_include_dir='$(libdir)/g++-include'
-+ #gxx_include_dir='$(exec_prefix)/include/g++'
-  
-  # Default --program-transform-name to nothing.
-*************** for machine in $canon_build $canon_host 
-*** 548,551 ****
---- 549,578 ----
-  		use_collect2=yes
-  		;;
-+ 	alpha-*-linux*oldas*)
-+ 		tm_file=alpha/linux.h
-+ 		tmake_file=alpha/t-linux
-+ 		xmake_file=alpha/x-linux
-+ 		fixincludes=Makefile.in
-+ 		xm_file=alpha/xm-linux.h
-+ 		gas=yes gnu_ld=yes
-+ 		;;
-+ 	alpha-*-linux*ecoff*)
-+ 		tm_file=alpha/linux.h
-+ 		tmake_file=alpha/t-linux
-+ 		xmake_file=alpha/x-linux
-+ 		fixincludes=Makefile.in
-+ 		xm_file=alpha/xm-linux.h
-+ 		extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
-+ 		gas=yes gnu_ld=yes
-+ 		;;
-+ 	alpha-*-linux*)
-+                 tm_file=alpha/elf.h
-+                 tmake_file=alpha/t-linux
-+                 xmake_file=alpha/x-linux
-+                 fixincludes=Makefile.in
-+                 xm_file=alpha/xm-linux.h
-+                 extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
-+                 gas=yes gnu_ld=yes
-+                 ;;
-  	alpha-dec-osf[23456789]*)
-  		tm_file=alpha/osf2.h
-*************** for machine in $canon_build $canon_host 
-*** 985,989 ****
-  		cpu_type=i386		# with a.out format using pre BFD linkers
-  		xm_file=i386/xm-linux.h
-! 		xmake_file=x-linux
-  		tm_file=i386/linux-oldld.h
-  		fixincludes=Makefile.in # The headers are ok already.
---- 1012,1016 ----
-  		cpu_type=i386		# with a.out format using pre BFD linkers
-  		xm_file=i386/xm-linux.h
-! 		xmake_file=x-linux-aout
-  		tm_file=i386/linux-oldld.h
-  		fixincludes=Makefile.in # The headers are ok already.
-*************** for machine in $canon_build $canon_host 
-*** 994,998 ****
-  		cpu_type=i386		# with a.out format
-  		xm_file=i386/xm-linux.h
-! 		xmake_file=x-linux
-  		tm_file=i386/linux-aout.h
-  		fixincludes=Makefile.in # The headers are ok already.
---- 1021,1025 ----
-  		cpu_type=i386		# with a.out format
-  		xm_file=i386/xm-linux.h
-! 		xmake_file=x-linux-aout
-  		tm_file=i386/linux-aout.h
-  		fixincludes=Makefile.in # The headers are ok already.
-*************** for machine in $canon_build $canon_host 
-*** 1003,1007 ****
-  		cpu_type=i386		# with ELF format, using GNU libc v1.
-  		xm_file=i386/xm-linux.h
-! 		xmake_file=x-linux
-  		tmake_file=t-linux-libc1
-  		tm_file=i386/linux.h
---- 1030,1034 ----
-  		cpu_type=i386		# with ELF format, using GNU libc v1.
-  		xm_file=i386/xm-linux.h
-! 		xmake_file=x-linux-aout
-  		tmake_file=t-linux-libc1
-  		tm_file=i386/linux.h
-*************** for machine in $canon_build $canon_host 
-*** 1651,1654 ****
---- 1678,1702 ----
-  		use_collect2=yes
-  		;;
-+         mips-sni-sysv4)
-+ 		if [ x$gas = xyes ]
-+ 		then
-+ 			if [ x$stabs = xyes ]
-+ 			then
-+ 				tm_file=mips/iris5gdb.h
-+ 			else
-+ 				tm_file=mips/sni-gas.h
-+ 			fi
-+ 		else
-+ 			tm_file=mips/sni-svr4.h
-+ 		fi
-+                 xm_file=mips/xm-sysv.h
-+                 xmake_file=mips/x-sni-svr4
-+                 tmake_file=mips/t-mips-gas
-+                 if [ x$gnu_ld != xyes ]
-+                 then
-+                         use_collect2=yes
-+                 fi
-+                 broken_install=yes
-+                 ;;
-  	mips-sgi-irix5*)		# SGI System V.4., IRIX 5
-  		if [ x$gas = xyes ]
-*************** MAYBE_TARGET_DEFAULT = -DTARGET_CPU_DEFA
-*** 2980,2984 ****
-  	rm Makefile.sed
-  	echo 's|||' > Makefile.sed
-! 	echo "s|^target=.*$|target=${target}|" >> Makefile.sed
-  	echo "s|^xmake_file=.*$|xmake_file=${dep_host_xmake_file}|" >> Makefile.sed
-  	echo "s|^tmake_file=.*$|tmake_file=${dep_tmake_file}|" >> Makefile.sed
---- 3028,3032 ----
-  	rm Makefile.sed
-  	echo 's|||' > Makefile.sed
-! 	echo "s|^target=.*$|target=${canon_target}|" >> Makefile.sed
-  	echo "s|^xmake_file=.*$|xmake_file=${dep_host_xmake_file}|" >> Makefile.sed
-  	echo "s|^tmake_file=.*$|tmake_file=${dep_tmake_file}|" >> Makefile.sed
-diff -rcp2N gcc-2.7.2.2/cse.c g77-new/cse.c
-*** gcc-2.7.2.2/cse.c	Sun Nov 26 14:47:05 1995
---- g77-new/cse.c	Sun Aug 10 18:46:37 1997
-*************** static struct table_elt *last_jump_equiv
-*** 520,544 ****
-  static int constant_pool_entries_cost;
-  
-- /* Bits describing what kind of values in memory must be invalidated
--    for a particular instruction.  If all three bits are zero,
--    no memory refs need to be invalidated.  Each bit is more powerful
--    than the preceding ones, and if a bit is set then the preceding
--    bits are also set.
-- 
--    Here is how the bits are set:
--    Pushing onto the stack invalidates only the stack pointer,
--    writing at a fixed address invalidates only variable addresses,
--    writing in a structure element at variable address
--      invalidates all but scalar variables,
--    and writing in anything else at variable address invalidates everything.  */
-- 
-- struct write_data
-- {
--   int sp : 1;			/* Invalidate stack pointer. */
--   int var : 1;			/* Invalidate variable addresses.  */
--   int nonscalar : 1;		/* Invalidate all but scalar variables.  */
--   int all : 1;			/* Invalidate all memory refs.  */
-- };
-- 
-  /* Define maximum length of a branch path.  */
-  
---- 520,523 ----
-*************** static void merge_equiv_classes PROTO((s
-*** 626,632 ****
-  				       struct table_elt *));
-  static void invalidate		PROTO((rtx, enum machine_mode));
-  static void remove_invalid_refs	PROTO((int));
-  static void rehash_using_reg	PROTO((rtx));
-! static void invalidate_memory	PROTO((struct write_data *));
-  static void invalidate_for_call	PROTO((void));
-  static rtx use_related_value	PROTO((rtx, struct table_elt *));
---- 605,612 ----
-  				       struct table_elt *));
-  static void invalidate		PROTO((rtx, enum machine_mode));
-+ static int cse_rtx_varies_p	PROTO((rtx));
-  static void remove_invalid_refs	PROTO((int));
-  static void rehash_using_reg	PROTO((rtx));
-! static void invalidate_memory	PROTO((void));
-  static void invalidate_for_call	PROTO((void));
-  static rtx use_related_value	PROTO((rtx, struct table_elt *));
-*************** static void set_nonvarying_address_compo
-*** 638,644 ****
-  						     HOST_WIDE_INT *));
-  static int refers_to_p		PROTO((rtx, rtx));
-- static int refers_to_mem_p	PROTO((rtx, rtx, HOST_WIDE_INT,
-- 				       HOST_WIDE_INT));
-- static int cse_rtx_addr_varies_p PROTO((rtx));
-  static rtx canon_reg		PROTO((rtx, rtx));
-  static void find_best_addr	PROTO((rtx, rtx *));
---- 618,621 ----
-*************** static void record_jump_cond	PROTO((enum
-*** 656,661 ****
-  				       rtx, rtx, int));
-  static void cse_insn		PROTO((rtx, int));
-! static void note_mem_written	PROTO((rtx, struct write_data *));
-! static void invalidate_from_clobbers PROTO((struct write_data *, rtx));
-  static rtx cse_process_notes	PROTO((rtx, rtx));
-  static void cse_around_loop	PROTO((rtx));
---- 633,638 ----
-  				       rtx, rtx, int));
-  static void cse_insn		PROTO((rtx, int));
-! static int note_mem_written	PROTO((rtx));
-! static void invalidate_from_clobbers PROTO((rtx));
-  static rtx cse_process_notes	PROTO((rtx, rtx));
-  static void cse_around_loop	PROTO((rtx));
-*************** invalidate (x, full_mode)
-*** 1512,1517 ****
-    register int i;
-    register struct table_elt *p;
--   rtx base;
--   HOST_WIDE_INT start, end;
-  
-    /* If X is a register, dependencies on its contents
---- 1489,1492 ----
-*************** invalidate (x, full_mode)
-*** 1605,1611 ****
-      full_mode = GET_MODE (x);
-  
--   set_nonvarying_address_components (XEXP (x, 0), GET_MODE_SIZE (full_mode),
-- 				     &base, &start, &end);
-- 
-    for (i = 0; i < NBUCKETS; i++)
-      {
---- 1580,1583 ----
-*************** invalidate (x, full_mode)
-*** 1614,1618 ****
-  	{
-  	  next = p->next_same_hash;
-! 	  if (refers_to_mem_p (p->exp, base, start, end))
-  	    remove_from_table (p, i);
-  	}
---- 1586,1594 ----
-  	{
-  	  next = p->next_same_hash;
-! 	  /* Invalidate ASM_OPERANDS which reference memory (this is easier
-! 	     than checking all the aliases).  */
-! 	  if (p->in_memory
-! 	      && (GET_CODE (p->exp) != MEM
-! 		  || true_dependence (x, full_mode, p->exp, cse_rtx_varies_p)))
-  	    remove_from_table (p, i);
-  	}
-*************** rehash_using_reg (x)
-*** 1695,1722 ****
-  }
-  
-- /* Remove from the hash table all expressions that reference memory,
--    or some of them as specified by *WRITES.  */
-- 
-- static void
-- invalidate_memory (writes)
--      struct write_data *writes;
-- {
--   register int i;
--   register struct table_elt *p, *next;
--   int all = writes->all;
--   int nonscalar = writes->nonscalar;
-- 
--   for (i = 0; i < NBUCKETS; i++)
--     for (p = table[i]; p; p = next)
--       {
-- 	next = p->next_same_hash;
-- 	if (p->in_memory
-- 	    && (all
-- 		|| (nonscalar && p->in_struct)
-- 		|| cse_rtx_addr_varies_p (p->exp)))
-- 	  remove_from_table (p, i);
--       }
-- }
-- 
-  /* Remove from the hash table any expression that is a call-clobbered
-     register.  Also update their TICK values.  */
---- 1671,1674 ----
-*************** invalidate_for_call ()
-*** 1756,1759 ****
---- 1708,1717 ----
-  	  next = p->next_same_hash;
-  
-+ 	  if (p->in_memory)
-+ 	    {
-+ 	      remove_from_table (p, hash);
-+ 	      continue;
-+ 	    }
-+ 
-  	  if (GET_CODE (p->exp) != REG
-  	      || REGNO (p->exp) >= FIRST_PSEUDO_REGISTER)
-*************** canon_hash (x, mode)
-*** 1946,1950 ****
-  	  return 0;
-  	}
-!       if (! RTX_UNCHANGING_P (x))
-  	{
-  	  hash_arg_in_memory = 1;
---- 1904,1908 ----
-  	  return 0;
-  	}
-!       if (! RTX_UNCHANGING_P (x) || FIXED_BASE_PLUS_P (XEXP (x, 0)))
-  	{
-  	  hash_arg_in_memory = 1;
-*************** set_nonvarying_address_components (addr,
-*** 2395,2477 ****
-  }
-  
-! /* Return 1 iff any subexpression of X refers to memory
-!    at an address of BASE plus some offset
-!    such that any of the bytes' offsets fall between START (inclusive)
-!    and END (exclusive).
-! 
-!    The value is undefined if X is a varying address (as determined by
-!    cse_rtx_addr_varies_p).  This function is not used in such cases.
-! 
-!    When used in the cse pass, `qty_const' is nonzero, and it is used
-!    to treat an address that is a register with a known constant value
-!    as if it were that constant value.
-!    In the loop pass, `qty_const' is zero, so this is not done.  */
-! 
-! static int
-! refers_to_mem_p (x, base, start, end)
-!      rtx x, base;
-!      HOST_WIDE_INT start, end;
-! {
-!   register HOST_WIDE_INT i;
-!   register enum rtx_code code;
-!   register char *fmt;
-! 
-!  repeat:
-!   if (x == 0)
-!     return 0;
-! 
-!   code = GET_CODE (x);
-!   if (code == MEM)
-!     {
-!       register rtx addr = XEXP (x, 0);	/* Get the address.  */
-!       rtx mybase;
-!       HOST_WIDE_INT mystart, myend;
-! 
-!       set_nonvarying_address_components (addr, GET_MODE_SIZE (GET_MODE (x)),
-! 					 &mybase, &mystart, &myend);
-! 
-! 
-!       /* refers_to_mem_p is never called with varying addresses. 
-! 	 If the base addresses are not equal, there is no chance
-! 	 of the memory addresses conflicting.  */
-!       if (! rtx_equal_p (mybase, base))
-! 	return 0;
-! 
-!       return myend > start && mystart < end;
-!     }
-! 
-!   /* X does not match, so try its subexpressions.  */
-! 
-!   fmt = GET_RTX_FORMAT (code);
-!   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
-!     if (fmt[i] == 'e')
-!       {
-! 	if (i == 0)
-! 	  {
-! 	    x = XEXP (x, 0);
-! 	    goto repeat;
-! 	  }
-! 	else
-! 	  if (refers_to_mem_p (XEXP (x, i), base, start, end))
-! 	    return 1;
-!       }
-!     else if (fmt[i] == 'E')
-!       {
-! 	int j;
-! 	for (j = 0; j < XVECLEN (x, i); j++)
-! 	  if (refers_to_mem_p (XVECEXP (x, i, j), base, start, end))
-! 	    return 1;
-!       }
-! 
-!   return 0;
-! }
-! 
-! /* Nonzero if X refers to memory at a varying address;
-     except that a register which has at the moment a known constant value
-     isn't considered variable.  */
-  
-  static int
-! cse_rtx_addr_varies_p (x)
-!      rtx x;
-  {
-    /* We need not check for X and the equivalence class being of the same
---- 2353,2363 ----
-  }
-  
-! /* Nonzero if X, a memory address, refers to a varying address;
-     except that a register which has at the moment a known constant value
-     isn't considered variable.  */
-  
-  static int
-! cse_rtx_varies_p (x)
-!      register rtx x;
-  {
-    /* We need not check for X and the equivalence class being of the same
-*************** cse_rtx_addr_varies_p (x)
-*** 2479,2497 ****
-       doesn't vary in any mode.  */
-  
-!   if (GET_CODE (x) == MEM
-!       && GET_CODE (XEXP (x, 0)) == REG
-!       && REGNO_QTY_VALID_P (REGNO (XEXP (x, 0)))
-!       && GET_MODE (XEXP (x, 0)) == qty_mode[reg_qty[REGNO (XEXP (x, 0))]]
-!       && qty_const[reg_qty[REGNO (XEXP (x, 0))]] != 0)
-      return 0;
-  
-!   if (GET_CODE (x) == MEM
-!       && GET_CODE (XEXP (x, 0)) == PLUS
-!       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
-!       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
-!       && REGNO_QTY_VALID_P (REGNO (XEXP (XEXP (x, 0), 0)))
-!       && (GET_MODE (XEXP (XEXP (x, 0), 0))
-! 	  == qty_mode[reg_qty[REGNO (XEXP (XEXP (x, 0), 0))]])
-!       && qty_const[reg_qty[REGNO (XEXP (XEXP (x, 0), 0))]])
-      return 0;
-  
---- 2365,2381 ----
-       doesn't vary in any mode.  */
-  
-!   if (GET_CODE (x) == REG
-!       && REGNO_QTY_VALID_P (REGNO (x))
-!       && GET_MODE (x) == qty_mode[reg_qty[REGNO (x)]]
-!       && qty_const[reg_qty[REGNO (x)]] != 0)
-      return 0;
-  
-!   if (GET_CODE (x) == PLUS
-!       && GET_CODE (XEXP (x, 1)) == CONST_INT
-!       && GET_CODE (XEXP (x, 0)) == REG
-!       && REGNO_QTY_VALID_P (REGNO (XEXP (x, 0)))
-!       && (GET_MODE (XEXP (x, 0))
-! 	  == qty_mode[reg_qty[REGNO (XEXP (x, 0))]])
-!       && qty_const[reg_qty[REGNO (XEXP (x, 0))]])
-      return 0;
-  
-*************** cse_rtx_addr_varies_p (x)
-*** 2501,2519 ****
-       load fp minus a constant into a register, then a MEM which is the
-       sum of the two `constant' registers.  */
-!   if (GET_CODE (x) == MEM
-!       && GET_CODE (XEXP (x, 0)) == PLUS
-!       && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
-!       && GET_CODE (XEXP (XEXP (x, 0), 1)) == REG
-!       && REGNO_QTY_VALID_P (REGNO (XEXP (XEXP (x, 0), 0)))
-!       && (GET_MODE (XEXP (XEXP (x, 0), 0))
-! 	  == qty_mode[reg_qty[REGNO (XEXP (XEXP (x, 0), 0))]])
-!       && qty_const[reg_qty[REGNO (XEXP (XEXP (x, 0), 0))]]
-!       && REGNO_QTY_VALID_P (REGNO (XEXP (XEXP (x, 0), 1)))
-!       && (GET_MODE (XEXP (XEXP (x, 0), 1))
-! 	  == qty_mode[reg_qty[REGNO (XEXP (XEXP (x, 0), 1))]])
-!       && qty_const[reg_qty[REGNO (XEXP (XEXP (x, 0), 1))]])
-      return 0;
-  
-!   return rtx_addr_varies_p (x);
-  }
-  
---- 2385,2402 ----
-       load fp minus a constant into a register, then a MEM which is the
-       sum of the two `constant' registers.  */
-!   if (GET_CODE (x) == PLUS
-!       && GET_CODE (XEXP (x, 0)) == REG
-!       && GET_CODE (XEXP (x, 1)) == REG
-!       && REGNO_QTY_VALID_P (REGNO (XEXP (x, 0)))
-!       && (GET_MODE (XEXP (x, 0))
-! 	  == qty_mode[reg_qty[REGNO (XEXP (x, 0))]])
-!       && qty_const[reg_qty[REGNO (XEXP (x, 0))]]
-!       && REGNO_QTY_VALID_P (REGNO (XEXP (x, 1)))
-!       && (GET_MODE (XEXP (x, 1))
-! 	  == qty_mode[reg_qty[REGNO (XEXP (x, 1))]])
-!       && qty_const[reg_qty[REGNO (XEXP (x, 1))]])
-      return 0;
-  
-!   return rtx_varies_p (x);
-  }
-  
-*************** cse_insn (insn, in_libcall_block)
-*** 6105,6110 ****
-    rtx this_insn_cc0 = 0;
-    enum machine_mode this_insn_cc0_mode;
--   struct write_data writes_memory;
--   static struct write_data init = {0, 0, 0, 0};
-  
-    rtx src_eqv = 0;
---- 5988,5991 ----
-*************** cse_insn (insn, in_libcall_block)
-*** 6118,6122 ****
-  
-    this_insn = insn;
--   writes_memory = init;
-  
-    /* Find all the SETs and CLOBBERs in this instruction.
---- 5999,6002 ----
-*************** cse_insn (insn, in_libcall_block)
-*** 6220,6232 ****
-  	  else if (GET_CODE (y) == CLOBBER)
-  	    {
-! 	      /* If we clobber memory, take note of that,
-! 		 and canon the address.
-  		 This does nothing when a register is clobbered
-  		 because we have already invalidated the reg.  */
-  	      if (GET_CODE (XEXP (y, 0)) == MEM)
-! 		{
-! 		  canon_reg (XEXP (y, 0), NULL_RTX);
-! 		  note_mem_written (XEXP (y, 0), &writes_memory);
-! 		}
-  	    }
-  	  else if (GET_CODE (y) == USE
---- 6100,6108 ----
-  	  else if (GET_CODE (y) == CLOBBER)
-  	    {
-! 	      /* If we clobber memory, canon the address.
-  		 This does nothing when a register is clobbered
-  		 because we have already invalidated the reg.  */
-  	      if (GET_CODE (XEXP (y, 0)) == MEM)
-! 		canon_reg (XEXP (y, 0), NULL_RTX);
-  	    }
-  	  else if (GET_CODE (y) == USE
-*************** cse_insn (insn, in_libcall_block)
-*** 6247,6254 ****
-      {
-        if (GET_CODE (XEXP (x, 0)) == MEM)
-! 	{
-! 	  canon_reg (XEXP (x, 0), NULL_RTX);
-! 	  note_mem_written (XEXP (x, 0), &writes_memory);
-! 	}
-      }
-  
---- 6123,6127 ----
-      {
-        if (GET_CODE (XEXP (x, 0)) == MEM)
-! 	canon_reg (XEXP (x, 0), NULL_RTX);
-      }
-  
-*************** cse_insn (insn, in_libcall_block)
-*** 6674,6678 ****
-  	}
-  #endif /* LOAD_EXTEND_OP */
-!  
-        if (src == src_folded)
-          src_folded = 0;
---- 6547,6551 ----
-  	}
-  #endif /* LOAD_EXTEND_OP */
-! 
-        if (src == src_folded)
-          src_folded = 0;
-*************** cse_insn (insn, in_libcall_block)
-*** 6860,6864 ****
-  		       || (GET_CODE (src_folded) != MEM
-  			   && ! src_folded_force_flag))
-! 		   && GET_MODE_CLASS (mode) != MODE_CC)
-  	    {
-  	      src_folded_force_flag = 1;
---- 6733,6738 ----
-  		       || (GET_CODE (src_folded) != MEM
-  			   && ! src_folded_force_flag))
-! 		   && GET_MODE_CLASS (mode) != MODE_CC
-! 		   && mode != VOIDmode)
-  	    {
-  	      src_folded_force_flag = 1;
-*************** cse_insn (insn, in_libcall_block)
-*** 6983,6993 ****
-        if (GET_CODE (dest) == MEM)
-  	{
-  	  dest = fold_rtx (dest, insn);
-- 
-- 	  /* Decide whether we invalidate everything in memory,
-- 	     or just things at non-fixed places.
-- 	     Writing a large aggregate must invalidate everything
-- 	     because we don't know how long it is.  */
-- 	  note_mem_written (dest, &writes_memory);
-  	}
-  
---- 6857,6869 ----
-        if (GET_CODE (dest) == MEM)
-  	{
-+ #ifdef PUSH_ROUNDING
-+ 	  /* Stack pushes invalidate the stack pointer.  */
-+ 	  rtx addr = XEXP (dest, 0);
-+ 	  if ((GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == PRE_INC
-+ 	       || GET_CODE (addr) == POST_DEC || GET_CODE (addr) == POST_INC)
-+ 	      && XEXP (addr, 0) == stack_pointer_rtx)
-+ 	    invalidate (stack_pointer_rtx, Pmode);
-+ #endif
-  	  dest = fold_rtx (dest, insn);
-  	}
-  
-*************** cse_insn (insn, in_libcall_block)
-*** 7234,7238 ****
-        sets[i].src_elt = src_eqv_elt;
-  
-!   invalidate_from_clobbers (&writes_memory, x);
-  
-    /* Some registers are invalidated by subroutine calls.  Memory is 
---- 7110,7114 ----
-        sets[i].src_elt = src_eqv_elt;
-  
-!   invalidate_from_clobbers (x);
-  
-    /* Some registers are invalidated by subroutine calls.  Memory is 
-*************** cse_insn (insn, in_libcall_block)
-*** 7241,7248 ****
-    if (GET_CODE (insn) == CALL_INSN)
-      {
--       static struct write_data everything = {0, 1, 1, 1};
-- 
-        if (! CONST_CALL_P (insn))
-! 	invalidate_memory (&everything);
-        invalidate_for_call ();
-      }
---- 7117,7122 ----
-    if (GET_CODE (insn) == CALL_INSN)
-      {
-        if (! CONST_CALL_P (insn))
-! 	invalidate_memory ();
-        invalidate_for_call ();
-      }
-*************** cse_insn (insn, in_libcall_block)
-*** 7265,7270 ****
-  	   we have just done an invalidate_memory that covers even those.  */
-  	if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG
-! 	    || (GET_CODE (dest) == MEM && ! writes_memory.all
-! 		&& ! cse_rtx_addr_varies_p (dest)))
-  	  invalidate (dest, VOIDmode);
-  	else if (GET_CODE (dest) == STRICT_LOW_PART
---- 7139,7143 ----
-  	   we have just done an invalidate_memory that covers even those.  */
-  	if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG
-! 	    || GET_CODE (dest) == MEM)
-  	  invalidate (dest, VOIDmode);
-  	else if (GET_CODE (dest) == STRICT_LOW_PART
-*************** cse_insn (insn, in_libcall_block)
-*** 7359,7363 ****
-  		      sets[i].dest_hash, GET_MODE (dest));
-  	elt->in_memory = (GET_CODE (sets[i].inner_dest) == MEM
-! 			  && ! RTX_UNCHANGING_P (sets[i].inner_dest));
-  
-  	if (elt->in_memory)
---- 7232,7238 ----
-  		      sets[i].dest_hash, GET_MODE (dest));
-  	elt->in_memory = (GET_CODE (sets[i].inner_dest) == MEM
-! 			  && (! RTX_UNCHANGING_P (sets[i].inner_dest)
-! 			      || FIXED_BASE_PLUS_P (XEXP (sets[i].inner_dest,
-! 							  0))));
-  
-  	if (elt->in_memory)
-*************** cse_insn (insn, in_libcall_block)
-*** 7532,7580 ****
-  }
-  
-- /* Store 1 in *WRITES_PTR for those categories of memory ref
--    that must be invalidated when the expression WRITTEN is stored in.
--    If WRITTEN is null, say everything must be invalidated.  */
-- 
-  static void
-! note_mem_written (written, writes_ptr)
-!      rtx written;
-!      struct write_data *writes_ptr;
-! {
-!   static struct write_data everything = {0, 1, 1, 1};
-! 
-!   if (written == 0)
-!     *writes_ptr = everything;
-!   else if (GET_CODE (written) == MEM)
-!     {
-!       /* Pushing or popping the stack invalidates just the stack pointer. */
-!       rtx addr = XEXP (written, 0);
-!       if ((GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == PRE_INC
-! 	   || GET_CODE (addr) == POST_DEC || GET_CODE (addr) == POST_INC)
-! 	  && GET_CODE (XEXP (addr, 0)) == REG
-! 	  && REGNO (XEXP (addr, 0)) == STACK_POINTER_REGNUM)
-! 	{
-! 	  writes_ptr->sp = 1;
-! 	  return;
-! 	}
-!       else if (GET_MODE (written) == BLKmode)
-! 	*writes_ptr = everything;
-!       /* (mem (scratch)) means clobber everything.  */
-!       else if (GET_CODE (addr) == SCRATCH)
-! 	*writes_ptr = everything;
-!       else if (cse_rtx_addr_varies_p (written))
-! 	{
-! 	  /* A varying address that is a sum indicates an array element,
-! 	     and that's just as good as a structure element
-! 	     in implying that we need not invalidate scalar variables.
-! 	     However, we must allow QImode aliasing of scalars, because the
-! 	     ANSI C standard allows character pointers to alias anything.  */
-! 	  if (! ((MEM_IN_STRUCT_P (written)
-! 		  || GET_CODE (XEXP (written, 0)) == PLUS)
-! 		 && GET_MODE (written) != QImode))
-! 	    writes_ptr->all = 1;
-! 	  writes_ptr->nonscalar = 1;
-! 	}
-!       writes_ptr->var = 1;
-      }
-  }
-  
---- 7407,7450 ----
-  }
-  
-  static void
-! invalidate_memory ()
-! {
-!   register int i;
-!   register struct table_elt *p, *next;
-! 
-!   for (i = 0; i < NBUCKETS; i++)
-!     for (p = table[i]; p; p = next)
-!       {
-! 	next = p->next_same_hash;
-! 	if (p->in_memory)
-! 	  remove_from_table (p, i);
-!       }
-! }
-! 
-! static int
-! note_mem_written (mem)
-!      register rtx mem;
-! {
-!   if (mem == 0 || GET_CODE(mem) != MEM )
-!      return 0;
-!   else
-!    {
-!       register rtx addr = XEXP (mem, 0);
-!   /* Pushing or popping the stack invalidates just the stack pointer.  */
-!     if ((GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == PRE_INC
-!        || GET_CODE (addr) == POST_DEC || GET_CODE (addr) == POST_INC)
-!       && GET_CODE (XEXP (addr, 0)) == REG
-!       && REGNO (XEXP (addr, 0)) == STACK_POINTER_REGNUM)
-!     {
-!       if (reg_tick[STACK_POINTER_REGNUM] >= 0)
-! 	reg_tick[STACK_POINTER_REGNUM]++;
-! 
-!       /* This should be *very* rare.  */
-!       if (TEST_HARD_REG_BIT (hard_regs_in_table, STACK_POINTER_REGNUM))
-! 	invalidate (stack_pointer_rtx, VOIDmode);
-!       return 1;
-      }
-+   return 0;
-+   }
-  }
-  
-*************** note_mem_written (written, writes_ptr)
-*** 7584,7612 ****
-     alias with something that is SET or CLOBBERed.
-  
--    W points to the writes_memory for this insn, a struct write_data
--    saying which kinds of memory references must be invalidated.
-     X is the pattern of the insn.  */
-  
-  static void
-! invalidate_from_clobbers (w, x)
-!      struct write_data *w;
-       rtx x;
-  {
--   /* If W->var is not set, W specifies no action.
--      If W->all is set, this step gets all memory refs
--      so they can be ignored in the rest of this function.  */
--   if (w->var)
--     invalidate_memory (w);
-- 
--   if (w->sp)
--     {
--       if (reg_tick[STACK_POINTER_REGNUM] >= 0)
-- 	reg_tick[STACK_POINTER_REGNUM]++;
-- 
--       /* This should be *very* rare.  */
--       if (TEST_HARD_REG_BIT (hard_regs_in_table, STACK_POINTER_REGNUM))
-- 	invalidate (stack_pointer_rtx, VOIDmode);
--     }
-- 
-    if (GET_CODE (x) == CLOBBER)
-      {
---- 7454,7463 ----
-     alias with something that is SET or CLOBBERed.
-  
-     X is the pattern of the insn.  */
-  
-  static void
-! invalidate_from_clobbers (x)
-       rtx x;
-  {
-    if (GET_CODE (x) == CLOBBER)
-      {
-*************** invalidate_from_clobbers (w, x)
-*** 7615,7619 ****
-  	{
-  	  if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG
-! 	      || (GET_CODE (ref) == MEM && ! w->all))
-  	    invalidate (ref, VOIDmode);
-  	  else if (GET_CODE (ref) == STRICT_LOW_PART
---- 7466,7470 ----
-  	{
-  	  if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG
-! 	      || GET_CODE (ref) == MEM)
-  	    invalidate (ref, VOIDmode);
-  	  else if (GET_CODE (ref) == STRICT_LOW_PART
-*************** invalidate_from_clobbers (w, x)
-*** 7631,7643 ****
-  	    {
-  	      rtx ref = XEXP (y, 0);
-! 	      if (ref)
-! 		{
-! 		  if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG
-! 		      || (GET_CODE (ref) == MEM && !w->all))
-! 		    invalidate (ref, VOIDmode);
-! 		  else if (GET_CODE (ref) == STRICT_LOW_PART
-! 			   || GET_CODE (ref) == ZERO_EXTRACT)
-! 		    invalidate (XEXP (ref, 0), GET_MODE (ref));
-! 		}
-  	    }
-  	}
---- 7482,7491 ----
-  	    {
-  	      rtx ref = XEXP (y, 0);
-! 	      if (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG
-! 		  || GET_CODE (ref) == MEM)
-! 		invalidate (ref, VOIDmode);
-! 	      else if (GET_CODE (ref) == STRICT_LOW_PART
-! 		       || GET_CODE (ref) == ZERO_EXTRACT)
-! 		invalidate (XEXP (ref, 0), GET_MODE (ref));
-  	    }
-  	}
-*************** cse_around_loop (loop_start)
-*** 7800,7807 ****
-  }
-  
-- /* Variable used for communications between the next two routines.  */
-- 
-- static struct write_data skipped_writes_memory;
-- 
-  /* Process one SET of an insn that was skipped.  We ignore CLOBBERs
-     since they are done elsewhere.  This function is called via note_stores.  */
---- 7648,7651 ----
-*************** invalidate_skipped_set (dest, set)
-*** 7812,7815 ****
---- 7656,7675 ----
-       rtx dest;
-  {
-+   enum rtx_code code = GET_CODE (dest);
-+   
-+   if (code == MEM
-+       && ! note_mem_written (dest)	/* If this is not a stack push ... */
-+       /* There are times when an address can appear varying and be a PLUS
-+ 	 during this scan when it would be a fixed address were we to know
-+ 	 the proper equivalences.  So invalidate all memory if there is
-+ 	 a BLKmode or nonscalar memory reference or a reference to a
-+ 	 variable address.  */
-+       && (MEM_IN_STRUCT_P (dest) || GET_MODE (dest) == BLKmode
-+ 	  || cse_rtx_varies_p (XEXP (dest, 0))))
-+     {
-+       invalidate_memory ();
-+       return;
-+     }
-+ 
-    if (GET_CODE (set) == CLOBBER
-  #ifdef HAVE_cc0
-*************** invalidate_skipped_set (dest, set)
-*** 7819,7837 ****
-      return;
-  
-!   if (GET_CODE (dest) == MEM)
-!     note_mem_written (dest, &skipped_writes_memory);
-! 
-!   /* There are times when an address can appear varying and be a PLUS
-!      during this scan when it would be a fixed address were we to know
-!      the proper equivalences.  So promote "nonscalar" to be "all".  */
-!   if (skipped_writes_memory.nonscalar)
-!     skipped_writes_memory.all = 1;
-! 
-!   if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG
-!       || (! skipped_writes_memory.all && ! cse_rtx_addr_varies_p (dest)))
-!     invalidate (dest, VOIDmode);
-!   else if (GET_CODE (dest) == STRICT_LOW_PART
-! 	   || GET_CODE (dest) == ZERO_EXTRACT)
-      invalidate (XEXP (dest, 0), GET_MODE (dest));
-  }
-  
---- 7679,7686 ----
-      return;
-  
-!   if (code == STRICT_LOW_PART || code == ZERO_EXTRACT)
-      invalidate (XEXP (dest, 0), GET_MODE (dest));
-+   else if (code == REG || code == SUBREG || code == MEM)
-+     invalidate (dest, VOIDmode);
-  }
-  
-*************** invalidate_skipped_block (start)
-*** 7845,7850 ****
-  {
-    rtx insn;
--   static struct write_data init = {0, 0, 0, 0};
--   static struct write_data everything = {0, 1, 1, 1};
-  
-    for (insn = start; insn && GET_CODE (insn) != CODE_LABEL;
---- 7694,7697 ----
-*************** invalidate_skipped_block (start)
-*** 7854,7867 ****
-  	continue;
-  
--       skipped_writes_memory = init;
-- 
-        if (GET_CODE (insn) == CALL_INSN)
-  	{
-  	  invalidate_for_call ();
-- 	  skipped_writes_memory = everything;
-  	}
-  
-        note_stores (PATTERN (insn), invalidate_skipped_set);
--       invalidate_from_clobbers (&skipped_writes_memory, PATTERN (insn));
-      }
-  }
---- 7701,7712 ----
-  	continue;
-  
-        if (GET_CODE (insn) == CALL_INSN)
-  	{
-+ 	  if (! CONST_CALL_P (insn))
-+ 	    invalidate_memory ();
-  	  invalidate_for_call ();
-  	}
-  
-        note_stores (PATTERN (insn), invalidate_skipped_set);
-      }
-  }
-*************** cse_set_around_loop (x, insn, loop_start
-*** 7913,7920 ****
-  {
-    struct table_elt *src_elt;
--   static struct write_data init = {0, 0, 0, 0};
--   struct write_data writes_memory;
-- 
--   writes_memory = init;
-  
-    /* If this is a SET, see if we can replace SET_SRC, but ignore SETs that
---- 7758,7761 ----
-*************** cse_set_around_loop (x, insn, loop_start
-*** 7976,7991 ****
-  
-    /* Now invalidate anything modified by X.  */
-!   note_mem_written (SET_DEST (x), &writes_memory);
-! 
-!   if (writes_memory.var)
-!     invalidate_memory (&writes_memory);
-! 
-!   /* See comment on similar code in cse_insn for explanation of these tests. */
-    if (GET_CODE (SET_DEST (x)) == REG || GET_CODE (SET_DEST (x)) == SUBREG
-!       || (GET_CODE (SET_DEST (x)) == MEM && ! writes_memory.all
-! 	  && ! cse_rtx_addr_varies_p (SET_DEST (x))))
-      invalidate (SET_DEST (x), VOIDmode);
-    else if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
-! 	   || GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
-      invalidate (XEXP (SET_DEST (x), 0), GET_MODE (SET_DEST (x)));
-  }
---- 7817,7828 ----
-  
-    /* Now invalidate anything modified by X.  */
-!   note_mem_written (SET_DEST (x));
-!   
-!   /* See comment on similar code in cse_insn for explanation of these tests.  */
-    if (GET_CODE (SET_DEST (x)) == REG || GET_CODE (SET_DEST (x)) == SUBREG
-!       || GET_CODE (SET_DEST (x)) == MEM)
-      invalidate (SET_DEST (x), VOIDmode);
-    else if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
-!   	   || GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
-      invalidate (XEXP (SET_DEST (x), 0), GET_MODE (SET_DEST (x)));
-  }
-*************** cse_main (f, nregs, after_loop, file)
-*** 8234,8237 ****
---- 8071,8075 ----
-  
-    init_recog ();
-+   init_alias_analysis ();
-  
-    max_reg = nregs;
-*************** cse_basic_block (from, to, next_branch, 
-*** 8405,8408 ****
---- 8243,8247 ----
-    int to_usage = 0;
-    int in_libcall_block = 0;
-+   int num_insns = 0;
-  
-    /* Each of these arrays is undefined before max_reg, so only allocate
-*************** cse_basic_block (from, to, next_branch, 
-*** 8437,8440 ****
---- 8276,8299 ----
-      {
-        register enum rtx_code code;
-+       int i;
-+       struct table_elt *p, *next;
-+ 
-+       /* If we have processed 1,000 insns, flush the hash table to avoid
-+ 	 extreme quadratic behavior.  */
-+       if (num_insns++ > 1000)
-+ 	{
-+ 	  for (i = 0; i < NBUCKETS; i++)
-+ 	    for (p = table[i]; p; p = next)
-+ 	      {
-+ 		next = p->next_same_hash;
-+ 
-+ 		if (GET_CODE (p->exp) == REG)
-+ 		  invalidate (p->exp, p->mode);
-+ 		else
-+ 		  remove_from_table (p, i);
-+ 	      }
-+ 
-+ 	  num_insns = 0;
-+ 	}
-  
-        /* See if this is a branch that is part of the path.  If so, and it is
-diff -rcp2N gcc-2.7.2.2/dwarfout.c g77-new/dwarfout.c
-*** gcc-2.7.2.2/dwarfout.c	Thu Oct 26 21:40:07 1995
---- g77-new/dwarfout.c	Sun Aug 10 18:47:19 1997
-*************** output_bound_representation (bound, dim_
-*** 1629,1705 ****
-      {
-  
-!       case ERROR_MARK:
-! 	return;
-  
-        /* All fixed-bounds are represented by INTEGER_CST nodes.	 */
-  
-!       case INTEGER_CST:
-! 	ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
-! 				(unsigned) TREE_INT_CST_LOW (bound));
-! 	break;
-! 
-!       /* Dynamic bounds may be represented by NOP_EXPR nodes containing
-! 	 SAVE_EXPR nodes.  */
-! 
-!       case NOP_EXPR:
-! 	bound = TREE_OPERAND (bound, 0);
-! 	/* ... fall thru... */
-! 
-!       case SAVE_EXPR:
-! 	{
-! 	  char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
-! 	  char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
-! 
-! 	  sprintf (begin_label, BOUND_BEGIN_LABEL_FMT,
-! 				current_dienum, dim_num, u_or_l);
-  
-! 	  sprintf (end_label,	BOUND_END_LABEL_FMT,
-! 				current_dienum, dim_num, u_or_l);
-  
-! 	  ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
-! 	  ASM_OUTPUT_LABEL (asm_out_file, begin_label);
-  
-! 	  /* If we are working on a bound for a dynamic dimension in C,
-! 	     the dynamic dimension in question had better have a static
-! 	     (zero) lower bound and a dynamic *upper* bound.  */
-  
-! 	  if (u_or_l != 'u')
-! 	    abort ();
-  
-! 	  /* If optimization is turned on, the SAVE_EXPRs that describe
-! 	     how to access the upper bound values are essentially bogus.
-! 	     They only describe (at best) how to get at these values at
-! 	     the points in the generated code right after they have just
-! 	     been computed.  Worse yet, in the typical case, the upper
-! 	     bound values will not even *be* computed in the optimized
-! 	     code, so these SAVE_EXPRs are entirely bogus.
-! 
-! 	     In order to compensate for this fact, we check here to see
-! 	     if optimization is enabled, and if so, we effectively create
-! 	     an empty location description for the (unknown and unknowable)
-! 	     upper bound.
-! 
-! 	     This should not cause too much trouble for existing (stupid?)
-! 	     debuggers because they have to deal with empty upper bounds
-! 	     location descriptions anyway in order to be able to deal with
-! 	     incomplete array types.
-! 
-! 	     Of course an intelligent debugger (GDB?) should be able to
-! 	     comprehend that a missing upper bound specification in a
-! 	     array type used for a storage class `auto' local array variable
-! 	     indicates that the upper bound is both unknown (at compile-
-! 	     time) and unknowable (at run-time) due to optimization.
-! 	  */
-! 
-! 	  if (! optimize)
-! 	    output_loc_descriptor
-! 	      (eliminate_regs (SAVE_EXPR_RTL (bound), 0, NULL_RTX));
-  
-! 	  ASM_OUTPUT_LABEL (asm_out_file, end_label);
-! 	}
-! 	break;
-  
--       default:
-- 	abort ();
-      }
-  }
---- 1629,1699 ----
-      {
-  
-!     case ERROR_MARK:
-!       return;
-  
-        /* All fixed-bounds are represented by INTEGER_CST nodes.	 */
-  
-!     case INTEGER_CST:
-!       ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
-! 			      (unsigned) TREE_INT_CST_LOW (bound));
-!       break;
-  
-!     default:
-  
-!       /* Dynamic bounds may be represented by NOP_EXPR nodes containing
-! 	 SAVE_EXPR nodes, in which case we can do something, or as
-! 	 an expression, which we cannot represent.  */
-!       {
-! 	char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
-! 	char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
-  
-! 	sprintf (begin_label, BOUND_BEGIN_LABEL_FMT,
-! 		 current_dienum, dim_num, u_or_l);
-  
-! 	sprintf (end_label, BOUND_END_LABEL_FMT,
-! 		 current_dienum, dim_num, u_or_l);
-  
-! 	ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
-! 	ASM_OUTPUT_LABEL (asm_out_file, begin_label);
-! 
-! 	/* If optimization is turned on, the SAVE_EXPRs that describe
-! 	   how to access the upper bound values are essentially bogus.
-! 	   They only describe (at best) how to get at these values at
-! 	   the points in the generated code right after they have just
-! 	   been computed.  Worse yet, in the typical case, the upper
-! 	   bound values will not even *be* computed in the optimized
-! 	   code, so these SAVE_EXPRs are entirely bogus.
-! 
-! 	   In order to compensate for this fact, we check here to see
-! 	   if optimization is enabled, and if so, we effectively create
-! 	   an empty location description for the (unknown and unknowable)
-! 	   upper bound.
-! 
-! 	   This should not cause too much trouble for existing (stupid?)
-! 	   debuggers because they have to deal with empty upper bounds
-! 	   location descriptions anyway in order to be able to deal with
-! 	   incomplete array types.
-! 
-! 	   Of course an intelligent debugger (GDB?) should be able to
-! 	   comprehend that a missing upper bound specification in a
-! 	   array type used for a storage class `auto' local array variable
-! 	   indicates that the upper bound is both unknown (at compile-
-! 	   time) and unknowable (at run-time) due to optimization. */
-! 
-! 	if (! optimize)
-! 	  {
-! 	    while (TREE_CODE (bound) == NOP_EXPR
-! 		   || TREE_CODE (bound) == CONVERT_EXPR)
-! 	      bound = TREE_OPERAND (bound, 0);
-! 
-! 	    if (TREE_CODE (bound) == SAVE_EXPR)
-! 	      output_loc_descriptor
-! 		(eliminate_regs (SAVE_EXPR_RTL (bound), 0, NULL_RTX));
-! 	  }
-  
-! 	ASM_OUTPUT_LABEL (asm_out_file, end_label);
-!       }
-!       break;
-  
-      }
-  }
-*************** type_attribute (type, decl_const, decl_v
-*** 2857,2861 ****
-    register int root_type_modified;
-  
-!   if (TREE_CODE (type) == ERROR_MARK)
-      return;
-  
---- 2851,2855 ----
-    register int root_type_modified;
-  
-!   if (code == ERROR_MARK)
-      return;
-  
-*************** type_attribute (type, decl_const, decl_v
-*** 2864,2869 ****
-       type `void', so this only applies to function return types.  */
-  
-!   if (TREE_CODE (type) == VOID_TYPE)
-      return;
-  
-    root_type_modified = (code == POINTER_TYPE || code == REFERENCE_TYPE
---- 2858,2869 ----
-       type `void', so this only applies to function return types.  */
-  
-!   if (code == VOID_TYPE)
-      return;
-+ 
-+   /* If this is a subtype, find the underlying type.  Eventually,
-+      this should write out the appropriate subtype info.  */
-+   while ((code == INTEGER_TYPE || code == REAL_TYPE)
-+ 	 && TREE_TYPE (type) != 0)
-+     type = TREE_TYPE (type), code = TREE_CODE (type);
-  
-    root_type_modified = (code == POINTER_TYPE || code == REFERENCE_TYPE
-diff -rcp2N gcc-2.7.2.2/emit-rtl.c g77-new/emit-rtl.c
-*** gcc-2.7.2.2/emit-rtl.c	Thu Sep 14 16:09:30 1995
---- g77-new/emit-rtl.c	Sun Aug 10 18:47:08 1997
-*************** max_label_num ()
-*** 545,548 ****
---- 545,565 ----
-  }
-  
-+ /* Identify REG (which may be a CONCAT) as a user register.  */
-+ 
-+ void
-+ mark_user_reg (reg)
-+      rtx reg;
-+ {
-+   if (GET_CODE (reg) == CONCAT)
-+     {
-+       REG_USERVAR_P (XEXP (reg, 0)) = 1;
-+       REG_USERVAR_P (XEXP (reg, 1)) = 1;
-+     }
-+   else if (GET_CODE (reg) == REG)
-+     REG_USERVAR_P (reg) = 1;
-+   else
-+     abort ();
-+ }
-+ 
-  /* Return first label number used in this function (if any were used).  */
-  
-*************** change_address (memref, mode, addr)
-*** 1315,1318 ****
---- 1332,1338 ----
-      addr = memory_address (mode, addr);
-  	
-+   if (rtx_equal_p (addr, XEXP (memref, 0)) && mode == GET_MODE (memref))
-+     return memref;
-+ 
-    new = gen_rtx (MEM, mode, addr);
-    MEM_VOLATILE_P (new) = MEM_VOLATILE_P (memref);
-diff -rcp2N gcc-2.7.2.2/explow.c g77-new/explow.c
-*** gcc-2.7.2.2/explow.c	Thu Jun 15 07:30:10 1995
---- g77-new/explow.c	Sun Aug 10 18:46:30 1997
-*************** convert_memory_address (to_mode, x)
-*** 305,310 ****
---- 305,313 ----
-       rtx x;
-  {
-+   enum machine_mode from_mode = to_mode == ptr_mode ? Pmode : ptr_mode;
-    rtx temp;
-  
-+   /* Here we handle some special cases.  If none of them apply, fall through
-+      to the default case.  */
-    switch (GET_CODE (x))
-      {
-*************** convert_memory_address (to_mode, x)
-*** 321,339 ****
-        return temp;
-  
--     case PLUS:
--     case MULT:
--       return gen_rtx (GET_CODE (x), to_mode, 
-- 		      convert_memory_address (to_mode, XEXP (x, 0)),
-- 		      convert_memory_address (to_mode, XEXP (x, 1)));
-- 
-      case CONST:
-        return gen_rtx (CONST, to_mode, 
-  		      convert_memory_address (to_mode, XEXP (x, 0)));
-  
-!     default:
-!       return convert_modes (to_mode,
-! 			    to_mode == ptr_mode ? Pmode : ptr_mode,
-! 			    x, POINTERS_EXTEND_UNSIGNED);
-      }
-  }
-  #endif
---- 324,348 ----
-        return temp;
-  
-      case CONST:
-        return gen_rtx (CONST, to_mode, 
-  		      convert_memory_address (to_mode, XEXP (x, 0)));
-  
-!     case PLUS:
-!     case MULT:
-!       /* For addition the second operand is a small constant, we can safely
-! 	 permute the converstion and addition operation.  We can always safely
-! 	 permute them if we are making the address narrower.  In addition,
-! 	 always permute the operations if this is a constant.  */
-!       if (GET_MODE_SIZE (to_mode) < GET_MODE_SIZE (from_mode)
-! 	  || (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT
-! 	      && (INTVAL (XEXP (x, 1)) + 20000 < 40000
-! 		  || CONSTANT_P (XEXP (x, 0)))))
-! 	return gen_rtx (GET_CODE (x), to_mode, 
-! 			convert_memory_address (to_mode, XEXP (x, 0)),
-! 			convert_memory_address (to_mode, XEXP (x, 1)));
-      }
-+ 
-+   return convert_modes (to_mode, from_mode,
-+ 			x, POINTERS_EXTEND_UNSIGNED);
-  }
-  #endif
-diff -rcp2N gcc-2.7.2.2/expmed.c g77-new/expmed.c
-*** gcc-2.7.2.2/expmed.c	Thu Jul 13 19:25:37 1995
---- g77-new/expmed.c	Sun Aug 10 18:46:23 1997
-*************** store_bit_field (str_rtx, bitsize, bitnu
-*** 399,402 ****
---- 399,403 ----
-  #ifdef HAVE_insv
-    if (HAVE_insv
-+       && GET_MODE (value) != BLKmode
-        && !(bitsize == 1 && GET_CODE (value) == CONST_INT)
-        /* Ensure insv's size is wide enough for this field.  */
-*************** store_split_bit_field (op0, bitsize, bit
-*** 777,781 ****
-  	     done in extract_bit_field, so that the two calls to
-  	     extract_fixed_bit_field will have comparable arguments.  */
-! 	  if (GET_CODE (value) != MEM)
-  	    total_bits = BITS_PER_WORD;
-  	  else
---- 778,782 ----
-  	     done in extract_bit_field, so that the two calls to
-  	     extract_fixed_bit_field will have comparable arguments.  */
-! 	  if (GET_CODE (value) != MEM || GET_MODE (value) == BLKmode)
-  	    total_bits = BITS_PER_WORD;
-  	  else
-*************** store_split_bit_field (op0, bitsize, bit
-*** 790,797 ****
-  	    /* The args are chosen so that the last part includes the
-  	       lsb.  Give extract_bit_field the value it needs (with
-! 	       endianness compensation) to fetch the piece we want.  */
-! 	    part = extract_fixed_bit_field (word_mode, value, 0, thissize,
-! 					    total_bits - bitsize + bitsdone,
-! 					    NULL_RTX, 1, align);
-  	}
-        else
---- 791,807 ----
-  	    /* The args are chosen so that the last part includes the
-  	       lsb.  Give extract_bit_field the value it needs (with
-! 	       endianness compensation) to fetch the piece we want.
-! 
-! 	       ??? We have no idea what the alignment of VALUE is, so
-! 	       we have to use a guess.  */
-! 	    part
-! 	      = extract_fixed_bit_field
-! 		(word_mode, value, 0, thissize,
-! 		 total_bits - bitsize + bitsdone, NULL_RTX, 1,
-! 		 GET_MODE (value) == VOIDmode
-! 		 ? UNITS_PER_WORD
-! 		 : (GET_MODE (value) == BLKmode
-! 		    ? 1
-! 		    : GET_MODE_ALIGNMENT (GET_MODE (value)) / BITS_PER_UNIT));
-  	}
-        else
-*************** store_split_bit_field (op0, bitsize, bit
-*** 803,808 ****
-  			    & (((HOST_WIDE_INT) 1 << thissize) - 1));
-  	  else
-! 	    part = extract_fixed_bit_field (word_mode, value, 0, thissize,
-! 					    bitsdone, NULL_RTX, 1, align);
-  	}
-  
---- 813,824 ----
-  			    & (((HOST_WIDE_INT) 1 << thissize) - 1));
-  	  else
-! 	    part
-! 	      = extract_fixed_bit_field
-! 		(word_mode, value, 0, thissize, bitsdone, NULL_RTX, 1,
-! 		 GET_MODE (value) == VOIDmode
-! 		 ? UNITS_PER_WORD
-! 		 : (GET_MODE (value) == BLKmode
-! 		    ? 1
-! 		    : GET_MODE_ALIGNMENT (GET_MODE (value)) / BITS_PER_UNIT));
-  	}
-  
-*************** extract_bit_field (str_rtx, bitsize, bit
-*** 876,882 ****
-    rtx spec_target_subreg = 0;
-  
--   if (GET_CODE (str_rtx) == MEM && ! MEM_IN_STRUCT_P (str_rtx))
--     abort ();
-- 
-    /* Discount the part of the structure before the desired byte.
-       We need to know how many bytes are safe to reference after it.  */
---- 892,895 ----
-*************** expand_divmod (rem_flag, code, mode, op0
-*** 3189,3193 ****
-  	   Notice that we compute also the final remainder value here,
-  	   and return the result right away.  */
-! 	if (target == 0)
-  	  target = gen_reg_rtx (compute_mode);
-  
---- 3202,3206 ----
-  	   Notice that we compute also the final remainder value here,
-  	   and return the result right away.  */
-! 	if (target == 0 || GET_MODE (target) != compute_mode)
-  	  target = gen_reg_rtx (compute_mode);
-  
-*************** expand_divmod (rem_flag, code, mode, op0
-*** 3316,3320 ****
-  	       remainder.  Notice that we compute also the final remainder
-  	       value here, and return the result right away.  */
-! 	    if (target == 0)
-  	      target = gen_reg_rtx (compute_mode);
-  
---- 3329,3333 ----
-  	       remainder.  Notice that we compute also the final remainder
-  	       value here, and return the result right away.  */
-! 	    if (target == 0 || GET_MODE (target) != compute_mode)
-  	      target = gen_reg_rtx (compute_mode);
-  
-*************** expand_divmod (rem_flag, code, mode, op0
-*** 3418,3422 ****
-  	       remainder.  Notice that we compute also the final remainder
-  	       value here, and return the result right away.  */
-! 	    if (target == 0)
-  	      target = gen_reg_rtx (compute_mode);
-  	    if (rem_flag)
---- 3431,3435 ----
-  	       remainder.  Notice that we compute also the final remainder
-  	       value here, and return the result right away.  */
-! 	    if (target == 0 || GET_MODE (target) != compute_mode)
-  	      target = gen_reg_rtx (compute_mode);
-  	    if (rem_flag)
-*************** expand_divmod (rem_flag, code, mode, op0
-*** 3602,3605 ****
---- 3615,3621 ----
-    if (quotient == 0)
-      {
-+       if (target && GET_MODE (target) != compute_mode)
-+ 	target = 0;
-+ 
-        if (rem_flag)
-  	{
-*************** expand_divmod (rem_flag, code, mode, op0
-*** 3653,3656 ****
---- 3669,3675 ----
-    if (rem_flag)
-      {
-+       if (target && GET_MODE (target) != compute_mode)
-+ 	target = 0;
-+ 
-        if (quotient == 0)
-  	/* No divide instruction either.  Use library for remainder.  */
-diff -rcp2N gcc-2.7.2.2/expr.c g77-new/expr.c
-*** gcc-2.7.2.2/expr.c	Thu Feb 20 19:24:17 1997
---- g77-new/expr.c	Sun Aug 10 18:47:21 1997
-*************** Boston, MA 02111-1307, USA.  */
-*** 27,30 ****
---- 27,31 ----
-  #include "flags.h"
-  #include "regs.h"
-+ #include "hard-reg-set.h"
-  #include "function.h"
-  #include "insn-flags.h"
-*************** extern int stack_depth;
-*** 139,143 ****
-  extern int max_stack_depth;
-  extern struct obstack permanent_obstack;
-! 
-  
-  static rtx enqueue_insn		PROTO((rtx, rtx));
---- 140,144 ----
-  extern int max_stack_depth;
-  extern struct obstack permanent_obstack;
-! extern rtx arg_pointer_save_area;
-  
-  static rtx enqueue_insn		PROTO((rtx, rtx));
-*************** expand_assignment (to, from, want_value,
-*** 2498,2503 ****
-  
-        push_temp_slots ();
-!       tem = get_inner_reference (to, &bitsize, &bitpos, &offset,
-! 				      &mode1, &unsignedp, &volatilep);
-  
-        /* If we are going to use store_bit_field and extract_bit_field,
---- 2499,2504 ----
-  
-        push_temp_slots ();
-!       tem = get_inner_reference (to, &bitsize, &bitpos, &offset, &mode1,
-! 				 &unsignedp, &volatilep, &alignment);
-  
-        /* If we are going to use store_bit_field and extract_bit_field,
-*************** expand_assignment (to, from, want_value,
-*** 2507,2511 ****
-  	tem = stabilize_reference (tem);
-  
--       alignment = TYPE_ALIGN (TREE_TYPE (tem)) / BITS_PER_UNIT;
-        to_rtx = expand_expr (tem, NULL_RTX, VOIDmode, 0);
-        if (offset != 0)
---- 2508,2511 ----
-*************** expand_assignment (to, from, want_value,
-*** 2518,2529 ****
-  				   gen_rtx (PLUS, ptr_mode, XEXP (to_rtx, 0),
-  					    force_reg (ptr_mode, offset_rtx)));
-- 	  /* If we have a variable offset, the known alignment
-- 	     is only that of the innermost structure containing the field.
-- 	     (Actually, we could sometimes do better by using the
-- 	     align of an element of the innermost array, but no need.)  */
-- 	  if (TREE_CODE (to) == COMPONENT_REF
-- 	      || TREE_CODE (to) == BIT_FIELD_REF)
-- 	    alignment
-- 	      = TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (to, 0))) / BITS_PER_UNIT;
-  	}
-        if (volatilep)
---- 2518,2521 ----
-*************** store_expr (exp, target, want_value)
-*** 2775,2780 ****
-  	 which will often result in some optimizations.  Do the conversion
-  	 in two steps: first change the signedness, if needed, then
-! 	 the extend.  */
-!       if (! want_value)
-  	{
-  	  if (TREE_UNSIGNED (TREE_TYPE (exp))
---- 2767,2775 ----
-  	 which will often result in some optimizations.  Do the conversion
-  	 in two steps: first change the signedness, if needed, then
-! 	 the extend.  But don't do this if the type of EXP is a subtype
-! 	 of something else since then the conversion might involve
-! 	 more than just converting modes.  */
-!       if (! want_value && INTEGRAL_TYPE_P (TREE_TYPE (exp))
-! 	  && TREE_TYPE (TREE_TYPE (exp)) == 0)
-  	{
-  	  if (TREE_UNSIGNED (TREE_TYPE (exp))
-*************** store_constructor (exp, target)
-*** 3071,3074 ****
---- 3066,3077 ----
-  	    }
-  
-+ 	  if (TREE_READONLY (field))
-+ 	    {
-+ 	      if (GET_CODE (to_rtx) == MEM)
-+ 		to_rtx = change_address (to_rtx, GET_MODE (to_rtx),
-+ 					 XEXP (to_rtx, 0));
-+ 	      RTX_UNCHANGING_P (to_rtx) = 1;
-+ 	    }
-+ 
-  	  store_field (to_rtx, bitsize, bitpos, mode, TREE_VALUE (elt),
-  		       /* The alignment of TARGET is
-*************** store_field (target, bitsize, bitpos, mo
-*** 3414,3417 ****
---- 3417,3432 ----
-        rtx temp = expand_expr (exp, NULL_RTX, VOIDmode, 0);
-  
-+       /* If BITSIZE is narrower than the size of the type of EXP
-+ 	 we will be narrowing TEMP.  Normally, what's wanted are the
-+ 	 low-order bits.  However, if EXP's type is a record and this is
-+ 	 big-endian machine, we want the upper BITSIZE bits.  */
-+       if (BYTES_BIG_ENDIAN && GET_MODE_CLASS (GET_MODE (temp)) == MODE_INT
-+ 	  && bitsize < GET_MODE_BITSIZE (GET_MODE (temp))
-+ 	  && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
-+ 	temp = expand_shift (RSHIFT_EXPR, GET_MODE (temp), temp,
-+ 			     size_int (GET_MODE_BITSIZE (GET_MODE (temp))
-+ 				       - bitsize),
-+ 			     temp, 1);
-+ 
-        /* Unless MODE is VOIDmode or BLKmode, convert TEMP to
-  	 MODE.  */
-*************** store_field (target, bitsize, bitpos, mo
-*** 3420,3423 ****
---- 3435,3459 ----
-  	temp = convert_modes (mode, TYPE_MODE (TREE_TYPE (exp)), temp, 1);
-  
-+       /* If the modes of TARGET and TEMP are both BLKmode, both
-+ 	 must be in memory and BITPOS must be aligned on a byte
-+ 	 boundary.  If so, we simply do a block copy.  */
-+       if (GET_MODE (target) == BLKmode && GET_MODE (temp) == BLKmode)
-+ 	{
-+ 	  if (GET_CODE (target) != MEM || GET_CODE (temp) != MEM
-+ 	      || bitpos % BITS_PER_UNIT != 0)
-+ 	    abort ();
-+ 
-+ 	  target = change_address (target, VOIDmode,
-+ 				   plus_constant (XEXP (target, 0),
-+ 						  bitpos / BITS_PER_UNIT));
-+ 
-+ 	  emit_block_move (target, temp,
-+ 			   GEN_INT ((bitsize + BITS_PER_UNIT - 1)
-+ 				    / BITS_PER_UNIT),
-+ 			   1);
-+ 
-+ 	  return value_mode == VOIDmode ? const0_rtx : target;
-+ 	}
-+ 
-        /* Store the value in the bitfield.  */
-        store_bit_field (target, bitsize, bitpos, mode, temp, align, total_size);
-*************** get_inner_unaligned_p (exp)
-*** 3515,3518 ****
---- 3551,3557 ----
-     This offset is in addition to the bit position.
-     If the position is not variable, we store 0 in *POFFSET.
-+    We set *PALIGNMENT to the alignment in bytes of the address that will be
-+    computed.  This is the alignment of the thing we return if *POFFSET
-+    is zero, but can be more less strictly aligned if *POFFSET is nonzero.
-  
-     If any of the extraction expressions is volatile,
-*************** get_inner_unaligned_p (exp)
-*** 3525,3533 ****
-     If the field describes a variable-sized object, *PMODE is set to
-     VOIDmode and *PBITSIZE is set to -1.  An access cannot be made in
-!    this case, but the address of the object can be found.  */
-  
-  tree
-  get_inner_reference (exp, pbitsize, pbitpos, poffset, pmode,
-! 		     punsignedp, pvolatilep)
-       tree exp;
-       int *pbitsize;
---- 3564,3572 ----
-     If the field describes a variable-sized object, *PMODE is set to
-     VOIDmode and *PBITSIZE is set to -1.  An access cannot be made in
-!    this case, but the address of the object can be found.   */
-  
-  tree
-  get_inner_reference (exp, pbitsize, pbitpos, poffset, pmode,
-! 		     punsignedp, pvolatilep, palignment)
-       tree exp;
-       int *pbitsize;
-*************** get_inner_reference (exp, pbitsize, pbit
-*** 3537,3540 ****
---- 3576,3580 ----
-       int *punsignedp;
-       int *pvolatilep;
-+      int *palignment;
-  {
-    tree orig_exp = exp;
-*************** get_inner_reference (exp, pbitsize, pbit
-*** 3542,3545 ****
---- 3582,3586 ----
-    enum machine_mode mode = VOIDmode;
-    tree offset = integer_zero_node;
-+   int alignment = BIGGEST_ALIGNMENT;
-  
-    if (TREE_CODE (exp) == COMPONENT_REF)
-*************** get_inner_reference (exp, pbitsize, pbit
-*** 3599,3607 ****
-  
-  	  *pbitpos += TREE_INT_CST_LOW (constant);
-! 
-! 	  if (var)
-! 	    offset = size_binop (PLUS_EXPR, offset,
-! 				 size_binop (EXACT_DIV_EXPR, var,
-! 					     size_int (BITS_PER_UNIT)));
-  	}
-  
---- 3640,3646 ----
-  
-  	  *pbitpos += TREE_INT_CST_LOW (constant);
-! 	  offset = size_binop (PLUS_EXPR, offset,
-! 			       size_binop (EXACT_DIV_EXPR, var,
-! 					   size_int (BITS_PER_UNIT)));
-  	}
-  
-*************** get_inner_reference (exp, pbitsize, pbit
-*** 3629,3633 ****
-  
-  	  index = fold (build (MULT_EXPR, index_type, index,
-! 			       TYPE_SIZE (TREE_TYPE (exp))));
-  
-  	  if (TREE_CODE (index) == INTEGER_CST
---- 3668,3673 ----
-  
-  	  index = fold (build (MULT_EXPR, index_type, index,
-! 			       convert (index_type,
-! 					TYPE_SIZE (TREE_TYPE (exp)))));
-  
-  	  if (TREE_CODE (index) == INTEGER_CST
-*************** get_inner_reference (exp, pbitsize, pbit
-*** 3652,3666 ****
-        if (TREE_THIS_VOLATILE (exp))
-  	*pvolatilep = 1;
-        exp = TREE_OPERAND (exp, 0);
-      }
-  
-!   /* If this was a bit-field, see if there is a mode that allows direct
-!      access in case EXP is in memory.  */
-!   if (mode == VOIDmode && *pbitsize != 0 && *pbitpos % *pbitsize == 0)
-!     {
-!       mode = mode_for_size (*pbitsize, MODE_INT, 0);
-!       if (mode == BLKmode)
-! 	mode = VOIDmode;
-!     }
-  
-    if (integer_zerop (offset))
---- 3692,3708 ----
-        if (TREE_THIS_VOLATILE (exp))
-  	*pvolatilep = 1;
-+ 
-+       /* If the offset is non-constant already, then we can't assume any
-+ 	 alignment more than the alignment here.  */
-+       if (! integer_zerop (offset))
-+ 	alignment = MIN (alignment, TYPE_ALIGN (TREE_TYPE (exp)));
-+ 
-        exp = TREE_OPERAND (exp, 0);
-      }
-  
-!   if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd')
-!     alignment = MIN (alignment, DECL_ALIGN (exp));
-!   else if (TREE_TYPE (exp) != 0)
-!     alignment = MIN (alignment, TYPE_ALIGN (TREE_TYPE (exp)));
-  
-    if (integer_zerop (offset))
-*************** get_inner_reference (exp, pbitsize, pbit
-*** 3672,3675 ****
---- 3714,3718 ----
-    *pmode = mode;
-    *poffset = offset;
-+   *palignment = alignment / BITS_PER_UNIT;
-    return exp;
-  }
-*************** init_noncopied_parts (lhs, list)
-*** 3812,3820 ****
-  }
-  
-! /* Subroutine of expand_expr: return nonzero iff there is no way that
-     EXP can reference X, which is being modified.  */
-  
-  static int
-! safe_from_p (x, exp)
-       rtx x;
-       tree exp;
---- 3855,3867 ----
-  }
-  
-! static int safe_from_p_count;
-! static int safe_from_p_size;
-! static tree *safe_from_p_rewritten;
-! 
-! /* Subroutine of safe_from_p: return nonzero iff there is no way that
-     EXP can reference X, which is being modified.  */
-  
-  static int
-! safe_from_p_1 (x, exp)
-       rtx x;
-       tree exp;
-*************** safe_from_p (x, exp)
-*** 3822,3825 ****
---- 3869,3873 ----
-    rtx exp_rtl = 0;
-    int i, nops;
-+   int is_save_expr = 0;
-  
-    if (x == 0
-*************** safe_from_p (x, exp)
-*** 3860,3878 ****
-  
-      case 'x':
-!       if (TREE_CODE (exp) == TREE_LIST)
-! 	return ((TREE_VALUE (exp) == 0
-! 		 || safe_from_p (x, TREE_VALUE (exp)))
-! 		&& (TREE_CHAIN (exp) == 0
-! 		    || safe_from_p (x, TREE_CHAIN (exp))));
-!       else
-! 	return 0;
-  
-      case '1':
-!       return safe_from_p (x, TREE_OPERAND (exp, 0));
-  
-      case '2':
-      case '<':
-!       return (safe_from_p (x, TREE_OPERAND (exp, 0))
-! 	      && safe_from_p (x, TREE_OPERAND (exp, 1)));
-  
-      case 'e':
---- 3908,3933 ----
-  
-      case 'x':
-!       switch (TREE_CODE (exp))
-! 	{
-! 	case TREE_LIST:
-! 	  return ((TREE_VALUE (exp) == 0
-! 		   || safe_from_p_1 (x, TREE_VALUE (exp)))
-! 		  && (TREE_CHAIN (exp) == 0
-! 		      || safe_from_p_1 (x, TREE_CHAIN (exp))));
-! 
-! 	case ERROR_MARK:
-! 	  return 1;
-! 
-! 	default:
-! 	  return 0;
-! 	}
-  
-      case '1':
-!       return safe_from_p_1 (x, TREE_OPERAND (exp, 0));
-  
-      case '2':
-      case '<':
-!       return (safe_from_p_1 (x, TREE_OPERAND (exp, 0))
-! 	      && safe_from_p_1 (x, TREE_OPERAND (exp, 1)));
-  
-      case 'e':
-*************** safe_from_p (x, exp)
-*** 3887,3891 ****
-  	case ADDR_EXPR:
-  	  return (staticp (TREE_OPERAND (exp, 0))
-! 		  || safe_from_p (x, TREE_OPERAND (exp, 0)));
-  
-  	case INDIRECT_REF:
---- 3942,3946 ----
-  	case ADDR_EXPR:
-  	  return (staticp (TREE_OPERAND (exp, 0))
-! 		  || safe_from_p_1 (x, TREE_OPERAND (exp, 0)));
-  
-  	case INDIRECT_REF:
-*************** safe_from_p (x, exp)
-*** 3922,3928 ****
-  
-  	case CLEANUP_POINT_EXPR:
-! 	  return safe_from_p (x, TREE_OPERAND (exp, 0));
-  
-  	case SAVE_EXPR:
-  	  exp_rtl = SAVE_EXPR_RTL (exp);
-  	  break;
---- 3977,3984 ----
-  
-  	case CLEANUP_POINT_EXPR:
-! 	  return safe_from_p_1 (x, TREE_OPERAND (exp, 0));
-  
-  	case SAVE_EXPR:
-+ 	  is_save_expr = 1;
-  	  exp_rtl = SAVE_EXPR_RTL (exp);
-  	  break;
-*************** safe_from_p (x, exp)
-*** 3931,3935 ****
-  	  /* The only operand we look at is operand 1.  The rest aren't
-  	     part of the expression.  */
-! 	  return safe_from_p (x, TREE_OPERAND (exp, 1));
-  
-  	case METHOD_CALL_EXPR:
---- 3987,3991 ----
-  	  /* The only operand we look at is operand 1.  The rest aren't
-  	     part of the expression.  */
-! 	  return safe_from_p_1 (x, TREE_OPERAND (exp, 1));
-  
-  	case METHOD_CALL_EXPR:
-*************** safe_from_p (x, exp)
-*** 3945,3949 ****
-        for (i = 0; i < nops; i++)
-  	if (TREE_OPERAND (exp, i) != 0
-! 	    && ! safe_from_p (x, TREE_OPERAND (exp, i)))
-  	  return 0;
-      }
---- 4001,4005 ----
-        for (i = 0; i < nops; i++)
-  	if (TREE_OPERAND (exp, i) != 0
-! 	    && ! safe_from_p_1 (x, TREE_OPERAND (exp, i)))
-  	  return 0;
-      }
-*************** safe_from_p (x, exp)
-*** 3969,3975 ****
---- 4025,4087 ----
-  
-    /* If we reach here, it is safe.  */
-+   if (is_save_expr)
-+     {
-+       /* This SAVE_EXPR might appear many times in the top-level
-+ 	 safe_from_p() expression, and if it has a complex
-+ 	 subexpression, examining it multiple times could result
-+ 	 in a combinatorial explosion.  E.g. on an Alpha Cabriolet
-+ 	 running at least 200MHz, a Fortran test case compiled with
-+ 	 optimization took about 28 minutes to compile -- even though
-+ 	 it was only a few lines long, and the complicated line causing
-+ 	 so much time to be spent in the earlier version of safe_from_p()
-+ 	 had only 293 or so unique nodes.
-+ 
-+ 	 So, turn this SAVE_EXPR into an ERROR_MARK for now, but remember
-+ 	 where it is so we can turn it back in the top-level safe_from_p()
-+ 	 when we're done.  */
-+ 
-+       if (safe_from_p_count > safe_from_p_size)
-+ 	return 0;	/* For now, don't bother re-sizing the array. */
-+       safe_from_p_rewritten[safe_from_p_count++] = exp;
-+       TREE_SET_CODE (exp, ERROR_MARK);
-+     }
-+ 
-    return 1;
-  }
-  
-+ /* Subroutine of expand_expr: return nonzero iff there is no way that
-+    EXP can reference X, which is being modified.  */
-+ 
-+ static int
-+ safe_from_p (x, exp)
-+      rtx x;
-+      tree exp;
-+ {
-+   int rtn;
-+   int i;
-+   tree trees[128];
-+ 
-+   safe_from_p_count = 0;
-+   safe_from_p_size = sizeof (trees) / sizeof (trees[0]);
-+   safe_from_p_rewritten = &trees[0];
-+ 
-+   rtn = safe_from_p_1 (x, exp);
-+ 
-+ #if 0
-+   if (safe_from_p_count != 0)
-+     fprintf (stderr, "%s:%d: safe_from_p_count = %d\n",
-+ 	     input_filename, lineno, safe_from_p_count);
-+ #endif
-+ 
-+   for (i = 0; i < safe_from_p_count; ++i)
-+     {
-+       if (TREE_CODE (trees [i]) != ERROR_MARK)
-+ 	abort ();
-+       TREE_SET_CODE (trees[i], SAVE_EXPR);
-+     }
-+ 
-+   return rtn;
-+ }
-+ 
-  /* Subroutine of expand_expr: return nonzero iff EXP is an
-     expression whose type is statically determinable.  */
-*************** expand_expr (exp, target, tmode, modifie
-*** 4534,4537 ****
---- 4646,4658 ----
-  		}
-  	    }
-+ 
-+ 	  if (TREE_READONLY (exp))
-+ 	    {
-+ 	      if (GET_CODE (target) == MEM)
-+ 		target = change_address (target, GET_MODE (target),
-+ 					 XEXP (target, 0));
-+ 	      RTX_UNCHANGING_P (target) = 1;
-+ 	    }
-+ 
-  	  store_constructor (exp, target);
-  	  return target;
-*************** expand_expr (exp, target, tmode, modifie
-*** 4543,4567 ****
-  	tree exp2;
-  
-! 	/* A SAVE_EXPR as the address in an INDIRECT_EXPR is generated
-! 	   for  *PTR += ANYTHING  where PTR is put inside the SAVE_EXPR.
-! 	   This code has the same general effect as simply doing
-! 	   expand_expr on the save expr, except that the expression PTR
-! 	   is computed for use as a memory address.  This means different
-! 	   code, suitable for indexing, may be generated.  */
-! 	if (TREE_CODE (exp1) == SAVE_EXPR
-! 	    && SAVE_EXPR_RTL (exp1) == 0
-! 	    && TYPE_MODE (TREE_TYPE (exp1)) == ptr_mode)
-! 	  {
-! 	    temp = expand_expr (TREE_OPERAND (exp1, 0), NULL_RTX,
-! 				VOIDmode, EXPAND_SUM);
-! 	    op0 = memory_address (mode, temp);
-! 	    op0 = copy_all_regs (op0);
-! 	    SAVE_EXPR_RTL (exp1) = op0;
-! 	  }
-! 	else
-! 	  {
-! 	    op0 = expand_expr (exp1, NULL_RTX, VOIDmode, EXPAND_SUM);
-! 	    op0 = memory_address (mode, op0);
-! 	  }
-  
-  	temp = gen_rtx (MEM, mode, op0);
---- 4664,4669 ----
-  	tree exp2;
-  
-! 	op0 = expand_expr (exp1, NULL_RTX, VOIDmode, EXPAND_SUM);
-! 	op0 = memory_address (mode, op0);
-  
-  	temp = gen_rtx (MEM, mode, op0);
-*************** expand_expr (exp, target, tmode, modifie
-*** 4770,4776 ****
-  	tree offset;
-  	int volatilep = 0;
-- 	tree tem = get_inner_reference (exp, &bitsize, &bitpos, &offset,
-- 					&mode1, &unsignedp, &volatilep);
-  	int alignment;
-  
-  	/* If we got back the original object, something is wrong.  Perhaps
---- 4872,4879 ----
-  	tree offset;
-  	int volatilep = 0;
-  	int alignment;
-+ 	tree tem = get_inner_reference (exp, &bitsize, &bitpos, &offset,
-+ 					&mode1, &unsignedp, &volatilep,
-+ 					&alignment);
-  
-  	/* If we got back the original object, something is wrong.  Perhaps
-*************** expand_expr (exp, target, tmode, modifie
-*** 4793,4797 ****
-  				!= INTEGER_CST)
-  			    ? target : NULL_RTX),
-! 			   VOIDmode, EXPAND_SUM);
-  
-  	/* If this is a constant, put it into a register if it is a
---- 4896,4901 ----
-  				!= INTEGER_CST)
-  			    ? target : NULL_RTX),
-! 			   VOIDmode,
-! 			   modifier == EXPAND_INITIALIZER ? modifier : 0);
-  
-  	/* If this is a constant, put it into a register if it is a
-*************** expand_expr (exp, target, tmode, modifie
-*** 4806,4810 ****
-  	  }
-  
-- 	alignment = TYPE_ALIGN (TREE_TYPE (tem)) / BITS_PER_UNIT;
-  	if (offset != 0)
-  	  {
---- 4910,4913 ----
-*************** expand_expr (exp, target, tmode, modifie
-*** 4816,4827 ****
-  				  gen_rtx (PLUS, ptr_mode, XEXP (op0, 0),
-  					   force_reg (ptr_mode, offset_rtx)));
-- 	  /* If we have a variable offset, the known alignment
-- 	     is only that of the innermost structure containing the field.
-- 	     (Actually, we could sometimes do better by using the
-- 	     size of an element of the innermost array, but no need.)  */
-- 	  if (TREE_CODE (exp) == COMPONENT_REF
-- 	      || TREE_CODE (exp) == BIT_FIELD_REF)
-- 	    alignment = (TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0)))
-- 			 / BITS_PER_UNIT);
-  	  }
-  
---- 4919,4922 ----
-*************** expand_expr (exp, target, tmode, modifie
-*** 4844,4848 ****
-  		&& modifier != EXPAND_SUM
-  		&& modifier != EXPAND_INITIALIZER
-! 		&& ((mode1 != BLKmode && ! direct_load[(int) mode1])
-  		    /* If the field isn't aligned enough to fetch as a memref,
-  		       fetch it as a bit field.  */
---- 4939,4945 ----
-  		&& modifier != EXPAND_SUM
-  		&& modifier != EXPAND_INITIALIZER
-! 		&& ((mode1 != BLKmode && ! direct_load[(int) mode1]
-! 		     && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
-! 		     && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT)
-  		    /* If the field isn't aligned enough to fetch as a memref,
-  		       fetch it as a bit field.  */
-*************** expand_expr (exp, target, tmode, modifie
-*** 4857,4861 ****
-  
-  	    if (ext_mode == BLKmode)
-! 	      abort ();
-  
-  	    op0 = extract_bit_field (validize_mem (op0), bitsize, bitpos,
---- 4954,4982 ----
-  
-  	    if (ext_mode == BLKmode)
-! 	      {
-! 		/* In this case, BITPOS must start at a byte boundary and
-! 		   TARGET, if specified, must be a MEM.  */
-! 		if (GET_CODE (op0) != MEM
-! 		    || (target != 0 && GET_CODE (target) != MEM)
-! 		    || bitpos % BITS_PER_UNIT != 0)
-! 		  abort ();
-! 
-! 		op0 = change_address (op0, VOIDmode,
-! 				      plus_constant (XEXP (op0, 0),
-! 						     bitpos / BITS_PER_UNIT));
-! 		if (target == 0)
-! 		  {
-! 		    target
-! 		      = assign_stack_temp (mode, int_size_in_bytes (type), 0);
-! 		    MEM_IN_STRUCT_P (target) = AGGREGATE_TYPE_P (type);
-! 		  }
-! 
-! 		emit_block_move (target, op0,
-! 				 GEN_INT ((bitsize + BITS_PER_UNIT - 1)
-! 					  / BITS_PER_UNIT),
-! 				 1);
-! 		
-! 		return target;
-! 	      }
-  
-  	    op0 = extract_bit_field (validize_mem (op0), bitsize, bitpos,
-*************** expand_expr (exp, target, tmode, modifie
-*** 4863,4866 ****
---- 4984,4999 ----
-  				     alignment,
-  				     int_size_in_bytes (TREE_TYPE (tem)));
-+ 
-+ 	    /* If the result is a record type and BITSIZE is narrower than
-+ 	       the mode of OP0, an integral mode, and this is a big endian
-+ 	       machine, we must put the field into the high-order bits.  */
-+ 	    if (TREE_CODE (type) == RECORD_TYPE && BYTES_BIG_ENDIAN
-+ 		&& GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
-+ 		&& bitsize < GET_MODE_BITSIZE (GET_MODE (op0)))
-+ 	      op0 = expand_shift (LSHIFT_EXPR, GET_MODE (op0), op0,
-+ 				  size_int (GET_MODE_BITSIZE (GET_MODE (op0))
-+ 					    - bitsize),
-+ 				  op0, 1);
-+ 
-  	    if (mode == BLKmode)
-  	      {
-*************** expand_expr (exp, target, tmode, modifie
-*** 4877,4880 ****
---- 5010,5018 ----
-  	  }
-  
-+ 	/* If the result is BLKmode, use that to access the object
-+ 	   now as well.  */
-+ 	if (mode == BLKmode)
-+ 	  mode1 = BLKmode;
-+ 
-  	/* Get a reference to just this component.  */
-  	if (modifier == EXPAND_CONST_ADDRESS
-*************** expand_expr (exp, target, tmode, modifie
-*** 4888,4895 ****
-  	MEM_IN_STRUCT_P (op0) = 1;
-  	MEM_VOLATILE_P (op0) |= volatilep;
-! 	if (mode == mode1 || mode1 == BLKmode || mode1 == tmode)
-  	  return op0;
-! 	if (target == 0)
-  	  target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
-  	convert_move (target, op0, unsignedp);
-  	return target;
---- 5026,5036 ----
-  	MEM_IN_STRUCT_P (op0) = 1;
-  	MEM_VOLATILE_P (op0) |= volatilep;
-! 	if (mode == mode1 || mode1 == BLKmode || mode1 == tmode
-! 	    || modifier == EXPAND_CONST_ADDRESS
-! 	    || modifier == EXPAND_INITIALIZER)
-  	  return op0;
-! 	else if (target == 0)
-  	  target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
-+ 
-  	convert_move (target, op0, unsignedp);
-  	return target;
-*************** expand_builtin (exp, target, subtarget, 
-*** 7986,7989 ****
---- 8127,8365 ----
-  #endif
-  
-+       /* __builtin_setjmp is passed a pointer to an array of five words
-+ 	 (not all will be used on all machines).  It operates similarly to
-+ 	 the C library function of the same name, but is more efficient.
-+ 	 Much of the code below (and for longjmp) is copied from the handling
-+ 	 of non-local gotos.
-+ 
-+ 	 NOTE: This is intended for use by GNAT and will only work in
-+ 	 the method used by it.  This code will likely NOT survive to 
-+ 	 the GCC 2.8.0 release.  */
-+     case BUILT_IN_SETJMP:
-+       if (arglist == 0
-+ 	  || TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE)
-+ 	break;
-+ 
-+       {
-+ 	rtx buf_addr = expand_expr (TREE_VALUE (arglist), subtarget,
-+ 				    VOIDmode, 0);
-+ 	rtx lab1 = gen_label_rtx (), lab2 = gen_label_rtx ();
-+ 	enum machine_mode sa_mode = Pmode;
-+ 	rtx stack_save;
-+ 	int old_inhibit_defer_pop = inhibit_defer_pop;
-+ 	int return_pops = RETURN_POPS_ARGS (get_identifier ("__dummy"),
-+ 					    get_identifier ("__dummy"), 0);
-+ 	rtx next_arg_reg;
-+ 	CUMULATIVE_ARGS args_so_far;
-+ 	int current_call_is_indirect = 1;
-+ 	int i;
-+ 
-+ #ifdef POINTERS_EXTEND_UNSIGNED
-+ 	buf_addr = convert_memory_address (Pmode, buf_addr);
-+ #endif
-+ 
-+ 	buf_addr = force_reg (Pmode, buf_addr);
-+ 
-+ 	if (target == 0 || GET_CODE (target) != REG
-+ 	    || REGNO (target) < FIRST_PSEUDO_REGISTER)
-+ 	  target = gen_reg_rtx (value_mode);
-+ 
-+ 	emit_queue ();
-+ 
-+ 	CONST_CALL_P (emit_note (NULL_PTR, NOTE_INSN_SETJMP)) = 1;
-+ 	current_function_calls_setjmp = 1;
-+ 
-+ 	/* We store the frame pointer and the address of lab1 in the buffer
-+ 	   and use the rest of it for the stack save area, which is
-+ 	   machine-dependent.  */
-+ 	emit_move_insn (gen_rtx (MEM, Pmode, buf_addr),
-+ 			virtual_stack_vars_rtx);
-+ 	emit_move_insn
-+ 	  (validize_mem (gen_rtx (MEM, Pmode,
-+ 				  plus_constant (buf_addr,
-+ 						 GET_MODE_SIZE (Pmode)))),
-+ 	   gen_rtx (LABEL_REF, Pmode, lab1));
-+ 
-+ #ifdef HAVE_save_stack_nonlocal
-+ 	if (HAVE_save_stack_nonlocal)
-+ 	  sa_mode = insn_operand_mode[(int) CODE_FOR_save_stack_nonlocal][0];
-+ #endif
-+ 
-+ 	current_function_has_nonlocal_goto = 1;
-+ 
-+ 	stack_save = gen_rtx (MEM, sa_mode,
-+ 			      plus_constant (buf_addr,
-+ 					     2 * GET_MODE_SIZE (Pmode)));
-+ 	emit_stack_save (SAVE_NONLOCAL, &stack_save, NULL_RTX);
-+ 
-+ #ifdef HAVE_setjmp
-+ 	if (HAVE_setjmp)
-+ 	  emit_insn (gen_setjmp ());
-+ #endif
-+ 
-+ 	/* Set TARGET to zero and branch around the other case.  */
-+ 	emit_move_insn (target, const0_rtx);
-+ 	emit_jump_insn (gen_jump (lab2));
-+ 	emit_barrier ();
-+ 	emit_label (lab1);
-+ 
-+ 	/* Note that setjmp clobbers FP when we get here, so we have to
-+ 	   make sure it's marked as used by this function. */
-+ 	emit_insn (gen_rtx (USE, VOIDmode, hard_frame_pointer_rtx));
-+ 
-+ 	/* Mark the static chain as clobbered here so life information
-+ 	   doesn't get messed up for it.  */
-+ 	emit_insn (gen_rtx (CLOBBER, VOIDmode, static_chain_rtx));
-+ 
-+ 	/* Now put in the code to restore the frame pointer, and argument
-+ 	   pointer, if needed.  The code below is from expand_end_bindings
-+ 	   in stmt.c; see detailed documentation there.  */
-+ #ifdef HAVE_nonlocal_goto
-+ 	if (! HAVE_nonlocal_goto)
-+ #endif
-+ 	  emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
-+ 
-+ #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
-+ 	if (fixed_regs[ARG_POINTER_REGNUM])
-+ 	  {
-+ #ifdef ELIMINABLE_REGS
-+ 	    static struct elims {int from, to;} elim_regs[] = ELIMINABLE_REGS;
-+ 
-+ 	    for (i = 0; i < sizeof elim_regs / sizeof elim_regs[0]; i++)
-+ 	      if (elim_regs[i].from == ARG_POINTER_REGNUM
-+ 		  && elim_regs[i].to == HARD_FRAME_POINTER_REGNUM)
-+ 		break;
-+ 
-+ 	    if (i == sizeof elim_regs / sizeof elim_regs [0])
-+ #endif
-+ 	      {
-+ 		/* Now restore our arg pointer from the address at which it
-+ 		   was saved in our stack frame.
-+ 		   If there hasn't be space allocated for it yet, make
-+ 		   some now.  */
-+ 		if (arg_pointer_save_area == 0)
-+ 		  arg_pointer_save_area
-+ 		    = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
-+ 		emit_move_insn (virtual_incoming_args_rtx,
-+ 				copy_to_reg (arg_pointer_save_area));
-+ 	      }
-+ 	  }
-+ #endif
-+ 
-+ #ifdef HAVE_nonlocal_goto_receiver
-+ 	if (HAVE_nonlocal_goto_receiver)
-+ 	  emit_insn (gen_nonlocal_goto_receiver ());
-+ #endif
-+ 	/* The static chain pointer contains the address of dummy function.
-+ 	   We need to call it here to handle some PIC cases of restoring
-+ 	   a global pointer.  Then return 1.  */
-+ 	op0 = copy_to_mode_reg (Pmode, static_chain_rtx);
-+ 
-+ 	/* We can't actually call emit_library_call here, so do everything
-+ 	   it does, which isn't much for a libfunc with no args.  */
-+ 	op0 = memory_address (FUNCTION_MODE, op0);
-+ 
-+ 	INIT_CUMULATIVE_ARGS (args_so_far, NULL_TREE,
-+ 			      gen_rtx (SYMBOL_REF, Pmode, "__dummy"));
-+ 	next_arg_reg = FUNCTION_ARG (args_so_far, VOIDmode, void_type_node, 1);
-+ 
-+ #ifndef ACCUMULATE_OUTGOING_ARGS
-+ #ifdef HAVE_call_pop
-+ 	if (HAVE_call_pop)
-+ 	  emit_call_insn (gen_call_pop (gen_rtx (MEM, FUNCTION_MODE, op0),
-+ 					const0_rtx, next_arg_reg,
-+ 					GEN_INT (return_pops)));
-+ 	else
-+ #endif
-+ #endif
-+ 
-+ #ifdef HAVE_call
-+ 	if (HAVE_call)
-+ 	  emit_call_insn (gen_call (gen_rtx (MEM, FUNCTION_MODE, op0),
-+ 				    const0_rtx, next_arg_reg, const0_rtx));
-+ 	else
-+ #endif
-+ 	    abort ();
-+ 
-+ 	emit_move_insn (target, const1_rtx);
-+ 	emit_label (lab2);
-+ 	return target;
-+       }
-+ 
-+       /* __builtin_longjmp is passed a pointer to an array of five words
-+ 	 and a value, which is a dummy.  It's similar to the C library longjmp
-+ 	 function but works with __builtin_setjmp above.  */
-+     case BUILT_IN_LONGJMP:
-+       if (arglist == 0 || TREE_CHAIN (arglist) == 0
-+ 	  || TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE)
-+ 	break;
-+ 
-+       {
-+ 	tree dummy_id = get_identifier ("__dummy");
-+ 	tree dummy_type = build_function_type (void_type_node, NULL_TREE);
-+ 	tree dummy_decl = build_decl (FUNCTION_DECL, dummy_id, dummy_type); 
-+ #ifdef POINTERS_EXTEND_UNSIGNED
-+ 	rtx buf_addr
-+ 	  = force_reg (Pmode,
-+ 		       convert_memory_address
-+ 		       (Pmode,
-+ 			expand_expr (TREE_VALUE (arglist),
-+ 				     NULL_RTX, VOIDmode, 0)));
-+ #else
-+ 	rtx buf_addr
-+ 	  = force_reg (Pmode, expand_expr (TREE_VALUE (arglist),
-+ 					   NULL_RTX,
-+ 					   VOIDmode, 0));
-+ #endif
-+ 	rtx fp = gen_rtx (MEM, Pmode, buf_addr);
-+ 	rtx lab = gen_rtx (MEM, Pmode,
-+ 			   plus_constant (buf_addr, GET_MODE_SIZE (Pmode)));
-+ 	enum machine_mode sa_mode
-+ #ifdef HAVE_save_stack_nonlocal
-+ 	  = (HAVE_save_stack_nonlocal
-+ 	     ? insn_operand_mode[(int) CODE_FOR_save_stack_nonlocal][0]
-+ 	     : Pmode);
-+ #else
-+ 	= Pmode;
-+ #endif
-+ 	rtx stack = gen_rtx (MEM, sa_mode,
-+ 			     plus_constant (buf_addr,
-+ 					    2 * GET_MODE_SIZE (Pmode)));
-+ 
-+ 	DECL_EXTERNAL (dummy_decl) = 1;
-+ 	TREE_PUBLIC (dummy_decl) = 1;
-+ 	make_decl_rtl (dummy_decl, NULL_PTR, 1);
-+ 
-+ 	/* Expand the second expression just for side-effects.  */
-+ 	expand_expr (TREE_VALUE (TREE_CHAIN (arglist)),
-+ 		     const0_rtx, VOIDmode, 0);
-+ 
-+ 	assemble_external (dummy_decl);
-+ 
-+ 	/* Pick up FP, label, and SP from the block and jump.  This code is
-+ 	   from expand_goto in stmt.c; see there for detailed comments.  */
-+ #if HAVE_nonlocal_goto
-+ 	if (HAVE_nonlocal_goto)
-+ 	  emit_insn (gen_nonlocal_goto (fp, lab, stack,
-+ 					XEXP (DECL_RTL (dummy_decl), 0)));
-+       else
-+ #endif
-+ 	{
-+ 	  lab = copy_to_reg (lab);
-+ 	  emit_move_insn (hard_frame_pointer_rtx, fp);
-+ 	  emit_stack_restore (SAVE_NONLOCAL, stack, NULL_RTX);
-+ 
-+ 	  /* Put in the static chain register the address of the dummy
-+ 	     function.  */
-+ 	  emit_move_insn (static_chain_rtx, XEXP (DECL_RTL (dummy_decl), 0));
-+ 	  emit_insn (gen_rtx (USE, VOIDmode, hard_frame_pointer_rtx));
-+ 	  emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
-+ 	  emit_insn (gen_rtx (USE, VOIDmode, static_chain_rtx));
-+ 	  emit_indirect_jump (lab);
-+ 	}
-+ 
-+ 	return const0_rtx;
-+       }
-+ 
-      default:			/* just do library call, if unknown builtin */
-        error ("built-in function `%s' not currently supported",
-*************** preexpand_calls (exp)
-*** 8688,8701 ****
-      case CALL_EXPR:
-        /* Do nothing if already expanded.  */
-!       if (CALL_EXPR_RTL (exp) != 0)
-  	return;
-  
-!       /* Do nothing to built-in functions.  */
-!       if (TREE_CODE (TREE_OPERAND (exp, 0)) != ADDR_EXPR
-! 	  || TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) != FUNCTION_DECL
-! 	  || ! DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
-! 	  /* Do nothing if the call returns a variable-sized object.  */
-! 	  || TREE_CODE (TYPE_SIZE (TREE_TYPE(exp))) != INTEGER_CST)
-! 	CALL_EXPR_RTL (exp) = expand_call (exp, NULL_RTX, 0);
-        return;
-  
---- 9064,9078 ----
-      case CALL_EXPR:
-        /* Do nothing if already expanded.  */
-!       if (CALL_EXPR_RTL (exp) != 0
-! 	  /* Do nothing if the call returns a variable-sized object.  */
-! 	  || TREE_CODE (TYPE_SIZE (TREE_TYPE(exp))) != INTEGER_CST
-! 	  /* Do nothing to built-in functions.  */
-! 	  || (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
-! 	      && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
-! 		  == FUNCTION_DECL)
-! 	      && DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))))
-  	return;
-  
-!       CALL_EXPR_RTL (exp) = expand_call (exp, NULL_RTX, 0);
-        return;
-  
-*************** do_jump (exp, if_false_label, if_true_la
-*** 9087,9090 ****
---- 9464,9468 ----
-        push_temp_slots ();
-        expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, 0);
-+       preserve_temp_slots (NULL_RTX);
-        free_temp_slots ();
-        pop_temp_slots ();
-*************** do_jump (exp, if_false_label, if_true_la
-*** 9103,9111 ****
-  	tree offset;
-  	int volatilep = 0;
-  
-  	/* Get description of this reference.  We don't actually care
-  	   about the underlying object here.  */
-  	get_inner_reference (exp, &bitsize, &bitpos, &offset,
-! 			     &mode, &unsignedp, &volatilep);
-  
-  	type = type_for_size (bitsize, unsignedp);
---- 9481,9491 ----
-  	tree offset;
-  	int volatilep = 0;
-+ 	int alignment;
-  
-  	/* Get description of this reference.  We don't actually care
-  	   about the underlying object here.  */
-  	get_inner_reference (exp, &bitsize, &bitpos, &offset,
-! 			     &mode, &unsignedp, &volatilep,
-! 			     &alignment);
-  
-  	type = type_for_size (bitsize, unsignedp);
-diff -rcp2N gcc-2.7.2.2/final.c g77-new/final.c
-*** gcc-2.7.2.2/final.c	Sun Nov 26 13:50:00 1995
---- g77-new/final.c	Thu Jul 10 20:11:16 1997
-*************** profile_function (file)
-*** 983,991 ****
-    text_section ();
-  
-! #ifdef STRUCT_VALUE_INCOMING_REGNUM
-    if (sval)
-      ASM_OUTPUT_REG_PUSH (file, STRUCT_VALUE_INCOMING_REGNUM);
-  #else
-! #ifdef STRUCT_VALUE_REGNUM
-    if (sval)
-      ASM_OUTPUT_REG_PUSH (file, STRUCT_VALUE_REGNUM);
---- 983,991 ----
-    text_section ();
-  
-! #if defined(STRUCT_VALUE_INCOMING_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
-    if (sval)
-      ASM_OUTPUT_REG_PUSH (file, STRUCT_VALUE_INCOMING_REGNUM);
-  #else
-! #if defined(STRUCT_VALUE_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
-    if (sval)
-      ASM_OUTPUT_REG_PUSH (file, STRUCT_VALUE_REGNUM);
-*************** profile_function (file)
-*** 993,1027 ****
-  #endif
-  
-! #if 0
-! #ifdef STATIC_CHAIN_INCOMING_REGNUM
-    if (cxt)
-      ASM_OUTPUT_REG_PUSH (file, STATIC_CHAIN_INCOMING_REGNUM);
-  #else
-! #ifdef STATIC_CHAIN_REGNUM
-    if (cxt)
-      ASM_OUTPUT_REG_PUSH (file, STATIC_CHAIN_REGNUM);
-  #endif
-  #endif
-- #endif				/* 0 */
-  
-    FUNCTION_PROFILER (file, profile_label_no);
-  
-! #if 0
-! #ifdef STATIC_CHAIN_INCOMING_REGNUM
-    if (cxt)
-      ASM_OUTPUT_REG_POP (file, STATIC_CHAIN_INCOMING_REGNUM);
-  #else
-! #ifdef STATIC_CHAIN_REGNUM
-    if (cxt)
-      ASM_OUTPUT_REG_POP (file, STATIC_CHAIN_REGNUM);
-  #endif
-  #endif
-- #endif				/* 0 */
-  
-! #ifdef STRUCT_VALUE_INCOMING_REGNUM
-    if (sval)
-      ASM_OUTPUT_REG_POP (file, STRUCT_VALUE_INCOMING_REGNUM);
-  #else
-! #ifdef STRUCT_VALUE_REGNUM
-    if (sval)
-      ASM_OUTPUT_REG_POP (file, STRUCT_VALUE_REGNUM);
---- 993,1023 ----
-  #endif
-  
-! #if defined(STATIC_CHAIN_INCOMING_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
-    if (cxt)
-      ASM_OUTPUT_REG_PUSH (file, STATIC_CHAIN_INCOMING_REGNUM);
-  #else
-! #if defined(STATIC_CHAIN_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
-    if (cxt)
-      ASM_OUTPUT_REG_PUSH (file, STATIC_CHAIN_REGNUM);
-  #endif
-  #endif
-  
-    FUNCTION_PROFILER (file, profile_label_no);
-  
-! #if defined(STATIC_CHAIN_INCOMING_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
-    if (cxt)
-      ASM_OUTPUT_REG_POP (file, STATIC_CHAIN_INCOMING_REGNUM);
-  #else
-! #if defined(STATIC_CHAIN_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
-    if (cxt)
-      ASM_OUTPUT_REG_POP (file, STATIC_CHAIN_REGNUM);
-  #endif
-  #endif
-  
-! #if defined(STRUCT_VALUE_INCOMING_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
-    if (sval)
-      ASM_OUTPUT_REG_POP (file, STRUCT_VALUE_INCOMING_REGNUM);
-  #else
-! #if defined(STRUCT_VALUE_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
-    if (sval)
-      ASM_OUTPUT_REG_POP (file, STRUCT_VALUE_REGNUM);
-diff -rcp2N gcc-2.7.2.2/flags.h g77-new/flags.h
-*** gcc-2.7.2.2/flags.h	Thu Jun 15 07:34:11 1995
---- g77-new/flags.h	Thu Jul 10 20:08:56 1997
-*************** extern int flag_unroll_loops;
-*** 204,207 ****
---- 204,221 ----
-  extern int flag_unroll_all_loops;
-  
-+ /* Nonzero forces all invariant computations in loops to be moved
-+    outside the loop. */
-+ 
-+ extern int flag_move_all_movables;
-+ 
-+ /* Nonzero forces all general induction variables in loops to be
-+    strength reduced. */
-+ 
-+ extern int flag_reduce_all_givs;
-+ 
-+ /* Nonzero gets another run of loop_optimize performed. */
-+ 
-+ extern int flag_rerun_loop_opt;
-+ 
-  /* Nonzero for -fcse-follow-jumps:
-     have cse follow jumps to do a more extensive job.  */
-*************** extern int flag_gnu_linker;
-*** 339,342 ****
---- 353,369 ----
-  /* Tag all structures with __attribute__(packed) */
-  extern int flag_pack_struct;
-+ 
-+ /* 1 if alias checking is enabled: symbols do not alias each other
-+    and parameters do not alias the current stack frame.  */
-+ extern int flag_alias_check;
-+ 
-+ /* This flag is only tested if alias checking is enabled.
-+    0 if pointer arguments may alias each other.  True in C.
-+    1 if pointer arguments may not alias each other but may alias
-+    global variables.
-+    2 if pointer arguments may not alias each other and may not
-+    alias global variables.  True in Fortran.
-+    The value is ignored if flag_alias_check is 0.  */
-+ extern int flag_argument_noalias;
-  
-  /* Other basic status info about current function.  */
-diff -rcp2N gcc-2.7.2.2/flow.c g77-new/flow.c
-*** gcc-2.7.2.2/flow.c	Mon Aug 28 06:23:34 1995
---- g77-new/flow.c	Sun Aug 10 18:46:11 1997
-*************** static HARD_REG_SET elim_reg_set;
-*** 288,292 ****
-  /* Forward declarations */
-  static void find_basic_blocks		PROTO((rtx, rtx));
-! static int uses_reg_or_mem		PROTO((rtx));
-  static void mark_label_ref		PROTO((rtx, rtx, int));
-  static void life_analysis		PROTO((rtx, int));
---- 288,292 ----
-  /* Forward declarations */
-  static void find_basic_blocks		PROTO((rtx, rtx));
-! static int jmp_uses_reg_or_mem		PROTO((rtx));
-  static void mark_label_ref		PROTO((rtx, rtx, int));
-  static void life_analysis		PROTO((rtx, int));
-*************** find_basic_blocks (f, nonlocal_label_lis
-*** 554,563 ****
-  		    if (GET_CODE (XVECEXP (pat, 0, i)) == SET
-  			&& SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx
-! 			&& uses_reg_or_mem (SET_SRC (XVECEXP (pat, 0, i))))
-  		      computed_jump = 1;
-  	      }
-  	    else if (GET_CODE (pat) == SET
-  		     && SET_DEST (pat) == pc_rtx
-! 		     && uses_reg_or_mem (SET_SRC (pat)))
-  	      computed_jump = 1;
-  		    
---- 554,563 ----
-  		    if (GET_CODE (XVECEXP (pat, 0, i)) == SET
-  			&& SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx
-! 			&& jmp_uses_reg_or_mem (SET_SRC (XVECEXP (pat, 0, i))))
-  		      computed_jump = 1;
-  	      }
-  	    else if (GET_CODE (pat) == SET
-  		     && SET_DEST (pat) == pc_rtx
-! 		     && jmp_uses_reg_or_mem (SET_SRC (pat)))
-  	      computed_jump = 1;
-  		    
-*************** find_basic_blocks (f, nonlocal_label_lis
-*** 760,767 ****
-  /* Subroutines of find_basic_blocks.  */
-  
-! /* Return 1 if X contain a REG or MEM that is not in the constant pool.  */
-  
-  static int
-! uses_reg_or_mem (x)
-       rtx x;
-  {
---- 760,768 ----
-  /* Subroutines of find_basic_blocks.  */
-  
-! /* Return 1 if X, the SRC_SRC of  SET of (pc) contain a REG or MEM that is
-!    not in the constant pool and not in the condition of an IF_THEN_ELSE.  */
-  
-  static int
-! jmp_uses_reg_or_mem (x)
-       rtx x;
-  {
-*************** uses_reg_or_mem (x)
-*** 770,778 ****
-    char *fmt;
-  
-!   if (code == REG
-!       || (code == MEM
-! 	  && ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
-! 		&& CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)))))
-!     return 1;
-  
-    fmt = GET_RTX_FORMAT (code);
---- 771,796 ----
-    char *fmt;
-  
-!   switch (code)
-!     {
-!     case CONST:
-!     case LABEL_REF:
-!     case PC:
-!       return 0;
-! 
-!     case REG:
-!       return 1;
-! 
-!     case MEM:
-!       return ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
-! 		&& CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)));
-! 
-!     case IF_THEN_ELSE:
-!       return (jmp_uses_reg_or_mem (XEXP (x, 1))
-! 	      || jmp_uses_reg_or_mem (XEXP (x, 2)));
-! 
-!     case PLUS:  case MINUS:  case MULT:
-!       return (jmp_uses_reg_or_mem (XEXP (x, 0))
-! 	      || jmp_uses_reg_or_mem (XEXP (x, 1)));
-!     }
-  
-    fmt = GET_RTX_FORMAT (code);
-*************** uses_reg_or_mem (x)
-*** 780,789 ****
-      {
-        if (fmt[i] == 'e'
-! 	  && uses_reg_or_mem (XEXP (x, i)))
-  	return 1;
-  
-        if (fmt[i] == 'E')
-  	for (j = 0; j < XVECLEN (x, i); j++)
-! 	  if (uses_reg_or_mem (XVECEXP (x, i, j)))
-  	    return 1;
-      }
---- 798,807 ----
-      {
-        if (fmt[i] == 'e'
-! 	  && jmp_uses_reg_or_mem (XEXP (x, i)))
-  	return 1;
-  
-        if (fmt[i] == 'E')
-  	for (j = 0; j < XVECLEN (x, i); j++)
-! 	  if (jmp_uses_reg_or_mem (XVECEXP (x, i, j)))
-  	    return 1;
-      }
-*************** propagate_block (old, first, last, final
-*** 1605,1614 ****
-  
-  		  /* Each call clobbers all call-clobbered regs that are not
-! 		     global.  Note that the function-value reg is a
-  		     call-clobbered reg, and mark_set_regs has already had
-  		     a chance to handle it.  */
-  
-  		  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-! 		    if (call_used_regs[i] && ! global_regs[i])
-  		      dead[i / REGSET_ELT_BITS]
-  			|= ((REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS));
---- 1623,1633 ----
-  
-  		  /* Each call clobbers all call-clobbered regs that are not
-! 		     global or fixed.  Note that the function-value reg is a
-  		     call-clobbered reg, and mark_set_regs has already had
-  		     a chance to handle it.  */
-  
-  		  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-! 		    if (call_used_regs[i] && ! global_regs[i]
-! 			&& ! fixed_regs[i])
-  		      dead[i / REGSET_ELT_BITS]
-  			|= ((REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS));
-diff -rcp2N gcc-2.7.2.2/fold-const.c g77-new/fold-const.c
-*** gcc-2.7.2.2/fold-const.c	Fri Sep 15 18:26:12 1995
---- g77-new/fold-const.c	Sun Aug 10 18:47:18 1997
-*************** static tree unextend	PROTO((tree, int, i
-*** 80,83 ****
---- 80,84 ----
-  static tree fold_truthop PROTO((enum tree_code, tree, tree, tree));
-  static tree strip_compound_expr PROTO((tree, tree));
-+ static int multiple_of_p PROTO((tree, tree, tree));
-  
-  #ifndef BRANCH_COST
-*************** const_binop (code, arg1, arg2, notrunc)
-*** 1077,1080 ****
---- 1078,1083 ----
-  	  if (int2h == 0 && int2l > 0
-  	      && TREE_TYPE (arg1) == sizetype
-+ 	      && ! TREE_CONSTANT_OVERFLOW (arg1)
-+ 	      && ! TREE_CONSTANT_OVERFLOW (arg2)
-  	      && int1h == 0 && int1l >= 0)
-  	    {
-*************** const_binop (code, arg1, arg2, notrunc)
-*** 1230,1233 ****
---- 1233,1237 ----
-    if (TREE_CODE (arg1) == COMPLEX_CST)
-      {
-+       register tree type = TREE_TYPE (arg1);
-        register tree r1 = TREE_REALPART (arg1);
-        register tree i1 = TREE_IMAGPART (arg1);
-*************** const_binop (code, arg1, arg2, notrunc)
-*** 1239,1253 ****
-  	{
-  	case PLUS_EXPR:
-! 	  t = build_complex (const_binop (PLUS_EXPR, r1, r2, notrunc),
-  			     const_binop (PLUS_EXPR, i1, i2, notrunc));
-  	  break;
-  
-  	case MINUS_EXPR:
-! 	  t = build_complex (const_binop (MINUS_EXPR, r1, r2, notrunc),
-  			     const_binop (MINUS_EXPR, i1, i2, notrunc));
-  	  break;
-  
-  	case MULT_EXPR:
-! 	  t = build_complex (const_binop (MINUS_EXPR,
-  					  const_binop (MULT_EXPR,
-  						       r1, r2, notrunc),
---- 1243,1260 ----
-  	{
-  	case PLUS_EXPR:
-! 	  t = build_complex (type,
-! 			     const_binop (PLUS_EXPR, r1, r2, notrunc),
-  			     const_binop (PLUS_EXPR, i1, i2, notrunc));
-  	  break;
-  
-  	case MINUS_EXPR:
-! 	  t = build_complex (type,
-! 			     const_binop (MINUS_EXPR, r1, r2, notrunc),
-  			     const_binop (MINUS_EXPR, i1, i2, notrunc));
-  	  break;
-  
-  	case MULT_EXPR:
-! 	  t = build_complex (type,
-! 			     const_binop (MINUS_EXPR,
-  					  const_binop (MULT_EXPR,
-  						       r1, r2, notrunc),
-*************** const_binop (code, arg1, arg2, notrunc)
-*** 1271,1293 ****
-  			     notrunc);
-  
-! 	    t = build_complex
-! 	      (const_binop (INTEGRAL_TYPE_P (TREE_TYPE (r1))
-! 			    ? TRUNC_DIV_EXPR : RDIV_EXPR,
-! 			    const_binop (PLUS_EXPR,
-! 					 const_binop (MULT_EXPR, r1, r2,
-! 						      notrunc),
-! 					 const_binop (MULT_EXPR, i1, i2,
-! 						      notrunc),
-! 					 notrunc),
-! 			    magsquared, notrunc),
-! 	       const_binop (INTEGRAL_TYPE_P (TREE_TYPE (r1))
-! 			    ? TRUNC_DIV_EXPR : RDIV_EXPR,
-! 			    const_binop (MINUS_EXPR,
-! 					 const_binop (MULT_EXPR, i1, r2,
-! 						      notrunc),
-! 					 const_binop (MULT_EXPR, r1, i2,
-! 						      notrunc),
-! 					 notrunc),
-! 			    magsquared, notrunc));
-  	  }
-  	  break;
---- 1278,1302 ----
-  			     notrunc);
-  
-! 	    t = build_complex (type,
-! 			       const_binop
-! 			       (INTEGRAL_TYPE_P (TREE_TYPE (r1))
-! 				? TRUNC_DIV_EXPR : RDIV_EXPR,
-! 				const_binop (PLUS_EXPR,
-! 					     const_binop (MULT_EXPR, r1, r2,
-! 							  notrunc),
-! 					     const_binop (MULT_EXPR, i1, i2,
-! 							  notrunc),
-! 					     notrunc),
-! 				magsquared, notrunc),
-! 			       const_binop
-! 			       (INTEGRAL_TYPE_P (TREE_TYPE (r1))
-! 				? TRUNC_DIV_EXPR : RDIV_EXPR,
-! 				const_binop (MINUS_EXPR,
-! 					     const_binop (MULT_EXPR, i1, r2,
-! 							  notrunc),
-! 					     const_binop (MULT_EXPR, r1, i2,
-! 							  notrunc),
-! 					     notrunc),
-! 				magsquared, notrunc));
-  	  }
-  	  break;
-*************** const_binop (code, arg1, arg2, notrunc)
-*** 1296,1300 ****
-  	  abort ();
-  	}
--       TREE_TYPE (t) = TREE_TYPE (arg1);
-        return t;
-      }
---- 1305,1308 ----
-*************** size_binop (code, arg0, arg1)
-*** 1346,1363 ****
-      {
-        /* And some specific cases even faster than that.  */
-!       if (code == PLUS_EXPR
-! 	  && TREE_INT_CST_LOW (arg0) == 0
-! 	  && TREE_INT_CST_HIGH (arg0) == 0)
-  	return arg1;
-!       if (code == MINUS_EXPR
-! 	  && TREE_INT_CST_LOW (arg1) == 0
-! 	  && TREE_INT_CST_HIGH (arg1) == 0)
-  	return arg0;
-!       if (code == MULT_EXPR
-! 	  && TREE_INT_CST_LOW (arg0) == 1
-! 	  && TREE_INT_CST_HIGH (arg0) == 0)
-  	return arg1;
-        /* Handle general case of two integer constants.  */
-!       return const_binop (code, arg0, arg1, 0);
-      }
-  
---- 1354,1367 ----
-      {
-        /* And some specific cases even faster than that.  */
-!       if (code == PLUS_EXPR && integer_zerop (arg0))
-  	return arg1;
-!       else if ((code == MINUS_EXPR || code == PLUS_EXPR)
-! 	       && integer_zerop (arg1))
-  	return arg0;
-!       else if (code == MULT_EXPR && integer_onep (arg0))
-  	return arg1;
-+ 
-        /* Handle general case of two integer constants.  */
-!       return const_binop (code, arg0, arg1, 1);
-      }
-  
-*************** fold_convert (t, arg1)
-*** 1482,1486 ****
-  	{
-  	  if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1)))
-! 	    return arg1;
-  	  else if (setjmp (float_error))
-  	    {
---- 1486,1494 ----
-  	{
-  	  if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1)))
-! 	    {
-! 	      t = arg1;
-! 	      TREE_TYPE (arg1) = type;
-! 	      return t;
-! 	    }
-  	  else if (setjmp (float_error))
-  	    {
-*************** operand_equal_p (arg0, arg1, only_const)
-*** 1644,1687 ****
-    STRIP_NOPS (arg1);
-  
-!   /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
-!      We don't care about side effects in that case because the SAVE_EXPR
-!      takes care of that for us.  */
-!   if (TREE_CODE (arg0) == SAVE_EXPR && arg0 == arg1)
-!     return ! only_const;
-! 
-!   if (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1))
-      return 0;
-  
-!   if (TREE_CODE (arg0) == TREE_CODE (arg1)
-!       && TREE_CODE (arg0) == ADDR_EXPR
-!       && TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0))
-!     return 1;
-! 
-!   if (TREE_CODE (arg0) == TREE_CODE (arg1)
-!       && TREE_CODE (arg0) == INTEGER_CST
-!       && TREE_INT_CST_LOW (arg0) == TREE_INT_CST_LOW (arg1)
-!       && TREE_INT_CST_HIGH (arg0) == TREE_INT_CST_HIGH (arg1))
-      return 1;
-  
-!   /* Detect when real constants are equal.  */
-!   if (TREE_CODE (arg0) == TREE_CODE (arg1)
-!       && TREE_CODE (arg0) == REAL_CST)
-!     return !bcmp ((char *) &TREE_REAL_CST (arg0),
-! 		  (char *) &TREE_REAL_CST (arg1),
-! 		  sizeof (REAL_VALUE_TYPE));
-  
-    if (only_const)
-      return 0;
-  
--   if (arg0 == arg1)
--     return 1;
-- 
--   if (TREE_CODE (arg0) != TREE_CODE (arg1))
--     return 0;
--   /* This is needed for conversions and for COMPONENT_REF.
--      Might as well play it safe and always test this.  */
--   if (TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
--     return 0;
-- 
-    switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
-      {
---- 1652,1705 ----
-    STRIP_NOPS (arg1);
-  
-!   if (TREE_CODE (arg0) != TREE_CODE (arg1)
-!       /* This is needed for conversions and for COMPONENT_REF.
-! 	 Might as well play it safe and always test this.  */
-!       || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1)))
-      return 0;
-  
-!   /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
-!      We don't care about side effects in that case because the SAVE_EXPR
-!      takes care of that for us. In all other cases, two expressions are
-!      equal if they have no side effects.  If we have two identical
-!      expressions with side effects that should be treated the same due
-!      to the only side effects being identical SAVE_EXPR's, that will
-!      be detected in the recursive calls below.  */
-!   if (arg0 == arg1 && ! only_const
-!       && (TREE_CODE (arg0) == SAVE_EXPR
-! 	  || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
-      return 1;
-  
-!   /* Next handle constant cases, those for which we can return 1 even
-!      if ONLY_CONST is set.  */
-!   if (TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1))
-!     switch (TREE_CODE (arg0))
-!       {
-!       case INTEGER_CST:
-! 	return (TREE_INT_CST_LOW (arg0) == TREE_INT_CST_LOW (arg1)
-! 		&& TREE_INT_CST_HIGH (arg0) == TREE_INT_CST_HIGH (arg1));
-! 
-!       case REAL_CST:
-! 	return REAL_VALUES_EQUAL (TREE_REAL_CST (arg0), TREE_REAL_CST (arg1));
-! 
-!       case COMPLEX_CST:
-! 	return (operand_equal_p (TREE_REALPART (arg0), TREE_REALPART (arg1),
-! 				 only_const)
-! 		&& operand_equal_p (TREE_IMAGPART (arg0), TREE_IMAGPART (arg1),
-! 				    only_const));
-! 
-!       case STRING_CST:
-! 	return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
-! 		&& ! strncmp (TREE_STRING_POINTER (arg0),
-! 			      TREE_STRING_POINTER (arg1),
-! 			      TREE_STRING_LENGTH (arg0)));
-! 
-!       case ADDR_EXPR:
-! 	return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
-! 				0);
-!       }
-  
-    if (only_const)
-      return 0;
-  
-    switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
-      {
-*************** operand_equal_p (arg0, arg1, only_const)
-*** 1698,1705 ****
-      case '<':
-      case '2':
-!       return (operand_equal_p (TREE_OPERAND (arg0, 0),
-! 			       TREE_OPERAND (arg1, 0), 0)
-  	      && operand_equal_p (TREE_OPERAND (arg0, 1),
-! 				  TREE_OPERAND (arg1, 1), 0));
-  
-      case 'r':
---- 1716,1735 ----
-      case '<':
-      case '2':
-!       if (operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 0)
-! 	  && operand_equal_p (TREE_OPERAND (arg0, 1), TREE_OPERAND (arg1, 1),
-! 			      0))
-! 	return 1;
-! 
-!       /* For commutative ops, allow the other order.  */
-!       return ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MULT_EXPR
-! 	       || TREE_CODE (arg0) == MIN_EXPR || TREE_CODE (arg0) == MAX_EXPR
-! 	       || TREE_CODE (arg0) == BIT_IOR_EXPR
-! 	       || TREE_CODE (arg0) == BIT_XOR_EXPR
-! 	       || TREE_CODE (arg0) == BIT_AND_EXPR
-! 	       || TREE_CODE (arg0) == NE_EXPR || TREE_CODE (arg0) == EQ_EXPR)
-! 	      && operand_equal_p (TREE_OPERAND (arg0, 0),
-! 				  TREE_OPERAND (arg1, 1), 0)
-  	      && operand_equal_p (TREE_OPERAND (arg0, 1),
-! 				  TREE_OPERAND (arg1, 0), 0));
-  
-      case 'r':
-*************** optimize_bit_field_compare (code, compar
-*** 2212,2215 ****
---- 2242,2246 ----
-    int lunsignedp, runsignedp;
-    int lvolatilep = 0, rvolatilep = 0;
-+   int alignment;
-    tree linner, rinner;
-    tree mask;
-*************** optimize_bit_field_compare (code, compar
-*** 2220,2224 ****
-       extraction at all and so can do nothing.  */
-    linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
-! 				&lunsignedp, &lvolatilep);
-    if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
-        || offset != 0)
---- 2251,2255 ----
-       extraction at all and so can do nothing.  */
-    linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode,
-! 				&lunsignedp, &lvolatilep, &alignment);
-    if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0
-        || offset != 0)
-*************** optimize_bit_field_compare (code, compar
-*** 2229,2234 ****
-       /* If this is not a constant, we can only do something if bit positions,
-  	sizes, and signedness are the same.   */
-!      rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset,
-! 				   &rmode, &runsignedp, &rvolatilep);
-  
-       if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
---- 2260,2265 ----
-       /* If this is not a constant, we can only do something if bit positions,
-  	sizes, and signedness are the same.   */
-!      rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode,
-! 				   &runsignedp, &rvolatilep, &alignment);
-  
-       if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize
-*************** decode_field_reference (exp, pbitsize, p
-*** 2403,2406 ****
---- 2434,2438 ----
-    tree unsigned_type;
-    int precision;
-+   int alignment;
-  
-    /* All the optimizations using this function assume integer fields.  
-*************** decode_field_reference (exp, pbitsize, p
-*** 2423,2427 ****
-  
-    inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
-! 			       punsignedp, pvolatilep);
-    if ((inner == exp && and_mask == 0)
-        || *pbitsize < 0 || offset != 0)
---- 2455,2459 ----
-  
-    inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
-! 			       punsignedp, pvolatilep, &alignment);
-    if ((inner == exp && and_mask == 0)
-        || *pbitsize < 0 || offset != 0)
-*************** strip_compound_expr (t, s)
-*** 3065,3068 ****
---- 3097,3200 ----
-  }
-  
-+ /* Determine if first argument is a multiple of second argument.
-+    Return 0 if it is not, or is not easily determined to so be.
-+ 
-+    An example of the sort of thing we care about (at this point --
-+    this routine could surely be made more general, and expanded
-+    to do what the *_DIV_EXPR's fold() cases do now) is discovering
-+    that
-+ 
-+      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
-+ 
-+    is a multiple of
-+ 
-+      SAVE_EXPR (J * 8)
-+ 
-+    when we know that the two `SAVE_EXPR (J * 8)' nodes are the
-+    same node (which means they will have the same value at run
-+    time, even though we don't know when they'll be assigned).
-+ 
-+    This code also handles discovering that
-+ 
-+      SAVE_EXPR (I) * SAVE_EXPR (J * 8)
-+ 
-+    is a multiple of
-+ 
-+      8
-+ 
-+    (of course) so we don't have to worry about dealing with a
-+    possible remainder.
-+ 
-+    Note that we _look_ inside a SAVE_EXPR only to determine
-+    how it was calculated; it is not safe for fold() to do much
-+    of anything else with the internals of a SAVE_EXPR, since
-+    fold() cannot know when it will be evaluated at run time.
-+    For example, the latter example above _cannot_ be implemented
-+    as
-+ 
-+      SAVE_EXPR (I) * J
-+ 
-+    or any variant thereof, since the value of J at evaluation time
-+    of the original SAVE_EXPR is not necessarily the same at the time
-+    the new expression is evaluated.  The only optimization of this
-+    sort that would be valid is changing
-+ 
-+      SAVE_EXPR (I) * SAVE_EXPR (SAVE_EXPR (J) * 8)
-+    divided by
-+      8
-+ 
-+    to
-+ 
-+      SAVE_EXPR (I) * SAVE_EXPR (J)
-+ 
-+    (where the same SAVE_EXPR (J) is used in the original and the
-+    transformed version).  */
-+ 
-+ static int
-+ multiple_of_p (type, top, bottom)
-+      tree type;
-+      tree top;
-+      tree bottom;
-+ {
-+   if (operand_equal_p (top, bottom, 0))
-+     return 1;
-+ 
-+   if (TREE_CODE (type) != INTEGER_TYPE)
-+     return 0;
-+ 
-+   switch (TREE_CODE (top))
-+     {
-+     case MULT_EXPR:
-+       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
-+ 	      || multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
-+ 
-+     case PLUS_EXPR:
-+     case MINUS_EXPR:
-+       return (multiple_of_p (type, TREE_OPERAND (top, 0), bottom)
-+ 	      && multiple_of_p (type, TREE_OPERAND (top, 1), bottom));
-+ 
-+     case NOP_EXPR:
-+       /* Punt if conversion from non-integral or wider integral type.  */
-+       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE)
-+ 	  || (TYPE_PRECISION (type)
-+ 	      < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (top, 0)))))
-+ 	return 0;
-+       /* Fall through. */
-+     case SAVE_EXPR:
-+       return multiple_of_p (type, TREE_OPERAND (top, 0), bottom);
-+ 
-+     case INTEGER_CST:
-+       if ((TREE_CODE (bottom) != INTEGER_CST)
-+ 	  || (tree_int_cst_sgn (top) < 0)
-+ 	  || (tree_int_cst_sgn (bottom) < 0))
-+ 	return 0;
-+       return integer_zerop (const_binop (TRUNC_MOD_EXPR,
-+ 					 top, bottom, 0));
-+ 
-+     default:
-+       return 0;
-+     }
-+ }
-+ 
-  /* Perform constant folding and related simplification of EXPR.
-     The related simplifications include x*1 => x, x*0 => 0, etc.,
-*************** fold (expr) 
-*** 3611,3615 ****
-  				    TREE_OPERAND (arg0, 1))));
-        else if (TREE_CODE (arg0) == COMPLEX_CST)
-! 	return build_complex (TREE_OPERAND (arg0, 0),
-  			      fold (build1 (NEGATE_EXPR,
-  					    TREE_TYPE (TREE_TYPE (arg0)),
---- 3743,3747 ----
-  				    TREE_OPERAND (arg0, 1))));
-        else if (TREE_CODE (arg0) == COMPLEX_CST)
-! 	return build_complex (type, TREE_OPERAND (arg0, 0),
-  			      fold (build1 (NEGATE_EXPR,
-  					    TREE_TYPE (TREE_TYPE (arg0)),
-*************** fold (expr) 
-*** 4014,4018 ****
-  	return non_lvalue (convert (type, arg0));
-        if (integer_zerop (arg1))
-! 	return t;
-  
-        /* If we have ((a / C1) / C2) where both division are the same type, try
---- 4146,4166 ----
-  	return non_lvalue (convert (type, arg0));
-        if (integer_zerop (arg1))
-! 	{
-! 	  if (extra_warnings)
-! 	    warning ("integer division by zero");
-! 	  return t;
-! 	}
-! 
-!       /* If arg0 is a multiple of arg1, then rewrite to the fastest div
-! 	 operation, EXACT_DIV_EXPR.  Otherwise, handle folding of
-! 	 general divide.  Note that only CEIL_DIV_EXPR is rewritten now,
-! 	 only because the others seem to be faster in some cases, e.g. the
-! 	 nonoptimized TRUNC_DIV_EXPR or FLOOR_DIV_EXPR on DEC Alpha.  This
-! 	 is probably just due to more work being done on it in expmed.c than
-! 	 on EXACT_DIV_EXPR, and could presumably be fixed, since
-! 	 EXACT_DIV_EXPR should _never_ be slower than *_DIV_EXPR.  */
-!       if ((code == CEIL_DIV_EXPR)
-! 	  && multiple_of_p (type, arg0, arg1))
-! 	return fold (build (EXACT_DIV_EXPR, type, arg0, arg1));
-  
-        /* If we have ((a / C1) / C2) where both division are the same type, try
-*************** fold (expr) 
-*** 4049,4053 ****
-  	  tree xarg0 = arg0;
-  
-! 	  if (TREE_CODE (xarg0) == SAVE_EXPR)
-  	    have_save_expr = 1, xarg0 = TREE_OPERAND (xarg0, 0);
-  
---- 4197,4201 ----
-  	  tree xarg0 = arg0;
-  
-! 	  if (TREE_CODE (xarg0) == SAVE_EXPR && SAVE_EXPR_RTL (xarg0) == 0)
-  	    have_save_expr = 1, xarg0 = TREE_OPERAND (xarg0, 0);
-  
-*************** fold (expr) 
-*** 4067,4071 ****
-  	    }
-  
-! 	  if (TREE_CODE (xarg0) == SAVE_EXPR)
-  	    have_save_expr = 1, xarg0 = TREE_OPERAND (xarg0, 0);
-  
---- 4215,4219 ----
-  	    }
-  
-! 	  if (TREE_CODE (xarg0) == SAVE_EXPR && SAVE_EXPR_RTL (xarg0) == 0)
-  	    have_save_expr = 1, xarg0 = TREE_OPERAND (xarg0, 0);
-  
-*************** fold (expr) 
-*** 5050,5054 ****
-      case COMPLEX_EXPR:
-        if (wins)
-! 	return build_complex (arg0, arg1);
-        return t;
-  
---- 5198,5202 ----
-      case COMPLEX_EXPR:
-        if (wins)
-! 	return build_complex (type, arg0, arg1);
-        return t;
-  
-diff -rcp2N gcc-2.7.2.2/function.c g77-new/function.c
-*** gcc-2.7.2.2/function.c	Sun Nov 26 14:50:26 1995
---- g77-new/function.c	Sun Aug 10 18:47:24 1997
-*************** free_temps_for_rtl_expr (t)
-*** 1184,1187 ****
---- 1184,1202 ----
-  }
-  
-+ /* Mark all temporaries ever allocated in this functon as not suitable
-+    for reuse until the current level is exited.  */
-+ 
-+ void
-+ mark_all_temps_used ()
-+ {
-+   struct temp_slot *p;
-+ 
-+   for (p = temp_slots; p; p = p->next)
-+     {
-+       p->in_use = 1;
-+       p->level = MIN (p->level, temp_slot_level);
-+     }
-+ }
-+ 
-  /* Push deeper into the nesting level for stack temporaries.  */
-  
-*************** pop_temp_slots ()
-*** 1208,1211 ****
---- 1223,1237 ----
-    temp_slot_level--;
-  }
-+ 
-+ /* Initialize temporary slots.  */
-+ 
-+ void
-+ init_temp_slots ()
-+ {
-+   /* We have not allocated any temporaries yet.  */
-+   temp_slots = 0;
-+   temp_slot_level = 0;
-+   target_temp_slot_level = 0;
-+ }
-  
-  /* Retroactively move an auto variable from a register to a stack slot.
-*************** instantiate_virtual_regs_1 (loc, object,
-*** 2838,2842 ****
-      case MEM:
-        /* Most cases of MEM that convert to valid addresses have already been
-! 	 handled by our scan of regno_reg_rtx.  The only special handling we
-  	 need here is to make a copy of the rtx to ensure it isn't being
-  	 shared if we have to change it to a pseudo. 
---- 2864,2868 ----
-      case MEM:
-        /* Most cases of MEM that convert to valid addresses have already been
-! 	 handled by our scan of decls.  The only special handling we
-  	 need here is to make a copy of the rtx to ensure it isn't being
-  	 shared if we have to change it to a pseudo. 
-*************** instantiate_virtual_regs_1 (loc, object,
-*** 2896,2900 ****
-  	     has less restrictions on an address that some other insn.
-  	     In that case, we will modify the shared address.  This case
-! 	     doesn't seem very likely, though.  */
-  
-  	  if (instantiate_virtual_regs_1 (&XEXP (x, 0),
---- 2922,2928 ----
-  	     has less restrictions on an address that some other insn.
-  	     In that case, we will modify the shared address.  This case
-! 	     doesn't seem very likely, though.  One case where this could
-! 	     happen is in the case of a USE or CLOBBER reference, but we
-! 	     take care of that below.  */
-  
-  	  if (instantiate_virtual_regs_1 (&XEXP (x, 0),
-*************** instantiate_virtual_regs_1 (loc, object,
-*** 2909,2914 ****
-  
-        /* Fall through to generic unary operation case.  */
--     case USE:
--     case CLOBBER:
-      case SUBREG:
-      case STRICT_LOW_PART:
---- 2937,2940 ----
-*************** instantiate_virtual_regs_1 (loc, object,
-*** 2927,2930 ****
---- 2953,2973 ----
-        goto restart;
-  
-+     case USE:
-+     case CLOBBER:
-+       /* If the operand is a MEM, see if the change is a valid MEM.  If not,
-+ 	 go ahead and make the invalid one, but do it to a copy.  For a REG,
-+ 	 just make the recursive call, since there's no chance of a problem. */
-+ 
-+       if ((GET_CODE (XEXP (x, 0)) == MEM
-+ 	   && instantiate_virtual_regs_1 (&XEXP (XEXP (x, 0), 0), XEXP (x, 0),
-+ 					  0))
-+ 	  || (GET_CODE (XEXP (x, 0)) == REG
-+ 	      && instantiate_virtual_regs_1 (&XEXP (x, 0), 0, 0)))
-+ 	return 1;
-+ 
-+       XEXP (x, 0) = copy_rtx (XEXP (x, 0));
-+       loc = &XEXP (x, 0);
-+       goto restart;
-+ 
-      case REG:
-        /* Try to replace with a PLUS.  If that doesn't work, compute the sum
-*************** assign_parms (fndecl, second_time)
-*** 3404,3409 ****
-  
-  	  /* If this is a memory ref that contains aggregate components,
-! 	     mark it as such for cse and loop optimize.  */
-  	  MEM_IN_STRUCT_P (stack_parm) = aggregate;
-  	}
-  
---- 3447,3454 ----
-  
-  	  /* If this is a memory ref that contains aggregate components,
-! 	     mark it as such for cse and loop optimize.  Likewise if it
-! 	     is readonly.  */
-  	  MEM_IN_STRUCT_P (stack_parm) = aggregate;
-+ 	  RTX_UNCHANGING_P (stack_parm) = TREE_READONLY (parm);
-  	}
-  
-*************** assign_parms (fndecl, second_time)
-*** 3627,3631 ****
-  
-  	  parmreg = gen_reg_rtx (promoted_nominal_mode);
-! 	  REG_USERVAR_P (parmreg) = 1;
-  
-  	  /* If this was an item that we received a pointer to, set DECL_RTL
---- 3672,3676 ----
-  
-  	  parmreg = gen_reg_rtx (promoted_nominal_mode);
-! 	  mark_user_reg (parmreg);
-  
-  	  /* If this was an item that we received a pointer to, set DECL_RTL
-*************** assign_parms (fndecl, second_time)
-*** 3695,3699 ****
-  		 Pmode above.  We must use the actual mode of the parm.  */
-  	      parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
-! 	      REG_USERVAR_P (parmreg) = 1;
-  	      emit_move_insn (parmreg, DECL_RTL (parm));
-  	      DECL_RTL (parm) = parmreg;
---- 3740,3744 ----
-  		 Pmode above.  We must use the actual mode of the parm.  */
-  	      parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
-! 	      mark_user_reg (parmreg);
-  	      emit_move_insn (parmreg, DECL_RTL (parm));
-  	      DECL_RTL (parm) = parmreg;
-*************** init_function_start (subr, filename, lin
-*** 4814,4821 ****
-    rtl_expr_chain = 0;
-  
-!   /* We have not allocated any temporaries yet.  */
-!   temp_slots = 0;
-!   temp_slot_level = 0;
-!   target_temp_slot_level = 0;
-  
-    /* Within function body, compute a type's size as soon it is laid out.  */
---- 4859,4864 ----
-    rtl_expr_chain = 0;
-  
-!   /* Set up to allocate temporaries.  */
-!   init_temp_slots ();
-  
-    /* Within function body, compute a type's size as soon it is laid out.  */
-diff -rcp2N gcc-2.7.2.2/gcc.c g77-new/gcc.c
-*** gcc-2.7.2.2/gcc.c	Tue Sep 12 17:15:11 1995
---- g77-new/gcc.c	Sun Aug 10 18:47:14 1997
-*************** static int is_directory		PROTO((char *, 
-*** 296,300 ****
-  static void validate_switches	PROTO((char *));
-  static void validate_all_switches PROTO((void));
-! static void give_switch		PROTO((int, int));
-  static int used_arg		PROTO((char *, int));
-  static int default_arg		PROTO((char *, int));
---- 296,300 ----
-  static void validate_switches	PROTO((char *));
-  static void validate_all_switches PROTO((void));
-! static void give_switch		PROTO((int, int, int));
-  static int used_arg		PROTO((char *, int));
-  static int default_arg		PROTO((char *, int));
-*************** or with constant text in a single argume
-*** 405,408 ****
---- 405,409 ----
-  	name starts with `o'.  %{o*} would substitute this text,
-  	including the space; thus, two arguments would be generated.
-+  %{^S*} likewise, but don't put a blank between a switch and any args.
-   %{S*:X} substitutes X if one or more switches whose names start with -S are
-  	specified to CC.  Note that the tail part of the -S option
-*************** process_command (argc, argv)
-*** 2828,2831 ****
---- 2829,2835 ----
-  	  infiles[n_infiles++].name = argv[i];
-  	}
-+       /* -save-temps overrides -pipe, so that temp files are produced */
-+       else if (save_temps_flag && strcmp (argv[i], "-pipe") == 0)
-+ 	;
-        else if (argv[i][0] == '-' && argv[i][1] != 0)
-  	{
-*************** handle_braces (p)
-*** 3832,3835 ****
---- 3836,3844 ----
-    int negate = 0;
-    int suffix = 0;
-+   int include_blanks = 1;
-+ 
-+   if (*p == '^')
-+     /* A '^' after the open-brace means to not give blanks before args.  */
-+     include_blanks = 0, ++p;
-  
-    if (*p == '|')
-*************** handle_braces (p)
-*** 3897,3901 ****
-  	if (!strncmp (switches[i].part1, filter, p - filter)
-  	    && check_live_switch (i, p - filter))
-! 	  give_switch (i, 0);
-      }
-    else
---- 3906,3910 ----
-  	if (!strncmp (switches[i].part1, filter, p - filter)
-  	    && check_live_switch (i, p - filter))
-! 	  give_switch (i, 0, include_blanks);
-      }
-    else
-*************** handle_braces (p)
-*** 3936,3940 ****
-  		    do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
-  		    /* Pass any arguments this switch has.  */
-! 		    give_switch (i, 1);
-  		  }
-  
---- 3945,3949 ----
-  		    do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
-  		    /* Pass any arguments this switch has.  */
-! 		    give_switch (i, 1, 1);
-  		  }
-  
-*************** handle_braces (p)
-*** 3980,3984 ****
-  	  if (*p == '}')
-  	    {
-! 	      give_switch (i, 0);
-  	    }
-  	  else
---- 3989,3993 ----
-  	  if (*p == '}')
-  	    {
-! 	      give_switch (i, 0, include_blanks);
-  	    }
-  	  else
-*************** check_live_switch (switchnum, prefix_len
-*** 4081,4090 ****
-     This cannot fail since it never finishes a command line.
-  
-!    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.  */
-  
-  static void
-! give_switch (switchnum, omit_first_word)
-       int switchnum;
-       int omit_first_word;
-  {
-    if (!omit_first_word)
---- 4090,4103 ----
-     This cannot fail since it never finishes a command line.
-  
-!    If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
-! 
-!    If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
-!    of the switch.  */
-  
-  static void
-! give_switch (switchnum, omit_first_word, include_blanks)
-       int switchnum;
-       int omit_first_word;
-+      int include_blanks;
-  {
-    if (!omit_first_word)
-*************** give_switch (switchnum, omit_first_word)
-*** 4093,4097 ****
-        do_spec_1 (switches[switchnum].part1, 1, NULL_PTR);
-      }
-!   do_spec_1 (" ", 0, NULL_PTR);
-    if (switches[switchnum].args != 0)
-      {
---- 4106,4110 ----
-        do_spec_1 (switches[switchnum].part1, 1, NULL_PTR);
-      }
-! 
-    if (switches[switchnum].args != 0)
-      {
-*************** give_switch (switchnum, omit_first_word)
-*** 4099,4106 ****
-        for (p = switches[switchnum].args; *p; p++)
-  	{
-  	  do_spec_1 (*p, 1, NULL_PTR);
-- 	  do_spec_1 (" ", 0, NULL_PTR);
-  	}
-      }
-    switches[switchnum].valid = 1;
-  }
---- 4112,4122 ----
-        for (p = switches[switchnum].args; *p; p++)
-  	{
-+ 	  if (include_blanks)
-+ 	    do_spec_1 (" ", 0, NULL_PTR);
-  	  do_spec_1 (*p, 1, NULL_PTR);
-  	}
-      }
-+ 
-+   do_spec_1 (" ", 0, NULL_PTR);
-    switches[switchnum].valid = 1;
-  }
-diff -rcp2N gcc-2.7.2.2/gcc.texi g77-new/gcc.texi
-*** gcc-2.7.2.2/gcc.texi	Thu Feb 20 19:24:19 1997
---- g77-new/gcc.texi	Thu Jul 10 20:08:58 1997
-*************** original English.
-*** 149,152 ****
---- 149,153 ----
-  @sp 3
-  @center Last updated 29 June 1996
-+ @center (Revised for GNU Fortran 1997-01-10)
-  @sp 1
-  @c The version number appears twice more in this file.  
-diff -rcp2N gcc-2.7.2.2/glimits.h g77-new/glimits.h
-*** gcc-2.7.2.2/glimits.h	Wed Sep 29 17:30:54 1993
---- g77-new/glimits.h	Thu Jul 10 20:08:58 1997
-***************
-*** 64,68 ****
-     (Same as `int').  */
-  #ifndef __LONG_MAX__
-! #define __LONG_MAX__ 2147483647L
-  #endif
-  #undef LONG_MIN
---- 64,72 ----
-     (Same as `int').  */
-  #ifndef __LONG_MAX__
-! # ifndef __alpha__
-! #  define __LONG_MAX__ 2147483647L
-! # else
-! #  define __LONG_MAX__ 9223372036854775807LL
-! # endif /* __alpha__ */
-  #endif
-  #undef LONG_MIN
-diff -rcp2N gcc-2.7.2.2/integrate.c g77-new/integrate.c
-*** gcc-2.7.2.2/integrate.c	Fri Oct 20 18:48:13 1995
---- g77-new/integrate.c	Sun Aug 10 18:46:31 1997
-*************** static rtx copy_for_inline	PROTO((rtx));
-*** 67,70 ****
---- 67,71 ----
-  static void integrate_parm_decls PROTO((tree, struct inline_remap *, rtvec));
-  static void integrate_decl_tree	PROTO((tree, int, struct inline_remap *));
-+ static void save_constants_in_decl_trees PROTO ((tree));
-  static void subst_constants	PROTO((rtx *, rtx, struct inline_remap *));
-  static void restore_constants	PROTO((rtx *));
-*************** save_for_inline_copying (fndecl)
-*** 435,438 ****
---- 436,443 ----
-  	  }
-  
-+       /* Also scan all decls, and replace any constant pool references with the
-+ 	 actual constant.  */
-+       save_constants_in_decl_trees (DECL_INITIAL (fndecl));
-+ 
-        /* Clear out the constant pool so that we can recreate it with the
-  	 copied constants below.  */
-*************** save_for_inline_nocopy (fndecl)
-*** 781,784 ****
---- 786,793 ----
-      }
-  
-+   /* Also scan all decls, and replace any constant pool references with the
-+      actual constant.  */
-+   save_constants_in_decl_trees (DECL_INITIAL (fndecl));
-+ 
-    /* We have now allocated all that needs to be allocated permanently
-       on the rtx obstack.  Set our high-water mark, so that we
-*************** expand_inline_function (fndecl, parms, t
-*** 1571,1575 ****
-        if (GET_CODE (XEXP (loc, 0)) == REG)
-  	{
-! 	  temp = force_reg (Pmode, structure_value_addr);
-  	  map->reg_map[REGNO (XEXP (loc, 0))] = temp;
-  	  if ((CONSTANT_P (structure_value_addr)
---- 1580,1585 ----
-        if (GET_CODE (XEXP (loc, 0)) == REG)
-  	{
-! 	  temp = force_reg (Pmode,
-! 			    force_operand (structure_value_addr, NULL_RTX));
-  	  map->reg_map[REGNO (XEXP (loc, 0))] = temp;
-  	  if ((CONSTANT_P (structure_value_addr)
-*************** integrate_decl_tree (let, level, map)
-*** 2029,2032 ****
---- 2039,2059 ----
-  	}
-      }
-+ }
-+ 
-+ /* Given a BLOCK node LET, search for all DECL_RTL fields, and pass them
-+    through save_constants.  */
-+ 
-+ static void
-+ save_constants_in_decl_trees (let)
-+      tree let;
-+ {
-+   tree t;
-+ 
-+   for (t = BLOCK_VARS (let); t; t = TREE_CHAIN (t))
-+     if (DECL_RTL (t) != 0)
-+       save_constants (&DECL_RTL (t));
-+ 
-+   for (t = BLOCK_SUBBLOCKS (let); t; t = TREE_CHAIN (t))
-+     save_constants_in_decl_trees (t);
-  }
-  
-diff -rcp2N gcc-2.7.2.2/invoke.texi g77-new/invoke.texi
-*** gcc-2.7.2.2/invoke.texi	Tue Oct  3 11:40:43 1995
---- g77-new/invoke.texi	Thu Jul 10 20:09:00 1997
-***************
-*** 1,3 ****
-! @c Copyright (C) 1988, 89, 92, 93, 94, 1995 Free Software Foundation, Inc.
-  @c This is part of the GCC manual.
-  @c For copying conditions, see the file gcc.texi.
---- 1,3 ----
-! @c Copyright (C) 1988, 89, 92-95, 1997 Free Software Foundation, Inc.
-  @c This is part of the GCC manual.
-  @c For copying conditions, see the file gcc.texi.
-*************** in the following sections.
-*** 149,152 ****
---- 149,153 ----
-  -fschedule-insns2  -fstrength-reduce  -fthread-jumps 
-  -funroll-all-loops  -funroll-loops
-+ -fmove-all-movables  -freduce-all-givs  -frerun-loop-opt
-  -O  -O0  -O1  -O2  -O3
-  @end smallexample
-*************** in addition to the above:
-*** 331,334 ****
---- 332,337 ----
-  -fshort-double  -fvolatile  -fvolatile-global
-  -fverbose-asm -fpack-struct +e0  +e1
-+ -fargument-alias  -fargument-noalias
-+ -fargument-noalias-global
-  @end smallexample
-  @end table
-*************** Print extra warning messages for these e
-*** 1253,1256 ****
---- 1256,1304 ----
-  
-  @itemize @bullet
-+ @cindex division by zero
-+ @cindex zero, division by
-+ @item
-+ An integer division by zero is detected.
-+ 
-+ Some cases of division by zero might occur as the result
-+ of using so-called ``safe'' macros.
-+ For example:
-+ 
-+ @smallexample
-+ #define BUCKETS(b) (((b) != NULL) ? (b)->buckets : 0)
-+ @dots{...}
-+   i = j / BUCKETS(b);
-+ @end smallexample
-+ 
-+ Although analysis of the context of the above code could
-+ prove that @samp{b} is never null when it is executed,
-+ the division-by-zero warning is still useful, because
-+ @code{gcc} generates code to do the division by zero at
-+ run time so as to generate a run-time fault,
-+ and tidy programmers will want to find ways to prevent
-+ this needless code from being generated.
-+ 
-+ Note that @code{gcc} transforms expressions so as to find
-+ opportunities for performing expensive operations
-+ (such as division) at compile time instead of generating
-+ code to perform them at run time.
-+ For example, @code{gcc} transforms:
-+ 
-+ @smallexample
-+ 2 / (i == 0)
-+ @end smallexample
-+ 
-+ into:
-+ 
-+ @smallexample
-+ (i == 0) ? (2 / 1) : (2 / 0)
-+ @end smallexample
-+ 
-+ As a result, the division-by-zero warning might occur
-+ in contexts where the divisor seems to be a non-constant.
-+ It is useful in this case as well, because programmers might want
-+ to clean up the code so the compiled code does not include
-+ dead code to divide by zero.
-+ 
-  @cindex @code{longjmp} warnings
-  @item
-*************** and usually makes programs run more slow
-*** 1941,1944 ****
---- 1989,2037 ----
-  implies @samp{-fstrength-reduce} as well as @samp{-frerun-cse-after-loop}.
-  
-+ @item -fmove-all-movables
-+ Forces all invariant computations in loops to be moved
-+ outside the loop.
-+ This option is provided primarily to improve performance
-+ for some Fortran code, though it might improve code written
-+ in other languages.
-+ 
-+ @emph{Note:} When compiling programs written in Fortran,
-+ this option is enabled by default.
-+ 
-+ Analysis of Fortran code optimization and the resulting
-+ optimizations triggered by this option, and the
-+ @samp{-freduce-all-givs} and @samp{-frerun-loop-opt}
-+ options as well, were
-+ contributed by Toon Moene (@code{toon@@moene.indiv.nluug.nl}).
-+ 
-+ These three options are intended to be removed someday, once
-+ they have helped determine the efficacy of various
-+ approaches to improving the performance of Fortran code.
-+ 
-+ Please let us (@code{fortran@@gnu.ai.mit.edu})
-+ know how use of these options affects
-+ the performance of your production code.
-+ We're very interested in code that runs @emph{slower}
-+ when these options are @emph{enabled}.
-+ 
-+ @item -freduce-all-givs
-+ Forces all general-induction variables in loops to be
-+ strength-reduced.
-+ This option is provided primarily to improve performance
-+ for some Fortran code, though it might improve code written
-+ in other languages.
-+ 
-+ @emph{Note:} When compiling programs written in Fortran,
-+ this option is enabled by default.
-+ 
-+ @item -frerun-loop-opt
-+ Runs loop optimizations a second time.
-+ This option is provided primarily to improve performance
-+ for some Fortran code, though it might improve code written
-+ in other languages.
-+ 
-+ @emph{Note:} When compiling programs written in Fortran,
-+ this option is enabled by default.
-+ 
-  @item -fno-peephole
-  Disable any machine-specific peephole optimizations.
-*************** compilation).
-*** 4229,4232 ****
---- 4322,4397 ----
-  With @samp{+e1}, G++ actually generates the code implementing virtual
-  functions defined in the code, and makes them publicly visible.
-+ 
-+ @cindex aliasing of parameters
-+ @cindex parameters, aliased
-+ @item -fargument-alias
-+ @item -fargument-noalias
-+ @item -fargument-noalias-global
-+ Specify the possible relationships among parameters and between
-+ parameters and global data.
-+ 
-+ @samp{-fargument-alias} specifies that arguments (parameters) may
-+ alias each other and may alias global storage.
-+ @samp{-fargument-noalias} specifies that arguments do not alias
-+ each other, but may alias global storage.
-+ @samp{-fargument-noalias-global} specifies that arguments do not
-+ alias each other and do not alias global storage.
-+ 
-+ For code written in C, C++, and Objective-C, @samp{-fargument-alias}
-+ is the default.
-+ For code written in Fortran, @samp{-fargument-noalias-global} is
-+ the default, though this is pertinent only on systems where
-+ @code{g77} is installed.
-+ (See the documentation for other compilers for information on the
-+ defaults for their respective languages.)
-+ 
-+ Normally, @code{gcc} assumes that a write through a pointer
-+ passed as a parameter to the current function might modify a
-+ value pointed to by another pointer passed as a parameter, or
-+ in global storage.
-+ 
-+ For example, consider this code:
-+ 
-+ @example
-+ void x(int *i, int *j)
-+ @{
-+   extern int k;
-+ 
-+   ++*i;
-+   ++*j;
-+   ++k;
-+ @}
-+ @end example
-+ 
-+ When compiling the above function, @code{gcc} assumes that @samp{i} might
-+ be a pointer to the same variable as @samp{j}, and that either @samp{i},
-+ @samp{j}, or both might be a pointer to @samp{k}.
-+ 
-+ Therefore, @code{gcc} does not assume it can generate code to read
-+ @samp{*i}, @samp{*j}, and @samp{k} into separate registers, increment
-+ each register, then write the incremented values back out.
-+ 
-+ Instead, @code{gcc} must generate code that reads @samp{*i},
-+ increments it, and writes it back before reading @samp{*j},
-+ in case @samp{i} and @samp{j} are aliased, and, similarly,
-+ that writes @samp{*j} before reading @samp{k}.
-+ The result is code that, on many systems, takes longer to execute,
-+ due to the way many processors schedule instruction execution.
-+ 
-+ Compiling the above code with the @samp{-fargument-noalias} option
-+ allows @code{gcc} to assume that @samp{i} and @samp{j} do not alias
-+ each other, but either might alias @samp{k}.
-+ 
-+ Compiling the above code with the @samp{-fargument-noalias-global}
-+ option allows @code{gcc} to assume that no combination of @samp{i},
-+ @samp{j}, and @samp{k} are aliases for each other.
-+ 
-+ @emph{Note:} Use the @samp{-fargument-noalias} and
-+ @samp{-fargument-noalias-global} options with care.
-+ While they can result in faster executables, they can
-+ also result in executables with subtle bugs, bugs that
-+ show up only when compiled for specific target systems,
-+ or bugs that show up only when compiled by specific versions
-+ of @code{g77}.
-  @end table
-  
-diff -rcp2N gcc-2.7.2.2/libgcc2.c g77-new/libgcc2.c
-*** gcc-2.7.2.2/libgcc2.c	Sun Nov 26 14:39:21 1995
---- g77-new/libgcc2.c	Sun Aug 10 18:46:07 1997
-*************** __gcc_bcmp (s1, s2, size)
-*** 1193,1196 ****
---- 1193,1201 ----
-  #endif
-  
-+ #ifdef L__dummy
-+ void
-+ __dummy () {}
-+ #endif
-+ 
-  #ifdef L_varargs
-  #ifdef __i860__
-diff -rcp2N gcc-2.7.2.2/local-alloc.c g77-new/local-alloc.c
-*** gcc-2.7.2.2/local-alloc.c	Mon Aug 21 13:15:44 1995
---- g77-new/local-alloc.c	Sun Aug 10 18:46:10 1997
-*************** static int this_insn_number;
-*** 243,246 ****
---- 243,250 ----
-  static rtx this_insn;
-  
-+ /* Used to communicate changes made by update_equiv_regs to
-+    memref_referenced_p.  */
-+ static rtx *reg_equiv_replacement;
-+ 
-  static void alloc_qty		PROTO((int, enum machine_mode, int, int));
-  static void alloc_qty_for_scratch PROTO((rtx, int, rtx, int, int));
-*************** validate_equiv_mem_from_store (dest, set
-*** 545,549 ****
-         && reg_overlap_mentioned_p (dest, equiv_mem))
-        || (GET_CODE (dest) == MEM
-! 	  && true_dependence (dest, equiv_mem)))
-      equiv_mem_modified = 1;
-  }
---- 549,553 ----
-         && reg_overlap_mentioned_p (dest, equiv_mem))
-        || (GET_CODE (dest) == MEM
-! 	  && true_dependence (dest, VOIDmode, equiv_mem, rtx_varies_p)))
-      equiv_mem_modified = 1;
-  }
-*************** memref_referenced_p (memref, x)
-*** 617,621 ****
-    switch (code)
-      {
--     case REG:
-      case CONST_INT:
-      case CONST:
---- 621,624 ----
-*************** memref_referenced_p (memref, x)
-*** 629,634 ****
-        return 0;
-  
-      case MEM:
-!       if (true_dependence (memref, x))
-  	return 1;
-        break;
---- 632,642 ----
-        return 0;
-  
-+     case REG:
-+       return (reg_equiv_replacement[REGNO (x)] == 0
-+ 	      || memref_referenced_p (memref,
-+ 				      reg_equiv_replacement[REGNO (x)]));
-+ 
-      case MEM:
-!       if (true_dependence (memref, VOIDmode, x, rtx_varies_p))
-  	return 1;
-        break;
-*************** optimize_reg_copy_1 (insn, dest, src)
-*** 818,827 ****
-  	      if (sregno >= FIRST_PSEUDO_REGISTER)
-  		{
-! 		  reg_live_length[sregno] -= length;
-! 		  /* reg_live_length is only an approximation after combine
-! 		     if sched is not run, so make sure that we still have
-! 		     a reasonable value.  */
-! 		  if (reg_live_length[sregno] < 2)
-! 		    reg_live_length[sregno] = 2;
-  		  reg_n_calls_crossed[sregno] -= n_calls;
-  		}
---- 826,839 ----
-  	      if (sregno >= FIRST_PSEUDO_REGISTER)
-  		{
-! 		  if (reg_live_length[sregno] >= 0)
-! 		    {
-! 		      reg_live_length[sregno] -= length;
-! 		      /* reg_live_length is only an approximation after
-! 			 combine if sched is not run, so make sure that we
-! 			 still have a reasonable value.  */
-! 		      if (reg_live_length[sregno] < 2)
-! 			reg_live_length[sregno] = 2;
-! 		    }
-! 
-  		  reg_n_calls_crossed[sregno] -= n_calls;
-  		}
-*************** optimize_reg_copy_1 (insn, dest, src)
-*** 829,833 ****
-  	      if (dregno >= FIRST_PSEUDO_REGISTER)
-  		{
-! 		  reg_live_length[dregno] += d_length;
-  		  reg_n_calls_crossed[dregno] += d_n_calls;
-  		}
---- 841,847 ----
-  	      if (dregno >= FIRST_PSEUDO_REGISTER)
-  		{
-! 		  if (reg_live_length[dregno] >= 0)
-! 		    reg_live_length[dregno] += d_length;
-! 
-  		  reg_n_calls_crossed[dregno] += d_n_calls;
-  		}
-*************** update_equiv_regs ()
-*** 948,953 ****
-  {
-    rtx *reg_equiv_init_insn = (rtx *) alloca (max_regno * sizeof (rtx *));
--   rtx *reg_equiv_replacement = (rtx *) alloca (max_regno * sizeof (rtx *));
-    rtx insn;
-  
-    bzero ((char *) reg_equiv_init_insn, max_regno * sizeof (rtx *));
---- 962,968 ----
-  {
-    rtx *reg_equiv_init_insn = (rtx *) alloca (max_regno * sizeof (rtx *));
-    rtx insn;
-+ 
-+   reg_equiv_replacement = (rtx *) alloca (max_regno * sizeof (rtx *));
-  
-    bzero ((char *) reg_equiv_init_insn, max_regno * sizeof (rtx *));
-diff -rcp2N gcc-2.7.2.2/loop.c g77-new/loop.c
-*** gcc-2.7.2.2/loop.c	Thu Feb 20 19:24:20 1997
---- g77-new/loop.c	Sun Aug 10 18:46:43 1997
-*************** int *loop_number_exit_count;
-*** 111,116 ****
-  unsigned HOST_WIDE_INT loop_n_iterations;
-  
-! /* Nonzero if there is a subroutine call in the current loop.
-!    (unknown_address_altered is also nonzero in this case.)  */
-  
-  static int loop_has_call;
---- 111,115 ----
-  unsigned HOST_WIDE_INT loop_n_iterations;
-  
-! /* Nonzero if there is a subroutine call in the current loop.  */
-  
-  static int loop_has_call;
-*************** static char *moved_once;
-*** 160,164 ****
-     here, we just turn on unknown_address_altered.  */
-  
-! #define NUM_STORES 20
-  static rtx loop_store_mems[NUM_STORES];
-  
---- 159,163 ----
-     here, we just turn on unknown_address_altered.  */
-  
-! #define NUM_STORES 30
-  static rtx loop_store_mems[NUM_STORES];
-  
-*************** scan_loop (loop_start, end, nregs)
-*** 669,673 ****
-  	    {
-  	      temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
-! 	      if (temp && CONSTANT_P (XEXP (temp, 0)))
-  		src = XEXP (temp, 0), move_insn = 1;
-  	      if (temp && find_reg_note (p, REG_RETVAL, NULL_RTX))
---- 668,673 ----
-  	    {
-  	      temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
-! 	      if (temp && CONSTANT_P (XEXP (temp, 0))
-! 		  && LEGITIMATE_CONSTANT_P (XEXP (temp, 0)))
-  		src = XEXP (temp, 0), move_insn = 1;
-  	      if (temp && find_reg_note (p, REG_RETVAL, NULL_RTX))
-*************** move_movables (movables, threshold, insn
-*** 1629,1632 ****
---- 1629,1633 ----
-  
-  	  if (already_moved[regno]
-+ 	      || flag_move_all_movables
-  	      || (threshold * savings * m->lifetime) >= insn_count
-  	      || (m->forces && m->forces->done
-*************** prescan_loop (start, end)
-*** 2199,2203 ****
-        else if (GET_CODE (insn) == CALL_INSN)
-  	{
-! 	  unknown_address_altered = 1;
-  	  loop_has_call = 1;
-  	}
---- 2200,2205 ----
-        else if (GET_CODE (insn) == CALL_INSN)
-  	{
-! 	  if (! CONST_CALL_P (insn))
-! 	    unknown_address_altered = 1;
-  	  loop_has_call = 1;
-  	}
-*************** invariant_p (x)
-*** 2777,2781 ****
-        /* See if there is any dependence between a store and this load.  */
-        for (i = loop_store_mems_idx - 1; i >= 0; i--)
-! 	if (true_dependence (loop_store_mems[i], x))
-  	  return 0;
-  
---- 2779,2783 ----
-        /* See if there is any dependence between a store and this load.  */
-        for (i = loop_store_mems_idx - 1; i >= 0; i--)
-! 	if (true_dependence (loop_store_mems[i], VOIDmode, x, rtx_varies_p))
-  	  return 0;
-  
-*************** strength_reduce (scan_start, end, loop_t
-*** 3821,3826 ****
-  	     exit.  */
-  
-! 	  if (v->lifetime * threshold * benefit < insn_count
-! 	      && ! bl->reversed)
-  	    {
-  	      if (loop_dump_stream)
---- 3823,3828 ----
-  	     exit.  */
-  
-! 	  if ( ! flag_reduce_all_givs && v->lifetime * threshold * benefit < insn_count
-! 	      && ! bl->reversed )
-  	    {
-  	      if (loop_dump_stream)
-*************** record_giv (v, insn, src_reg, dest_reg, 
-*** 4375,4378 ****
---- 4377,4382 ----
-    v->final_value = 0;
-    v->same_insn = 0;
-+   v->unrolled = 0;
-+   v->shared = 0;
-  
-    /* The v->always_computable field is used in update_giv_derive, to
-*************** check_final_value (v, loop_start, loop_e
-*** 4652,4657 ****
-  	      if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p)
-  		  && LABEL_NAME (JUMP_LABEL (p))
-! 		  && ((INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (v->insn)
-! 		       && INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (loop_start))
-  		      || (INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (last_giv_use)
-  			  && INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (loop_end))))
---- 4656,4664 ----
-  	      if (GET_CODE (p) == JUMP_INSN && JUMP_LABEL (p)
-  		  && LABEL_NAME (JUMP_LABEL (p))
-! 		  && ((INSN_UID (JUMP_LABEL (p)) >= max_uid_for_loop)
-! 		      || (INSN_UID (v->insn) >= max_uid_for_loop)
-! 		      || (INSN_UID (last_giv_use) >= max_uid_for_loop)
-! 		      || (INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (v->insn)
-! 			  && INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (loop_start))
-  		      || (INSN_LUID (JUMP_LABEL (p)) > INSN_LUID (last_giv_use)
-  			  && INSN_LUID (JUMP_LABEL (p)) < INSN_LUID (loop_end))))
-*************** emit_iv_add_mult (b, m, a, reg, insert_b
-*** 5560,5563 ****
---- 5567,5572 ----
-  
-    emit_insn_before (seq, insert_before);
-+ 
-+   record_base_value (REGNO (reg), b);
-  }
-  
-diff -rcp2N gcc-2.7.2.2/loop.h g77-new/loop.h
-*** gcc-2.7.2.2/loop.h	Fri Jul 14 08:23:28 1995
---- g77-new/loop.h	Thu Jul 10 20:09:03 1997
-*************** struct induction
-*** 89,92 ****
---- 89,95 ----
-  				   we won't use it to eliminate a biv, it
-  				   would probably lose. */
-+   unsigned unrolled : 1;	/* 1 if new register has been allocated in
-+ 				   unrolled loop.  */
-+   unsigned shared : 1;
-    int lifetime;			/* Length of life of this giv */
-    int times_used;		/* # times this giv is used. */
-diff -rcp2N gcc-2.7.2.2/real.c g77-new/real.c
-*** gcc-2.7.2.2/real.c	Tue Aug 15 17:57:18 1995
---- g77-new/real.c	Thu Jul 10 20:09:04 1997
-*************** make_nan (nan, sign, mode)
-*** 5625,5633 ****
-  }
-  
-! /* Convert an SFmode target `float' value to a REAL_VALUE_TYPE.
-!    This is the inverse of the function `etarsingle' invoked by
-     REAL_VALUE_TO_TARGET_SINGLE.  */
-  
-  REAL_VALUE_TYPE
-  ereal_from_float (f)
-       HOST_WIDE_INT f;
---- 5625,5699 ----
-  }
-  
-! /* This is the inverse of the function `etarsingle' invoked by
-     REAL_VALUE_TO_TARGET_SINGLE.  */
-  
-  REAL_VALUE_TYPE
-+ ereal_unto_float (f)
-+      long f;
-+ {
-+   REAL_VALUE_TYPE r;
-+   unsigned EMUSHORT s[2];
-+   unsigned EMUSHORT e[NE];
-+ 
-+   /* Convert 32 bit integer to array of 16 bit pieces in target machine order.
-+    This is the inverse operation to what the function `endian' does.  */
-+   if (REAL_WORDS_BIG_ENDIAN)
-+     {
-+       s[0] = (unsigned EMUSHORT) (f >> 16);
-+       s[1] = (unsigned EMUSHORT) f;
-+     }
-+   else
-+     {
-+       s[0] = (unsigned EMUSHORT) f;
-+       s[1] = (unsigned EMUSHORT) (f >> 16);
-+     }
-+   /* Convert and promote the target float to E-type. */
-+   e24toe (s, e);
-+   /* Output E-type to REAL_VALUE_TYPE. */
-+   PUT_REAL (e, &r);
-+   return r;
-+ }
-+ 
-+ 
-+ /* This is the inverse of the function `etardouble' invoked by
-+    REAL_VALUE_TO_TARGET_DOUBLE.  */
-+ 
-+ REAL_VALUE_TYPE
-+ ereal_unto_double (d)
-+      long d[];
-+ {
-+   REAL_VALUE_TYPE r;
-+   unsigned EMUSHORT s[4];
-+   unsigned EMUSHORT e[NE];
-+ 
-+   /* Convert array of HOST_WIDE_INT to equivalent array of 16-bit pieces.  */
-+   if (REAL_WORDS_BIG_ENDIAN)
-+     {
-+       s[0] = (unsigned EMUSHORT) (d[0] >> 16);
-+       s[1] = (unsigned EMUSHORT) d[0];
-+       s[2] = (unsigned EMUSHORT) (d[1] >> 16);
-+       s[3] = (unsigned EMUSHORT) d[1];
-+     }
-+   else
-+     {
-+       /* Target float words are little-endian.  */
-+       s[0] = (unsigned EMUSHORT) d[0];
-+       s[1] = (unsigned EMUSHORT) (d[0] >> 16);
-+       s[2] = (unsigned EMUSHORT) d[1];
-+       s[3] = (unsigned EMUSHORT) (d[1] >> 16);
-+     }
-+   /* Convert target double to E-type. */
-+   e53toe (s, e);
-+   /* Output E-type to REAL_VALUE_TYPE. */
-+   PUT_REAL (e, &r);
-+   return r;
-+ }
-+ 
-+ 
-+ /* Convert an SFmode target `float' value to a REAL_VALUE_TYPE.
-+    This is somewhat like ereal_unto_float, but the input types
-+    for these are different.  */
-+ 
-+ REAL_VALUE_TYPE
-  ereal_from_float (f)
-       HOST_WIDE_INT f;
-*************** ereal_from_float (f)
-*** 5658,5663 ****
-  
-  /* Convert a DFmode target `double' value to a REAL_VALUE_TYPE.
-!    This is the inverse of the function `etardouble' invoked by
-!    REAL_VALUE_TO_TARGET_DOUBLE.
-  
-     The DFmode is stored as an array of HOST_WIDE_INT in the target's
---- 5724,5729 ----
-  
-  /* Convert a DFmode target `double' value to a REAL_VALUE_TYPE.
-!    This is somewhat like ereal_unto_double, but the input types
-!    for these are different.
-  
-     The DFmode is stored as an array of HOST_WIDE_INT in the target's
-diff -rcp2N gcc-2.7.2.2/real.h g77-new/real.h
-*** gcc-2.7.2.2/real.h	Thu Jun 15 07:57:56 1995
---- g77-new/real.h	Thu Jul 10 20:09:05 1997
-*************** extern void ereal_to_decimal	PROTO((REAL
-*** 152,155 ****
---- 152,157 ----
-  extern int ereal_cmp		PROTO((REAL_VALUE_TYPE, REAL_VALUE_TYPE));
-  extern int ereal_isneg		PROTO((REAL_VALUE_TYPE));
-+ extern REAL_VALUE_TYPE ereal_unto_float PROTO((long));
-+ extern REAL_VALUE_TYPE ereal_unto_double PROTO((long *));
-  extern REAL_VALUE_TYPE ereal_from_float PROTO((HOST_WIDE_INT));
-  extern REAL_VALUE_TYPE ereal_from_double PROTO((HOST_WIDE_INT *));
-*************** extern REAL_VALUE_TYPE real_value_trunca
-*** 197,200 ****
---- 199,208 ----
-  /* IN is a REAL_VALUE_TYPE.  OUT is a long. */
-  #define REAL_VALUE_TO_TARGET_SINGLE(IN, OUT) ((OUT) = etarsingle ((IN)))
-+ 
-+ /* Inverse of REAL_VALUE_TO_TARGET_DOUBLE. */
-+ #define REAL_VALUE_UNTO_TARGET_DOUBLE(d)  (ereal_unto_double (d))
-+ 
-+ /* Inverse of REAL_VALUE_TO_TARGET_SINGLE. */
-+ #define REAL_VALUE_UNTO_TARGET_SINGLE(f)  (ereal_unto_float (f))
-  
-  /* d is an array of HOST_WIDE_INT that holds a double precision
-diff -rcp2N gcc-2.7.2.2/recog.c g77-new/recog.c
-*** gcc-2.7.2.2/recog.c	Sat Jul  1 06:52:35 1995
---- g77-new/recog.c	Sun Aug 10 18:46:55 1997
-*************** register_operand (op, mode)
-*** 872,876 ****
-  				REGNO (SUBREG_REG (op)))
-  	  && (GET_MODE_SIZE (mode)
-! 	      != GET_MODE_SIZE (GET_MODE (SUBREG_REG (op)))))
-  	return 0;
-  #endif
---- 872,878 ----
-  				REGNO (SUBREG_REG (op)))
-  	  && (GET_MODE_SIZE (mode)
-! 	      != GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))))
-! 	  && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op))) != MODE_COMPLEX_INT
-! 	  && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op))) != MODE_COMPLEX_FLOAT)
-  	return 0;
-  #endif
-diff -rcp2N gcc-2.7.2.2/reload.c g77-new/reload.c
-*** gcc-2.7.2.2/reload.c	Sat Nov 11 08:23:54 1995
---- g77-new/reload.c	Sun Aug 10 04:58:03 1997
-***************
-*** 1,4 ****
-  /* Search an insn for pseudo regs that must be in hard regs and are not.
-!    Copyright (C) 1987, 88, 89, 92, 93, 94, 1995 Free Software Foundation, Inc.
-  
-  This file is part of GNU CC.
---- 1,4 ----
-  /* Search an insn for pseudo regs that must be in hard regs and are not.
-!    Copyright (C) 1987, 88, 89, 92-5, 1996 Free Software Foundation, Inc.
-  
-  This file is part of GNU CC.
-*************** static int push_secondary_reload PROTO((
-*** 292,295 ****
---- 292,296 ----
-  					enum machine_mode, enum reload_type,
-  					enum insn_code *));
-+ static enum reg_class find_valid_class PROTO((enum machine_mode, int));
-  static int push_reload		PROTO((rtx, rtx, rtx *, rtx *, enum reg_class,
-  				       enum machine_mode, enum machine_mode,
-*************** static struct decomposition decompose PR
-*** 305,312 ****
-  static int immune_p		PROTO((rtx, rtx, struct decomposition));
-  static int alternative_allows_memconst PROTO((char *, int));
-! static rtx find_reloads_toplev	PROTO((rtx, int, enum reload_type, int, int));
-  static rtx make_memloc		PROTO((rtx, int));
-  static int find_reloads_address	PROTO((enum machine_mode, rtx *, rtx, rtx *,
-! 				       int, enum reload_type, int));
-  static rtx subst_reg_equivs	PROTO((rtx));
-  static rtx subst_indexed_address PROTO((rtx));
---- 306,313 ----
-  static int immune_p		PROTO((rtx, rtx, struct decomposition));
-  static int alternative_allows_memconst PROTO((char *, int));
-! static rtx find_reloads_toplev	PROTO((rtx, int, enum reload_type, int, int, short *));
-  static rtx make_memloc		PROTO((rtx, int));
-  static int find_reloads_address	PROTO((enum machine_mode, rtx *, rtx, rtx *,
-! 				       int, enum reload_type, int, short *));
-  static rtx subst_reg_equivs	PROTO((rtx));
-  static rtx subst_indexed_address PROTO((rtx));
-*************** push_secondary_reload (in_p, x, opnum, o
-*** 590,599 ****
-  
-        if (in_p && icode == CODE_FOR_nothing
-! 	  && SECONDARY_MEMORY_NEEDED (class, reload_class, reload_mode))
-! 	get_secondary_mem (x, reload_mode, opnum, type);
-  
-        if (! in_p && icode == CODE_FOR_nothing
-! 	  && SECONDARY_MEMORY_NEEDED (reload_class, class, reload_mode))
-! 	get_secondary_mem (x, reload_mode, opnum, type);
-  #endif
-      }
---- 591,600 ----
-  
-        if (in_p && icode == CODE_FOR_nothing
-! 	  && SECONDARY_MEMORY_NEEDED (class, reload_class, mode))
-! 	get_secondary_mem (x, mode, opnum, type);
-  
-        if (! in_p && icode == CODE_FOR_nothing
-! 	  && SECONDARY_MEMORY_NEEDED (reload_class, class, mode))
-! 	get_secondary_mem (x, mode, opnum, type);
-  #endif
-      }
-*************** get_secondary_mem (x, mode, opnum, type)
-*** 673,677 ****
-  
-        find_reloads_address (mode, NULL_PTR, XEXP (loc, 0), &XEXP (loc, 0),
-! 			    opnum, type, 0);
-      }
-  
---- 674,678 ----
-  
-        find_reloads_address (mode, NULL_PTR, XEXP (loc, 0), &XEXP (loc, 0),
-! 			    opnum, type, 0, NULL);
-      }
-  
-*************** clear_secondary_mem ()
-*** 689,692 ****
---- 690,725 ----
-  #endif /* SECONDARY_MEMORY_NEEDED */
-  
-+ /* Find the largest class for which every register number plus N is valid in
-+    M1 (if in range).  Abort if no such class exists.  */
-+ 
-+ static enum reg_class
-+ find_valid_class (m1, n)
-+      enum machine_mode  m1;
-+      int n;
-+ {
-+   int class;
-+   int regno;
-+   enum reg_class best_class;
-+   int best_size = 0;
-+ 
-+   for (class = 1; class < N_REG_CLASSES; class++)
-+     {
-+       int bad = 0;
-+       for (regno = 0; regno < FIRST_PSEUDO_REGISTER && ! bad; regno++)
-+ 	if (TEST_HARD_REG_BIT (reg_class_contents[class], regno)
-+ 	    && TEST_HARD_REG_BIT (reg_class_contents[class], regno + n)
-+ 	    && ! HARD_REGNO_MODE_OK (regno + n, m1))
-+ 	  bad = 1;
-+ 
-+       if (! bad && reg_class_size[class] > best_size)
-+ 	best_class = class, best_size = reg_class_size[class];
-+     }
-+ 
-+   if (best_size == 0)
-+     abort ();
-+ 
-+   return best_class;
-+ }
-+ 
-  /* Record one reload that needs to be performed.
-     IN is an rtx saying where the data are to be found before this instruction.
-*************** push_reload (in, out, inloc, outloc, cla
-*** 894,898 ****
-        && GET_CODE (SUBREG_REG (in)) == REG
-        && REGNO (SUBREG_REG (in)) < FIRST_PSEUDO_REGISTER
-!       && (! HARD_REGNO_MODE_OK (REGNO (SUBREG_REG (in)), inmode)
-  	  || (GET_MODE_SIZE (inmode) <= UNITS_PER_WORD
-  	      && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (in)))
---- 927,932 ----
-        && GET_CODE (SUBREG_REG (in)) == REG
-        && REGNO (SUBREG_REG (in)) < FIRST_PSEUDO_REGISTER
-!       && (! HARD_REGNO_MODE_OK (REGNO (SUBREG_REG (in)) + SUBREG_WORD (in),
-! 				inmode)
-  	  || (GET_MODE_SIZE (inmode) <= UNITS_PER_WORD
-  	      && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (in)))
-*************** push_reload (in, out, inloc, outloc, cla
-*** 909,913 ****
-  	 output before the outer reload.  */
-        push_reload (SUBREG_REG (in), NULL_RTX, &SUBREG_REG (in), NULL_PTR,
-! 		   GENERAL_REGS, VOIDmode, VOIDmode, 0, 0, opnum, type);
-        dont_remove_subreg = 1;
-      }
---- 943,948 ----
-  	 output before the outer reload.  */
-        push_reload (SUBREG_REG (in), NULL_RTX, &SUBREG_REG (in), NULL_PTR,
-! 		   find_valid_class (inmode, SUBREG_WORD (in)),
-! 		   VOIDmode, VOIDmode, 0, 0, opnum, type);
-        dont_remove_subreg = 1;
-      }
-*************** push_reload (in, out, inloc, outloc, cla
-*** 982,986 ****
-        && GET_CODE (SUBREG_REG (out)) == REG
-        && REGNO (SUBREG_REG (out)) < FIRST_PSEUDO_REGISTER
-!       && (! HARD_REGNO_MODE_OK (REGNO (SUBREG_REG (out)), outmode)
-  	  || (GET_MODE_SIZE (outmode) <= UNITS_PER_WORD
-  	      && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (out)))
---- 1017,1022 ----
-        && GET_CODE (SUBREG_REG (out)) == REG
-        && REGNO (SUBREG_REG (out)) < FIRST_PSEUDO_REGISTER
-!       && (! HARD_REGNO_MODE_OK (REGNO (SUBREG_REG (out)) + SUBREG_WORD (out),
-! 				outmode)
-  	  || (GET_MODE_SIZE (outmode) <= UNITS_PER_WORD
-  	      && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (out)))
-*************** push_reload (in, out, inloc, outloc, cla
-*** 998,1002 ****
-        dont_remove_subreg = 1;
-        push_reload (SUBREG_REG (out), SUBREG_REG (out), &SUBREG_REG (out),
-! 		   &SUBREG_REG (out), ALL_REGS, VOIDmode, VOIDmode, 0, 0,
-  		   opnum, RELOAD_OTHER);
-      }
---- 1034,1040 ----
-        dont_remove_subreg = 1;
-        push_reload (SUBREG_REG (out), SUBREG_REG (out), &SUBREG_REG (out),
-! 		   &SUBREG_REG (out),
-! 		   find_valid_class (outmode, SUBREG_WORD (out)),
-! 		   VOIDmode, VOIDmode, 0, 0,
-  		   opnum, RELOAD_OTHER);
-      }
-*************** find_reloads (insn, replace, ind_levels,
-*** 2241,2244 ****
---- 2279,2283 ----
-    int goal_earlyclobber, this_earlyclobber;
-    enum machine_mode operand_mode[MAX_RECOG_OPERANDS];
-+   short force_update[MAX_RECOG_OPERANDS];
-  
-    this_insn = insn;
-*************** find_reloads (insn, replace, ind_levels,
-*** 2272,2275 ****
---- 2311,2316 ----
-  #endif
-  
-+   bzero ((char *) force_update, sizeof force_update);
-+ 
-    /* Find what kind of insn this is.  NOPERANDS gets number of operands.
-       Make OPERANDS point to a vector of operand values.
-*************** find_reloads (insn, replace, ind_levels,
-*** 2469,2473 ****
-  	  find_reloads_address (VOIDmode, NULL_PTR,
-  				recog_operand[i], recog_operand_loc[i],
-! 				i, operand_type[i], ind_levels);
-  	  substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
-  	}
---- 2510,2515 ----
-  	  find_reloads_address (VOIDmode, NULL_PTR,
-  				recog_operand[i], recog_operand_loc[i],
-! 				i, operand_type[i], ind_levels,
-! 				&force_update[i]);
-  	  substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
-  	}
-*************** find_reloads (insn, replace, ind_levels,
-*** 2478,2482 ****
-  				    XEXP (recog_operand[i], 0),
-  				    &XEXP (recog_operand[i], 0),
-! 				    i, address_type[i], ind_levels))
-  	    address_reloaded[i] = 1;
-  	  substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
---- 2520,2525 ----
-  				    XEXP (recog_operand[i], 0),
-  				    &XEXP (recog_operand[i], 0),
-! 				    i, address_type[i], ind_levels,
-! 				    &force_update[i]))
-  	    address_reloaded[i] = 1;
-  	  substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
-*************** find_reloads (insn, replace, ind_levels,
-*** 2487,2491 ****
-  				 ind_levels,
-  				 set != 0
-! 				 && &SET_DEST (set) == recog_operand_loc[i]);
-        else if (code == PLUS)
-  	/* We can get a PLUS as an "operand" as a result of
---- 2530,2535 ----
-  				 ind_levels,
-  				 set != 0
-! 				 && &SET_DEST (set) == recog_operand_loc[i],
-! 				 &force_update[i]);
-        else if (code == PLUS)
-  	/* We can get a PLUS as an "operand" as a result of
-*************** find_reloads (insn, replace, ind_levels,
-*** 2493,2497 ****
-  	substed_operand[i] = recog_operand[i] = *recog_operand_loc[i]
-  	  = find_reloads_toplev (recog_operand[i], i, address_type[i],
-! 				 ind_levels, 0);
-        else if (code == REG)
-  	{
---- 2537,2541 ----
-  	substed_operand[i] = recog_operand[i] = *recog_operand_loc[i]
-  	  = find_reloads_toplev (recog_operand[i], i, address_type[i],
-! 				 ind_levels, 0, &force_update[i]);
-        else if (code == REG)
-  	{
-*************** find_reloads (insn, replace, ind_levels,
-*** 2505,2510 ****
-  	  if (reg_equiv_constant[regno] != 0
-  	      && (set == 0 || &SET_DEST (set) != recog_operand_loc[i]))
-! 	    substed_operand[i] = recog_operand[i]
-! 	      = reg_equiv_constant[regno];
-  #if 0 /* This might screw code in reload1.c to delete prior output-reload
-  	 that feeds this insn.  */
---- 2549,2557 ----
-  	  if (reg_equiv_constant[regno] != 0
-  	      && (set == 0 || &SET_DEST (set) != recog_operand_loc[i]))
-! 	    {
-! 	      substed_operand[i] = recog_operand[i]
-! 		= reg_equiv_constant[regno];
-! 	      force_update[i] = 1;
-! 	    }
-  #if 0 /* This might screw code in reload1.c to delete prior output-reload
-  	 that feeds this insn.  */
-*************** find_reloads (insn, replace, ind_levels,
-*** 2545,2549 ****
-  				    XEXP (recog_operand[i], 0),
-  				    &XEXP (recog_operand[i], 0),
-! 				    i, address_type[i], ind_levels);
-  	      substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
-  	    }
---- 2592,2597 ----
-  				    XEXP (recog_operand[i], 0),
-  				    &XEXP (recog_operand[i], 0),
-! 				    i, address_type[i], ind_levels,
-! 				    &force_update[i]);
-  	      substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
-  	    }
-*************** find_reloads (insn, replace, ind_levels,
-*** 3415,3419 ****
-  	  = find_reloads_toplev (force_const_mem (operand_mode[i],
-  						  recog_operand[i]),
-! 				 i, address_type[i], ind_levels, 0);
-  	if (alternative_allows_memconst (constraints1[i],
-  					 goal_alternative_number))
---- 3463,3467 ----
-  	  = find_reloads_toplev (force_const_mem (operand_mode[i],
-  						  recog_operand[i]),
-! 				 i, address_type[i], ind_levels, 0, NULL);
-  	if (alternative_allows_memconst (constraints1[i],
-  					 goal_alternative_number))
-*************** find_reloads (insn, replace, ind_levels,
-*** 3595,3609 ****
-       Don't do this if we aren't making replacements because we might be
-       propagating things allocated by frame pointer elimination into places
-!      it doesn't expect.  */
-  
-!   if (insn_code_number >= 0 && replace)
-!     for (i = insn_n_dups[insn_code_number] - 1; i >= 0; i--)
-!       {
-! 	int opno = recog_dup_num[i];
-! 	*recog_dup_loc[i] = *recog_operand_loc[opno];
-! 	if (operand_reloadnum[opno] >= 0)
-! 	  push_replacement (recog_dup_loc[i], operand_reloadnum[opno],
-! 			    insn_operand_mode[insn_code_number][opno]);
-!       }
-  
-  #if 0
---- 3643,3664 ----
-       Don't do this if we aren't making replacements because we might be
-       propagating things allocated by frame pointer elimination into places
-!      it doesn't expect.  However, always do it for replaces of pseudos
-!      by constants.  */
-  
-!   for (i = insn_n_dups[insn_code_number] - 1; i >= 0; i--)
-!     {
-!       int opno = recog_dup_num[i];
-! 
-!       if (! (insn_code_number >= 0 && replace))
-! 	{
-! 	  if (! force_update[opno])
-! 	    continue;
-! 	}
-! 
-!       *recog_dup_loc[i] = *recog_operand_loc[opno];
-!       if (operand_reloadnum[opno] >= 0)
-! 	push_replacement (recog_dup_loc[i], operand_reloadnum[opno],
-! 			  insn_operand_mode[insn_code_number][opno]);
-!     }
-  
-  #if 0
-*************** find_reloads (insn, replace, ind_levels,
-*** 3829,3832 ****
---- 3884,3888 ----
-        register RTX_CODE code = GET_CODE (recog_operand[i]);
-        int is_set_dest = GET_CODE (body) == SET && (i == 0);
-+       short ign;
-  
-        if (insn_code_number >= 0)
-*************** find_reloads (insn, replace, ind_levels,
-*** 3834,3838 ****
-  	  find_reloads_address (VOIDmode, NULL_PTR,
-  				recog_operand[i], recog_operand_loc[i],
-! 				i, RELOAD_FOR_INPUT, ind_levels);
-  
-        /* In these cases, we can't tell if the operand is an input
---- 3890,3894 ----
-  	  find_reloads_address (VOIDmode, NULL_PTR,
-  				recog_operand[i], recog_operand_loc[i],
-! 				i, RELOAD_FOR_INPUT, ind_levels, &ign);
-  
-        /* In these cases, we can't tell if the operand is an input
-*************** find_reloads (insn, replace, ind_levels,
-*** 3845,3853 ****
-  			      XEXP (recog_operand[i], 0),
-  			      &XEXP (recog_operand[i], 0),
-! 			      i, RELOAD_OTHER, ind_levels);
-        if (code == SUBREG)
-  	recog_operand[i] = *recog_operand_loc[i]
-  	  = find_reloads_toplev (recog_operand[i], i, RELOAD_OTHER,
-! 				 ind_levels, is_set_dest);
-        if (code == REG)
-  	{
---- 3901,3909 ----
-  			      XEXP (recog_operand[i], 0),
-  			      &XEXP (recog_operand[i], 0),
-! 			      i, RELOAD_OTHER, ind_levels, &ign);
-        if (code == SUBREG)
-  	recog_operand[i] = *recog_operand_loc[i]
-  	  = find_reloads_toplev (recog_operand[i], i, RELOAD_OTHER,
-! 				 ind_levels, is_set_dest, &ign);
-        if (code == REG)
-  	{
-*************** alternative_allows_memconst (constraint,
-*** 3908,3915 ****
-  
-     IS_SET_DEST is true if X is the destination of a SET, which is not
-!    appropriate to be replaced by a constant.  */
-  
-  static rtx
-! find_reloads_toplev (x, opnum, type, ind_levels, is_set_dest)
-       rtx x;
-       int opnum;
---- 3964,3974 ----
-  
-     IS_SET_DEST is true if X is the destination of a SET, which is not
-!    appropriate to be replaced by a constant.
-! 
-!    FORCE_UPDATE, if non-NULL, is the address of a SHORT that is set to
-!    1 if X is replaced with something based on reg_equiv_constant.  */
-  
-  static rtx
-! find_reloads_toplev (x, opnum, type, ind_levels, is_set_dest, force_update)
-       rtx x;
-       int opnum;
-*************** find_reloads_toplev (x, opnum, type, ind
-*** 3917,3920 ****
---- 3976,3980 ----
-       int ind_levels;
-       int is_set_dest;
-+      short *force_update;
-  {
-    register RTX_CODE code = GET_CODE (x);
-*************** find_reloads_toplev (x, opnum, type, ind
-*** 3928,3932 ****
-        register int regno = REGNO (x);
-        if (reg_equiv_constant[regno] != 0 && !is_set_dest)
-! 	x = reg_equiv_constant[regno];
-  #if 0
-  /*  This creates (subreg (mem...)) which would cause an unnecessary
---- 3988,3998 ----
-        register int regno = REGNO (x);
-        if (reg_equiv_constant[regno] != 0 && !is_set_dest)
-! 	{
-! 	  x = reg_equiv_constant[regno];
-! 	  if (force_update)
-! 	    *force_update = 1;
-! 	  else
-! 	    abort ();	/* Learn why this happens. */
-! 	}
-  #if 0
-  /*  This creates (subreg (mem...)) which would cause an unnecessary
-*************** find_reloads_toplev (x, opnum, type, ind
-*** 3951,3955 ****
-  	  find_reloads_address (GET_MODE (x), NULL_PTR,
-  				XEXP (x, 0),
-! 				&XEXP (x, 0), opnum, type, ind_levels);
-  	}
-        return x;
---- 4017,4022 ----
-  	  find_reloads_address (GET_MODE (x), NULL_PTR,
-  				XEXP (x, 0),
-! 				&XEXP (x, 0), opnum, type, ind_levels,
-! 				force_update);
-  	}
-        return x;
-*************** find_reloads_toplev (x, opnum, type, ind
-*** 3959,3963 ****
-        rtx tem = x;
-        find_reloads_address (GET_MODE (x), &tem, XEXP (x, 0), &XEXP (x, 0),
-! 			    opnum, type, ind_levels);
-        return tem;
-      }
---- 4026,4030 ----
-        rtx tem = x;
-        find_reloads_address (GET_MODE (x), &tem, XEXP (x, 0), &XEXP (x, 0),
-! 			    opnum, type, ind_levels, force_update);
-        return tem;
-      }
-*************** find_reloads_toplev (x, opnum, type, ind
-*** 3982,3986 ****
-  	  && (tem = gen_lowpart_common (GET_MODE (x),
-  					reg_equiv_constant[regno])) != 0)
-! 	return tem;
-  
-        if (GET_MODE_BITSIZE (GET_MODE (x)) == BITS_PER_WORD
---- 4049,4059 ----
-  	  && (tem = gen_lowpart_common (GET_MODE (x),
-  					reg_equiv_constant[regno])) != 0)
-! 	{
-! 	  if (force_update)
-! 	    *force_update = 1;
-! 	  else
-! 	    abort ();	/* Learn why this happens. */
-! 	  return tem;
-! 	}
-  
-        if (GET_MODE_BITSIZE (GET_MODE (x)) == BITS_PER_WORD
-*************** find_reloads_toplev (x, opnum, type, ind
-*** 3990,3994 ****
-  				     SUBREG_WORD (x), 0,
-  				     GET_MODE (SUBREG_REG (x)))) != 0)
-! 	return tem;
-  
-        if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0
---- 4063,4073 ----
-  				     SUBREG_WORD (x), 0,
-  				     GET_MODE (SUBREG_REG (x)))) != 0)
-! 	{
-! 	  if (force_update)
-! 	    *force_update = 1;
-! 	  else
-! 	    abort ();	/* Learn why this happens. */
-! 	  return tem;
-! 	}
-  
-        if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0
-*************** find_reloads_toplev (x, opnum, type, ind
-*** 4040,4044 ****
-  	  find_reloads_address (GET_MODE (x), NULL_PTR,
-  				XEXP (x, 0),
-! 				&XEXP (x, 0), opnum, type, ind_levels);
-  	}
-  
---- 4119,4124 ----
-  	  find_reloads_address (GET_MODE (x), NULL_PTR,
-  				XEXP (x, 0),
-! 				&XEXP (x, 0), opnum, type, ind_levels,
-! 				force_update);
-  	}
-  
-*************** find_reloads_toplev (x, opnum, type, ind
-*** 4049,4053 ****
-        if (fmt[i] == 'e')
-  	XEXP (x, i) = find_reloads_toplev (XEXP (x, i), opnum, type,
-! 					   ind_levels, is_set_dest);
-      }
-    return x;
---- 4129,4133 ----
-        if (fmt[i] == 'e')
-  	XEXP (x, i) = find_reloads_toplev (XEXP (x, i), opnum, type,
-! 					   ind_levels, is_set_dest, NULL);
-      }
-    return x;
-*************** make_memloc (ad, regno)
-*** 4110,4114 ****
-  
-  static int
-! find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels)
-       enum machine_mode mode;
-       rtx *memrefloc;
---- 4190,4195 ----
-  
-  static int
-! find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels,
-! 		      force_update)
-       enum machine_mode mode;
-       rtx *memrefloc;
-*************** find_reloads_address (mode, memrefloc, a
-*** 4118,4121 ****
---- 4199,4203 ----
-       enum reload_type type;
-       int ind_levels;
-+      short *force_update;
-  {
-    register int regno;
-*************** find_reloads_address (mode, memrefloc, a
-*** 4134,4137 ****
---- 4216,4223 ----
-  	{
-  	  *loc = ad = reg_equiv_constant[regno];
-+ 	  if (force_update)
-+ 	    *force_update = 1;
-+ 	  else
-+ 	    abort ();	/* Learn why this happens. */
-  	  return 1;
-  	}
-*************** find_reloads_address (mode, memrefloc, a
-*** 4141,4145 ****
-  	  tem = make_memloc (ad, regno);
-  	  find_reloads_address (GET_MODE (tem), NULL_PTR, XEXP (tem, 0),
-! 				&XEXP (tem, 0), opnum, type, ind_levels);
-  	  push_reload (tem, NULL_RTX, loc, NULL_PTR, BASE_REG_CLASS,
-  		       GET_MODE (ad), VOIDmode, 0, 0,
---- 4227,4231 ----
-  	  tem = make_memloc (ad, regno);
-  	  find_reloads_address (GET_MODE (tem), NULL_PTR, XEXP (tem, 0),
-! 				&XEXP (tem, 0), opnum, type, ind_levels, NULL);
-  	  push_reload (tem, NULL_RTX, loc, NULL_PTR, BASE_REG_CLASS,
-  		       GET_MODE (ad), VOIDmode, 0, 0,
-*************** find_reloads_address (mode, memrefloc, a
-*** 4214,4218 ****
-        tem = ad;
-        find_reloads_address (GET_MODE (ad), &tem, XEXP (ad, 0), &XEXP (ad, 0),
-! 			    opnum, type, ind_levels == 0 ? 0 : ind_levels - 1);
-  
-        /* If tem was changed, then we must create a new memory reference to
---- 4300,4305 ----
-        tem = ad;
-        find_reloads_address (GET_MODE (ad), &tem, XEXP (ad, 0), &XEXP (ad, 0),
-! 			    opnum, type, ind_levels == 0 ? 0 : ind_levels - 1,
-! 			    NULL);
-  
-        /* If tem was changed, then we must create a new memory reference to
-*************** find_reloads_address_1 (x, context, loc,
-*** 4722,4726 ****
-  	      /* First reload the memory location's address.  */
-  	      find_reloads_address (GET_MODE (tem), 0, XEXP (tem, 0),
-! 				    &XEXP (tem, 0), opnum, type, ind_levels);
-  	      /* Put this inside a new increment-expression.  */
-  	      x = gen_rtx (GET_CODE (x), GET_MODE (x), tem);
---- 4809,4814 ----
-  	      /* First reload the memory location's address.  */
-  	      find_reloads_address (GET_MODE (tem), 0, XEXP (tem, 0),
-! 				    &XEXP (tem, 0), opnum, type, ind_levels,
-! 				    NULL);
-  	      /* Put this inside a new increment-expression.  */
-  	      x = gen_rtx (GET_CODE (x), GET_MODE (x), tem);
-*************** find_reloads_address_1 (x, context, loc,
-*** 4788,4792 ****
-  	  find_reloads_address (GET_MODE (x), &XEXP (x, 0),
-  				XEXP (XEXP (x, 0), 0), &XEXP (XEXP (x, 0), 0),
-! 				opnum, type, ind_levels);
-  
-  	  reloadnum = push_reload (x, NULL_RTX, loc, NULL_PTR,
---- 4876,4880 ----
-  	  find_reloads_address (GET_MODE (x), &XEXP (x, 0),
-  				XEXP (XEXP (x, 0), 0), &XEXP (XEXP (x, 0), 0),
-! 				opnum, type, ind_levels, NULL);
-  
-  	  reloadnum = push_reload (x, NULL_RTX, loc, NULL_PTR,
-*************** find_reloads_address_1 (x, context, loc,
-*** 4818,4822 ****
-  
-        find_reloads_address (GET_MODE (x), loc, XEXP (x, 0), &XEXP (x, 0),
-! 			    opnum, type, ind_levels);
-        push_reload (*loc, NULL_RTX, loc, NULL_PTR,
-  		   context ? INDEX_REG_CLASS : BASE_REG_CLASS,
---- 4906,4910 ----
-  
-        find_reloads_address (GET_MODE (x), loc, XEXP (x, 0), &XEXP (x, 0),
-! 			    opnum, type, ind_levels, NULL);
-        push_reload (*loc, NULL_RTX, loc, NULL_PTR,
-  		   context ? INDEX_REG_CLASS : BASE_REG_CLASS,
-*************** find_reloads_address_1 (x, context, loc,
-*** 4852,4856 ****
-  	    x = make_memloc (x, regno);
-  	    find_reloads_address (GET_MODE (x), 0, XEXP (x, 0), &XEXP (x, 0),
-! 				  opnum, type, ind_levels);
-  	  }
-  
---- 4940,4944 ----
-  	    x = make_memloc (x, regno);
-  	    find_reloads_address (GET_MODE (x), 0, XEXP (x, 0), &XEXP (x, 0),
-! 				  opnum, type, ind_levels, NULL);
-  	  }
-  
-*************** find_reloads_address_part (x, loc, class
-*** 4965,4969 ****
-        rtx tem = x = force_const_mem (mode, x);
-        find_reloads_address (mode, &tem, XEXP (tem, 0), &XEXP (tem, 0),
-! 			    opnum, type, ind_levels);
-      }
-  
---- 5053,5057 ----
-        rtx tem = x = force_const_mem (mode, x);
-        find_reloads_address (mode, &tem, XEXP (tem, 0), &XEXP (tem, 0),
-! 			    opnum, type, ind_levels, NULL);
-      }
-  
-*************** find_reloads_address_part (x, loc, class
-*** 4977,4981 ****
-        x = gen_rtx (PLUS, GET_MODE (x), XEXP (x, 0), tem);
-        find_reloads_address (mode, &tem, XEXP (tem, 0), &XEXP (tem, 0),
-! 			    opnum, type, ind_levels);
-      }
-  
---- 5065,5069 ----
-        x = gen_rtx (PLUS, GET_MODE (x), XEXP (x, 0), tem);
-        find_reloads_address (mode, &tem, XEXP (tem, 0), &XEXP (tem, 0),
-! 			    opnum, type, ind_levels, NULL);
-      }
-  
-*************** find_equiv_reg (goal, insn, class, other
-*** 5518,5522 ****
-       and is also a register that appears in the address of GOAL.  */
-  
-!   if (goal_mem && value == SET_DEST (PATTERN (where))
-        && refers_to_regno_for_reload_p (valueno,
-  				       (valueno
---- 5606,5610 ----
-       and is also a register that appears in the address of GOAL.  */
-  
-!   if (goal_mem && value == SET_DEST (single_set (where))
-        && refers_to_regno_for_reload_p (valueno,
-  				       (valueno
-*************** debug_reload()
-*** 5900,5904 ****
-  
-        if (reload_nocombine[r])
-! 	fprintf (stderr, ", can combine", reload_nocombine[r]);
-  
-        if (reload_secondary_p[r])
---- 5988,5992 ----
-  
-        if (reload_nocombine[r])
-! 	fprintf (stderr, ", can't combine %d", reload_nocombine[r]);
-  
-        if (reload_secondary_p[r])
-diff -rcp2N gcc-2.7.2.2/reload1.c g77-new/reload1.c
-*** gcc-2.7.2.2/reload1.c	Sun Nov  5 11:22:22 1995
---- g77-new/reload1.c	Sun Aug 10 18:47:00 1997
-*************** reload (first, global, dumpfile)
-*** 542,546 ****
-       Also find all paradoxical subregs and find largest such for each pseudo.
-       On machines with small register classes, record hard registers that
-!      are used for user variables.  These can never be used for spills.  */
-  
-    for (insn = first; insn; insn = NEXT_INSN (insn))
---- 542,548 ----
-       Also find all paradoxical subregs and find largest such for each pseudo.
-       On machines with small register classes, record hard registers that
-!      are used for user variables.  These can never be used for spills. 
-!      Also look for a "constant" NOTE_INSN_SETJMP.  This means that all
-!      caller-saved registers must be marked live.  */
-  
-    for (insn = first; insn; insn = NEXT_INSN (insn))
-*************** reload (first, global, dumpfile)
-*** 548,551 ****
---- 550,559 ----
-        rtx set = single_set (insn);
-  
-+       if (GET_CODE (insn) == NOTE && CONST_CALL_P (insn)
-+ 	  && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP)
-+ 	for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-+ 	  if (! call_used_regs[i])
-+ 	    regs_ever_live[i] = 1;
-+ 
-        if (set != 0 && GET_CODE (SET_DEST (set)) == REG)
-  	{
-*************** reload (first, global, dumpfile)
-*** 564,568 ****
-  		  if (GET_CODE (x) == MEM)
-  		    reg_equiv_memory_loc[i] = x;
-! 		  else if (CONSTANT_P (x))
-  		    {
-  		      if (LEGITIMATE_CONSTANT_P (x))
---- 572,578 ----
-  		  if (GET_CODE (x) == MEM)
-  		    reg_equiv_memory_loc[i] = x;
-! 		  else if (CONSTANT_P (x)
-! 			   && ! (GET_CODE (x) == CONST
-! 				 && GET_CODE (XEXP (x, 0)) == MINUS))
-  		    {
-  		      if (LEGITIMATE_CONSTANT_P (x))
-*************** eliminate_regs (x, mem_mode, insn)
-*** 2886,2890 ****
-  
-        /* Fall through to generic unary operation case.  */
--     case USE:
-      case STRICT_LOW_PART:
-      case NEG:          case NOT:
---- 2896,2899 ----
-*************** eliminate_regs (x, mem_mode, insn)
-*** 2975,2978 ****
---- 2984,3000 ----
-        return x;
-  
-+     case USE:
-+       /* If using a register that is the source of an eliminate we still
-+ 	 think can be performed, note it cannot be performed since we don't
-+ 	 know how this register is used.  */
-+       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
-+ 	if (ep->from_rtx == XEXP (x, 0))
-+ 	  ep->can_eliminate = 0;
-+ 
-+       new = eliminate_regs (XEXP (x, 0), mem_mode, insn);
-+       if (new != XEXP (x, 0))
-+ 	return gen_rtx (code, GET_MODE (x), new);
-+       return x;
-+ 
-      case CLOBBER:
-        /* If clobbering a register that is the replacement register for an
-*************** gen_reload (out, in, opnum, type)
-*** 6736,6741 ****
---- 6758,6765 ----
-    if (GET_CODE (in) == PLUS
-        && (GET_CODE (XEXP (in, 0)) == REG
-+ 	  || GET_CODE (XEXP (in, 0)) == SUBREG
-  	  || GET_CODE (XEXP (in, 0)) == MEM)
-        && (GET_CODE (XEXP (in, 1)) == REG
-+ 	  || GET_CODE (XEXP (in, 1)) == SUBREG
-  	  || CONSTANT_P (XEXP (in, 1))
-  	  || GET_CODE (XEXP (in, 1)) == MEM))
-*************** gen_reload (out, in, opnum, type)
-*** 6798,6807 ****
-  	 we emit below.  */
-  
-!       if (CONSTANT_P (op1) || GET_CODE (op1) == MEM
-  	  || (GET_CODE (op1) == REG
-  	      && REGNO (op1) >= FIRST_PSEUDO_REGISTER))
-  	tem = op0, op0 = op1, op1 = tem;
-  
-!       emit_insn (gen_move_insn (out, op0));
-  
-        /* If OP0 and OP1 are the same, we can use OUT for OP1.
---- 6822,6831 ----
-  	 we emit below.  */
-  
-!       if (CONSTANT_P (op1) || GET_CODE (op1) == MEM || GET_CODE (op1) == SUBREG
-  	  || (GET_CODE (op1) == REG
-  	      && REGNO (op1) >= FIRST_PSEUDO_REGISTER))
-  	tem = op0, op0 = op1, op1 = tem;
-  
-!       gen_reload (out, op0, opnum, type);
-  
-        /* If OP0 and OP1 are the same, we can use OUT for OP1.
-*************** gen_reload (out, in, opnum, type)
-*** 6831,6835 ****
-        delete_insns_since (last);
-  
-!       emit_insn (gen_move_insn (out, op1));
-        emit_insn (gen_add2_insn (out, op0));
-      }
---- 6855,6859 ----
-        delete_insns_since (last);
-  
-!       gen_reload (out, op1, opnum, type);
-        emit_insn (gen_add2_insn (out, op0));
-      }
-*************** gen_reload (out, in, opnum, type)
-*** 6852,6857 ****
-  	in = gen_rtx (REG, GET_MODE (loc), REGNO (in));
-  
-!       emit_insn (gen_move_insn (loc, in));
-!       emit_insn (gen_move_insn (out, loc));
-      }
-  #endif
---- 6876,6881 ----
-  	in = gen_rtx (REG, GET_MODE (loc), REGNO (in));
-  
-!       gen_reload (loc, in, opnum, type);
-!       gen_reload (out, loc, opnum, type);
-      }
-  #endif
-diff -rcp2N gcc-2.7.2.2/rtl.c g77-new/rtl.c
-*** gcc-2.7.2.2/rtl.c	Thu Jun 15 08:02:59 1995
---- g77-new/rtl.c	Thu Jul 10 20:09:06 1997
-*************** char *reg_note_name[] = { "", "REG_DEAD"
-*** 179,183 ****
-  			  "REG_NONNEG", "REG_NO_CONFLICT", "REG_UNUSED",
-  			  "REG_CC_SETTER", "REG_CC_USER", "REG_LABEL",
-! 			  "REG_DEP_ANTI", "REG_DEP_OUTPUT" };
-  
-  /* Allocate an rtx vector of N elements.
---- 179,183 ----
-  			  "REG_NONNEG", "REG_NO_CONFLICT", "REG_UNUSED",
-  			  "REG_CC_SETTER", "REG_CC_USER", "REG_LABEL",
-! 			  "REG_DEP_ANTI", "REG_DEP_OUTPUT", "REG_NOALIAS" };
-  
-  /* Allocate an rtx vector of N elements.
-diff -rcp2N gcc-2.7.2.2/rtl.h g77-new/rtl.h
-*** gcc-2.7.2.2/rtl.h	Thu Jun 15 08:03:16 1995
---- g77-new/rtl.h	Thu Jul 10 20:09:07 1997
-*************** enum reg_note { REG_DEAD = 1, REG_INC = 
-*** 349,353 ****
-  		REG_NONNEG = 8, REG_NO_CONFLICT = 9, REG_UNUSED = 10,
-  		REG_CC_SETTER = 11, REG_CC_USER = 12, REG_LABEL = 13,
-! 		REG_DEP_ANTI = 14, REG_DEP_OUTPUT = 15 };
-  
-  /* Define macros to extract and insert the reg-note kind in an EXPR_LIST.  */
---- 349,353 ----
-  		REG_NONNEG = 8, REG_NO_CONFLICT = 9, REG_UNUSED = 10,
-  		REG_CC_SETTER = 11, REG_CC_USER = 12, REG_LABEL = 13,
-! 		REG_DEP_ANTI = 14, REG_DEP_OUTPUT = 15, REG_NOALIAS = 16 };
-  
-  /* Define macros to extract and insert the reg-note kind in an EXPR_LIST.  */
-*************** extern char *reg_note_name[];
-*** 432,436 ****
-  #define NOTE_INSN_FUNCTION_BEG -13
-  
-- 
-  #if 0 /* These are not used, and I don't know what they were for. --rms.  */
-  #define NOTE_DECL_NAME(INSN) ((INSN)->fld[3].rtstr)
---- 432,435 ----
-*************** extern char *note_insn_name[];
-*** 576,579 ****
---- 575,579 ----
-  /* For a TRAP_IF rtx, TRAP_CONDITION is an expression.  */
-  #define TRAP_CONDITION(RTX) ((RTX)->fld[0].rtx)
-+ #define TRAP_CODE(RTX) ((RTX)->fld[1].rtint)
-  
-  /* 1 in a SYMBOL_REF if it addresses this function's constants pool.  */
-*************** extern rtx eliminate_constant_term	PROTO
-*** 817,820 ****
---- 817,830 ----
-  extern rtx expand_complex_abs		PROTO((enum machine_mode, rtx, rtx, int));
-  extern enum machine_mode choose_hard_reg_mode PROTO((int, int));
-+ extern int rtx_varies_p		PROTO((rtx));
-+ extern int may_trap_p		PROTO((rtx));
-+ extern int side_effects_p	PROTO((rtx));
-+ extern int volatile_refs_p	PROTO((rtx));
-+ extern int volatile_insn_p	PROTO((rtx));
-+ extern void remove_note		PROTO((rtx, rtx));
-+ extern void note_stores		PROTO((rtx, void (*)()));
-+ extern int refers_to_regno_p	PROTO((int, int, rtx, rtx *));
-+ extern int reg_overlap_mentioned_p PROTO((rtx, rtx));
-+ 
-  
-  /* Maximum number of parallel sets and clobbers in any insn in this fn.
-*************** extern rtx *regno_reg_rtx;
-*** 967,968 ****
---- 977,987 ----
-  
-  extern int rtx_to_tree_code	PROTO((enum rtx_code));
-+ 
-+ extern int true_dependence	PROTO((rtx, enum machine_mode, rtx, int (*)()));
-+ extern int read_dependence	PROTO((rtx, rtx));
-+ extern int anti_dependence	PROTO((rtx, rtx));
-+ extern int output_dependence	PROTO((rtx, rtx));
-+ extern void init_alias_analysis	PROTO((void));
-+ extern void end_alias_analysis	PROTO((void));
-+ extern void mark_user_reg	PROTO((rtx));
-+ extern void mark_reg_pointer	PROTO((rtx));
-diff -rcp2N gcc-2.7.2.2/sched.c g77-new/sched.c
-*** gcc-2.7.2.2/sched.c	Thu Jun 15 08:06:39 1995
---- g77-new/sched.c	Sun Aug 10 18:46:13 1997
-*************** Boston, MA 02111-1307, USA.  */
-*** 126,129 ****
---- 126,132 ----
-  #include "insn-attr.h"
-  
-+ extern char *reg_known_equiv_p;
-+ extern rtx *reg_known_value;
-+ 
-  #ifdef INSN_SCHEDULING
-  /* Arrays set up by scheduling for the same respective purposes as
-*************** static int *sched_reg_live_length;
-*** 143,146 ****
---- 146,150 ----
-     by splitting insns.  */
-  static rtx *reg_last_uses;
-+ static int reg_last_uses_size;
-  static rtx *reg_last_sets;
-  static regset reg_pending_sets;
-*************** struct sometimes
-*** 294,302 ****
-  
-  /* Forward declarations.  */
-- static rtx canon_rtx			PROTO((rtx));
-- static int rtx_equal_for_memref_p	PROTO((rtx, rtx));
-- static rtx find_symbolic_term		PROTO((rtx));
-- static int memrefs_conflict_p		PROTO((int, rtx, int, rtx,
-- 					       HOST_WIDE_INT));
-  static void add_dependence		PROTO((rtx, rtx, enum reg_note));
-  static void remove_dependence		PROTO((rtx, rtx));
---- 298,301 ----
-*************** static int priority			PROTO((rtx));
-*** 314,318 ****
-  static void free_pending_lists		PROTO((void));
-  static void add_insn_mem_dependence	PROTO((rtx *, rtx *, rtx, rtx));
-! static void flush_pending_lists		PROTO((rtx));
-  static void sched_analyze_1		PROTO((rtx, rtx));
-  static void sched_analyze_2		PROTO((rtx, rtx));
---- 313,317 ----
-  static void free_pending_lists		PROTO((void));
-  static void add_insn_mem_dependence	PROTO((rtx *, rtx *, rtx, rtx));
-! static void flush_pending_lists		PROTO((rtx, int));
-  static void sched_analyze_1		PROTO((rtx, rtx));
-  static void sched_analyze_2		PROTO((rtx, rtx));
-*************** void schedule_insns	PROTO((FILE *));
-*** 346,885 ****
-  #endif /* INSN_SCHEDULING */
-  
-- #define SIZE_FOR_MODE(X) (GET_MODE_SIZE (GET_MODE (X)))
-- 
-- /* Vector indexed by N giving the initial (unchanging) value known
--    for pseudo-register N.  */
-- static rtx *reg_known_value;
-- 
-- /* Vector recording for each reg_known_value whether it is due to a
--    REG_EQUIV note.  Future passes (viz., reload) may replace the
--    pseudo with the equivalent expression and so we account for the
--    dependences that would be introduced if that happens. */
-- /* ??? This is a problem only on the Convex.  The REG_EQUIV notes created in
--    assign_parms mention the arg pointer, and there are explicit insns in the
--    RTL that modify the arg pointer.  Thus we must ensure that such insns don't
--    get scheduled across each other because that would invalidate the REG_EQUIV
--    notes.  One could argue that the REG_EQUIV notes are wrong, but solving
--    the problem in the scheduler will likely give better code, so we do it
--    here.  */
-- static char *reg_known_equiv_p;
-- 
-- /* Indicates number of valid entries in reg_known_value.  */
-- static int reg_known_value_size;
-- 
-- static rtx
-- canon_rtx (x)
--      rtx x;
-- {
--   if (GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER
--       && REGNO (x) <= reg_known_value_size)
--     return reg_known_value[REGNO (x)];
--   else if (GET_CODE (x) == PLUS)
--     {
--       rtx x0 = canon_rtx (XEXP (x, 0));
--       rtx x1 = canon_rtx (XEXP (x, 1));
-- 
--       if (x0 != XEXP (x, 0) || x1 != XEXP (x, 1))
-- 	{
-- 	  /* We can tolerate LO_SUMs being offset here; these
-- 	     rtl are used for nothing other than comparisons.  */
-- 	  if (GET_CODE (x0) == CONST_INT)
-- 	    return plus_constant_for_output (x1, INTVAL (x0));
-- 	  else if (GET_CODE (x1) == CONST_INT)
-- 	    return plus_constant_for_output (x0, INTVAL (x1));
-- 	  return gen_rtx (PLUS, GET_MODE (x), x0, x1);
-- 	}
--     }
--   return x;
-- }
-- 
-- /* Set up all info needed to perform alias analysis on memory references.  */
-- 
-- void
-- init_alias_analysis ()
-- {
--   int maxreg = max_reg_num ();
--   rtx insn;
--   rtx note;
--   rtx set;
-- 
--   reg_known_value_size = maxreg;
-- 
--   reg_known_value
--     = (rtx *) oballoc ((maxreg-FIRST_PSEUDO_REGISTER) * sizeof (rtx))
--       - FIRST_PSEUDO_REGISTER;
--   bzero ((char *) (reg_known_value + FIRST_PSEUDO_REGISTER),
-- 	 (maxreg-FIRST_PSEUDO_REGISTER) * sizeof (rtx));
-- 
--   reg_known_equiv_p
--     = (char *) oballoc ((maxreg -FIRST_PSEUDO_REGISTER) * sizeof (char))
--       - FIRST_PSEUDO_REGISTER;
--   bzero (reg_known_equiv_p + FIRST_PSEUDO_REGISTER,
-- 	 (maxreg - FIRST_PSEUDO_REGISTER) * sizeof (char));
-- 
--   /* Fill in the entries with known constant values.  */
--   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
--     if ((set = single_set (insn)) != 0
-- 	&& GET_CODE (SET_DEST (set)) == REG
-- 	&& REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
-- 	&& (((note = find_reg_note (insn, REG_EQUAL, 0)) != 0
-- 	     && reg_n_sets[REGNO (SET_DEST (set))] == 1)
-- 	    || (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != 0)
-- 	&& GET_CODE (XEXP (note, 0)) != EXPR_LIST)
--       {
-- 	int regno = REGNO (SET_DEST (set));
-- 	reg_known_value[regno] = XEXP (note, 0);
-- 	reg_known_equiv_p[regno] = REG_NOTE_KIND (note) == REG_EQUIV;
--       }
-- 
--   /* Fill in the remaining entries.  */
--   while (--maxreg >= FIRST_PSEUDO_REGISTER)
--     if (reg_known_value[maxreg] == 0)
--       reg_known_value[maxreg] = regno_reg_rtx[maxreg];
-- }
-- 
-- /* Return 1 if X and Y are identical-looking rtx's.
-- 
--    We use the data in reg_known_value above to see if two registers with
--    different numbers are, in fact, equivalent.  */
-- 
-- static int
-- rtx_equal_for_memref_p (x, y)
--      rtx x, y;
-- {
--   register int i;
--   register int j;
--   register enum rtx_code code;
--   register char *fmt;
-- 
--   if (x == 0 && y == 0)
--     return 1;
--   if (x == 0 || y == 0)
--     return 0;
--   x = canon_rtx (x);
--   y = canon_rtx (y);
-- 
--   if (x == y)
--     return 1;
-- 
--   code = GET_CODE (x);
--   /* Rtx's of different codes cannot be equal.  */
--   if (code != GET_CODE (y))
--     return 0;
-- 
--   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
--      (REG:SI x) and (REG:HI x) are NOT equivalent.  */
-- 
--   if (GET_MODE (x) != GET_MODE (y))
--     return 0;
-- 
--   /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively.  */
-- 
--   if (code == REG)
--     return REGNO (x) == REGNO (y);
--   if (code == LABEL_REF)
--     return XEXP (x, 0) == XEXP (y, 0);
--   if (code == SYMBOL_REF)
--     return XSTR (x, 0) == XSTR (y, 0);
-- 
--   /* For commutative operations, the RTX match if the operand match in any
--      order.  Also handle the simple binary and unary cases without a loop.  */
--   if (code == EQ || code == NE || GET_RTX_CLASS (code) == 'c')
--     return ((rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
-- 	     && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)))
-- 	    || (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 1))
-- 		&& rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 0))));
--   else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == '2')
--     return (rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0))
-- 	    && rtx_equal_for_memref_p (XEXP (x, 1), XEXP (y, 1)));
--   else if (GET_RTX_CLASS (code) == '1')
--     return rtx_equal_for_memref_p (XEXP (x, 0), XEXP (y, 0));
-- 
--   /* Compare the elements.  If any pair of corresponding elements
--      fail to match, return 0 for the whole things.  */
-- 
--   fmt = GET_RTX_FORMAT (code);
--   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
--     {
--       switch (fmt[i])
-- 	{
-- 	case 'w':
-- 	  if (XWINT (x, i) != XWINT (y, i))
-- 	    return 0;
-- 	  break;
-- 
-- 	case 'n':
-- 	case 'i':
-- 	  if (XINT (x, i) != XINT (y, i))
-- 	    return 0;
-- 	  break;
-- 
-- 	case 'V':
-- 	case 'E':
-- 	  /* Two vectors must have the same length.  */
-- 	  if (XVECLEN (x, i) != XVECLEN (y, i))
-- 	    return 0;
-- 
-- 	  /* And the corresponding elements must match.  */
-- 	  for (j = 0; j < XVECLEN (x, i); j++)
-- 	    if (rtx_equal_for_memref_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
-- 	      return 0;
-- 	  break;
-- 
-- 	case 'e':
-- 	  if (rtx_equal_for_memref_p (XEXP (x, i), XEXP (y, i)) == 0)
-- 	    return 0;
-- 	  break;
-- 
-- 	case 'S':
-- 	case 's':
-- 	  if (strcmp (XSTR (x, i), XSTR (y, i)))
-- 	    return 0;
-- 	  break;
-- 
-- 	case 'u':
-- 	  /* These are just backpointers, so they don't matter.  */
-- 	  break;
-- 
-- 	case '0':
-- 	  break;
-- 
-- 	  /* It is believed that rtx's at this level will never
-- 	     contain anything but integers and other rtx's,
-- 	     except for within LABEL_REFs and SYMBOL_REFs.  */
-- 	default:
-- 	  abort ();
-- 	}
--     }
--   return 1;
-- }
-- 
-- /* Given an rtx X, find a SYMBOL_REF or LABEL_REF within
--    X and return it, or return 0 if none found.  */
-- 
-- static rtx
-- find_symbolic_term (x)
--      rtx x;
-- {
--   register int i;
--   register enum rtx_code code;
--   register char *fmt;
-- 
--   code = GET_CODE (x);
--   if (code == SYMBOL_REF || code == LABEL_REF)
--     return x;
--   if (GET_RTX_CLASS (code) == 'o')
--     return 0;
-- 
--   fmt = GET_RTX_FORMAT (code);
--   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
--     {
--       rtx t;
-- 
--       if (fmt[i] == 'e')
-- 	{
-- 	  t = find_symbolic_term (XEXP (x, i));
-- 	  if (t != 0)
-- 	    return t;
-- 	}
--       else if (fmt[i] == 'E')
-- 	break;
--     }
--   return 0;
-- }
-- 
-- /* Return nonzero if X and Y (memory addresses) could reference the
--    same location in memory.  C is an offset accumulator.  When
--    C is nonzero, we are testing aliases between X and Y + C.
--    XSIZE is the size in bytes of the X reference,
--    similarly YSIZE is the size in bytes for Y.
-- 
--    If XSIZE or YSIZE is zero, we do not know the amount of memory being
--    referenced (the reference was BLKmode), so make the most pessimistic
--    assumptions.
-- 
--    We recognize the following cases of non-conflicting memory:
-- 
-- 	(1) addresses involving the frame pointer cannot conflict
-- 	    with addresses involving static variables.
-- 	(2) static variables with different addresses cannot conflict.
-- 
--    Nice to notice that varying addresses cannot conflict with fp if no
--    local variables had their addresses taken, but that's too hard now.  */
-- 
-- /* ??? In Fortran, references to a array parameter can never conflict with
--    another array parameter.  */
-- 
-- static int
-- memrefs_conflict_p (xsize, x, ysize, y, c)
--      rtx x, y;
--      int xsize, ysize;
--      HOST_WIDE_INT c;
-- {
--   if (GET_CODE (x) == HIGH)
--     x = XEXP (x, 0);
--   else if (GET_CODE (x) == LO_SUM)
--     x = XEXP (x, 1);
--   else
--     x = canon_rtx (x);
--   if (GET_CODE (y) == HIGH)
--     y = XEXP (y, 0);
--   else if (GET_CODE (y) == LO_SUM)
--     y = XEXP (y, 1);
--   else
--     y = canon_rtx (y);
-- 
--   if (rtx_equal_for_memref_p (x, y))
--     return (xsize == 0 || ysize == 0 ||
-- 	    (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
-- 
--   if (y == frame_pointer_rtx || y == hard_frame_pointer_rtx
--       || y == stack_pointer_rtx)
--     {
--       rtx t = y;
--       int tsize = ysize;
--       y = x; ysize = xsize;
--       x = t; xsize = tsize;
--     }
-- 
--   if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
--       || x == stack_pointer_rtx)
--     {
--       rtx y1;
-- 
--       if (CONSTANT_P (y))
-- 	return 0;
-- 
--       if (GET_CODE (y) == PLUS
-- 	  && canon_rtx (XEXP (y, 0)) == x
-- 	  && (y1 = canon_rtx (XEXP (y, 1)))
-- 	  && GET_CODE (y1) == CONST_INT)
-- 	{
-- 	  c += INTVAL (y1);
-- 	  return (xsize == 0 || ysize == 0
-- 		  || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
-- 	}
-- 
--       if (GET_CODE (y) == PLUS
-- 	  && (y1 = canon_rtx (XEXP (y, 0)))
-- 	  && CONSTANT_P (y1))
-- 	return 0;
-- 
--       return 1;
--     }
-- 
--   if (GET_CODE (x) == PLUS)
--     {
--       /* The fact that X is canonicalized means that this
-- 	 PLUS rtx is canonicalized.  */
--       rtx x0 = XEXP (x, 0);
--       rtx x1 = XEXP (x, 1);
-- 
--       if (GET_CODE (y) == PLUS)
-- 	{
-- 	  /* The fact that Y is canonicalized means that this
-- 	     PLUS rtx is canonicalized.  */
-- 	  rtx y0 = XEXP (y, 0);
-- 	  rtx y1 = XEXP (y, 1);
-- 
-- 	  if (rtx_equal_for_memref_p (x1, y1))
-- 	    return memrefs_conflict_p (xsize, x0, ysize, y0, c);
-- 	  if (rtx_equal_for_memref_p (x0, y0))
-- 	    return memrefs_conflict_p (xsize, x1, ysize, y1, c);
-- 	  if (GET_CODE (x1) == CONST_INT)
-- 	    if (GET_CODE (y1) == CONST_INT)
-- 	      return memrefs_conflict_p (xsize, x0, ysize, y0,
-- 					 c - INTVAL (x1) + INTVAL (y1));
-- 	    else
-- 	      return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
-- 	  else if (GET_CODE (y1) == CONST_INT)
-- 	    return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
-- 
-- 	  /* Handle case where we cannot understand iteration operators,
-- 	     but we notice that the base addresses are distinct objects.  */
-- 	  x = find_symbolic_term (x);
-- 	  if (x == 0)
-- 	    return 1;
-- 	  y = find_symbolic_term (y);
-- 	  if (y == 0)
-- 	    return 1;
-- 	  return rtx_equal_for_memref_p (x, y);
-- 	}
--       else if (GET_CODE (x1) == CONST_INT)
-- 	return memrefs_conflict_p (xsize, x0, ysize, y, c - INTVAL (x1));
--     }
--   else if (GET_CODE (y) == PLUS)
--     {
--       /* The fact that Y is canonicalized means that this
-- 	 PLUS rtx is canonicalized.  */
--       rtx y0 = XEXP (y, 0);
--       rtx y1 = XEXP (y, 1);
-- 
--       if (GET_CODE (y1) == CONST_INT)
-- 	return memrefs_conflict_p (xsize, x, ysize, y0, c + INTVAL (y1));
--       else
-- 	return 1;
--     }
-- 
--   if (GET_CODE (x) == GET_CODE (y))
--     switch (GET_CODE (x))
--       {
--       case MULT:
-- 	{
-- 	  /* Handle cases where we expect the second operands to be the
-- 	     same, and check only whether the first operand would conflict
-- 	     or not.  */
-- 	  rtx x0, y0;
-- 	  rtx x1 = canon_rtx (XEXP (x, 1));
-- 	  rtx y1 = canon_rtx (XEXP (y, 1));
-- 	  if (! rtx_equal_for_memref_p (x1, y1))
-- 	    return 1;
-- 	  x0 = canon_rtx (XEXP (x, 0));
-- 	  y0 = canon_rtx (XEXP (y, 0));
-- 	  if (rtx_equal_for_memref_p (x0, y0))
-- 	    return (xsize == 0 || ysize == 0
-- 		    || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
-- 
-- 	  /* Can't properly adjust our sizes.  */
-- 	  if (GET_CODE (x1) != CONST_INT)
-- 	    return 1;
-- 	  xsize /= INTVAL (x1);
-- 	  ysize /= INTVAL (x1);
-- 	  c /= INTVAL (x1);
-- 	  return memrefs_conflict_p (xsize, x0, ysize, y0, c);
-- 	}
--       }
-- 
--   if (CONSTANT_P (x))
--     {
--       if (GET_CODE (x) == CONST_INT && GET_CODE (y) == CONST_INT)
-- 	{
-- 	  c += (INTVAL (y) - INTVAL (x));
-- 	  return (xsize == 0 || ysize == 0
-- 		  || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
-- 	}
-- 
--       if (GET_CODE (x) == CONST)
-- 	{
-- 	  if (GET_CODE (y) == CONST)
-- 	    return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
-- 				       ysize, canon_rtx (XEXP (y, 0)), c);
-- 	  else
-- 	    return memrefs_conflict_p (xsize, canon_rtx (XEXP (x, 0)),
-- 				       ysize, y, c);
-- 	}
--       if (GET_CODE (y) == CONST)
-- 	return memrefs_conflict_p (xsize, x, ysize,
-- 				   canon_rtx (XEXP (y, 0)), c);
-- 
--       if (CONSTANT_P (y))
-- 	return (rtx_equal_for_memref_p (x, y)
-- 		&& (xsize == 0 || ysize == 0
-- 		    || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)));
-- 
--       return 1;
--     }
--   return 1;
-- }
-- 
-- /* Functions to compute memory dependencies.
-- 
--    Since we process the insns in execution order, we can build tables
--    to keep track of what registers are fixed (and not aliased), what registers
--    are varying in known ways, and what registers are varying in unknown
--    ways.
-- 
--    If both memory references are volatile, then there must always be a
--    dependence between the two references, since their order can not be
--    changed.  A volatile and non-volatile reference can be interchanged
--    though. 
-- 
--    A MEM_IN_STRUCT reference at a non-QImode varying address can never
--    conflict with a non-MEM_IN_STRUCT reference at a fixed address.   We must
--    allow QImode aliasing because the ANSI C standard allows character
--    pointers to alias anything.  We are assuming that characters are
--    always QImode here.  */
-- 
-- /* Read dependence: X is read after read in MEM takes place.  There can
--    only be a dependence here if both reads are volatile.  */
-- 
-- int
-- read_dependence (mem, x)
--      rtx mem;
--      rtx x;
-- {
--   return MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem);
-- }
-- 
-- /* True dependence: X is read after store in MEM takes place.  */
-- 
-- int
-- true_dependence (mem, x)
--      rtx mem;
--      rtx x;
-- {
--   /* If X is an unchanging read, then it can't possibly conflict with any
--      non-unchanging store.  It may conflict with an unchanging write though,
--      because there may be a single store to this address to initialize it.
--      Just fall through to the code below to resolve the case where we have
--      both an unchanging read and an unchanging write.  This won't handle all
--      cases optimally, but the possible performance loss should be
--      negligible.  */
--   if (RTX_UNCHANGING_P (x) && ! RTX_UNCHANGING_P (mem))
--     return 0;
-- 
--   return ((MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
-- 	  || (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
-- 				  SIZE_FOR_MODE (x), XEXP (x, 0), 0)
-- 	      && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
-- 		    && GET_MODE (mem) != QImode
-- 		    && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
-- 	      && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
-- 		    && GET_MODE (x) != QImode
-- 		    && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem))));
-- }
-- 
-- /* Anti dependence: X is written after read in MEM takes place.  */
-- 
-- int
-- anti_dependence (mem, x)
--      rtx mem;
--      rtx x;
-- {
--   /* If MEM is an unchanging read, then it can't possibly conflict with
--      the store to X, because there is at most one store to MEM, and it must
--      have occurred somewhere before MEM.  */
--   if (RTX_UNCHANGING_P (mem))
--     return 0;
-- 
--   return ((MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
-- 	  || (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
-- 				  SIZE_FOR_MODE (x), XEXP (x, 0), 0)
-- 	      && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
-- 		    && GET_MODE (mem) != QImode
-- 		    && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
-- 	      && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
-- 		    && GET_MODE (x) != QImode
-- 		    && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem))));
-- }
-- 
-- /* Output dependence: X is written after store in MEM takes place.  */
-- 
-- int
-- output_dependence (mem, x)
--      rtx mem;
--      rtx x;
-- {
--   return ((MEM_VOLATILE_P (x) && MEM_VOLATILE_P (mem))
-- 	  || (memrefs_conflict_p (SIZE_FOR_MODE (mem), XEXP (mem, 0),
-- 				  SIZE_FOR_MODE (x), XEXP (x, 0), 0)
-- 	      && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
-- 		    && GET_MODE (mem) != QImode
-- 		    && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
-- 	      && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
-- 		    && GET_MODE (x) != QImode
-- 		    && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem))));
-- }
-- 
-  /* Helper functions for instruction scheduling.  */
-  
---- 345,348 ----
-*************** add_insn_mem_dependence (insn_list, mem_
-*** 1609,1621 ****
-  
-  /* Make a dependency between every memory reference on the pending lists
-!    and INSN, thus flushing the pending lists.  */
-  
-  static void
-! flush_pending_lists (insn)
-       rtx insn;
-  {
-    rtx link;
-  
-!   while (pending_read_insns)
-      {
-        add_dependence (insn, XEXP (pending_read_insns, 0), REG_DEP_ANTI);
---- 1072,1086 ----
-  
-  /* Make a dependency between every memory reference on the pending lists
-!    and INSN, thus flushing the pending lists.  If ONLY_WRITE, don't flush
-!    the read list.  */
-  
-  static void
-! flush_pending_lists (insn, only_write)
-       rtx insn;
-+      int only_write;
-  {
-    rtx link;
-  
-!   while (pending_read_insns && ! only_write)
-      {
-        add_dependence (insn, XEXP (pending_read_insns, 0), REG_DEP_ANTI);
-*************** sched_analyze_1 (x, insn)
-*** 1746,1750 ****
-  	     this flush occurs 8 times for sparc, and 10 times for m88k using
-  	     the number 32.  */
-! 	  flush_pending_lists (insn);
-  	}
-        else
---- 1211,1215 ----
-  	     this flush occurs 8 times for sparc, and 10 times for m88k using
-  	     the number 32.  */
-! 	  flush_pending_lists (insn, 0);
-  	}
-        else
-*************** sched_analyze_2 (x, insn)
-*** 1922,1926 ****
-  	    /* If a dependency already exists, don't create a new one.  */
-  	    if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
-! 	      if (true_dependence (XEXP (pending_mem, 0), x))
-  		add_dependence (insn, XEXP (pending, 0), 0);
-  
---- 1387,1392 ----
-  	    /* If a dependency already exists, don't create a new one.  */
-  	    if (! find_insn_list (XEXP (pending, 0), LOG_LINKS (insn)))
-! 	      if (true_dependence (XEXP (pending_mem, 0), VOIDmode,
-! 				   x, rtx_varies_p))
-  		add_dependence (insn, XEXP (pending, 0), 0);
-  
-*************** sched_analyze_2 (x, insn)
-*** 1968,1972 ****
-  	    reg_pending_sets_all = 1;
-  
-! 	    flush_pending_lists (insn);
-  	  }
-  
---- 1434,1438 ----
-  	    reg_pending_sets_all = 1;
-  
-! 	    flush_pending_lists (insn, 0);
-  	  }
-  
-*************** sched_analyze_insn (x, insn, loop_notes)
-*** 2021,2025 ****
-    register RTX_CODE code = GET_CODE (x);
-    rtx link;
-!   int maxreg = max_reg_num ();
-    int i;
-  
---- 1487,1491 ----
-    register RTX_CODE code = GET_CODE (x);
-    rtx link;
-!   int maxreg = reg_last_uses_size;
-    int i;
-  
-*************** sched_analyze_insn (x, insn, loop_notes)
-*** 2058,2062 ****
-    if (loop_notes)
-      {
-!       int max_reg = max_reg_num ();
-        rtx link;
-  
---- 1524,1528 ----
-    if (loop_notes)
-      {
-!       int max_reg = reg_last_uses_size;
-        rtx link;
-  
-*************** sched_analyze_insn (x, insn, loop_notes)
-*** 2072,2076 ****
-        reg_pending_sets_all = 1;
-  
-!       flush_pending_lists (insn);
-  
-        link = loop_notes;
---- 1538,1542 ----
-        reg_pending_sets_all = 1;
-  
-!       flush_pending_lists (insn, 0);
-  
-        link = loop_notes;
-*************** sched_analyze (head, tail)
-*** 2202,2207 ****
-  	      && NOTE_LINE_NUMBER (NEXT_INSN (insn)) == NOTE_INSN_SETJMP)
-  	    {
-! 	      int max_reg = max_reg_num ();
-! 	      for (i = 0; i < max_reg; i++)
-  		{
-  		  for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
---- 1668,1672 ----
-  	      && NOTE_LINE_NUMBER (NEXT_INSN (insn)) == NOTE_INSN_SETJMP)
-  	    {
-! 	      for (i = 0; i < reg_last_uses_size; i++)
-  		{
-  		  for (u = reg_last_uses[i]; u; u = XEXP (u, 1))
-*************** sched_analyze (head, tail)
-*** 2247,2259 ****
-  	  loop_notes = 0;
-  
-! 	  /* We don't need to flush memory for a function call which does
-! 	     not involve memory.  */
-! 	  if (! CONST_CALL_P (insn))
-! 	    {
-! 	      /* In the absence of interprocedural alias analysis,
-! 		 we must flush all pending reads and writes, and
-! 		 start new dependencies starting from here.  */
-! 	      flush_pending_lists (insn);
-! 	    }
-  
-  	  /* Depend this function call (actually, the user of this
---- 1712,1720 ----
-  	  loop_notes = 0;
-  
-! 	  /* In the absence of interprocedural alias analysis, we must flush
-! 	     all pending reads and writes, and start new dependencies starting
-! 	     from here.  But only flush writes for constant calls (which may
-! 	     be passed a pointer to something we haven't written yet).  */
-! 	  flush_pending_lists (insn, CONST_CALL_P (insn));
-  
-  	  /* Depend this function call (actually, the user of this
-*************** sched_analyze (head, tail)
-*** 2264,2270 ****
-        else if (GET_CODE (insn) == NOTE
-  	       && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
-! 		   || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END))
-! 	loop_notes = gen_rtx (EXPR_LIST, REG_DEAD,
-! 			      GEN_INT (NOTE_LINE_NUMBER (insn)), loop_notes);
-  
-        if (insn == tail)
---- 1725,1736 ----
-        else if (GET_CODE (insn) == NOTE
-  	       && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
-! 		   || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END
-! 		   || (NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP
-! 		       && GET_CODE (PREV_INSN (insn)) != CALL_INSN)))
-! 	{
-! 	  loop_notes = gen_rtx (EXPR_LIST, REG_DEAD,
-! 				GEN_INT (NOTE_LINE_NUMBER (insn)), loop_notes);
-! 	  CONST_CALL_P (loop_notes) = CONST_CALL_P (insn);
-! 	}
-  
-        if (insn == tail)
-*************** sched_note_set (b, x, death)
-*** 2372,2380 ****
-  
-  #define SCHED_SORT(READY, NEW_READY, OLD_READY) \
-!   do { if ((NEW_READY) - (OLD_READY) == 1)				\
-! 	 swap_sort (READY, NEW_READY);					\
-!        else if ((NEW_READY) - (OLD_READY) > 1)				\
-! 	 qsort (READY, NEW_READY, sizeof (rtx), rank_for_schedule); }	\
-!   while (0)
-  
-  /* Returns a positive value if y is preferred; returns a negative value if
---- 1838,1845 ----
-  
-  #define SCHED_SORT(READY, NEW_READY, OLD_READY) \
-!   if ((NEW_READY) - (OLD_READY) == 1)					\
-!     swap_sort (READY, NEW_READY);					\
-!   else if ((NEW_READY) - (OLD_READY) > 1)				\
-!     qsort (READY, NEW_READY, sizeof (rtx), rank_for_schedule); else	\
-  
-  /* Returns a positive value if y is preferred; returns a negative value if
-*************** reemit_notes (insn, last)
-*** 3128,3132 ****
-  	{
-  	  if (INTVAL (XEXP (note, 0)) == NOTE_INSN_SETJMP)
-! 	    emit_note_after (INTVAL (XEXP (note, 0)), insn);
-  	  else
-  	    last = emit_note_before (INTVAL (XEXP (note, 0)), last);
---- 2593,2598 ----
-  	{
-  	  if (INTVAL (XEXP (note, 0)) == NOTE_INSN_SETJMP)
-! 	    CONST_CALL_P (emit_note_after (INTVAL (XEXP (note, 0)), insn))
-! 	      = CONST_CALL_P (note);
-  	  else
-  	    last = emit_note_before (INTVAL (XEXP (note, 0)), last);
-*************** schedule_block (b, file)
-*** 3174,3178 ****
-  	     b, INSN_UID (basic_block_head[b]), INSN_UID (basic_block_end[b]));
-  
-!   i = max_reg_num ();
-    reg_last_uses = (rtx *) alloca (i * sizeof (rtx));
-    bzero ((char *) reg_last_uses, i * sizeof (rtx));
---- 2640,2644 ----
-  	     b, INSN_UID (basic_block_head[b]), INSN_UID (basic_block_end[b]));
-  
-!   reg_last_uses_size = i = max_reg_num ();
-    reg_last_uses = (rtx *) alloca (i * sizeof (rtx));
-    bzero ((char *) reg_last_uses, i * sizeof (rtx));
-*************** schedule_block (b, file)
-*** 3800,3804 ****
-  		     made live again later.  */
-  		  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-! 		    if (call_used_regs[i] || global_regs[i])
-  		      {
-  			register int offset = i / REGSET_ELT_BITS;
---- 3266,3271 ----
-  		     made live again later.  */
-  		  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-! 		    if ((call_used_regs[i] && ! fixed_regs[i])
-! 			|| global_regs[i])
-  		      {
-  			register int offset = i / REGSET_ELT_BITS;
-*************** schedule_insns (dump_file)
-*** 4717,4721 ****
-        bcopy ((char *) reg_n_deaths, (char *) sched_reg_n_deaths,
-  	     max_regno * sizeof (short));
--       init_alias_analysis ();
-      }
-    else
---- 4184,4187 ----
-*************** schedule_insns (dump_file)
-*** 4726,4732 ****
-        bb_dead_regs = 0;
-        bb_live_regs = 0;
--       if (! flag_schedule_insns)
-- 	init_alias_analysis ();
-      }
-  
-    if (write_symbols != NO_DEBUG)
---- 4192,4213 ----
-        bb_dead_regs = 0;
-        bb_live_regs = 0;
-      }
-+   init_alias_analysis ();
-+ #if 0
-+   if (dump_file)
-+     {
-+       extern rtx *reg_base_value;
-+       extern int reg_base_value_size;
-+       int i;
-+       for (i = 0; i < reg_base_value_size; i++)
-+ 	if (reg_base_value[i])
-+ 	  {
-+ 	    fprintf (dump_file, ";; reg_base_value[%d] = ", i);
-+ 	    print_rtl (dump_file, reg_base_value[i]);
-+ 	    fputc ('\n', dump_file);
-+ 	  }
-+     }
-+ #endif
-+ 
-  
-    if (write_symbols != NO_DEBUG)
-diff -rcp2N gcc-2.7.2.2/sdbout.c g77-new/sdbout.c
-*** gcc-2.7.2.2/sdbout.c	Thu Jun 15 08:07:11 1995
---- g77-new/sdbout.c	Mon Aug 11 01:42:22 1997
-*************** plain_type_1 (type, level)
-*** 539,543 ****
-  	  sdb_dims[sdb_n_dims++]
-  	    = (TYPE_DOMAIN (type)
-! 	       ? TREE_INT_CST_LOW (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) + 1
-  	       : 0);
-  	return PUSH_DERIVED_LEVEL (DT_ARY, m);
---- 539,546 ----
-  	  sdb_dims[sdb_n_dims++]
-  	    = (TYPE_DOMAIN (type)
-! 	       && TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) == INTEGER_CST
-! 	       && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (type))) == INTEGER_CST
-! 	       ? (TREE_INT_CST_LOW (TYPE_MAX_VALUE (TYPE_DOMAIN (type)))
-! 		  - TREE_INT_CST_LOW (TYPE_MIN_VALUE (TYPE_DOMAIN (type))) + 1)
-  	       : 0);
-  	return PUSH_DERIVED_LEVEL (DT_ARY, m);
-diff -rcp2N gcc-2.7.2.2/stmt.c g77-new/stmt.c
-*** gcc-2.7.2.2/stmt.c	Tue Sep 12 19:01:54 1995
---- g77-new/stmt.c	Sun Aug 10 18:46:56 1997
-*************** fixup_gotos (thisblock, stack_level, cle
-*** 1244,1249 ****
-  	      poplevel (1, 0, 0);
-  	      end_sequence ();
-! 	      f->before_jump
-! 		= emit_insns_after (cleanup_insns, f->before_jump);
-  
-  	      f->cleanup_list_list = TREE_CHAIN (lists);
---- 1244,1250 ----
-  	      poplevel (1, 0, 0);
-  	      end_sequence ();
-! 	      if (cleanup_insns != 0)
-! 		f->before_jump
-! 		  = emit_insns_after (cleanup_insns, f->before_jump);
-  
-  	      f->cleanup_list_list = TREE_CHAIN (lists);
-*************** expand_expr_stmt (exp)
-*** 1721,1725 ****
-  
-    last_expr_type = TREE_TYPE (exp);
-!   if (! flag_syntax_only)
-      last_expr_value = expand_expr (exp,
-  				   (expr_stmts_for_value
---- 1722,1726 ----
-  
-    last_expr_type = TREE_TYPE (exp);
-!   if (! flag_syntax_only || expr_stmts_for_value)
-      last_expr_value = expand_expr (exp,
-  				   (expr_stmts_for_value
-*************** expand_end_bindings (vars, mark_ends, do
-*** 3160,3163 ****
---- 3161,3169 ----
-  #endif
-  
-+ #ifdef HAVE_nonlocal_goto_receiver
-+       if (HAVE_nonlocal_goto_receiver)
-+ 	emit_insn (gen_nonlocal_goto_receiver ());
-+ #endif
-+ 
-        /* The handler expects the desired label address in the static chain
-  	 register.  It tests the address and does an appropriate jump
-*************** expand_decl (decl)
-*** 3369,3393 ****
-  	= promote_mode (type, DECL_MODE (decl), &unsignedp, 0);
-  
-!       if (TREE_CODE (type) == COMPLEX_TYPE)
-! 	{
-! 	  rtx realpart, imagpart;
-! 	  enum machine_mode partmode = TYPE_MODE (TREE_TYPE (type));
-  
-! 	  /* For a complex type variable, make a CONCAT of two pseudos
-! 	     so that the real and imaginary parts
-! 	     can be allocated separately.  */
-! 	  realpart = gen_reg_rtx (partmode);
-! 	  REG_USERVAR_P (realpart) = 1;
-! 	  imagpart = gen_reg_rtx (partmode);
-! 	  REG_USERVAR_P (imagpart) = 1;
-! 	  DECL_RTL (decl) = gen_rtx (CONCAT, reg_mode, realpart, imagpart);
-! 	}
-!       else
-! 	{
-! 	  DECL_RTL (decl) = gen_reg_rtx (reg_mode);
-! 	  if (TREE_CODE (type) == POINTER_TYPE)
-! 	    mark_reg_pointer (DECL_RTL (decl));
-! 	  REG_USERVAR_P (DECL_RTL (decl)) = 1;
-! 	}
-      }
-    else if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST)
---- 3375,3383 ----
-  	= promote_mode (type, DECL_MODE (decl), &unsignedp, 0);
-  
-!       DECL_RTL (decl) = gen_reg_rtx (reg_mode);
-!       mark_user_reg (DECL_RTL (decl));
-  
-!       if (TREE_CODE (type) == POINTER_TYPE)
-! 	mark_reg_pointer (DECL_RTL (decl));
-      }
-    else if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST)
-*************** expand_decl (decl)
-*** 3462,3468 ****
-        free_temp_slots ();
-  
-!       /* Allocate space on the stack for the variable.  */
-        address = allocate_dynamic_stack_space (size, NULL_RTX,
-! 					      DECL_ALIGN (decl));
-  
-        /* Reference the variable indirect through that rtx.  */
---- 3452,3461 ----
-        free_temp_slots ();
-  
-!       /* Allocate space on the stack for the variable.  Note that
-! 	 DECL_ALIGN says how the variable is to be aligned and we 
-! 	 cannot use it to conclude anything about the alignment of
-! 	 the size.  */
-        address = allocate_dynamic_stack_space (size, NULL_RTX,
-! 					      TYPE_ALIGN (TREE_TYPE (decl)));
-  
-        /* Reference the variable indirect through that rtx.  */
-diff -rcp2N gcc-2.7.2.2/stor-layout.c g77-new/stor-layout.c
-*** gcc-2.7.2.2/stor-layout.c	Thu Feb 20 19:24:20 1997
---- g77-new/stor-layout.c	Mon Aug 11 06:47:50 1997
-*************** layout_decl (decl, known_align)
-*** 255,259 ****
-        if (maximum_field_alignment != 0)
-  	DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), maximum_field_alignment);
-!       else if (flag_pack_struct)
-  	DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
-      }
---- 255,259 ----
-        if (maximum_field_alignment != 0)
-  	DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), maximum_field_alignment);
-!       else if (DECL_PACKED (decl))
-  	DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
-      }
-*************** layout_decl (decl, known_align)
-*** 261,265 ****
-    if (DECL_BIT_FIELD (decl)
-        && TYPE_SIZE (type) != 0
-!       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
-      {
-        register enum machine_mode xmode
---- 261,266 ----
-    if (DECL_BIT_FIELD (decl)
-        && TYPE_SIZE (type) != 0
-!       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
-!       && GET_MODE_CLASS (TYPE_MODE (type)) == MODE_INT)
-      {
-        register enum machine_mode xmode
-*************** layout_decl (decl, known_align)
-*** 278,281 ****
---- 279,291 ----
-      }
-  
-+   /* Turn off DECL_BIT_FIELD if we won't need it set.  */
-+   if (DECL_BIT_FIELD (decl) && TYPE_MODE (type) == BLKmode
-+       && known_align % TYPE_ALIGN (type) == 0
-+       && DECL_SIZE (decl) != 0
-+       && (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST
-+ 	  || (TREE_INT_CST_LOW (DECL_SIZE (decl)) % BITS_PER_UNIT) == 0)
-+       && DECL_ALIGN (decl) >= TYPE_ALIGN (type))
-+     DECL_BIT_FIELD (decl) = 0;
-+ 
-    /* Evaluate nonconstant size only once, either now or as soon as safe.  */
-    if (DECL_SIZE (decl) != 0 && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
-*************** layout_record (rec)
-*** 380,384 ****
-  	      if (maximum_field_alignment != 0)
-  		type_align = MIN (type_align, maximum_field_alignment);
-! 	      else if (flag_pack_struct)
-  		type_align = MIN (type_align, BITS_PER_UNIT);
-  
---- 390,394 ----
-  	      if (maximum_field_alignment != 0)
-  		type_align = MIN (type_align, maximum_field_alignment);
-! 	      else if (TYPE_PACKED (rec))
-  		type_align = MIN (type_align, BITS_PER_UNIT);
-  
-*************** layout_record (rec)
-*** 422,428 ****
-  	  && DECL_BIT_FIELD_TYPE (field)
-  	  && !DECL_PACKED (field)
-- 	  /* If #pragma pack is in effect, turn off this feature.  */
-  	  && maximum_field_alignment == 0
-- 	  && !flag_pack_struct
-  	  && !integer_zerop (DECL_SIZE (field)))
-  	{
---- 432,436 ----
-*************** layout_record (rec)
-*** 459,463 ****
-  	  if (maximum_field_alignment != 0)
-  	    type_align = MIN (type_align, maximum_field_alignment);
-! 	  else if (flag_pack_struct)
-  	    type_align = MIN (type_align, BITS_PER_UNIT);
-  
---- 467,471 ----
-  	  if (maximum_field_alignment != 0)
-  	    type_align = MIN (type_align, maximum_field_alignment);
-! 	  else if (TYPE_PACKED (rec))
-  	    type_align = MIN (type_align, BITS_PER_UNIT);
-  
-*************** layout_record (rec)
-*** 500,505 ****
-  	  /* Do nothing.  */;
-  	else if (TREE_CODE (dsize) == INTEGER_CST
-  		 && TREE_INT_CST_HIGH (dsize) == 0
-! 		 && TREE_INT_CST_LOW (dsize) + const_size > const_size)
-  	  /* Use const_size if there's no overflow.  */
-  	  const_size += TREE_INT_CST_LOW (dsize);
---- 508,514 ----
-  	  /* Do nothing.  */;
-  	else if (TREE_CODE (dsize) == INTEGER_CST
-+ 		 && ! TREE_CONSTANT_OVERFLOW (dsize)
-  		 && TREE_INT_CST_HIGH (dsize) == 0
-! 		 && TREE_INT_CST_LOW (dsize) + const_size >= const_size)
-  	  /* Use const_size if there's no overflow.  */
-  	  const_size += TREE_INT_CST_LOW (dsize);
-*************** get_best_mode (bitsize, bitpos, align, l
-*** 1172,1175 ****
---- 1181,1192 ----
-    enum machine_mode mode;
-    int unit;
-+ 
-+   if (bitpos < 0)
-+     {
-+       /* For correct calculations and convenience, bias negative bitpos
-+ 	 to become a non-negative value that is [1,bitsize], such that
-+ 	 the relative bit offset to a multiple of bitsize is preserved.  */
-+       bitpos = bitsize - ((-bitpos) % bitsize);
-+     }
-  
-    /* Find the narrowest integer mode that contains the bit field.  */
-diff -rcp2N gcc-2.7.2.2/stupid.c g77-new/stupid.c
-*** gcc-2.7.2.2/stupid.c	Sun Oct 29 07:45:22 1995
---- g77-new/stupid.c	Sun Aug 10 18:46:01 1997
-*************** static int *uid_suid;
-*** 66,69 ****
---- 66,74 ----
-  static int last_call_suid;
-  
-+ /* Record the suid of the last NOTE_INSN_SETJMP
-+    so we can tell whether a pseudo reg crosses any setjmp.  */
-+ 
-+ static int last_setjmp_suid;
-+ 
-  /* Element N is suid of insn where life span of pseudo reg N ends.
-     Element is  0 if register N has not been seen yet on backward scan.  */
-*************** static char *regs_live;
-*** 89,92 ****
---- 94,101 ----
-  static char *regs_change_size;
-  
-+ /* Indexed by reg number, nonzero if reg crosses a setjmp.  */
-+ 
-+ static char *regs_crosses_setjmp;
-+ 
-  /* Indexed by insn's suid, the set of hard regs live after that insn.  */
-  
-*************** stupid_life_analysis (f, nregs, file)
-*** 149,152 ****
---- 158,162 ----
-  
-    last_call_suid = i + 1;
-+   last_setjmp_suid = i + 1;
-    max_suid = i + 1;
-  
-*************** stupid_life_analysis (f, nregs, file)
-*** 167,170 ****
---- 177,183 ----
-    bzero ((char *) regs_change_size, nregs * sizeof (char));
-  
-+   regs_crosses_setjmp = (char *) alloca (nregs * sizeof (char));
-+   bzero ((char *) regs_crosses_setjmp, nregs * sizeof (char));
-+ 
-    reg_renumber = (short *) oballoc (nregs * sizeof (short));
-    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-*************** stupid_life_analysis (f, nregs, file)
-*** 216,219 ****
---- 229,236 ----
-  	stupid_mark_refs (PATTERN (insn), insn);
-  
-+       if (GET_CODE (insn) == NOTE
-+ 	  && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP)
-+ 	last_setjmp_suid = INSN_SUID (insn);
-+ 
-        /* Mark all call-clobbered regs as live after each call insn
-  	 so that a pseudo whose life span includes this insn
-*************** stupid_life_analysis (f, nregs, file)
-*** 254,259 ****
-        register int r = reg_order[i];
-  
-!       /* Some regnos disappear from the rtl.  Ignore them to avoid crash.  */
-!       if (regno_reg_rtx[r] == 0)
-  	continue;
-  
---- 271,277 ----
-        register int r = reg_order[i];
-  
-!       /* Some regnos disappear from the rtl.  Ignore them to avoid crash. 
-! 	 Also don't allocate registers that cross a setjmp.  */
-!       if (regno_reg_rtx[r] == 0 || regs_crosses_setjmp[r])
-  	continue;
-  
-*************** stupid_reg_compare (r1p, r2p)
-*** 309,314 ****
-     that can hold a value of machine-mode MODE
-       (but actually we test only the first of the block for holding MODE)
-!    currently free from after insn whose suid is BIRTH
-!    through the insn whose suid is DEATH,
-     and return the number of the first of them.
-     Return -1 if such a block cannot be found.
---- 327,332 ----
-     that can hold a value of machine-mode MODE
-       (but actually we test only the first of the block for holding MODE)
-!    currently free from after insn whose suid is BORN_INSN
-!    through the insn whose suid is DEAD_INSN,
-     and return the number of the first of them.
-     Return -1 if such a block cannot be found.
-*************** stupid_find_reg (call_preserved, class, 
-*** 338,341 ****
---- 356,366 ----
-  #endif
-  
-+   /* If this register's life is more than 5,000 insns, we probably
-+      can't allocate it, so don't waste the time trying.  This avoid
-+      quadratic behavior on programs that have regularly-occurring
-+      SAVE_EXPRs.  */
-+   if (dead_insn > born_insn + 5000)
-+     return -1;
-+ 
-    COPY_HARD_REG_SET (used,
-  		     call_preserved ? call_used_reg_set : fixed_reg_set);
-*************** stupid_mark_refs (x, insn)
-*** 488,491 ****
---- 513,519 ----
-  	      if (last_call_suid < reg_where_dead[regno])
-  		reg_n_calls_crossed[regno] += 1;
-+ 
-+ 	      if (last_setjmp_suid < reg_where_dead[regno])
-+ 		regs_crosses_setjmp[regno] = 1;
-  	    }
-  	}
-diff -rcp2N gcc-2.7.2.2/toplev.c g77-new/toplev.c
-*** gcc-2.7.2.2/toplev.c	Fri Oct 20 17:56:35 1995
---- g77-new/toplev.c	Sun Aug 10 18:43:36 1997
-*************** int flag_unroll_loops;
-*** 388,391 ****
---- 388,405 ----
-  int flag_unroll_all_loops;
-  
-+ /* Nonzero forces all invariant computations in loops to be moved
-+    outside the loop. */
-+ 
-+ int flag_move_all_movables = 0;
-+ 
-+ /* Nonzero forces all general induction variables in loops to be
-+    strength reduced. */
-+ 
-+ int flag_reduce_all_givs = 0;
-+ 
-+ /* Nonzero gets another run of loop_optimize performed. */
-+ 
-+ int flag_rerun_loop_opt = 0;
-+ 
-  /* Nonzero for -fwritable-strings:
-     store string constants in data segment and don't uniquize them.  */
-*************** int flag_gnu_linker = 1;
-*** 522,525 ****
---- 536,550 ----
-  int flag_pack_struct = 0;
-  
-+ /* 1 if alias checking is on (by default, when -O).  */
-+ int flag_alias_check = 0;
-+ 
-+ /* 0 if pointer arguments may alias each other.  True in C.
-+    1 if pointer arguments may not alias each other but may alias
-+    global variables.
-+    2 if pointer arguments may not alias each other and may not
-+    alias global variables.  True in Fortran.
-+    This defaults to 0 for C.  */
-+ int flag_argument_noalias = 0;
-+ 
-  /* Table of language-independent -f options.
-     STRING is the option name.  VARIABLE is the address of the variable.
-*************** struct { char *string; int *variable; in
-*** 542,545 ****
---- 567,573 ----
-    {"unroll-loops", &flag_unroll_loops, 1},
-    {"unroll-all-loops", &flag_unroll_all_loops, 1},
-+   {"move-all-movables", &flag_move_all_movables, 1},
-+   {"reduce-all-givs", &flag_reduce_all_givs, 1},
-+   {"rerun-loop-opt", &flag_rerun_loop_opt, 1},
-    {"writable-strings", &flag_writable_strings, 1},
-    {"peephole", &flag_no_peephole, 0},
-*************** struct { char *string; int *variable; in
-*** 568,572 ****
-    {"gnu-linker", &flag_gnu_linker, 1},
-    {"pack-struct", &flag_pack_struct, 1},
-!   {"bytecode", &output_bytecode, 1}
-  };
-  
---- 596,604 ----
-    {"gnu-linker", &flag_gnu_linker, 1},
-    {"pack-struct", &flag_pack_struct, 1},
-!   {"bytecode", &output_bytecode, 1},
-!   {"alias-check", &flag_alias_check, 1},
-!   {"argument-alias", &flag_argument_noalias, 0},
-!   {"argument-noalias", &flag_argument_noalias, 1},
-!   {"argument-noalias-global", &flag_argument_noalias, 2}
-  };
-  
-*************** rest_of_compilation (decl)
-*** 2715,2725 ****
-  	 finish_compilation will call rest_of_compilation again
-  	 for those functions that need to be output.  Also defer those
-! 	 functions that we are supposed to defer.  */
-! 
-!       if (DECL_DEFER_OUTPUT (decl)
-! 	  || ((specd || DECL_INLINE (decl))
-! 	      && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
-! 		   && ! flag_keep_inline_functions)
-! 		  || DECL_EXTERNAL (decl))))
-  	{
-  	  DECL_DEFER_OUTPUT (decl) = 1;
---- 2747,2760 ----
-  	 finish_compilation will call rest_of_compilation again
-  	 for those functions that need to be output.  Also defer those
-! 	 functions that we are supposed to defer.  We cannot defer
-! 	 functions containing nested functions since the nested function
-! 	 data is in our non-saved obstack.  */
-! 
-!       if (! current_function_contains_functions
-! 	  && (DECL_DEFER_OUTPUT (decl)
-! 	      || ((specd || DECL_INLINE (decl))
-! 		  && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
-! 		       && ! flag_keep_inline_functions)
-! 		      || DECL_EXTERNAL (decl)))))
-  	{
-  	  DECL_DEFER_OUTPUT (decl) = 1;
-*************** rest_of_compilation (decl)
-*** 2893,2897 ****
---- 2928,2951 ----
-        TIMEVAR (loop_time,
-  	       {
-+ 		 int save_unroll_flag;
-+ 		 int save_unroll_all_flag;
-+ 
-+ 		 if (flag_rerun_loop_opt)
-+ 		   {
-+ 		     save_unroll_flag = flag_unroll_loops;
-+ 		     save_unroll_all_flag = flag_unroll_all_loops;
-+ 		     flag_unroll_loops = 0;
-+ 		     flag_unroll_all_loops = 0;
-+ 		   }
-+ 
-  		 loop_optimize (insns, loop_dump_file);
-+ 
-+ 		 if (flag_rerun_loop_opt)
-+ 		   {
-+ 		     flag_unroll_loops = save_unroll_flag;
-+ 		     flag_unroll_all_loops = save_unroll_all_flag;
-+ 
-+ 		     loop_optimize (insns, loop_dump_file);
-+ 		   }
-  	       });
-      }
-*************** rest_of_compilation (decl)
-*** 3280,3283 ****
---- 3334,3341 ----
-    resume_temporary_allocation ();
-  
-+   /* Show no temporary slots allocated.  */
-+ 
-+   init_temp_slots ();
-+ 
-    /* The parsing time is all the time spent in yyparse
-       *except* what is spent in this function.  */
-*************** main (argc, argv, envp)
-*** 3383,3386 ****
---- 3441,3445 ----
-        flag_omit_frame_pointer = 1;
-  #endif
-+       flag_alias_check = 1;
-      }
-  
-diff -rcp2N gcc-2.7.2.2/tree.c g77-new/tree.c
-*** gcc-2.7.2.2/tree.c	Sun Oct  1 21:26:56 1995
---- g77-new/tree.c	Sun Aug 10 18:47:23 1997
-*************** build_string (len, str)
-*** 1428,1436 ****
-  /* Return a newly constructed COMPLEX_CST node whose value is
-     specified by the real and imaginary parts REAL and IMAG.
-!    Both REAL and IMAG should be constant nodes.
-!    The TREE_TYPE is not initialized.  */
-  
-  tree
-! build_complex (real, imag)
-       tree real, imag;
-  {
---- 1428,1437 ----
-  /* Return a newly constructed COMPLEX_CST node whose value is
-     specified by the real and imaginary parts REAL and IMAG.
-!    Both REAL and IMAG should be constant nodes.  TYPE, if specified,
-!    will be the type of the COMPLEX_CST; otherwise a new type will be made.  */
-  
-  tree
-! build_complex (type, real, imag)
-!      tree type;
-       tree real, imag;
-  {
-*************** build_complex (real, imag)
-*** 1439,1443 ****
-    TREE_REALPART (t) = real;
-    TREE_IMAGPART (t) = imag;
-!   TREE_TYPE (t) = build_complex_type (TREE_TYPE (real));
-    TREE_OVERFLOW (t) = TREE_OVERFLOW (real) | TREE_OVERFLOW (imag);
-    TREE_CONSTANT_OVERFLOW (t)
---- 1440,1444 ----
-    TREE_REALPART (t) = real;
-    TREE_IMAGPART (t) = imag;
-!   TREE_TYPE (t) = type ? type : build_complex_type (TREE_TYPE (real));
-    TREE_OVERFLOW (t) = TREE_OVERFLOW (real) | TREE_OVERFLOW (imag);
-    TREE_CONSTANT_OVERFLOW (t)
-*************** integer_zerop (expr)
-*** 1484,1487 ****
---- 1485,1489 ----
-  
-    return ((TREE_CODE (expr) == INTEGER_CST
-+ 	   && ! TREE_CONSTANT_OVERFLOW (expr)
-  	   && TREE_INT_CST_LOW (expr) == 0
-  	   && TREE_INT_CST_HIGH (expr) == 0)
-*************** integer_onep (expr)
-*** 1501,1504 ****
---- 1503,1507 ----
-  
-    return ((TREE_CODE (expr) == INTEGER_CST
-+ 	   && ! TREE_CONSTANT_OVERFLOW (expr)
-  	   && TREE_INT_CST_LOW (expr) == 1
-  	   && TREE_INT_CST_HIGH (expr) == 0)
-*************** integer_all_onesp (expr)
-*** 1525,1529 ****
-      return 1;
-  
-!   else if (TREE_CODE (expr) != INTEGER_CST)
-      return 0;
-  
---- 1528,1533 ----
-      return 1;
-  
-!   else if (TREE_CODE (expr) != INTEGER_CST
-! 	   || TREE_CONSTANT_OVERFLOW (expr))
-      return 0;
-  
-*************** integer_pow2p (expr)
-*** 1574,1578 ****
-      return 1;
-  
-!   if (TREE_CODE (expr) != INTEGER_CST)
-      return 0;
-  
---- 1578,1582 ----
-      return 1;
-  
-!   if (TREE_CODE (expr) != INTEGER_CST || TREE_CONSTANT_OVERFLOW (expr))
-      return 0;
-  
-*************** real_zerop (expr)
-*** 1596,1599 ****
---- 1600,1604 ----
-  
-    return ((TREE_CODE (expr) == REAL_CST
-+ 	   && ! TREE_CONSTANT_OVERFLOW (expr)
-  	   && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst0))
-  	  || (TREE_CODE (expr) == COMPLEX_CST
-*************** real_onep (expr)
-*** 1611,1614 ****
---- 1616,1620 ----
-  
-    return ((TREE_CODE (expr) == REAL_CST
-+ 	   && ! TREE_CONSTANT_OVERFLOW (expr)
-  	   && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst1))
-  	  || (TREE_CODE (expr) == COMPLEX_CST
-*************** real_twop (expr)
-*** 1626,1629 ****
---- 1632,1636 ----
-  
-    return ((TREE_CODE (expr) == REAL_CST
-+ 	   && ! TREE_CONSTANT_OVERFLOW (expr)
-  	   && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst2))
-  	  || (TREE_CODE (expr) == COMPLEX_CST
-*************** staticp (arg)
-*** 2055,2061 ****
-        return 1;
-  
-      case COMPONENT_REF:
-      case BIT_FIELD_REF:
-!       return staticp (TREE_OPERAND (arg, 0));
-  
-  #if 0
---- 2062,2073 ----
-        return 1;
-  
-+       /* If we are referencing a bitfield, we can't evaluate an
-+ 	 ADDR_EXPR at compile time and so it isn't a constant.  */
-      case COMPONENT_REF:
-+       return (! DECL_BIT_FIELD (TREE_OPERAND (arg, 1))
-+ 	      && staticp (TREE_OPERAND (arg, 0)));
-+ 
-      case BIT_FIELD_REF:
-!       return 0;
-  
-  #if 0
-*************** contains_placeholder_p (exp)
-*** 2157,2160 ****
---- 2169,2174 ----
-    if (code == WITH_RECORD_EXPR)
-      return 0;
-+   else if (code == PLACEHOLDER_EXPR)
-+     return 1;
-  
-    switch (TREE_CODE_CLASS (code))
-*************** substitute_in_expr (exp, f, r)
-*** 2204,2207 ****
---- 2218,2222 ----
-  {
-    enum tree_code code = TREE_CODE (exp);
-+   tree op0, op1, op2;
-    tree new = 0;
-    tree inner;
-*************** substitute_in_expr (exp, f, r)
-*** 2225,2231 ****
-  	{
-  	case 1:
-! 	  new = fold (build1 (code, TREE_TYPE (exp),
-! 			      substitute_in_expr (TREE_OPERAND (exp, 0),
-! 						  f, r)));
-  	  break;
-  
---- 2240,2248 ----
-  	{
-  	case 1:
-! 	  op0 = substitute_in_expr (TREE_OPERAND (exp, 0), f, r);
-! 	  if (op0 == TREE_OPERAND (exp, 0))
-! 	    return exp;
-! 	  
-! 	  new = fold (build1 (code, TREE_TYPE (exp), op0));
-  	  break;
-  
-*************** substitute_in_expr (exp, f, r)
-*** 2238,2245 ****
-  	    abort ();
-  
-! 	  new = fold (build (code, TREE_TYPE (exp),
-! 			     substitute_in_expr (TREE_OPERAND (exp, 0), f, r),
-! 			     substitute_in_expr (TREE_OPERAND (exp, 1),
-! 						 f, r)));
-  	  break;
-  
---- 2255,2264 ----
-  	    abort ();
-  
-! 	  op0 = substitute_in_expr (TREE_OPERAND (exp, 0), f, r);
-! 	  op1 = substitute_in_expr (TREE_OPERAND (exp, 1), f, r);
-! 	  if (op0 == TREE_OPERAND (exp, 0) && op1 == TREE_OPERAND (exp, 1))
-! 	    return exp;
-! 
-! 	  new = fold (build (code, TREE_TYPE (exp), op0, op1));
-  	  break;
-  
-*************** substitute_in_expr (exp, f, r)
-*** 2253,2261 ****
-  	    abort ();
-  
-! 	  new = fold (build (code, TREE_TYPE (exp),
-! 			     substitute_in_expr (TREE_OPERAND (exp, 0), f, r),
-! 			     substitute_in_expr (TREE_OPERAND (exp, 1), f, r),
-! 			     substitute_in_expr (TREE_OPERAND (exp, 2),
-! 						 f, r)));
-  	}
-  
---- 2272,2283 ----
-  	    abort ();
-  
-! 	  op0 = substitute_in_expr (TREE_OPERAND (exp, 0), f, r);
-! 	  op1 = substitute_in_expr (TREE_OPERAND (exp, 1), f, r);
-! 	  op2 = substitute_in_expr (TREE_OPERAND (exp, 2), f, r);
-! 	  if (op0 == TREE_OPERAND (exp, 0) && op1 == TREE_OPERAND (exp, 1)
-! 	      && op2 == TREE_OPERAND (exp, 2))
-! 	    return exp;
-! 
-! 	  new = fold (build (code, TREE_TYPE (exp), op0, op1, op2));
-  	}
-  
-*************** substitute_in_expr (exp, f, r)
-*** 2276,2302 ****
-  	    return r;
-  
-! 	  new = fold (build (code, TREE_TYPE (exp),
-! 			     substitute_in_expr (TREE_OPERAND (exp, 0), f, r),
-  			     TREE_OPERAND (exp, 1)));
-  	  break;
-  
-  	case BIT_FIELD_REF:
-! 	  new = fold (build (code, TREE_TYPE (exp),
-! 			     substitute_in_expr (TREE_OPERAND (exp, 0), f, r),
-! 			     substitute_in_expr (TREE_OPERAND (exp, 1), f, r),
-! 			     substitute_in_expr (TREE_OPERAND (exp, 2), f, r)));
-  	  break;
-  
-  	case INDIRECT_REF:
-  	case BUFFER_REF:
-! 	  new = fold (build1 (code, TREE_TYPE (exp),
-! 			      substitute_in_expr (TREE_OPERAND (exp, 0),
-! 						  f, r)));
-  	  break;
-  
-  	case OFFSET_REF:
-! 	  new = fold (build (code, TREE_TYPE (exp),
-! 			     substitute_in_expr (TREE_OPERAND (exp, 0), f, r),
-! 			     substitute_in_expr (TREE_OPERAND (exp, 1), f, r)));
-  	  break;
-  	}
---- 2298,2342 ----
-  	    return r;
-  
-! 	  /* If this expression hasn't been completed let, leave it 
-! 	     alone.  */
-! 	  if (TREE_CODE (inner) == PLACEHOLDER_EXPR
-! 	      && TREE_TYPE (inner) == 0)
-! 	    return exp;
-! 
-! 	  op0 = substitute_in_expr (TREE_OPERAND (exp, 0), f, r);
-! 	  if (op0 == TREE_OPERAND (exp, 0))
-! 	    return exp;
-! 
-! 	  new = fold (build (code, TREE_TYPE (exp), op0,
-  			     TREE_OPERAND (exp, 1)));
-  	  break;
-  
-  	case BIT_FIELD_REF:
-! 	  op0 = substitute_in_expr (TREE_OPERAND (exp, 0), f, r);
-! 	  op1 = substitute_in_expr (TREE_OPERAND (exp, 1), f, r);
-! 	  op2 = substitute_in_expr (TREE_OPERAND (exp, 2), f, r);
-! 	  if (op0 == TREE_OPERAND (exp, 0) && op1 == TREE_OPERAND (exp, 1)
-! 	      && op2 == TREE_OPERAND (exp, 2))
-! 	    return exp;
-! 
-! 	  new = fold (build (code, TREE_TYPE (exp), op0, op1, op2));
-  	  break;
-  
-  	case INDIRECT_REF:
-  	case BUFFER_REF:
-! 	  op0 = substitute_in_expr (TREE_OPERAND (exp, 0), f, r);
-! 	  if (op0 == TREE_OPERAND (exp, 0))
-! 	    return exp;
-! 
-! 	  new = fold (build1 (code, TREE_TYPE (exp), op0));
-  	  break;
-  
-  	case OFFSET_REF:
-! 	  op0 = substitute_in_expr (TREE_OPERAND (exp, 0), f, r);
-! 	  op1 = substitute_in_expr (TREE_OPERAND (exp, 1), f, r);
-! 	  if (op0 == TREE_OPERAND (exp, 0) && op1 == TREE_OPERAND (exp, 1))
-! 	    return exp;
-! 
-! 	  new = fold (build (code, TREE_TYPE (exp), op0, op1));
-  	  break;
-  	}
-*************** substitute_in_expr (exp, f, r)
-*** 2311,2454 ****
-  }
-  
-- /* Given a type T, a FIELD_DECL F, and a replacement value R,
--    return a new type with all size expressions that contain F
--    updated by replacing F with R.  */
-- 
-- tree
-- substitute_in_type (t, f, r)
--      tree t, f, r;
-- {
--   switch (TREE_CODE (t))
--     {
--     case POINTER_TYPE:
--     case VOID_TYPE:
--       return t;
--     case INTEGER_TYPE:
--     case ENUMERAL_TYPE:
--     case BOOLEAN_TYPE:
--     case CHAR_TYPE:
--       if ((TREE_CODE (TYPE_MIN_VALUE (t)) != INTEGER_CST
-- 	   && contains_placeholder_p (TYPE_MIN_VALUE (t)))
-- 	  || (TREE_CODE (TYPE_MAX_VALUE (t)) != INTEGER_CST
-- 	      && contains_placeholder_p (TYPE_MAX_VALUE (t))))
-- 	return build_range_type (t,
-- 				 substitute_in_expr (TYPE_MIN_VALUE (t), f, r),
-- 				 substitute_in_expr (TYPE_MAX_VALUE (t), f, r));
--       return t;
-- 
--     case REAL_TYPE:
--       if ((TYPE_MIN_VALUE (t) != 0
-- 	   && TREE_CODE (TYPE_MIN_VALUE (t)) != REAL_CST
-- 	   && contains_placeholder_p (TYPE_MIN_VALUE (t)))
-- 	  || (TYPE_MAX_VALUE (t) != 0
-- 	      && TREE_CODE (TYPE_MAX_VALUE (t)) != REAL_CST
-- 	      && contains_placeholder_p (TYPE_MAX_VALUE (t))))
-- 	{
-- 	  t = build_type_copy (t);
-- 
-- 	  if (TYPE_MIN_VALUE (t))
-- 	    TYPE_MIN_VALUE (t) = substitute_in_expr (TYPE_MIN_VALUE (t), f, r);
-- 	  if (TYPE_MAX_VALUE (t))
-- 	    TYPE_MAX_VALUE (t) = substitute_in_expr (TYPE_MAX_VALUE (t), f, r);
-- 	}
--       return t;
-- 
--     case COMPLEX_TYPE:
--       return build_complex_type (substitute_in_type (TREE_TYPE (t), f, r));
-- 
--     case OFFSET_TYPE:
--     case METHOD_TYPE:
--     case REFERENCE_TYPE:
--     case FILE_TYPE:
--     case SET_TYPE:
--     case FUNCTION_TYPE:
--     case LANG_TYPE:
--       /* Don't know how to do these yet.  */
--       abort ();
-- 
--     case ARRAY_TYPE:
--       t = build_array_type (substitute_in_type (TREE_TYPE (t), f, r),
-- 			    substitute_in_type (TYPE_DOMAIN (t), f, r));
--       TYPE_SIZE (t) = 0;
--       layout_type (t);
--       return t;
-- 
--     case RECORD_TYPE:
--     case UNION_TYPE:
--     case QUAL_UNION_TYPE:
--       {
-- 	tree new = copy_node (t);
-- 	tree field;
-- 	tree last_field = 0;
-- 
-- 	/* Start out with no fields, make new fields, and chain them
-- 	   in.  */
-- 
-- 	TYPE_FIELDS (new) = 0;
-- 	TYPE_SIZE (new) = 0;
-- 
-- 	for (field = TYPE_FIELDS (t); field;
-- 	     field = TREE_CHAIN (field))
-- 	  {
-- 	    tree new_field = copy_node (field);
-- 
-- 	    TREE_TYPE (new_field)
-- 	      = substitute_in_type (TREE_TYPE (new_field), f, r);
-- 
-- 	    /* If this is an anonymous field and the type of this field is
-- 	       a UNION_TYPE or RECORD_TYPE with no elements, ignore it.  If
-- 	       the type just has one element, treat that as the field. 
-- 	       But don't do this if we are processing a QUAL_UNION_TYPE.  */
-- 	    if (TREE_CODE (t) != QUAL_UNION_TYPE && DECL_NAME (new_field) == 0
-- 		&& (TREE_CODE (TREE_TYPE (new_field)) == UNION_TYPE
-- 		    || TREE_CODE (TREE_TYPE (new_field)) == RECORD_TYPE))
-- 	      {
-- 		if (TYPE_FIELDS (TREE_TYPE (new_field)) == 0)
-- 		  continue;
-- 
-- 		if (TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (new_field))) == 0)
-- 		  new_field = TYPE_FIELDS (TREE_TYPE (new_field));
-- 	      }
-- 
-- 	    DECL_CONTEXT (new_field) = new;
-- 	    DECL_SIZE (new_field) = 0;
-- 
-- 	    if (TREE_CODE (t) == QUAL_UNION_TYPE)
-- 	      {
-- 		/* Do the substitution inside the qualifier and if we find
-- 		   that this field will not be present, omit it.  */
-- 		DECL_QUALIFIER (new_field)
-- 		  = substitute_in_expr (DECL_QUALIFIER (field), f, r);
-- 		if (integer_zerop (DECL_QUALIFIER (new_field)))
-- 		  continue;
-- 	      }
-- 
-- 	    if (last_field == 0)
-- 	      TYPE_FIELDS (new) = new_field;
-- 	    else
-- 	      TREE_CHAIN (last_field) = new_field;
-- 
-- 	    last_field = new_field;
-- 
-- 	    /* If this is a qualified type and this field will always be
-- 	       present, we are done.  */
-- 	    if (TREE_CODE (t) == QUAL_UNION_TYPE
-- 		&& integer_onep (DECL_QUALIFIER (new_field)))
-- 	      break;
-- 	  }
-- 
-- 	/* If this used to be a qualified union type, but we now know what
-- 	   field will be present, make this a normal union.  */
-- 	if (TREE_CODE (new) == QUAL_UNION_TYPE
-- 	    && (TYPE_FIELDS (new) == 0
-- 		|| integer_onep (DECL_QUALIFIER (TYPE_FIELDS (new)))))
-- 	  TREE_SET_CODE (new, UNION_TYPE);
-- 
-- 	layout_type (new);
-- 	return new;
--       }
--     }
-- }
-- 
-  /* Stabilize a reference so that we can use it any number of times
-     without causing its operands to be evaluated more than once.
---- 2351,2354 ----
-*************** build_type_variant (type, constp, volati
-*** 3141,3145 ****
-       preserve the TYPE_NAME, since there is code that depends on this.  */
-  
-!   for (t = TYPE_MAIN_VARIANT(type); t; t = TYPE_NEXT_VARIANT (t))
-      if (constp == TYPE_READONLY (t) && volatilep == TYPE_VOLATILE (t)
-  	&& TYPE_NAME (t) == TYPE_NAME (type))
---- 3041,3045 ----
-       preserve the TYPE_NAME, since there is code that depends on this.  */
-  
-!   for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
-      if (constp == TYPE_READONLY (t) && volatilep == TYPE_VOLATILE (t)
-  	&& TYPE_NAME (t) == TYPE_NAME (type))
-*************** get_unwidened (op, for_type)
-*** 4051,4055 ****
-    if (TREE_CODE (op) == COMPONENT_REF
-        /* Since type_for_size always gives an integer type.  */
-!       && TREE_CODE (type) != REAL_TYPE)
-      {
-        unsigned innerprec = TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (op, 1)));
---- 3951,3957 ----
-    if (TREE_CODE (op) == COMPONENT_REF
-        /* Since type_for_size always gives an integer type.  */
-!       && TREE_CODE (type) != REAL_TYPE
-!       /* Don't crash if field not layed out yet.  */
-!       && DECL_SIZE (TREE_OPERAND (op, 1)) != 0)
-      {
-        unsigned innerprec = TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (op, 1)));
-diff -rcp2N gcc-2.7.2.2/tree.h g77-new/tree.h
-*** gcc-2.7.2.2/tree.h	Mon Sep 25 17:49:40 1995
---- g77-new/tree.h	Sun Aug 10 18:47:08 1997
-*************** enum built_in_function
-*** 98,101 ****
---- 98,103 ----
-    BUILT_IN_APPLY,
-    BUILT_IN_RETURN,
-+   BUILT_IN_SETJMP,
-+   BUILT_IN_LONGJMP,
-  
-    /* C++ extensions */
-*************** struct tree_int_cst
-*** 408,411 ****
---- 410,415 ----
-  {
-    char common[sizeof (struct tree_common)];
-+   struct rtx_def *rtl;	/* acts as link to register transfer language
-+ 			   (rtl) info */
-    HOST_WIDE_INT int_cst_low;
-    HOST_WIDE_INT int_cst_high;
-*************** struct tree_type
-*** 957,960 ****
---- 961,967 ----
-  #define DECL_STATIC_DESTRUCTOR(NODE) ((NODE)->decl.static_dtor_flag)
-  
-+ /* In a PARM_DECL, nonzero if this is a restricted pointer.  */
-+ #define DECL_RESTRICT(NODE) (NODE)->decl.static_ctor_flag
-+ 
-  /* Used to indicate that this DECL represents a compiler-generated entity.  */
-  #define DECL_ARTIFICIAL(NODE) ((NODE)->decl.artificial_flag)
-*************** extern tree build_int_2_wide		PROTO((HOS
-*** 1176,1180 ****
-  extern tree build_real			PROTO((tree, REAL_VALUE_TYPE));
-  extern tree build_real_from_int_cst 	PROTO((tree, tree));
-! extern tree build_complex		PROTO((tree, tree));
-  extern tree build_string		PROTO((int, char *));
-  extern tree build1			PROTO((enum tree_code, tree, tree));
---- 1183,1187 ----
-  extern tree build_real			PROTO((tree, REAL_VALUE_TYPE));
-  extern tree build_real_from_int_cst 	PROTO((tree, tree));
-! extern tree build_complex		PROTO((tree, tree, tree));
-  extern tree build_string		PROTO((int, char *));
-  extern tree build1			PROTO((enum tree_code, tree, tree));
-*************** extern int contains_placeholder_p	PROTO(
-*** 1378,1387 ****
-  extern tree substitute_in_expr		PROTO((tree, tree, tree));
-  
-- /* Given a type T, a FIELD_DECL F, and a replacement value R,
--    return a new type with all size expressions that contain F
--    updated by replacing the reference to F with R.  */
-- 
-- extern tree substitute_in_type		PROTO((tree, tree, tree));
-- 
-  /* variable_size (EXP) is like save_expr (EXP) except that it
-     is for the special case of something that is part of a
---- 1385,1388 ----
-*************** extern tree maybe_build_cleanup		PROTO((
-*** 1456,1460 ****
-     and find the ultimate containing object, which is returned.  */
-  
-! extern tree get_inner_reference		PROTO((tree, int *, int *, tree *, enum machine_mode *, int *, int *));
-  
-  /* Return the FUNCTION_DECL which provides this _DECL with its context,
---- 1457,1463 ----
-     and find the ultimate containing object, which is returned.  */
-  
-! extern tree get_inner_reference		PROTO((tree, int *, int *, tree *,
-! 					       enum machine_mode *, int *,
-! 					       int *, int *));
-  
-  /* Return the FUNCTION_DECL which provides this _DECL with its context,
-diff -rcp2N gcc-2.7.2.2/unroll.c g77-new/unroll.c
-*** gcc-2.7.2.2/unroll.c	Sat Aug 19 17:33:26 1995
---- g77-new/unroll.c	Thu Jul 10 20:09:10 1997
-*************** unroll_loop (loop_end, insn_count, loop_
-*** 268,273 ****
-       structure of the function.  This can happen as a result of the
-       "if (foo) bar; else break;" optimization in jump.c.  */
-  
-!   if (write_symbols != NO_DEBUG)
-      {
-        int block_begins = 0;
---- 268,277 ----
-       structure of the function.  This can happen as a result of the
-       "if (foo) bar; else break;" optimization in jump.c.  */
-+   /* ??? Gcc has a general policy that -g is never supposed to change the code
-+      that the compiler emits, so we must disable this optimization always,
-+      even if debug info is not being output.  This is rare, so this should
-+      not be a significant performance problem.  */
-  
-!   if (1 /* write_symbols != NO_DEBUG */)
-      {
-        int block_begins = 0;
-*************** unroll_loop (loop_end, insn_count, loop_
-*** 633,636 ****
---- 637,657 ----
-      }
-  
-+   if (unroll_type == UNROLL_NAIVE
-+       && GET_CODE (last_loop_insn) == JUMP_INSN
-+       && start_label != JUMP_LABEL (last_loop_insn))
-+     {
-+       /* ??? The loop ends with a conditional branch that does not branch back
-+ 	 to the loop start label.  In this case, we must emit an unconditional
-+ 	 branch to the loop exit after emitting the final branch.
-+ 	 copy_loop_body does not have support for this currently, so we
-+ 	 give up.  It doesn't seem worthwhile to unroll anyways since
-+ 	 unrolling would increase the number of branch instructions
-+ 	 executed.  */
-+       if (loop_dump_stream)
-+ 	fprintf (loop_dump_stream,
-+ 		 "Unrolling failure: final conditional branch not to loop start\n");
-+       return;
-+     }
-+ 
-    /* Allocate a translation table for the labels and insn numbers.
-       They will be filled in as we copy the insns in the loop.  */
-*************** unroll_loop (loop_end, insn_count, loop_
-*** 995,999 ****
-  	      for (j = FIRST_PSEUDO_REGISTER; j < max_reg_before_loop; j++)
-  		if (local_regno[j])
-! 		  map->reg_map[j] = gen_reg_rtx (GET_MODE (regno_reg_rtx[j]));
-  
-  	      /* The last copy needs the compare/branch insns at the end,
---- 1016,1024 ----
-  	      for (j = FIRST_PSEUDO_REGISTER; j < max_reg_before_loop; j++)
-  		if (local_regno[j])
-! 		  {
-! 		    map->reg_map[j] = gen_reg_rtx (GET_MODE (regno_reg_rtx[j]));
-! 		    record_base_value (REGNO (map->reg_map[j]),
-! 				       regno_reg_rtx[j]);
-! 		  }
-  
-  	      /* The last copy needs the compare/branch insns at the end,
-*************** unroll_loop (loop_end, insn_count, loop_
-*** 1136,1140 ****
-        for (j = FIRST_PSEUDO_REGISTER; j < max_reg_before_loop; j++)
-  	if (local_regno[j])
-! 	  map->reg_map[j] = gen_reg_rtx (GET_MODE (regno_reg_rtx[j]));
-  
-        /* If loop starts with a branch to the test, then fix it so that
---- 1161,1169 ----
-        for (j = FIRST_PSEUDO_REGISTER; j < max_reg_before_loop; j++)
-  	if (local_regno[j])
-! 	  {
-! 	    map->reg_map[j] = gen_reg_rtx (GET_MODE (regno_reg_rtx[j]));
-! 	    record_base_value (REGNO (map->reg_map[j]),
-! 			       regno_reg_rtx[j]);
-! 	  }
-  
-        /* If loop starts with a branch to the test, then fix it so that
-*************** copy_loop_body (copy_start, copy_end, ma
-*** 1605,1608 ****
---- 1634,1641 ----
-  		    int this_giv_inc = INTVAL (giv_inc);
-  
-+ 		    /* If this DEST_ADDR giv was not split, then ignore it.  */
-+ 		    if (*tv->location != tv->dest_reg)
-+ 		      continue;
-+ 
-  		    /* Scale this_giv_inc if the multiplicative factors of
-  		       the two givs are different.  */
-*************** copy_loop_body (copy_start, copy_end, ma
-*** 1631,1635 ****
-  			   incrementing the shared pseudo reg more than
-  			   once.  */
-! 			if (! tv->same_insn)
-  			  {
-  			    /* tv->dest_reg may actually be a (PLUS (REG)
---- 1664,1668 ----
-  			   incrementing the shared pseudo reg more than
-  			   once.  */
-! 			if (! tv->same_insn && ! tv->shared)
-  			  {
-  			    /* tv->dest_reg may actually be a (PLUS (REG)
-*************** copy_loop_body (copy_start, copy_end, ma
-*** 1757,1760 ****
---- 1790,1794 ----
-  		      giv_dest_reg = tem;
-  		      map->reg_map[regno] = tem;
-+ 		      record_base_value (REGNO (tem), giv_src_reg);
-  		    }
-  		  else
-*************** iteration_info (iteration_var, initial_v
-*** 2220,2231 ****
-        return;
-      }
-!   /* Reject iteration variables larger than the host long size, since they
-       could result in a number of iterations greater than the range of our
-!      `unsigned long' variable loop_n_iterations.  */
-!   else if (GET_MODE_BITSIZE (GET_MODE (iteration_var)) > HOST_BITS_PER_LONG)
-      {
-        if (loop_dump_stream)
-  	fprintf (loop_dump_stream,
-! 		 "Loop unrolling: Iteration var rejected because mode larger than host long.\n");
-        return;
-      }
---- 2254,2266 ----
-        return;
-      }
-!   /* Reject iteration variables larger than the host wide int size, since they
-       could result in a number of iterations greater than the range of our
-!      `unsigned HOST_WIDE_INT' variable loop_n_iterations.  */
-!   else if ((GET_MODE_BITSIZE (GET_MODE (iteration_var))
-! 	    > HOST_BITS_PER_WIDE_INT))
-      {
-        if (loop_dump_stream)
-  	fprintf (loop_dump_stream,
-! 		 "Loop unrolling: Iteration var rejected because mode too large.\n");
-        return;
-      }
-*************** find_splittable_regs (unroll_type, loop_
-*** 2443,2447 ****
-  		{
-  		  rtx tem = gen_reg_rtx (bl->biv->mode);
-! 		  
-  		  emit_insn_before (gen_move_insn (tem, bl->biv->src_reg),
-  				    loop_start);
---- 2478,2483 ----
-  		{
-  		  rtx tem = gen_reg_rtx (bl->biv->mode);
-! 
-! 		  record_base_value (REGNO (tem), bl->biv->add_val);
-  		  emit_insn_before (gen_move_insn (tem, bl->biv->src_reg),
-  				    loop_start);
-*************** find_splittable_regs (unroll_type, loop_
-*** 2500,2503 ****
---- 2536,2541 ----
-  		 exits.  */
-  	      rtx tem = gen_reg_rtx (bl->biv->mode);
-+ 	      record_base_value (REGNO (tem), bl->biv->add_val);
-+ 
-  	      emit_insn_before (gen_move_insn (tem, bl->biv->src_reg),
-  				loop_start);
-*************** find_splittable_givs (bl, unroll_type, l
-*** 2675,2678 ****
---- 2713,2717 ----
-  	      rtx tem = gen_reg_rtx (bl->biv->mode);
-  
-+ 	      record_base_value (REGNO (tem), bl->biv->add_val);
-  	      emit_insn_before (gen_move_insn (tem, bl->biv->src_reg),
-  				loop_start);
-*************** find_splittable_givs (bl, unroll_type, l
-*** 2716,2719 ****
---- 2755,2759 ----
-  		{
-  		  rtx tem = gen_reg_rtx (v->mode);
-+ 		  record_base_value (REGNO (tem), v->add_val);
-  		  emit_iv_add_mult (bl->initial_value, v->mult_val,
-  				    v->add_val, tem, loop_start);
-*************** find_splittable_givs (bl, unroll_type, l
-*** 2734,2747 ****
-  		 register for the split addr giv, just to be safe.  */
-  
-! 	      /* ??? If there are multiple address givs which have been
-! 		 combined with the same dest_reg giv, then we may only need
-! 		 one new register for them.  Pulling out constants below will
-! 		 catch some of the common cases of this.  Currently, I leave
-! 		 the work of simplifying multiple address givs to the
-! 		 following cse pass.  */
-! 	      
-! 	      /* As a special case, if we have multiple identical address givs
-! 		 within a single instruction, then we do use a single pseudo
-! 		 reg for both.  This is necessary in case one is a match_dup
-  		 of the other.  */
-  
---- 2774,2780 ----
-  		 register for the split addr giv, just to be safe.  */
-  
-! 	      /* If we have multiple identical address givs within a
-! 		 single instruction, then use a single pseudo reg for
-! 		 both.  This is necessary in case one is a match_dup
-  		 of the other.  */
-  
-*************** find_splittable_givs (bl, unroll_type, l
-*** 2756,2759 ****
---- 2789,2812 ----
-  			     INSN_UID (v->insn));
-  		}
-+ 	      /* If multiple address GIVs have been combined with the
-+ 		 same dest_reg GIV, do not create a new register for
-+ 		 each.  */
-+ 	      else if (unroll_type != UNROLL_COMPLETELY
-+ 		       && v->giv_type == DEST_ADDR
-+ 		       && v->same && v->same->giv_type == DEST_ADDR
-+ 		       && v->same->unrolled
-+ #ifdef ADDRESS_COST
-+ 		       /* combine_givs_p may return true when ADDRESS_COST is
-+ 			  defined even if the multiply and add values are
-+ 			  not equal.  To share a register here, the values
-+ 			  must be equal, as well as related.  */
-+ 		       && rtx_equal_p (v->mult_val, v->same->mult_val)
-+ 		       && rtx_equal_p (v->add_val, v->same->add_val)
-+ #endif
-+ 		       )
-+ 		{
-+ 		  v->dest_reg = v->same->dest_reg;
-+ 		  v->shared = 1;
-+ 		}
-  	      else if (unroll_type != UNROLL_COMPLETELY)
-  		{
-*************** find_splittable_givs (bl, unroll_type, l
-*** 2761,2765 ****
-  		     register to hold the split value of the DEST_ADDR giv.
-  		     Emit insn to initialize its value before loop start.  */
-! 		  tem = gen_reg_rtx (v->mode);
-  
-  		  /* If the address giv has a constant in its new_reg value,
---- 2814,2821 ----
-  		     register to hold the split value of the DEST_ADDR giv.
-  		     Emit insn to initialize its value before loop start.  */
-! 
-! 		  rtx tem = gen_reg_rtx (v->mode);
-! 		  record_base_value (REGNO (tem), v->add_val);
-! 		  v->unrolled = 1;
-  
-  		  /* If the address giv has a constant in its new_reg value,
-*************** find_splittable_givs (bl, unroll_type, l
-*** 2772,2781 ****
-  		      v->dest_reg
-  			= plus_constant (tem, INTVAL (XEXP (v->new_reg,1)));
-! 		      
-  		      /* Only succeed if this will give valid addresses.
-  			 Try to validate both the first and the last
-  			 address resulting from loop unrolling, if
-  			 one fails, then can't do const elim here.  */
-! 		      if (! verify_addresses (v, giv_inc, unroll_number))
-  			{
-  			  /* Save the negative of the eliminated const, so
---- 2828,2837 ----
-  		      v->dest_reg
-  			= plus_constant (tem, INTVAL (XEXP (v->new_reg,1)));
-! 
-  		      /* Only succeed if this will give valid addresses.
-  			 Try to validate both the first and the last
-  			 address resulting from loop unrolling, if
-  			 one fails, then can't do const elim here.  */
-! 		      if (verify_addresses (v, giv_inc, unroll_number))
-  			{
-  			  /* Save the negative of the eliminated const, so
-*************** final_biv_value (bl, loop_start, loop_en
-*** 3061,3064 ****
---- 3117,3121 ----
-  
-  	  tem = gen_reg_rtx (bl->biv->mode);
-+ 	  record_base_value (REGNO (tem), bl->biv->add_val);
-  	  /* Make sure loop_end is not the last insn.  */
-  	  if (NEXT_INSN (loop_end) == 0)
-*************** final_giv_value (v, loop_start, loop_end
-*** 3154,3157 ****
---- 3211,3215 ----
-  	  /* Put the final biv value in tem.  */
-  	  tem = gen_reg_rtx (bl->biv->mode);
-+ 	  record_base_value (REGNO (tem), bl->biv->add_val);
-  	  emit_iv_add_mult (increment, GEN_INT (loop_n_iterations),
-  			    bl->initial_value, tem, insert_before);
-diff -rcp2N gcc-2.7.2.2/varasm.c g77-new/varasm.c
-*** gcc-2.7.2.2/varasm.c	Thu Aug 31 19:02:53 1995
---- g77-new/varasm.c	Sun Aug 10 22:26:32 1997
-*************** assemble_variable (decl, top_level, at_e
-*** 1067,1070 ****
---- 1067,1072 ----
-    if (! dont_output_data)
-      {
-+       int size;
-+ 
-        if (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
-  	goto finish;
-*************** assemble_variable (decl, top_level, at_e
-*** 1072,1078 ****
-        /* This is better than explicit arithmetic, since it avoids overflow.  */
-        size_tree = size_binop (CEIL_DIV_EXPR,
-! 			  DECL_SIZE (decl), size_int (BITS_PER_UNIT));
-  
-!       if (TREE_INT_CST_HIGH (size_tree) != 0)
-  	{
-  	  error_with_decl (decl, "size of variable `%s' is too large");
---- 1074,1082 ----
-        /* This is better than explicit arithmetic, since it avoids overflow.  */
-        size_tree = size_binop (CEIL_DIV_EXPR,
-! 			      DECL_SIZE (decl), size_int (BITS_PER_UNIT));
-  
-!       size = TREE_INT_CST_LOW (size_tree);
-!       if (TREE_INT_CST_HIGH (size_tree) != 0
-! 	  || size != TREE_INT_CST_LOW (size_tree))
-  	{
-  	  error_with_decl (decl, "size of variable `%s' is too large");
-*************** decode_addr_const (exp, value)
-*** 2132,2135 ****
---- 2136,2140 ----
-      case COMPLEX_CST:
-      case CONSTRUCTOR:
-+     case INTEGER_CST:
-        x = TREE_CST_RTL (target);
-        break;
-*************** const_hash (exp)
-*** 2247,2251 ****
-      return const_hash (TREE_OPERAND (exp, 0)) * 9
-        +  const_hash (TREE_OPERAND (exp, 1));
-!   else if (code == NOP_EXPR || code == CONVERT_EXPR)
-      return const_hash (TREE_OPERAND (exp, 0)) * 7 + 2;
-  
---- 2252,2256 ----
-      return const_hash (TREE_OPERAND (exp, 0)) * 9
-        +  const_hash (TREE_OPERAND (exp, 1));
-!   else if (code == NOP_EXPR || code == CONVERT_EXPR || code == NON_LVALUE_EXPR)
-      return const_hash (TREE_OPERAND (exp, 0)) * 7 + 2;
-  
-*************** compare_constant_1 (exp, p)
-*** 2401,2405 ****
-        return p;
-      }
-!   else if (code == NOP_EXPR || code == CONVERT_EXPR)
-      {
-        p = compare_constant_1 (TREE_OPERAND (exp, 0), p);
---- 2406,2410 ----
-        return p;
-      }
-!   else if (code == NOP_EXPR || code == CONVERT_EXPR || code == NON_LVALUE_EXPR)
-      {
-        p = compare_constant_1 (TREE_OPERAND (exp, 0), p);
-*************** copy_constant (exp)
-*** 2633,2637 ****
-  
-      case COMPLEX_CST:
-!       return build_complex (copy_constant (TREE_REALPART (exp)),
-  			    copy_constant (TREE_IMAGPART (exp)));
-  
---- 2638,2643 ----
-  
-      case COMPLEX_CST:
-!       return build_complex (TREE_TYPE (exp),
-! 			    copy_constant (TREE_REALPART (exp)),
-  			    copy_constant (TREE_IMAGPART (exp)));
-  
-*************** copy_constant (exp)
-*** 2644,2647 ****
---- 2650,2654 ----
-      case NOP_EXPR:
-      case CONVERT_EXPR:
-+     case NON_LVALUE_EXPR:
-        return build1 (TREE_CODE (exp), TREE_TYPE (exp),
-  		     copy_constant (TREE_OPERAND (exp, 0)));
-*************** output_constant_def (exp)
-*** 2690,2696 ****
-    register rtx def;
-  
--   if (TREE_CODE (exp) == INTEGER_CST)
--     abort ();			/* No TREE_CST_RTL slot in these.  */
-- 
-    if (TREE_CST_RTL (exp))
-      return TREE_CST_RTL (exp);
---- 2697,2700 ----
-*************** bc_assemble_integer (exp, size)
-*** 3620,3624 ****
-    exp = fold (exp);
-    
-!   while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR)
-      exp = TREE_OPERAND (exp, 0);
-    if (TREE_CODE (exp) == INTEGER_CST)
---- 3624,3629 ----
-    exp = fold (exp);
-    
-!   while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
-! 	 || TREE_CODE (exp) == NON_LVALUE_EXPR)
-      exp = TREE_OPERAND (exp, 0);
-    if (TREE_CODE (exp) == INTEGER_CST)
-*************** bc_assemble_integer (exp, size)
-*** 3631,3639 ****
-        const_part = TREE_OPERAND (exp, 0);
-        while (TREE_CODE (const_part) == NOP_EXPR
-! 	     || TREE_CODE (const_part) == CONVERT_EXPR)
-  	const_part = TREE_OPERAND (const_part, 0);
-        addr_part = TREE_OPERAND (exp, 1);
-        while (TREE_CODE (addr_part) == NOP_EXPR
-! 	     || TREE_CODE (addr_part) == CONVERT_EXPR)
-  	addr_part = TREE_OPERAND (addr_part, 0);
-        if (TREE_CODE (const_part) != INTEGER_CST)
---- 3636,3646 ----
-        const_part = TREE_OPERAND (exp, 0);
-        while (TREE_CODE (const_part) == NOP_EXPR
-! 	     || TREE_CODE (const_part) == CONVERT_EXPR
-! 	     || TREE_CODE (const_part) == NON_LVALUE_EXPR)
-  	const_part = TREE_OPERAND (const_part, 0);
-        addr_part = TREE_OPERAND (exp, 1);
-        while (TREE_CODE (addr_part) == NOP_EXPR
-! 	     || TREE_CODE (addr_part) == CONVERT_EXPR
-! 	     || TREE_CODE (addr_part) == NON_LVALUE_EXPR)
-  	addr_part = TREE_OPERAND (addr_part, 0);
-        if (TREE_CODE (const_part) != INTEGER_CST)
-diff -rcp2N gcc-2.7.2.2/version.c g77-new/version.c
-*** gcc-2.7.2.2/version.c	Thu Feb 20 19:24:33 1997
---- g77-new/version.c	Sun Aug 10 19:28:55 1997
-***************
-*** 1 ****
-! char *version_string = "2.7.2.2";
---- 1 ----
-! char *version_string = "2.7.2.2.f.3b";
diff --git a/gcc/f/intdoc.h b/gcc/f/intdoc.h
deleted file mode 100644
index 58b4007..0000000
--- a/gcc/f/intdoc.h
+++ /dev/null
@@ -1,2370 +0,0 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
- * This is part of the G77 manual.
- * For copying conditions, see the file g77.texi. */
-
-/* This is the file containing the verbage for the
-   intrinsics.  It consists of a data base built up
-   via DEFDOC macros of the form:
-
-   DEFDOC (IMP, SUMMARY, DESCRIPTION)
-
-   IMP is the implementation keyword used in the intrin module.
-   SUMMARY is the short summary to go in the "* Menu:" section
-   of the Info document.  DESCRIPTION is the longer description
-   to go in the documentation itself.
-
-   Note that IMP is leveraged across multiple intrinsic names.
-
-   To make for more accurate and consistent documentation,
-   the translation made by intdoc.c of the text in SUMMARY
-   and DESCRIPTION includes the special sequence
-
-   @ARGNO@
-
-   where ARGNO is a series of digits forming a number that
-   is substituted by intdoc.c as follows:
-
-   0     The initial-caps form of the intrinsic name (e.g. Float).
-   1-98  The initial-caps form of the ARGNO'th argument.
-   99    (SUMMARY only) a newline plus the appropriate # of spaces.
-
-   Hope this info is enough to encourage people to feel free to
-   add documentation to this file!
-
-*/
-
-/* ~~~~~ to do:
-   ALARM
-*/
-
-#define ARCHAIC(upper,mixed) \
-  "Archaic form of @code{" #upper "()} that is specific\n\
-to one type for @var{@1@}.\n\
-@xref{" #mixed " Intrinsic}.\n"
-
-#define ARCHAIC_2nd(upper,mixed) \
-  "Archaic form of @code{" #upper "()} that is specific\n\
-to one type for @var{@2@}.\n\
-@xref{" #mixed " Intrinsic}.\n"
-
-#define ARCHAIC_2(upper,mixed) \
-  "Archaic form of @code{" #upper "()} that is specific\n\
-to one type for @var{@1@} and @var{@2@}.\n\
-@xref{" #mixed " Intrinsic}.\n"
-
-DEFDOC (ABS, "Absolute value.", "\
-Returns the absolute value of @var{@1@}.
-
-If @var{@1@} is type @code{COMPLEX}, the absolute
-value is computed as:
-
-@example
-SQRT(REALPART(@var{@1@})**2, IMAGPART(@var{@1@})**2)
-@end example
-
-@noindent
-Otherwise, it is computed by negating the @var{@1@} if
-it is negative, or returning @var{@1@}.
-
-@xref{Sign Intrinsic}, for how to explicitly
-compute the positive or negative form of the absolute
-value of an expression.
-")
-
-DEFDOC (CABS, "Absolute value (archaic).", ARCHAIC (ABS, Abs))
-
-DEFDOC (DABS, "Absolute value (archaic).", ARCHAIC (ABS, Abs))
-
-DEFDOC (IABS, "Absolute value (archaic).", ARCHAIC (ABS, Abs))
-
-DEFDOC (CDABS, "Absolute value (archaic).", ARCHAIC (ABS, Abs))
-
-DEFDOC (ACHAR, "ASCII character from code.", "\
-Returns the ASCII character corresponding to the
-code specified by @var{@1@}.
-
-@xref{IAChar Intrinsic}, for the inverse of this function.
-
-@xref{Char Intrinsic}, for the function corresponding
-to the system's native character set.
-")
-
-DEFDOC (IACHAR, "ASCII code for character.", "\
-Returns the code for the ASCII character in the
-first character position of @var{@1@}.
-
-@xref{AChar Intrinsic}, for the inverse of this function.
-
-@xref{IChar Intrinsic}, for the function corresponding
-to the system's native character set.
-")
-
-DEFDOC (CHAR, "Character from code.", "\
-Returns the character corresponding to the
-code specified by @var{@1@}, using the system's
-native character set.
-
-Because the system's native character set is used,
-the correspondence between character and their codes
-is not necessarily the same between GNU Fortran
-implementations.
-
-Note that no intrinsic exists to convert a numerical
-value to a printable character string.
-For example, there is no intrinsic that, given
-an @code{INTEGER} or @code{REAL} argument with the
-value @samp{154}, returns the @code{CHARACTER}
-result @samp{'154'}.
-
-Instead, you can use internal-file I/O to do this kind
-of conversion.
-For example:
-
-@smallexample
-INTEGER VALUE
-CHARACTER*10 STRING
-VALUE = 154
-WRITE (STRING, '(I10)'), VALUE
-PRINT *, STRING
-END
-@end smallexample
-
-The above program, when run, prints:
-
-@smallexample
-        154
-@end smallexample
-
-@xref{IChar Intrinsic}, for the inverse of the @code{@0@} function.
-
-@xref{AChar Intrinsic}, for the function corresponding
-to the ASCII character set.
-")
-
-DEFDOC (ICHAR, "Code for character.", "\
-Returns the code for the character in the
-first character position of @var{@1@}.
-
-Because the system's native character set is used,
-the correspondence between character and their codes
-is not necessarily the same between GNU Fortran
-implementations.
-
-Note that no intrinsic exists to convert a printable
-character string to a numerical value.
-For example, there is no intrinsic that, given
-the @code{CHARACTER} value @samp{'154'}, returns an
-@code{INTEGER} or @code{REAL} value with the value @samp{154}.
-
-Instead, you can use internal-file I/O to do this kind
-of conversion.
-For example:
-
-@smallexample
-INTEGER VALUE
-CHARACTER*10 STRING
-STRING = '154'
-READ (STRING, '(I10)'), VALUE
-PRINT *, VALUE
-END
-@end smallexample
-
-The above program, when run, prints:
-
-@smallexample
- 154
-@end smallexample
-
-@xref{Char Intrinsic}, for the inverse of the @code{@0@} function.
-
-@xref{IAChar Intrinsic}, for the function corresponding
-to the ASCII character set.
-")
-
-DEFDOC (ACOS, "Arc cosine.", "\
-Returns the arc-cosine (inverse cosine) of @var{@1@}
-in radians.
-
-@xref{Cos Intrinsic}, for the inverse of this function.
-")
-
-DEFDOC (DACOS, "Arc cosine (archaic).", ARCHAIC (ACOS, ACos))
-
-DEFDOC (AIMAG, "Convert/extract imaginary part of complex.", "\
-Returns the (possibly converted) imaginary part of @var{@1@}.
-
-Use of @code{@0@()} with an argument of a type
-other than @code{COMPLEX(KIND=1)} is restricted to the following case:
-
-@example
-REAL(AIMAG(@1@))
-@end example
-
-@noindent
-This expression converts the imaginary part of @1@ to
-@code{REAL(KIND=1)}.
-
-@xref{REAL() and AIMAG() of Complex}, for more information.
-")
-
-DEFDOC (DIMAG, "Convert/extract imaginary part of complex (archaic).", ARCHAIC (AIMAG, AImag))
-
-DEFDOC (AINT, "Truncate to whole number.", "\
-Returns @var{@1@} with the fractional portion of its
-magnitude truncated and its sign preserved.
-(Also called ``truncation towards zero''.)
-
-@xref{ANInt Intrinsic}, for how to round to nearest
-whole number.
-
-@xref{Int Intrinsic}, for how to truncate and then convert
-number to @code{INTEGER}.
-")
-
-DEFDOC (DINT, "Truncate to whole number (archaic).", ARCHAIC (AINT, AInt))
-
-DEFDOC (INT, "Convert to @code{INTEGER} value truncated@99@to whole number.", "\
-Returns @var{@1@} with the fractional portion of its
-magnitude truncated and its sign preserved, converted
-to type @code{INTEGER(KIND=1)}.
-
-If @var{@1@} is type @code{COMPLEX}, its real part is
-truncated and converted, and its imaginary part is disregarded.
-
-@xref{NInt Intrinsic}, for how to convert, rounded to nearest
-whole number.
-
-@xref{AInt Intrinsic}, for how to truncate to whole number
-without converting.
-")
-
-DEFDOC (IDINT, "Convert to @code{INTEGER} value truncated@99@to whole number (archaic).", ARCHAIC (INT, Int))
-
-DEFDOC (ANINT, "Round to nearest whole number.", "\
-Returns @var{@1@} with the fractional portion of its
-magnitude eliminated by rounding to the nearest whole
-number and with its sign preserved.
-
-A fractional portion exactly equal to
-@samp{.5} is rounded to the whole number that
-is larger in magnitude.
-(Also called ``Fortran round''.)
-
-@xref{AInt Intrinsic}, for how to truncate to
-whole number.
-
-@xref{NInt Intrinsic}, for how to round and then convert
-number to @code{INTEGER}.
-")
-
-DEFDOC (DNINT, "Round to nearest whole number (archaic).", ARCHAIC (ANINT, ANInt))
-
-DEFDOC (NINT, "Convert to @code{INTEGER} value rounded@99@to nearest whole number.", "\
-Returns @var{@1@} with the fractional portion of its
-magnitude eliminated by rounding to the nearest whole
-number and with its sign preserved, converted
-to type @code{INTEGER(KIND=1)}.
-
-If @var{@1@} is type @code{COMPLEX}, its real part is
-rounded and converted.
-
-A fractional portion exactly equal to
-@samp{.5} is rounded to the whole number that
-is larger in magnitude.
-(Also called ``Fortran round''.)
-
-@xref{Int Intrinsic}, for how to convert, truncate to
-whole number.
-
-@xref{ANInt Intrinsic}, for how to round to nearest whole number
-without converting.
-")
-
-DEFDOC (IDNINT, "Convert to @code{INTEGER} value rounded@99@to nearest whole number (archaic).", ARCHAIC (NINT, NInt))
-
-DEFDOC (LOG, "Natural logarithm.", "\
-Returns the natural logarithm of @var{@1@}, which must
-be greater than zero or, if type @code{COMPLEX}, must not
-be zero.
-
-@xref{Exp Intrinsic}, for the inverse of this function.
-
-@xref{Log10 Intrinsic}, for the base-10 logarithm function.
-")
-
-DEFDOC (ALOG, "Natural logarithm (archaic).", ARCHAIC (LOG, Log))
-
-DEFDOC (CLOG, "Natural logarithm (archaic).", ARCHAIC (LOG, Log))
-
-DEFDOC (DLOG, "Natural logarithm (archaic).", ARCHAIC (LOG, Log))
-
-DEFDOC (CDLOG, "Natural logarithm (archaic).", ARCHAIC (LOG, Log))
-
-DEFDOC (LOG10, "Natural logarithm.", "\
-Returns the natural logarithm of @var{@1@}, which must
-be greater than zero or, if type @code{COMPLEX}, must not
-be zero.
-
-The inverse of this function is @samp{10. ** LOG10(@var{@1@})}.
-
-@xref{Log Intrinsic}, for the natural logarithm function.
-")
-
-DEFDOC (ALOG10, "Natural logarithm (archaic).", ARCHAIC (LOG10, Log10))
-
-DEFDOC (DLOG10, "Natural logarithm (archaic).", ARCHAIC (LOG10, Log10))
-
-DEFDOC (MAX, "Maximum value.", "\
-Returns the argument with the largest value.
-
-@xref{Min Intrinsic}, for the opposite function.
-")
-
-DEFDOC (AMAX0, "Maximum value (archaic).", "\
-Archaic form of @code{MAX()} that is specific
-to one type for @var{@1@} and a different return type.
-@xref{Max Intrinsic}.
-")
-
-DEFDOC (AMAX1, "Maximum value (archaic).", ARCHAIC (MAX, Max))
-
-DEFDOC (DMAX1, "Maximum value (archaic).", ARCHAIC (MAX, Max))
-
-DEFDOC (MAX0, "Maximum value (archaic).", ARCHAIC (MAX, Max))
-
-DEFDOC (MAX1, "Maximum value (archaic).", "\
-Archaic form of @code{MAX()} that is specific
-to one type for @var{@1@} and a different return type.
-@xref{Max Intrinsic}.
-")
-
-DEFDOC (MIN, "Minimum value.", "\
-Returns the argument with the smallest value.
-
-@xref{Max Intrinsic}, for the opposite function.
-")
-
-DEFDOC (AMIN0, "Minimum value (archaic).", "\
-Archaic form of @code{MIN()} that is specific
-to one type for @var{@1@} and a different return type.
-@xref{Min Intrinsic}.
-")
-
-DEFDOC (AMIN1, "Minimum value (archaic).", ARCHAIC (MIN, Min))
-
-DEFDOC (DMIN1, "Minimum value (archaic).", ARCHAIC (MIN, Min))
-
-DEFDOC (MIN0, "Minimum value (archaic).", ARCHAIC (MIN, Min))
-
-DEFDOC (MIN1, "Minimum value (archaic).", "\
-Archaic form of @code{MIN()} that is specific
-to one type for @var{@1@} and a different return type.
-@xref{Min Intrinsic}.
-")
-
-DEFDOC (MOD, "Remainder.", "\
-Returns remainder calculated as:
-
-@smallexample
-@var{@1@} - (INT(@var{@1@} / @var{@2@}) * @var{@2@})
-@end smallexample
-
-@var{@2@} must not be zero.
-")
-
-DEFDOC (AMOD, "Remainder (archaic).", ARCHAIC (MOD, Mod))
-
-DEFDOC (DMOD, "Remainder (archaic).", ARCHAIC (MOD, Mod))
-
-DEFDOC (AND, "Boolean AND.", "\
-Returns value resulting from boolean AND of
-pair of bits in each of @var{@1@} and @var{@2@}.
-")
-
-DEFDOC (IAND, "Boolean AND.", "\
-Returns value resulting from boolean AND of
-pair of bits in each of @var{@1@} and @var{@2@}.
-")
-
-DEFDOC (OR, "Boolean OR.", "\
-Returns value resulting from boolean OR of
-pair of bits in each of @var{@1@} and @var{@2@}.
-")
-
-DEFDOC (IOR, "Boolean OR.", "\
-Returns value resulting from boolean OR of
-pair of bits in each of @var{@1@} and @var{@2@}.
-")
-
-DEFDOC (XOR, "Boolean XOR.", "\
-Returns value resulting from boolean exclusive-OR of
-pair of bits in each of @var{@1@} and @var{@2@}.
-")
-
-DEFDOC (IEOR, "Boolean XOR.", "\
-Returns value resulting from boolean exclusive-OR of
-pair of bits in each of @var{@1@} and @var{@2@}.
-")
-
-DEFDOC (NOT, "Boolean NOT.", "\
-Returns value resulting from boolean NOT of each bit
-in @var{@1@}.
-")
-
-DEFDOC (ASIN, "Arc sine.", "\
-Returns the arc-sine (inverse sine) of @var{@1@}
-in radians.
-
-@xref{Sin Intrinsic}, for the inverse of this function.
-")
-
-DEFDOC (DASIN, "Arc sine (archaic).", ARCHAIC (ASIN, ASin))
-
-DEFDOC (ATAN, "Arc tangent.", "\
-Returns the arc-tangent (inverse tangent) of @var{@1@}
-in radians.
-
-@xref{Tan Intrinsic}, for the inverse of this function.
-")
-
-DEFDOC (DATAN, "Arc tangent (archaic).", ARCHAIC (ATAN, ATan))
-
-DEFDOC (ATAN2, "Arc tangent.", "\
-Returns the arc-tangent (inverse tangent) of the complex
-number (@var{@1@}, @var{@2@}) in radians.
-
-@xref{Tan Intrinsic}, for the inverse of this function.
-")
-
-DEFDOC (DATAN2, "Arc tangent (archaic).", ARCHAIC_2 (ATAN2, ATan2))
-
-DEFDOC (BIT_SIZE, "Number of bits in argument's type.", "\
-Returns the number of bits (integer precision plus sign bit)
-represented by the type for @var{@1@}.
-
-@xref{BTest Intrinsic}, for how to test the value of a
-bit in a variable or array.
-
-@xref{IBSet Intrinsic}, for how to set a bit in a variable to 1.
-
-@xref{IBClr Intrinsic}, for how to set a bit in a variable to 0.
-
-")
-
-DEFDOC (BTEST, "Test bit.", "\
-Returns @code{.TRUE.} if bit @var{@2@} in @var{@1@} is
-1, @code{.FALSE.} otherwise.
-
-(Bit 0 is the low-order (rightmost) bit, adding the value 
-@ifinfo
-2**0,
-@end ifinfo
-@iftex
-@tex
-$2^0$,
-@end tex
-@end iftex
-or 1,
-to the number if set to 1;
-bit 1 is the next-higher-order bit, adding 
-@ifinfo
-2**1,
-@end ifinfo
-@iftex
-@tex
-$2^1$,
-@end tex
-@end iftex
-or 2;
-bit 2 adds 
-@ifinfo
-2**2,
-@end ifinfo
-@iftex
-@tex
-$2^2$,
-@end tex
-@end iftex
-or 4; and so on.)
-
-@xref{Bit_Size Intrinsic}, for how to obtain the number of bits
-in a type.
-The leftmost bit of @var{@1@} is @samp{BIT_SIZE(@var{@1@}-1}.
-")
-
-DEFDOC (CMPLX, "Construct @code{COMPLEX(KIND=1)} value.", "\
-If @var{@1@} is not type @code{COMPLEX},
-constructs a value of type @code{COMPLEX(KIND=1)} from the
-real and imaginary values specified by @var{@1@} and
-@var{@2@}, respectively.
-If @var{@2@} is omitted, @samp{0.} is assumed.
-
-If @var{@1@} is type @code{COMPLEX},
-converts it to type @code{COMPLEX(KIND=1)}.
-
-@xref{Complex Intrinsic}, for information on easily constructing
-a @code{COMPLEX} value of arbitrary precision from @code{REAL}
-arguments.
-")
-
-DEFDOC (DCMPLX, "Construct @code{COMPLEX(KIND=2)} value.", "\
-If @var{@1@} is not type @code{COMPLEX},
-constructs a value of type @code{COMPLEX(KIND=2)} from the
-real and imaginary values specified by @var{@1@} and
-@var{@2@}, respectively.
-If @var{@2@} is omitted, @samp{0D0} is assumed.
-
-If @var{@1@} is type @code{COMPLEX},
-converts it to type @code{COMPLEX(KIND=2)}.
-
-Although this intrinsic is not standard Fortran,
-it is a popular extension offered by many compilers
-that support @code{DOUBLE COMPLEX}, since it offers
-the easiest way to convert to @code{DOUBLE COMPLEX}
-without using Fortran 90 features (such as the @samp{KIND=}
-argument to the @code{CMPLX()} intrinsic).
-
-(@samp{CMPLX(0D0, 0D0)} returns a single-precision
-@code{COMPLEX} result, as required by standard FORTRAN 77.
-That's why so many compilers provide @code{DCMPLX()}, since
-@samp{DCMPLX(0D0, 0D0)} returns a @code{DOUBLE COMPLEX}
-result.
-Still, @code{DCMPLX()} converts even @code{REAL*16} arguments
-to their @code{REAL*8} equivalents in most dialects of
-Fortran, so neither it nor @code{CMPLX()} allow easy
-construction of arbitrary-precision values without
-potentially forcing a conversion involving extending or
-reducing precision.
-GNU Fortran provides such an intrinsic, called @code{COMPLEX()}.)
-
-@xref{Complex Intrinsic}, for information on easily constructing
-a @code{COMPLEX} value of arbitrary precision from @code{REAL}
-arguments.
-")
-
-DEFDOC (CONJG, "Complex conjugate.", "\
-Returns the complex conjugate:
-
-@example
-COMPLEX(REALPART(@var{@1@}), -IMAGPART(@var{@1@}))
-@end example
-")
-
-DEFDOC (DCONJG, "Complex conjugate (archaic).", ARCHAIC (CONJG, ATan2))
-
-DEFDOC (COS, "Cosine.", "\
-Returns the cosine of @var{@1@}, an angle measured
-in radians.
-
-@xref{ACos Intrinsic}, for the inverse of this function.
-")
-
-DEFDOC (CCOS, "Cosine (archaic).", ARCHAIC (COS, Cos))
-
-DEFDOC (DCOS, "Cosine (archaic).", ARCHAIC (COS, Cos))
-
-DEFDOC (CDCOS, "Cosine (archaic).", ARCHAIC (COS, Cos))
-
-DEFDOC (COSH, "Hyperbolic cosine.", "\
-Returns the hyperbolic cosine of @var{@1@}.
-")
-
-DEFDOC (DCOSH, "Hyperbolic cosine (archaic).", ARCHAIC (COSH, CosH))
-
-DEFDOC (SQRT, "Square root.", "\
-Returns the square root of @var{@1@}, which must
-not be negative.
-
-To calculate and represent the square root of a negative
-number, complex arithmetic must be used.
-For example, @samp{SQRT(COMPLEX(@var{@1@}))}.
-
-The inverse of this function is @samp{SQRT(@var{@1@}) * SQRT(@var{@1@})}.
-")
-
-DEFDOC (CSQRT, "Square root (archaic).", ARCHAIC (SQRT, SqRt))
-
-DEFDOC (DSQRT, "Square root (archaic).", ARCHAIC (SQRT, SqRt))
-
-DEFDOC (CDSQRT, "Square root (archaic).", ARCHAIC (SQRT, SqRt))
-
-DEFDOC (DBLE, "Convert to double precision.", "\
-Returns @var{@1@} converted to double precision
-(@code{REAL(KIND=2)}).
-If @var{@1@} is @code{COMPLEX}, the real part of
-@var{@1@} is used for the conversion
-and the imaginary part disregarded.
-
-@xref{Sngl Intrinsic}, for the function that converts
-to single precision.
-
-@xref{Int Intrinsic}, for the function that converts
-to @code{INTEGER}.
-
-@xref{Complex Intrinsic}, for the function that converts
-to @code{COMPLEX}.
-")
-
-DEFDOC (DIM, "Difference magnitude (non-negative subtract).", "\
-Returns @samp{@var{@1@}-@var{@2@}} if @var{@1@} is greater than
-@var{@2@}; otherwise returns zero.
-")
-
-DEFDOC (DDIM, "Difference magnitude (archaic).", ARCHAIC_2 (DIM, DiM))
-DEFDOC (IDIM, "Difference magnitude (archaic).", ARCHAIC_2 (IDIM, IDiM))
-
-DEFDOC (DPROD, "Double-precision product.", "\
-Returns @samp{DBLE(@var{@1@})*DBLE(@var{@2@})}.
-")
-
-DEFDOC (EXP, "Exponential.", "\
-Returns @samp{@var{e}**@var{@1@}}, where
-@var{e} is approximately 2.7182818.
-
-@xref{Log Intrinsic}, for the inverse of this function.
-")
-
-DEFDOC (CEXP, "Exponential (archaic).", ARCHAIC (EXP, Exp))
-
-DEFDOC (DEXP, "Exponential (archaic).", ARCHAIC (EXP, Exp))
-
-DEFDOC (CDEXP, "Exponential (archaic).", ARCHAIC (EXP, Exp))
-
-DEFDOC (FLOAT, "Conversion (archaic).", ARCHAIC (REAL, Real))
-DEFDOC (DFLOAT, "Conversion (archaic).", ARCHAIC (REAL, Real))
-
-DEFDOC (IFIX, "Conversion (archaic).", ARCHAIC (INT, Int))
-
-DEFDOC (LONG, "Conversion to @code{INTEGER(KIND=1)} (archaic).", "\
-Archaic form of @code{INT()} that is specific
-to one type for @var{@1@}.
-@xref{Int Intrinsic}.
-
-The precise meaning of this intrinsic might change
-in a future version of the GNU Fortran language,
-as more is learned about how it is used.
-")
-
-DEFDOC (SHORT, "Convert to @code{INTEGER(KIND=6)} value@99@truncated to whole number.", "\
-Returns @var{@1@} with the fractional portion of its
-magnitude truncated and its sign preserved, converted
-to type @code{INTEGER(KIND=6)}.
-
-If @var{@1@} is type @code{COMPLEX}, its real part
-is truncated and converted, and its imaginary part is disgregarded.
-
-@xref{Int Intrinsic}.
-
-The precise meaning of this intrinsic might change
-in a future version of the GNU Fortran language,
-as more is learned about how it is used.
-")
-
-DEFDOC (INT2, "Convert to @code{INTEGER(KIND=6)} value@99@truncated to whole number.", "\
-Returns @var{@1@} with the fractional portion of its
-magnitude truncated and its sign preserved, converted
-to type @code{INTEGER(KIND=6)}.
-
-If @var{@1@} is type @code{COMPLEX}, its real part
-is truncated and converted, and its imaginary part is disgregarded.
-
-@xref{Int Intrinsic}.
-
-The precise meaning of this intrinsic might change
-in a future version of the GNU Fortran language,
-as more is learned about how it is used.
-")
-
-DEFDOC (INT8, "Convert to @code{INTEGER(KIND=2)} value@99@truncated to whole number.", "\
-Returns @var{@1@} with the fractional portion of its
-magnitude truncated and its sign preserved, converted
-to type @code{INTEGER(KIND=2)}.
-
-If @var{@1@} is type @code{COMPLEX}, its real part
-is truncated and converted, and its imaginary part is disgregarded.
-
-@xref{Int Intrinsic}.
-
-The precise meaning of this intrinsic might change
-in a future version of the GNU Fortran language,
-as more is learned about how it is used.
-")
-
-DEFDOC (LEN, "Length of character entity.", "\
-Returns the length of @var{@1@}.
-
-If @var{@1@} is an array, the length of an element
-of @var{@1@} is returned.
-
-Note that @var{@1@} need not be defined when this
-intrinsic is invoked, since only the length, not
-the content, of @var{@1@} is needed.
-
-@xref{Bit_Size Intrinsic}, for the function that determines
-the size of its argument in bits.
-")
-
-DEFDOC (TAN, "Tangent.", "\
-Returns the tangent of @var{@1@}, an angle measured
-in radians.
-
-@xref{ATan Intrinsic}, for the inverse of this function.
-")
-
-DEFDOC (DTAN, "Tangent (archaic).", ARCHAIC (TAN, Tan))
-
-DEFDOC (TANH, "Hyperbolic tangent.", "\
-Returns the hyperbolic tangent of @var{@1@}.
-")
-
-DEFDOC (DTANH, "Hyperbolic tangent (archaic).", ARCHAIC (TANH, TanH))
-
-DEFDOC (SNGL, "Convert (archaic).", ARCHAIC (REAL, Real))
-
-DEFDOC (SIN, "Sine.", "\
-Returns the sine of @var{@1@}, an angle measured
-in radians.
-
-@xref{ASin Intrinsic}, for the inverse of this function.
-")
-
-DEFDOC (CSIN, "Sine (archaic).", ARCHAIC (SIN, Sin))
-
-DEFDOC (DSIN, "Sine (archaic).", ARCHAIC (SIN, Sin))
-
-DEFDOC (CDSIN, "Sine (archaic).", ARCHAIC (SIN, Sin))
-
-DEFDOC (SINH, "Hyperbolic sine.", "\
-Returns the hyperbolic sine of @var{@1@}.
-")
-
-DEFDOC (DSINH, "Hyperbolic sine (archaic).", ARCHAIC (SINH, SinH))
-
-DEFDOC (LSHIFT, "Left-shift bits.", "\
-Returns @var{@1@} shifted to the left
-@var{@2@} bits.
-
-Although similar to the expression
-@samp{@var{@1@}*(2**@var{@2@})}, there
-are important differences.
-For example, the sign of the result is
-not necessarily the same as the sign of
-@var{@1@}.
-
-Currently this intrinsic is defined assuming
-the underlying representation of @var{@1@}
-is as a two's-complement integer.
-It is unclear at this point whether that
-definition will apply when a different
-representation is involved.
-
-@xref{LShift Intrinsic}, for the inverse of this function.
-
-@xref{IShft Intrinsic}, for information
-on a more widely available left-shifting
-intrinsic that is also more precisely defined.
-")
-
-DEFDOC (RSHIFT, "Right-shift bits.", "\
-Returns @var{@1@} shifted to the right
-@var{@2@} bits.
-
-Although similar to the expression
-@samp{@var{@1@}/(2**@var{@2@})}, there
-are important differences.
-For example, the sign of the result is
-undefined.
-
-Currently this intrinsic is defined assuming
-the underlying representation of @var{@1@}
-is as a two's-complement integer.
-It is unclear at this point whether that
-definition will apply when a different
-representation is involved.
-
-@xref{RShift Intrinsic}, for the inverse of this function.
-
-@xref{IShft Intrinsic}, for information
-on a more widely available right-shifting
-intrinsic that is also more precisely defined.
-")
-
-DEFDOC (LGE, "Lexically greater than or equal.", "\
-Returns @samp{.TRUE.} if @samp{@var{@1@}.GE.@var{@2@}},
-@samp{.FALSE.} otherwise.
-@var{@1@} and @var{@2@} are interpreted as containing
-ASCII character codes.
-If either value contains a character not in the ASCII
-character set, the result is processor dependent.
-
-If the @var{@1@} and @var{@2@} are not the same length,
-the shorter is compared as if spaces were appended to
-it to form a value that has the same length as the longer.
-
-The lexical comparison intrinsics @code{LGe}, @code{LGt},
-@code{LLe}, and @code{LLt} differ from the corresponding
-intrinsic operators @code{.GE.}, @code{.GT.},
-@code{.LE.}, @code{.LT.}.
-Because the ASCII collating sequence is assumed,
-the following expressions always return @samp{.TRUE.}:
-
-@smallexample
-LGE ('0', ' ')
-LGE ('A', '0')
-LGE ('a', 'A')
-@end smallexample
-
-The following related expressions do @emph{not} always
-return @samp{.TRUE.}, as they are not necessarily evaluated
-assuming the arguments use ASCII encoding:
-
-@smallexample
-'0' .GE. ' '
-'A' .GE. '0'
-'a' .GE. 'A'
-@end smallexample
-
-The same difference exists
-between @code{LGt} and @code{.GT.};
-between @code{LLe} and @code{.LE.}; and
-between @code{LLt} and @code{.LT.}.
-")
-
-DEFDOC (LGT, "Lexically greater than.", "\
-Returns @samp{.TRUE.} if @samp{@var{@1@}.GT.@var{@2@}},
-@samp{.FALSE.} otherwise.
-@var{@1@} and @var{@2@} are interpreted as containing
-ASCII character codes.
-If either value contains a character not in the ASCII
-character set, the result is processor dependent.
-
-If the @var{@1@} and @var{@2@} are not the same length,
-the shorter is compared as if spaces were appended to
-it to form a value that has the same length as the longer.
-
-@xref{LGe Intrinsic}, for information on the distinction
-between the @code{@0@} intrinsic and the @code{.GT.}
-operator.
-")
-
-DEFDOC (LLE, "Lexically less than or equal.", "\
-Returns @samp{.TRUE.} if @samp{@var{@1@}.LE.@var{@2@}},
-@samp{.FALSE.} otherwise.
-@var{@1@} and @var{@2@} are interpreted as containing
-ASCII character codes.
-If either value contains a character not in the ASCII
-character set, the result is processor dependent.
-
-If the @var{@1@} and @var{@2@} are not the same length,
-the shorter is compared as if spaces were appended to
-it to form a value that has the same length as the longer.
-
-@xref{LGe Intrinsic}, for information on the distinction
-between the @code{@0@} intrinsic and the @code{.LE.}
-operator.
-")
-
-DEFDOC (LLT, "Lexically less than.", "\
-Returns @samp{.TRUE.} if @samp{@var{@1@}.LT.@var{@2@}},
-@samp{.FALSE.} otherwise.
-@var{@1@} and @var{@2@} are interpreted as containing
-ASCII character codes.
-If either value contains a character not in the ASCII
-character set, the result is processor dependent.
-
-If the @var{@1@} and @var{@2@} are not the same length,
-the shorter is compared as if spaces were appended to
-it to form a value that has the same length as the longer.
-
-@xref{LGe Intrinsic}, for information on the distinction
-between the @code{@0@} intrinsic and the @code{.LT.}
-operator.
-")
-
-DEFDOC (SIGN, "Apply sign to magnitude.", "\
-Returns @samp{ABS(@var{@1@})*@var{s}}, where
-@var{s} is +1 if @samp{@var{@2@}.GE.0},
--1 otherwise.
-
-@xref{Abs Intrinsic}, for the function that returns
-the magnitude of a value.
-")
-
-DEFDOC (DSIGN, "Apply sign to magnitude (archaic).", ARCHAIC_2 (SIGN, Sign))
-DEFDOC (ISIGN, "Apply sign to magnitude (archaic).", ARCHAIC_2 (ISIGN, ISign))
-
-DEFDOC (REAL, "Convert value to type @code{REAL(KIND=1)}.", "\
-Converts @var{@1@} to @code{REAL(KIND=1)}.
-
-Use of @code{@0@()} with a @code{COMPLEX} argument
-(other than @code{COMPLEX(KIND=1)}) is restricted to the following case:
-
-@example
-REAL(REAL(@1@))
-@end example
-
-@noindent
-This expression converts the real part of @1@ to
-@code{REAL(KIND=1)}.
-
-@xref{RealPart Intrinsic}, for information on a GNU Fortran
-intrinsic that extracts the real part of an arbitrary
-@code{COMPLEX} value.
-
-@xref{REAL() and AIMAG() of Complex}, for more information.
-")
-
-DEFDOC (DREAL, "Convert value to type @code{REAL(KIND=2)}.", "\
-Converts @var{@1@} to @code{REAL(KIND=2)}.
-
-If @var{@1@} is type @code{COMPLEX}, its real part
-is converted (if necessary) to @code{REAL(KIND=2)},
-and its imaginary part is disregarded.
-
-Although this intrinsic is not standard Fortran,
-it is a popular extension offered by many compilers
-that support @code{DOUBLE COMPLEX}, since it offers
-the easiest way to extract the real part of a @code{DOUBLE COMPLEX}
-value without using the Fortran 90 @code{REAL()} intrinsic
-in a way that produces a return value inconsistent with
-the way many FORTRAN 77 compilers handle @code{REAL()} of
-a @code{DOUBLE COMPLEX} value.
-
-@xref{RealPart Intrinsic}, for information on a GNU Fortran
-intrinsic that avoids these areas of confusion.
-
-@xref{REAL() and AIMAG() of Complex}, for more information on
-this issue.
-")
-
-DEFDOC (IMAGPART, "Extract imaginary part of complex.", "\
-The imaginary part of @var{@1@} is returned, without conversion.
-
-@emph{Note:} The way to do this in standard Fortran 90
-is @samp{AIMAG(@var{@1@})}.
-However, when, for example, @var{@1@} is @code{DOUBLE COMPLEX},
-@samp{AIMAG(@var{@1@})} means something different for some compilers
-that are not true Fortran 90 compilers but offer some
-extensions standardized by Fortran 90 (such as the
-@code{DOUBLE COMPLEX} type, also known as @code{COMPLEX(KIND=2)}).
-
-The advantage of @code{@0@()} is that, while not necessarily
-more or less portable than @code{AIMAG()}, it is more likely to
-cause a compiler that doesn't support it to produce a diagnostic
-than generate incorrect code.
-
-@xref{REAL() and AIMAG() of Complex}, for more information.
-")
-
-DEFDOC (COMPLEX, "Build complex value from real and@99@imaginary parts.", "\
-Returns a @code{COMPLEX} value that has @samp{@1@} and @samp{@2@} as its
-real and imaginary parts, respectively.
-
-If @var{@1@} and @var{@2@} are the same type, and that type is not
-@code{INTEGER}, no data conversion is performed, and the type of
-the resulting value has the same kind value as the types
-of @var{@1@} and @var{@2@}.
-
-If @var{@1@} and @var{@2@} are not the same type, the usual type-promotion
-rules are applied to both, converting either or both to the
-appropriate @code{REAL} type.
-The type of the resulting value has the same kind value as the
-type to which both @var{@1@} and @var{@2@} were converted, in this case.
-
-If @var{@1@} and @var{@2@} are both @code{INTEGER}, they are both converted
-to @code{REAL(KIND=1)}, and the result of the @code{@0@()}
-invocation is type @code{COMPLEX(KIND=1)}.
-
-@emph{Note:} The way to do this in standard Fortran 90
-is too hairy to describe here, but it is important to
-note that @samp{CMPLX(D1,D2)} returns a @code{COMPLEX(KIND=1)}
-result even if @samp{D1} and @samp{D2} are type @code{REAL(KIND=2)}.
-Hence the availability of @code{COMPLEX()} in GNU Fortran.
-")
-
-DEFDOC (LOC, "Address of entity in core.", "\
-The @code{LOC()} intrinsic works the
-same way as the @code{%LOC()} construct.
-@xref{%LOC(),,The @code{%LOC()} Construct}, for
-more information.
-")
-
-DEFDOC (REALPART, "Extract real part of complex.", "\
-The real part of @var{@1@} is returned, without conversion.
-
-@emph{Note:} The way to do this in standard Fortran 90
-is @samp{REAL(@var{@1@})}.
-However, when, for example, @var{@1@} is @code{COMPLEX(KIND=2)},
-@samp{REAL(@var{@1@})} means something different for some compilers
-that are not true Fortran 90 compilers but offer some
-extensions standardized by Fortran 90 (such as the
-@code{DOUBLE COMPLEX} type, also known as @code{COMPLEX(KIND=2)}).
-
-The advantage of @code{@0@()} is that, while not necessarily
-more or less portable than @code{REAL()}, it is more likely to
-cause a compiler that doesn't support it to produce a diagnostic
-than generate incorrect code.
-
-@xref{REAL() and AIMAG() of Complex}, for more information.
-")
-
-DEFDOC (GETARG, "Obtain command-line argument.", "\
-Sets @var{@2@} to the @var{@1@}-th command-line argument (or to all
-blanks if there are fewer than @var{@2@} command-line arguments);
-@code{CALL @0@(0, @var{value})} sets @var{value} to the name of the
-program (on systems that support this feature).
-
-@xref{IArgC Intrinsic}, for information on how to get the number
-of arguments.
-")
-
-DEFDOC (ABORT, "Abort the program.", "\
-Prints a message and potentially causes a core dump via @code{abort(3)}.
-")
-
-DEFDOC (EXIT, "Terminate the program.", "\
-Exit the program with status @var{@1@} after closing open Fortran
-I/O units and otherwise behaving as @code{exit(2)}.
-If @var{@1@} is omitted the canonical `success' value
-will be returned to the system.
-")
-
-DEFDOC (IARGC, "Obtain count of command-line arguments.", "\
-Returns the number of command-line arguments.
-
-This count does not include the specification of the program
-name itself.
-")
-
-DEFDOC (CTIME_func, "Convert time to Day Mon dd hh:mm:ss yyyy.", "\
-Converts @var{@1@}, a system time value, such as returned by
-@code{TIME8()}, to a string of the form @samp{Sat Aug 19 18:13:14 1995},
-and returns that string as the function value.
-
-@xref{Time8 Intrinsic}.
-")
-
-DEFDOC (CTIME_subr, "Convert time to Day Mon dd hh:mm:ss yyyy.", "\
-Converts @var{@2@}, a system time value, such as returned by
-@code{TIME8()}, to a string of the form @samp{Sat Aug 19 18:13:14 1995},
-and returns that string in @var{@1@}.
-
-@xref{Time8 Intrinsic}.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine.
-")
-
-DEFDOC (DATE, "Get current date as dd-Mon-yy.", "\
-Returns @var{@1@} in the form @samp{@var{dd}-@var{mmm}-@var{yy}},
-representing the numeric day of the month @var{dd}, a three-character
-abbreviation of the month name @var{mmm} and the last two digits of
-the year @var{yy}, e.g.@ @samp{25-Nov-96}.
-
-This intrinsic is not recommended, due to the year 2000 approaching.
-@xref{CTime Intrinsic (subroutine)}, for information on obtaining more digits
-for the current (or any) date.
-")
-
-DEFDOC (DTIME_func, "Get elapsed time since last time.", "\
-Initially, return the number of seconds of runtime
-since the start of the process's execution
-as the function value,
-and the user and system components of this in @samp{@var{@1@}(1)}
-and @samp{@var{@1@}(2)} respectively.
-The functions' value is equal to @samp{@var{@1@}(1) + @var{@1@}(2)}.
-
-Subsequent invocations of @samp{@0@()} return values accumulated since the
-previous invocation.
-
-Due to the side effects performed by this intrinsic, the function
-form is not recommended.
-")
-
-DEFDOC (DTIME_subr, "Get elapsed time since last time.", "\
-Initially, return the number of seconds of runtime
-since the start of the process's execution
-in @var{@1@},
-and the user and system components of this in @samp{@var{@2@}(1)}
-and @samp{@var{@2@}(2)} respectively.
-The value of @var{@1@} is equal to @samp{@var{@2@}(1) + @var{@2@}(2)}.
-
-Subsequent invocations of @samp{@0@()} set values based on accumulations
-since the previous invocation.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine.
-")
-
-DEFDOC (ETIME_func, "Get elapsed time for process.", "\
-Return the number of seconds of runtime
-since the start of the process's execution
-as the function value,
-and the user and system components of this in @samp{@var{@1@}(1)}
-and @samp{@var{@1@}(2)} respectively.
-The functions' value is equal to @samp{@var{@1@}(1) + @var{@1@}(2)}.
-")
-
-DEFDOC (ETIME_subr, "Get elapsed time for process.", "\
-Return the number of seconds of runtime
-since the start of the process's execution
-in @var{@1@},
-and the user and system components of this in @samp{@var{@2@}(1)}
-and @samp{@var{@2@}(2)} respectively.
-The value of @var{@1@} is equal to @samp{@var{@2@}(1) + @var{@2@}(2)}.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine.
-")
-
-DEFDOC (FDATE_func, "Get current time as Day Mon dd hh:mm:ss yyyy.", "\
-Returns the current date (using the same format as @code{CTIME()}).
-
-Equivalent to:
-
-@example
-CTIME(TIME8())
-@end example
-
-@xref{CTime Intrinsic (function)}.
-")
-
-DEFDOC (FDATE_subr, "Get current time as Day Mon dd hh:mm:ss yyyy.", "\
-Returns the current date (using the same format as @code{CTIME()})
-in @var{@1@}.
-
-Equivalent to:
-
-@example
-CALL CTIME(@var{@1@}, TIME8())
-@end example
-
-@xref{CTime Intrinsic (subroutine)}.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine.
-")
-
-DEFDOC (GMTIME, "Convert time to GMT time info.", "\
-Given a system time value @var{@1@}, fills @var{@2@} with values
-extracted from it appropriate to the GMT time zone using
-@code{gmtime(3)}.
-
-The array elements are as follows:
-
-@enumerate
-@item
-Seconds after the minute, range 0--59 or 0--61 to allow for leap
-seconds
-
-@item
-Minutes after the hour, range 0--59
-
-@item
-Hours past midnight, range 0--23
-
-@item
-Day of month, range 0--31
-
-@item
-Number of months since January, range 0--12
-
-@item
-Years since 1900
-
-@item
-Number of days since Sunday, range 0--6
-
-@item
-Days since January 1
-
-@item
-Daylight savings indicator: positive if daylight savings is in effect,
-zero if not, and negative if the information isn't available.
-@end enumerate
-")
-
-DEFDOC (LTIME, "Convert time to local time info.", "\
-Given a system time value @var{@1@}, fills @var{@2@} with values
-extracted from it appropriate to the GMT time zone using
-@code{localtime(3)}.
-
-The array elements are as follows:
-
-@enumerate
-@item
-Seconds after the minute, range 0--59 or 0--61 to allow for leap
-seconds
-
-@item
-Minutes after the hour, range 0--59
-
-@item
-Hours past midnight, range 0--23
-
-@item
-Day of month, range 0--31
-
-@item
-Number of months since January, range 0--12
-
-@item
-Years since 1900
-
-@item
-Number of days since Sunday, range 0--6
-
-@item
-Days since January 1
-
-@item
-Daylight savings indicator: positive if daylight savings is in effect,
-zero if not, and negative if the information isn't available.
-@end enumerate
-")
-
-DEFDOC (IDATE_unix, "Get local time info.", "\
-Fills @var{@1@} with the numerical values at the current local time
-of day, month (in the range 1--12), and year in elements 1, 2, and 3,
-respectively.
-The year has four significant digits.
-")
-
-DEFDOC (IDATE_vxt, "Get local time info (VAX/VMS).", "\
-Returns the numerical values of the current local time.
-The month (in the range 1--12) is returned in @var{@1@},
-the day (in the range 1--7) in @var{@2@},
-and the year in @var{@3@} (in the range 0--99).
-
-This intrinsic is not recommended, due to the year 2000 approaching.
-")
-
-DEFDOC (ITIME, "Get local time of day.", "\
-Returns the current local time hour, minutes, and seconds in elements
-1, 2, and 3 of @var{@1@}, respectively.
-")
-
-DEFDOC (MCLOCK, "Get number of clock ticks for process.", "\
-Returns the number of clock ticks since the start of the process.
-Supported on systems with @code{clock(3)} (q.v.).
-
-This intrinsic is not fully portable, such as to systems
-with 32-bit @code{INTEGER} types but supporting times
-wider than 32 bits.
-@xref{MClock8 Intrinsic}, for information on a
-similar intrinsic that might be portable to more
-GNU Fortran implementations, though to fewer
-Fortran compilers.
-
-If the system does not support @code{clock(3)},
--1 is returned.
-")
-
-DEFDOC (MCLOCK8, "Get number of clock ticks for process.", "\
-Returns the number of clock ticks since the start of the process.
-Supported on systems with @code{clock(3)} (q.v.).
-
-No Fortran implementations other than GNU Fortran are
-known to support this intrinsic at the time of this
-writing.
-@xref{MClock Intrinsic}, for information on a
-similar intrinsic that might be portable to more Fortran
-compilers, though to fewer GNU Fortran implementations.
-
-If the system does not support @code{clock(3)},
--1 is returned.
-")
-
-DEFDOC (SECNDS, "Get local time offset since midnight.", "\
-Returns the local time in seconds since midnight minus the value
-@var{@1@}.
-")
-
-DEFDOC (SECOND_func, "Get CPU time for process in seconds.", "\
-Returns the process's runtime in seconds---the same value as the
-UNIX function @code{etime} returns.
-
-This routine is known from Cray Fortran.
-")
-
-DEFDOC (SECOND_subr, "Get CPU time for process@99@in seconds.", "\
-Returns the process's runtime in seconds in @var{@1@}---the same value
-as the UNIX function @code{etime} returns.
-
-This routine is known from Cray Fortran.  @xref{Cpu_Time Intrinsic}
-for a standard equivalent.
-")
-
-DEFDOC (SYSTEM_CLOCK, "Get current system clock value.", "\
-Returns in @var{@1@} the current value of the system clock; this is
-the value returned by the UNIX function @code{times(2)}
-in this implementation, but
-isn't in general.
-@var{@2@} is the number of clock ticks per second and
-@var{@3@} is the maximum value this can take, which isn't very useful
-in this implementation since it's just the maximum C @code{unsigned
-int} value.
-")
-
-DEFDOC (CPU_TIME, "Get current CPU time.", "\
-Returns in @var{@1@} the current value of the system time.
-This implementation of the Fortran 95 intrinsic is just an alias for
-@code{second} @xref{Second Intrinsic (subroutine)}.
-")
-
-DEFDOC (TIME8, "Get current time as time value.", "\
-Returns the current time encoded as a long integer
-(in the manner of the UNIX function @code{time(3)}).
-This value is suitable for passing to @code{CTIME},
-@code{GMTIME}, and @code{LTIME}.
-
-No Fortran implementations other than GNU Fortran are
-known to support this intrinsic at the time of this
-writing.
-@xref{Time Intrinsic (UNIX)}, for information on a
-similar intrinsic that might be portable to more Fortran
-compilers, though to fewer GNU Fortran implementations.
-")
-
-DEFDOC (TIME_unix, "Get current time as time value.", "\
-Returns the current time encoded as an integer
-(in the manner of the UNIX function @code{time(3)}).
-This value is suitable for passing to @code{CTIME},
-@code{GMTIME}, and @code{LTIME}.
-
-This intrinsic is not fully portable, such as to systems
-with 32-bit @code{INTEGER} types but supporting times
-wider than 32 bits.
-@xref{Time8 Intrinsic}, for information on a
-similar intrinsic that might be portable to more
-GNU Fortran implementations, though to fewer
-Fortran compilers.
-")
-
-#define BES(num,n,val) "\
-Calculates the Bessel function of the " #num " kind of \
-order " #n " of @var{@" #val "@}.\n\
-See @code{bessel(3m)}, on whose implementation the \
-function depends.\
-"
-
-DEFDOC (BESJ0, "Bessel function.", BES (first, 0, 1))
-DEFDOC (BESJ1, "Bessel function.", BES (first, 1, 1))
-DEFDOC (BESJN, "Bessel function.", BES (first, @var{N}, 2))
-DEFDOC (BESY0, "Bessel function.", BES (second, 0, 1))
-DEFDOC (BESY1, "Bessel function.", BES (second, 1, 1))
-DEFDOC (BESYN, "Bessel function.", BES (second, @var{N}, 2))
-DEFDOC (DBESJ0, "Bessel function (archaic).", ARCHAIC (BESJ0, BesJ0))
-DEFDOC (DBESJ1, "Bessel function (archaic).", ARCHAIC (BESJ1, BesJ1))
-DEFDOC (DBESJN, "Bessel function (archaic).", ARCHAIC_2nd (BESJN, BesJN))
-DEFDOC (DBESY0, "Bessel function (archaic).", ARCHAIC (BESY0, BesY0))
-DEFDOC (DBESY1, "Bessel function (archaic).", ARCHAIC (BESY1, BesY1))
-DEFDOC (DBESYN, "Bessel function (archaic).", ARCHAIC_2nd (BESYN, BesYN))
-
-DEFDOC (ERF, "Error function.", "\
-Returns the error function of @var{@1@}.
-See @code{erf(3m)}, which provides the implementation.
-")
-
-DEFDOC (ERFC, "Complementary error function.", "\
-Returns the complementary error function of @var{@1@}:
-@samp{ERFC(R) = 1 - ERF(R)} (except that the result may be more
-accurate than explicitly evaluating that formulae would give).
-See @code{erfc(3m)}, which provides the implementation.
-")
-
-DEFDOC (DERF, "Error function (archaic).", ARCHAIC (ERF, ErF))
-DEFDOC (DERFC, "Complementary error function (archaic).", ARCHAIC (ERFC, ErFC))
-
-DEFDOC (IRAND, "Random number.", "\
-Returns a uniform quasi-random number up to a system-dependent limit.
-If @var{@1@} is 0, the next number in sequence is returned; if
-@var{@1@} is 1, the generator is restarted by calling the UNIX function
-@samp{srand(0)}; if @var{@1@} has any other value,
-it is used as a new seed with @code{srand()}.
-
-@xref{SRand Intrinsic}.
-
-@emph{Note:} As typically implemented (by the routine of the same
-name in the C library), this random number generator is a very poor
-one, though the BSD and GNU libraries provide a much better
-implementation than the `traditional' one.
-On a different system you almost certainly want to use something better.
-")
-
-DEFDOC (RAND, "Random number.", "\
-Returns a uniform quasi-random number between 0 and 1.
-If @var{@1@} is 0, the next number in sequence is returned; if
-@var{@1@} is 1, the generator is restarted by calling @samp{srand(0)};
-if @var{@1@} has any other value, it is used as a new seed with
-@code{srand}.
-
-@xref{SRand Intrinsic}.
-
-@emph{Note:} As typically implemented (by the routine of the same
-name in the C library), this random number generator is a very poor
-one, though the BSD and GNU libraries provide a much better
-implementation than the `traditional' one.
-On a different system you
-almost certainly want to use something better.
-")
-
-DEFDOC (SRAND, "Random seed.", "\
-Reinitialises the generator with the seed in @var{@1@}.
-@xref{IRand Intrinsic}.
-@xref{Rand Intrinsic}.
-")
-
-DEFDOC (ACCESS, "Check file accessibility.", "\
-Checks file @var{@1@} for accessibility in the mode specified by @var{@2@} and
-returns 0 if the file is accessible in that mode, otherwise an error
-code if the file is inaccessible or @var{@2@} is invalid.
-See @code{access(2)}.
-A null character (@samp{CHAR(0)}) marks the end of
-the name in @var{@1@}---otherwise,
-trailing blanks in @var{@1@} are ignored.
-@var{@2@} may be a concatenation of any of the following characters:
-
-@table @samp
-@item r
-Read permission
-
-@item w
-Write permission
-
-@item x
-Execute permission
-
-@item @kbd{SPC}
-Existence
-@end table
-")
-
-DEFDOC (CHDIR_subr, "Change directory.", "\
-Sets the current working directory to be @var{@1@}.
-If the @var{@2@} argument is supplied, it contains 0
-on success or a non-zero error code otherwise upon return.
-See @code{chdir(3)}.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine, or do not support the
-(optional) @var{@2@} argument.
-")
-
-DEFDOC (CHDIR_func, "Change directory.", "\
-Sets the current working directory to be @var{@1@}.
-Returns 0 on success or a non-zero error code.
-See @code{chdir(3)}.
-
-Due to the side effects performed by this intrinsic, the function
-form is not recommended.
-")
-
-DEFDOC (CHMOD_func, "Change file modes.", "\
-Changes the access mode of file @var{@1@} according to the
-specification @var{@2@}, which is given in the format of
-@code{chmod(1)}.
-A null character (@samp{CHAR(0)}) marks the end of
-the name in @var{@1@}---otherwise,
-trailing blanks in @var{@1@} are ignored.
-Currently, @var{@1@} must not contain the single quote
-character.
-
-Returns 0 on success or a non-zero error code otherwise.
-
-Note that this currently works
-by actually invoking @code{/bin/chmod} (or the @code{chmod} found when
-the library was configured) and so may fail in some circumstances and
-will, anyway, be slow.
-
-Due to the side effects performed by this intrinsic, the function
-form is not recommended.
-")
-
-DEFDOC (CHMOD_subr, "Change file modes.", "\
-Changes the access mode of file @var{@1@} according to the
-specification @var{@2@}, which is given in the format of
-@code{chmod(1)}.
-A null character (@samp{CHAR(0)}) marks the end of
-the name in @var{@1@}---otherwise,
-trailing blanks in @var{@1@} are ignored.
-Currently, @var{@1@} must not contain the single quote
-character.
-
-If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
-
-Note that this currently works
-by actually invoking @code{/bin/chmod} (or the @code{chmod} found when
-the library was configured) and so may fail in some circumstances and
-will, anyway, be slow.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine, or do not support the
-(optional) @var{@3@} argument.
-")
-
-DEFDOC (GETCWD_func, "Get current working directory.", "\
-Places the current working directory in @var{@1@}.
-Returns 0 on
-success, otherwise a non-zero error code
-(@code{ENOSYS} if the system does not provide @code{getcwd(3)}
-or @code{getwd(3)}).
-")
-
-DEFDOC (GETCWD_subr, "Get current working directory.", "\
-Places the current working directory in @var{@1@}.
-If the @var{@2@} argument is supplied, it contains 0
-success or a non-zero error code upon return
-(@code{ENOSYS} if the system does not provide @code{getcwd(3)}
-or @code{getwd(3)}).
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine, or do not support the
-(optional) @var{@2@} argument.
-")
-
-DEFDOC (FSTAT_func, "Get file information.", "\
-Obtains data about the file open on Fortran I/O unit @var{@1@} and
-places them in the array @var{@2@}.
-The values in this array are
-extracted from the @code{stat} structure as returned by
-@code{fstat(2)} q.v., as follows:
-
-@enumerate
-@item
-File mode
-
-@item
-Inode number
-
-@item
-ID of device containing directory entry for file
-
-@item
-Device id (if relevant)
-
-@item
-Number of links
-
-@item
-Owner's uid
-
-@item
-Owner's gid
-
-@item
-File size (bytes)
-
-@item
-Last access time
-
-@item
-Last modification time
-
-@item
-Last file status change time
-
-@item
-Preferred I/O block size
-
-@item
-Number of blocks allocated
-@end enumerate
-
-Not all these elements are relevant on all systems.
-If an element is not relevant, it is returned as 0.
-
-Returns 0 on success or a non-zero error code.
-")
-
-DEFDOC (FSTAT_subr, "Get file information.", "\
-Obtains data about the file open on Fortran I/O unit @var{@1@} and
-places them in the array @var{@2@}.
-The values in this array are
-extracted from the @code{stat} structure as returned by
-@code{fstat(2)} q.v., as follows:
-
-@enumerate
-@item
-File mode
-
-@item
-Inode number
-
-@item
-ID of device containing directory entry for file
-
-@item
-Device id (if relevant)
-
-@item
-Number of links
-
-@item
-Owner's uid
-
-@item
-Owner's gid
-
-@item
-File size (bytes)
-
-@item
-Last access time
-
-@item
-Last modification time
-
-@item
-Last file status change time
-
-@item
-Preferred I/O block size
-
-@item
-Number of blocks allocated
-@end enumerate
-
-Not all these elements are relevant on all systems.
-If an element is not relevant, it is returned as 0.
-
-If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine, or do not support the
-(optional) @var{@3@} argument.
-")
-
-DEFDOC (LSTAT_func, "Get file information.", "\
-Obtains data about the given file @var{@1@} and places them in the array
-@var{@2@}.
-A null character (@samp{CHAR(0)}) marks the end of
-the name in @var{@1@}---otherwise,
-trailing blanks in @var{@1@} are ignored.
-If @var{@1@} is a symbolic link it returns data on the
-link itself, so the routine is available only on systems that support
-symbolic links.
-The values in this array are extracted from the
-@code{stat} structure as returned by @code{fstat(2)} q.v., as follows:
-
-@enumerate
-@item
-File mode
-
-@item
-Inode number
-
-@item
-ID of device containing directory entry for file
-
-@item
-Device id (if relevant)
-
-@item
-Number of links
-
-@item
-Owner's uid
-
-@item
-Owner's gid
-
-@item
-File size (bytes)
-
-@item
-Last access time
-
-@item
-Last modification time
-
-@item
-Last file status change time
-
-@item
-Preferred I/O block size
-
-@item
-Number of blocks allocated
-@end enumerate
-
-Not all these elements are relevant on all systems.
-If an element is not relevant, it is returned as 0.
-
-Returns 0 on success or a non-zero error code
-(@code{ENOSYS} if the system does not provide @code{lstat(2)}).
-")
-
-DEFDOC (LSTAT_subr, "Get file information.", "\
-Obtains data about the given file @var{@1@} and places them in the array
-@var{@2@}.
-A null character (@samp{CHAR(0)}) marks the end of
-the name in @var{@1@}---otherwise,
-trailing blanks in @var{@1@} are ignored.
-If @var{@1@} is a symbolic link it returns data on the
-link itself, so the routine is available only on systems that support
-symbolic links.
-The values in this array are extracted from the
-@code{stat} structure as returned by @code{fstat(2)} q.v., as follows:
-
-@enumerate
-@item
-File mode
-
-@item
-Inode number
-
-@item
-ID of device containing directory entry for file
-
-@item
-Device id (if relevant)
-
-@item
-Number of links
-
-@item
-Owner's uid
-
-@item
-Owner's gid
-
-@item
-File size (bytes)
-
-@item
-Last access time
-
-@item
-Last modification time
-
-@item
-Last file status change time
-
-@item
-Preferred I/O block size
-
-@item
-Number of blocks allocated
-@end enumerate
-
-Not all these elements are relevant on all systems.
-If an element is not relevant, it is returned as 0.
-
-If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return
-(@code{ENOSYS} if the system does not provide @code{lstat(2)}).
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine, or do not support the
-(optional) @var{@3@} argument.
-")
-
-DEFDOC (STAT_func, "Get file information.", "\
-Obtains data about the given file @var{@1@} and places them in the array
-@var{@2@}.
-A null character (@samp{CHAR(0)}) marks the end of
-the name in @var{@1@}---otherwise,
-trailing blanks in @var{@1@} are ignored.
-The values in this array are extracted from the
-@code{stat} structure as returned by @code{fstat(2)} q.v., as follows:
-
-@enumerate
-@item
-File mode
-
-@item
-Inode number
-
-@item
-ID of device containing directory entry for file
-
-@item
-Device id (if relevant)
-
-@item
-Number of links
-
-@item
-Owner's uid
-
-@item
-Owner's gid
-
-@item
-File size (bytes)
-
-@item
-Last access time
-
-@item
-Last modification time
-
-@item
-Last file status change time
-
-@item
-Preferred I/O block size
-
-@item
-Number of blocks allocated
-@end enumerate
-
-Not all these elements are relevant on all systems.
-If an element is not relevant, it is returned as 0.
-
-Returns 0 on success or a non-zero error code.
-")
-
-DEFDOC (STAT_subr, "Get file information.", "\
-Obtains data about the given file @var{@1@} and places them in the array
-@var{@2@}.
-A null character (@samp{CHAR(0)}) marks the end of
-the name in @var{@1@}---otherwise,
-trailing blanks in @var{@1@} are ignored.
-The values in this array are extracted from the
-@code{stat} structure as returned by @code{fstat(2)} q.v., as follows:
-
-@enumerate
-@item
-File mode
-
-@item
-Inode number
-
-@item
-ID of device containing directory entry for file
-
-@item
-Device id (if relevant)
-
-@item
-Number of links
-
-@item
-Owner's uid
-
-@item
-Owner's gid
-
-@item
-File size (bytes)
-
-@item
-Last access time
-
-@item
-Last modification time
-
-@item
-Last file status change time
-
-@item
-Preferred I/O block size
-
-@item
-Number of blocks allocated
-@end enumerate
-
-Not all these elements are relevant on all systems.
-If an element is not relevant, it is returned as 0.
-
-If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine, or do not support the
-(optional) @var{@3@} argument.
-")
-
-DEFDOC (LINK_subr, "Make hard link in file system.", "\
-Makes a (hard) link from file @var{@1@} to @var{@2@}.
-A null character (@samp{CHAR(0)}) marks the end of
-the names in @var{@1@} and @var{@2@}---otherwise,
-trailing blanks in @var{@1@} and @var{@2@} are ignored.
-If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
-See @code{link(2)}.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine, or do not support the
-(optional) @var{@3@} argument.
-")
-
-DEFDOC (LINK_func, "Make hard link in file system.", "\
-Makes a (hard) link from file @var{@1@} to @var{@2@}.
-A null character (@samp{CHAR(0)}) marks the end of
-the names in @var{@1@} and @var{@2@}---otherwise,
-trailing blanks in @var{@1@} and @var{@2@} are ignored.
-Returns 0 on success or a non-zero error code.
-See @code{link(2)}.
-
-Due to the side effects performed by this intrinsic, the function
-form is not recommended.
-")
-
-DEFDOC (SYMLNK_subr, "Make symbolic link in file system.", "\
-Makes a symbolic link from file @var{@1@} to @var{@2@}.
-A null character (@samp{CHAR(0)}) marks the end of
-the names in @var{@1@} and @var{@2@}---otherwise,
-trailing blanks in @var{@1@} and @var{@2@} are ignored.
-If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return
-(@code{ENOSYS} if the system does not provide @code{symlink(2)}).
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine, or do not support the
-(optional) @var{@3@} argument.
-")
-
-DEFDOC (SYMLNK_func, "Make symbolic link in file system.", "\
-Makes a symbolic link from file @var{@1@} to @var{@2@}.
-A null character (@samp{CHAR(0)}) marks the end of
-the names in @var{@1@} and @var{@2@}---otherwise,
-trailing blanks in @var{@1@} and @var{@2@} are ignored.
-Returns 0 on success or a non-zero error code
-(@code{ENOSYS} if the system does not provide @code{symlink(2)}).
-
-Due to the side effects performed by this intrinsic, the function
-form is not recommended.
-")
-
-DEFDOC (RENAME_subr, "Rename file.", "\
-Renames the file @var{@1@} to @var{@2@}.
-A null character (@samp{CHAR(0)}) marks the end of
-the names in @var{@1@} and @var{@2@}---otherwise,
-trailing blanks in @var{@1@} and @var{@2@} are ignored.
-See @code{rename(2)}.
-If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine, or do not support the
-(optional) @var{@3@} argument.
-")
-
-DEFDOC (RENAME_func, "Rename file.", "\
-Renames the file @var{@1@} to @var{@2@}.
-A null character (@samp{CHAR(0)}) marks the end of
-the names in @var{@1@} and @var{@2@}---otherwise,
-trailing blanks in @var{@1@} and @var{@2@} are ignored.
-See @code{rename(2)}.
-Returns 0 on success or a non-zero error code.
-
-Due to the side effects performed by this intrinsic, the function
-form is not recommended.
-")
-
-DEFDOC (UMASK_subr, "Set file creation permissions mask.", "\
-Sets the file creation mask to @var{@1@} and returns the old value in
-argument @var{@2@} if it is supplied.
-See @code{umask(2)}.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine.
-")
-
-DEFDOC (UMASK_func, "Set file creation permissions mask.", "\
-Sets the file creation mask to @var{@1@} and returns the old value.
-See @code{umask(2)}.
-
-Due to the side effects performed by this intrinsic, the function
-form is not recommended.
-")
-
-DEFDOC (UNLINK_subr, "Unlink file.", "\
-Unlink the file @var{@1@}.
-A null character (@samp{CHAR(0)}) marks the end of
-the name in @var{@1@}---otherwise,
-trailing blanks in @var{@1@} are ignored.
-If the @var{@2@} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
-See @code{unlink(2)}.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine, or do not support the
-(optional) @var{@2@} argument.
-")
-
-DEFDOC (UNLINK_func, "Unlink file.", "\
-Unlink the file @var{@1@}.
-A null character (@samp{CHAR(0)}) marks the end of
-the name in @var{@1@}---otherwise,
-trailing blanks in @var{@1@} are ignored.
-Returns 0 on success or a non-zero error code.
-See @code{unlink(2)}.
-
-Due to the side effects performed by this intrinsic, the function
-form is not recommended.
-")
-
-DEFDOC (GERROR, "Get error message for last error.", "\
-Returns the system error message corresponding to the last system
-error (C @code{errno}).
-")
-
-DEFDOC (IERRNO, "Get error number for last error.", "\
-Returns the last system error number (corresponding to the C
-@code{errno}).
-")
-
-DEFDOC (PERROR, "Print error message for last error.", "\
-Prints (on the C @code{stderr} stream) a newline-terminated error
-message corresponding to the last system error.
-This is prefixed by @var{@1@}, a colon and a space.
-See @code{perror(3)}.
-")
- 
-DEFDOC (GETGID, "Get process group id.", "\
-Returns the group id for the current process.
-")
- 
-DEFDOC (GETUID, "Get process user id.", "\
-Returns the user id for the current process.
-")
- 
-DEFDOC (GETPID, "Get process id.", "\
-Returns the process id for the current process.
-")
-
-DEFDOC (GETENV, "Get environment variable.", "\
-Sets @var{@2@} to the value of environment variable given by the
-value of @var{@1@} (@code{$name} in shell terms) or to blanks if
-@code{$name} has not been set.
-A null character (@samp{CHAR(0)}) marks the end of
-the name in @var{@1@}---otherwise,
-trailing blanks in @var{@1@} are ignored.
-")
-
-DEFDOC (GETLOG, "Get login name.", "\
-Returns the login name for the process in @var{@1@}.
-")
-
-DEFDOC (HOSTNM_func, "Get host name.", "\
-Fills @var{@1@} with the system's host name returned by
-@code{gethostname(2)}, returning 0 on success or a non-zero error code
-(@code{ENOSYS} if the system does not provide @code{gethostname(2)}).
-
-This intrinsic is not available on all systems.
-")
-
-DEFDOC (HOSTNM_subr, "Get host name.", "\
-Fills @var{@1@} with the system's host name returned by
-@code{gethostname(2)}.
-If the @var{@2@} argument is supplied, it contains
-0 on success or a non-zero error code upon return
-(@code{ENOSYS} if the system does not provide @code{gethostname(2)}).
-
-This intrinsic is not available on all systems.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine, or do not support the
-(optional) @var{@2@} argument.
-")
-
-/* Fixme: stream I/O */
-
-DEFDOC (FLUSH, "Flush buffered output.", "\
-Flushes Fortran unit(s) currently open for output.
-Without the optional argument, all such units are flushed,
-otherwise just the unit specified by @var{@1@}.
-
-Some non-GNU implementations of Fortran provide this intrinsic
-as a library procedure that might or might not support the
-(optional) @var{@1@} argument.
-")
-
-DEFDOC (FNUM, "Get file descriptor from Fortran unit number.", "\
-Returns the Unix file descriptor number corresponding to the open
-Fortran I/O unit @var{@1@}.
-This could be passed to an interface to C I/O routines.
-")
-
-#define IOWARN "
-Stream I/O should not be mixed with normal record-oriented (formatted or
-unformatted) I/O on the same unit; the results are unpredictable.
-"
-
-DEFDOC (FGET_func, "Read a character from unit 5 stream-wise.", "\
-Reads a single character into @var{@1@} in stream mode from unit 5
-(by-passing normal formatted input) using @code{getc(3)}.
-Returns 0 on
-success, @minus{}1 on end-of-file, and the error code from
-@code{ferror(3)} otherwise.
-" IOWARN)
-
-DEFDOC (FGET_subr, "Read a character from unit 5 stream-wise.", "\
-Reads a single character into @var{@1@} in stream mode from unit 5
-(by-passing normal formatted output) using @code{getc(3)}.
-Returns in
-@var{@2@} 0 on success, @minus{}1 on end-of-file, and the error code
-from @code{ferror(3)} otherwise.
-" IOWARN)
-
-DEFDOC (FGETC_func, "Read a character stream-wise.", "\
-Reads a single character into @var{@2@} in stream mode from unit @var{@1@}
-(by-passing normal formatted output) using @code{getc(3)}.
-Returns 0 on
-success, @minus{}1 on end-of-file, and the error code from
-@code{ferror(3)} otherwise.
-" IOWARN)
-
-DEFDOC (FGETC_subr, "Read a character stream-wise.", "\
-Reads a single character into @var{@2@} in stream mode from unit @var{@1@}
-(by-passing normal formatted output) using @code{getc(3)}.
-Returns in
-@var{@3@} 0 on success, @minus{}1 on end-of-file, and the error code from
-@code{ferror(3)} otherwise.
-" IOWARN)
-
-DEFDOC (FPUT_func, "Write a character to unit 6 stream-wise.", "\
-Writes the single character @var{@1@} in stream mode to unit 6
-(by-passing normal formatted output) using @code{getc(3)}.
-Returns 0 on
-success, the error code from @code{ferror(3)} otherwise.
-" IOWARN)
-
-DEFDOC (FPUT_subr, "Write a character to unit 6 stream-wise.", "\
-Writes the single character @var{@1@} in stream mode to unit 6
-(by-passing normal formatted output) using @code{putc(3)}.
-Returns in
-@var{@2@} 0 on success, the error code from @code{ferror(3)} otherwise.
-" IOWARN)
-
-DEFDOC (FPUTC_func, "Write a character stream-wise.", "\
-Writes the single character @var{@2@} in stream mode to unit @var{@1@}
-(by-passing normal formatted output) using @code{putc(3)}.
-Returns 0 on
-success, the error code from @code{ferror(3)} otherwise.
-" IOWARN)
-
-DEFDOC (FPUTC_subr, "Write a character stream-wise.", "\
-Writes the single character @var{@1@} in stream mode to unit 6
-(by-passing normal formatted output) using @code{putc(3)}.
-Returns in
-@var{@2@} 0 on success, the error code from @code{ferror(3)} otherwise.
-" IOWARN)
-
-DEFDOC (FSEEK, "Position file (low-level).", "\
-Attempts to move Fortran unit @var{@1@} to the specified
-@var{Offset}: absolute offset if @var{@2@}=0; relative to the
-current offset if @var{@2@}=1; relative to the end of the file if
-@var{@2@}=2.
-It branches to label @var{@3@} if @var{@1@} is
-not open or if the call otherwise fails.
-")
-
-DEFDOC (FTELL_func, "Get file position (low-level).", "\
-Returns the current offset of Fortran unit @var{@1@}
-(or @minus{}1 if @var{@1@} is not open).
-")
-
-DEFDOC (FTELL_subr, "Get file position (low-level).", "\
-Sets @var{@2@} to the current offset of Fortran unit @var{@1@}
-(or to @minus{}1 if @var{@1@} is not open).
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine.
-")
-
-DEFDOC (ISATTY, "Is unit connected to a terminal?", "\
-Returns @code{.TRUE.} if and only if the Fortran I/O unit
-specified by @var{@1@} is connected
-to a terminal device.
-See @code{isatty(3)}.
-")
-
-DEFDOC (TTYNAM_func, "Get name of terminal device for unit.", "\
-Returns the name of the terminal device open on logical unit
-@var{@1@} or a blank string if @var{@1@} is not connected to a
-terminal.
-")
-
-DEFDOC (TTYNAM_subr, "Get name of terminal device for unit.", "\
-Sets @var{@1@} to the name of the terminal device open on logical unit
-@var{@2@} or a blank string if @var{@2@} is not connected to a
-terminal.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine.
-")
-
-DEFDOC (SIGNAL_subr, "Muck with signal handling.", "\
-If @var{@2@} is a an @code{EXTERNAL} routine, arranges for it to be
-invoked with a single integer argument (of system-dependent length)
-when signal @var{@1@} occurs.
-If @var{@1@} is an integer, it can be
-used to turn off handling of signal @var{@2@} or revert to its default
-action.
-See @code{signal(2)}.
-
-Note that @var{@2@} will be called using C conventions, so its value in
-Fortran terms is obtained by applying @code{%LOC()} (or @var{LOC()}) to it.
-
-The value returned by @code{signal(2)} is written to @var{@3@}, if
-that argument is supplied.
-Otherwise the return value is ignored.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine, or do not support the
-(optional) @var{@3@} argument.
-")
-
-DEFDOC (SIGNAL_func, "Muck with signal handling.", "\
-If @var{@2@} is a an @code{EXTERNAL} routine, arranges for it to be
-invoked with a single integer argument (of system-dependent length)
-when signal @var{@1@} occurs.
-If @var{@1@} is an integer, it can be
-used to turn off handling of signal @var{@2@} or revert to its default
-action.
-See @code{signal(2)}.
-
-Note that @var{@2@} will be called using C conventions, so its value in
-Fortran terms is obtained by applying @code{%LOC()} (or @var{LOC()}) to it.
-
-The value returned by @code{signal(2)} is returned.
-
-Due to the side effects performed by this intrinsic, the function
-form is not recommended.
-")
-
-DEFDOC (KILL_func, "Signal a process.", "\
-Sends the signal specified by @var{@2@} to the process @var{@1@}.
-Returns 0 on success or a non-zero error code.
-See @code{kill(2)}.
-
-Due to the side effects performed by this intrinsic, the function
-form is not recommended.
-")
-
-DEFDOC (KILL_subr, "Signal a process.", "\
-Sends the signal specified by @var{@2@} to the process @var{@1@}.
-If the @var{@3@} argument is supplied, it contains
-0 on success or a non-zero error code upon return.
-See @code{kill(2)}.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine, or do not support the
-(optional) @var{@3@} argument.
-")
-
-DEFDOC (LNBLNK, "Get last non-blank character in string.", "\
-Returns the index of the last non-blank character in @var{@1@}.
-@code{LNBLNK} and @code{LEN_TRIM} are equivalent.
-")
-
-DEFDOC (SLEEP, "Sleep for a specified time.", "\
-Causes the process to pause for @var{@1@} seconds.
-See @code{sleep(2)}.
-")
-
-DEFDOC (SYSTEM_subr, "Invoke shell (system) command.", "\
-Passes the command @var{@1@} to a shell (see @code{system(3)}).
-If argument @var{@2@} is present, it contains the value returned by
-@code{system(3)}, presumably 0 if the shell command succeeded.
-Note that which shell is used to invoke the command is system-dependent
-and environment-dependent.
-
-Some non-GNU implementations of Fortran provide this intrinsic as
-only a function, not as a subroutine, or do not support the
-(optional) @var{@2@} argument.
-")
-
-DEFDOC (SYSTEM_func, "Invoke shell (system) command.", "\
-Passes the command @var{@1@} to a shell (see @code{system(3)}).
-Returns the value returned by
-@code{system(3)}, presumably 0 if the shell command succeeded.
-Note that which shell is used to invoke the command is system-dependent
-and environment-dependent.
-
-Due to the side effects performed by this intrinsic, the function
-form is not recommended.
-However, the function form can be valid in cases where the
-actual side effects performed by the call are unimportant to
-the application.
-
-For example, on a UNIX system, @samp{SAME = SYSTEM('cmp a b')}
-does not perform any side effects likely to be important to the
-program, so the programmer would not care if the actual system
-call (and invocation of @code{cmp}) was optimized away in a situation
-where the return value could be determined otherwise, or was not
-actually needed (@samp{SAME} not actually referenced after the
-sample assignment statement).
-")
-
-DEFDOC (TIME_vxt, "Get the time as a character value.", "\
-Returns in @var{@1@} a character representation of the current time as
-obtained from @code{ctime(3)}.
-
-@xref{Fdate Intrinsic (subroutine)} for an equivalent routine.
-")
-
-DEFDOC (IBCLR, "Clear a bit.", "\
-Returns the value of @var{@1@} with bit @var{@2@} cleared (set to
-zero).
-@xref{BTest Intrinsic} for information on bit positions.
-")
-
-DEFDOC (IBSET, "Set a bit.", "\
-Returns the value of @var{@1@} with bit @var{@2@} set (to one).
-@xref{BTest Intrinsic} for information on bit positions.
-")
-
-DEFDOC (IBITS, "Extract a bit subfield of a variable.", "\
-Extracts a subfield of length @var{@3@} from @var{@1@}, starting from
-bit position @var{@2@} and extending left for @var{@3@} bits.
-The result is right-justified and the remaining bits are zeroed.
-The value
-of @samp{@var{@2@}+@var{@3@}} must be less than or equal to the value
-@samp{BIT_SIZE(@var{@1@})}.
-@xref{Bit_Size Intrinsic}.
-")
-
-DEFDOC (ISHFT, "Logical bit shift.", "\
-All bits representing @var{@1@} are shifted @var{@2@} places.
-@samp{@var{@2@}.GT.0} indicates a left shift, @samp{@var{@2@}.EQ.0}
-indicates no shift and @samp{@var{@2@}.LT.0} indicates a right shift.
-If the absolute value of the shift count is greater than
-@samp{BIT_SIZE(@var{@1@})}, the result is undefined.
-Bits shifted out from the left end or the right end, as the case may be,
-are lost.
-Zeros are shifted in from the opposite end.
-
-@xref{IShftC Intrinsic} for the circular-shift equivalent.
-")
-
-DEFDOC (ISHFTC, "Circular bit shift.", "\
-The rightmost @var{@3@} bits of the argument @var{@1@}
-are shifted circularly @var{@2@}
-places, i.e.@ the bits shifted out of one end are shifted into 
-the opposite end.
-No bits are lost.
-The unshifted bits of the result are the same as
-the unshifted bits of @var{@1@}.
-The  absolute value of the argument @var{@2@}
-must be less than or equal to @var{@3@}.  
-The value of @var{@3@} must be greater than or equal to one and less than 
-or equal to @samp{BIT_SIZE(@var{@1@})}.
-
-@xref{IShft Intrinsic} for the logical shift equivalent.
-")
-
-DEFDOC (MVBITS, "Moving a bit field.", "\
-Moves @var{@3@} bits from positions @var{@2@} through
-@samp{@var{@2@}+@var{@3@}-1} of @var{@1@} to positions @var{@5@} through
-@samp{@var{@2@}+@var{@3@}-1} of @var{@4@}.  The portion of argument
-@var{@4@} not affected by the movement of bits is unchanged.  Arguments
-@var{@1@} and @var{@4@} are permitted to be the same numeric storage
-unit.  The values of @samp{@var{@2@}+@var{@3@}} and
-@samp{@var{@5@}+@var{@3@}} must be less than or equal to
-@samp{BIT_SIZE(@var{@1@})}.
-")
-
-DEFDOC (INDEX, "Locate a CHARACTER substring.", "\
-Returns the position of the start of the first occurrence of string
-@var{@2@} as a substring in @var{@1@}, counting from one.
-If @var{@2@} doesn't occur in @var{@1@}, zero is returned.
-")
-
diff --git a/gcc/f/runtime/ChangeLog b/gcc/f/runtime/ChangeLog
deleted file mode 100644
index 57b175e..0000000
--- a/gcc/f/runtime/ChangeLog
+++ /dev/null
@@ -1,756 +0,0 @@
-Tue Sep  9 00:33:24 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* Version 0.5.21 released.
-
-Mon Sep  8 19:39:01 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libI77/close.c (f_exit): Fix thinko, inverted test
-	of whether initialization done, so exiting now closes
-	open units again.
-
-Tue Aug 26 01:42:21 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	From Jim Wilson:
-	* configure.in: Make sure RANLIB_TEST is set also.
-
-	From Robert Lipe <robertl@dgii.com>:
-	* libU77/getcwd_.c, libU77/hostnm_.c, libU77/lstat_.c:
-	Also #include <errno.h>, to define ENOSYS.
-
-Tue Aug 26 01:25:58 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* Makefile.in (stamp-lib): Put all f2cext.c objects in
-	a temp directory named libE77, then `ar' them all at
-	once into libf2c.a, to get the job done a bit faster.
-	Still remove the objects (and libE77 directory) afterward.
-
-Sun Aug 24 05:04:35 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libU77/rand_.c (G77_rand_0), libU77/dtime_.c (G77_dtime_0),
-	libU77/etime_.c (G77_etime_0), libU77/secnds_.c (G77_secnds_0),
-	libU77/second_.c (G77_second_0): Really return `double', not
-	`doublereal', since the result is cast to `float'.
-	* f2cext.c: (rand_, dtime_, etime_, secnds_, second_): Ditto.
-	(erf_, erfc_, besj0_, besj1_, besjn_, besy0_, besy1_,
-	besyn_, dbesj0_, dbesj1_, dbesjn_, dbesy0_, dbesy1_,
-	dbesyn_): All of these return `double', not `doublereal',
-	as they either have `float' or `double' results.
-	* libU77/bes.c (besj0_, besj1_, besjn_, besy0_, besy1_,
-	besyn_): Ditto.
-	* libU77/dbes.c (dbesj0_, dbesj1_, dbesjn_, dbesy0_, dbesy1_,
-	dbesyn_): Ditto.
-
-	Update to Netlib version of 1997-08-16:
-	* libI77/iio.c: Fix bug in internal writes to an array
-	of character strings.
-
-	* Makefile.in (UOBJ): Restore fixes made by Dan Pettet I
-	lost, which included the addition of mclock_.o already noted
-	below, plus adding symlnk_.o.
-
-Thu Aug 21 03:58:34 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* Makefile.in (UOBJ): Add mclock_.o, thanks to Mumit Khan!
-
-1997-08-21  Dave Love  <d.love@dl.ac.uk>
-
-	* libU77/alarm_.c: Fix return type: `integer'.
-
-Mon Aug 11 20:12:42 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* Makefile.in ($(lib), stamp-lib): Ensure that library
-	gets fully updated even if updating was aborted earlier.
-
-	* libU77/hostnm_.c (G77_hostnm_0): Return ENOSYS and stuff
-	in errno if system has no gethostname() function.
-
-	* libU77/lstat_.c (G77_lstat_0): Return ENOSYS and stuff
-	in errno if system has no lstat() function.
-
-	* libU77/getcwd_.c (G77_getcwd_0): Return ENOSYS and stuff
-	in errno if system has no getcwd() or getwd() function.
-	Test HAVE_GETCWD properly.
-
-	* libU77/symlnk_.c (G77_symlink_0): Return ENOSYS and stuff
-	in errno if system has no symlink() function.
-
-	* libU77/mclock_.c (G77_mclock_0): Return -1 if system
-	has no clock() function.
-
-Mon Aug 11 01:55:36 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* Makefile.in (F2CEXT): Add `alarm' to this list.
-
-	* f2cext.c (alarm_): Fix some typos in this function.
-	Delete third `status' argument.
-
-	* libU77/alarm_.c: Delete third `status' argument,
-	as caller gets this from function result; return
-	status value as function result for caller.
-
-	* configure.in: Rename `ac_cv_struct_FILE' to
-	`g77_cv_struct_FILE' according to 1997-06-26 change.
-
-1997-08-06  Dave Love  <d.love@dl.ac.uk>
-
-	* libU77/vxtidate_.c: Correct day/month argument order.
-	* f2cext.c: Likewise.
-
-1997-07-07  Dave Love  <d.love@dl.ac.uk>
-
-	* f2cext.c: Add alarm_.
-
-	* Makefile.in, libU77/Makefile.in: Add alarm_.
-
-	* libU77/alarm_.c: New file.
-
-1997-06-26  Dave Love  <d.love@dl.ac.uk>
-
-	* configure.in: Generally use prefix `g77_' for cached values
-	we've invented, not `ac_'.
-
-Tue Jun 24 18:50:06 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libI77/ilnw.c (s_wsni): Call f_init() here.
-	(s_wsli): Ditto.
-	(e_wsli): Turn off "doing I/O" flag here.
-
-1997-06-20  Dave Love  <d.love@dl.ac.uk>
-
-	* runtime/configure.in: Check for cygwin32 after Mumit Khan (but
- 	differently); if cygwin32 define NON_UNIX_STDIO and don't define
- 	NON_ANSI_RW_MODES.
-
-Tue Jun 01 06:26:29 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libI77/rsne.c (nl_init): Don't call f_init() here,
-	since s_rsne() already does.
-	(c_lir): Call f_init() here instead.
-	* libI77/rsli.c (e_rsli): Turn off "doing I/O" flag here.
-	* libI77/sue.c (e_rsue): Ditto.
-
-Sun Jun 22 23:27:22 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libI77/fio.h (err): Mark I/O as no longer in progress
-	before returning a non-zero error indicator (since
-	that tells the caller to jump over the remaining I/O
-	calls, including the corresponding `e_whatever' call).
-	* libI77/err.c (endif): Ditto.
-	* libI77/sfe.c (e_wsfe): Ditto.
-	* libI77/lread.c (ERR): Ditto.
-	* libI77/lread.c (l_read): Ditto by having quad case
-	use ERR, not return, to return non-zero error code.
-
-Sat Jun 21 12:31:28 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libI77/open.c (fk_open): Temporarily turn off
-	"doing I/O" flag during f_open() call to avoid recursive
-	I/O error.
-
-Tue Jun 17 22:40:47 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* err.c, close.c, rewind.c, inquire.c, backspace.c, endfile.c,
-	iio.c, open.c, Version.c, sfe.c, wsle.c, rsne.c, sue.c, rsfe.c,
-	lread.c, wsfe.c, fio.h, due.c, dfe.c: Change f__init from
-	`flag' to `int' and to signal not just whether initialization
-	has happened (bit 0), but also whether I/O is in progress
-	already (bit 1).  Consistently produce a clear diagnostic
-	in cases of recursive I/O.  Avoid infinite recursion in
-	f__fatal, in case sig_die triggers another error.  Don't
-	output info on internals if not initialized in f__fatal.  Don't
-	bother closing units in f_exit if initialization hasn't
-	happened.
-
-Tue Jun 10 12:57:44 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	Update to Netlib version of 1997-06-09:
-	* libI77/err.c, libI77/lread.c, libI77/rdfmt.c,
-	libI77/wref.c: Move some #include's around.
-
-Mon Jun  9 18:11:56 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libU77/kill_.c (kill_): KR_headers version needed
-	`*' in front of args in decls.
-
-Sun May 25 03:16:53 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	Update to Netlib version of 1997-05-24:
-	* libF77/README, libF77/Version.c, libF77/main.c,
-	libF77/makefile, libF77/s_paus.c, libF77/signal1.h,
-	libF77/signal_.c, libF77/z_div.c, libI77/Notice,
-	libI77/README, libI77/Version.c, libI77/dfe.c,
-	libI77/err.c, libI77/fmt.c, libI77/makefile,
-	libI77/rawio.h: Apply many, but not all, of the changes
-	made to libf2c since last update.
-	* libF77/Makefile.in (MISC), Makefile.in (MISC): Rename
-	exit.o to exit_.o to go along with Netlib.
-	* libF77/signal.c: Make the prologue much simpler than
-	Netlib has it.
-
-Sun May 18 20:56:02 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libU77/unlink_.c, libU77/stat_.c, libU77/symlnk_.c,
-	libU77/chmod_.c: g_char first arg is const.
-
-	* libU77/chmod_.c: s_cat expects ftnlen[], not int[] or
-	integer[], change types of array and variables
-	accordingly.
-
-May 7 1997  Daniel Pettet  <dan.pettet@bchydro.bc.ca>
-
-	* libU77/dbes_.c: Commented out the code in the
-	same way the bes* routines are commented out.  This
-	was done because corresponding C routines are referenced
-	directly in com-rt.def.
-
-Mon May  5 13:56:02 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libU77/stat_.c: Reverse KR/ANSI decls of g_char().
-
-Apr 18 1997  Daniel Pettet  <dan.pettet@bchydro.bc.ca>
-
-	* libF77/F77_aloc.c, libF77/abort_.c, libF77/derf_.c,
-	libF77/derfc_.c, libF77/ef1asc_.c, libF77/ef1cmc_.c,
-	libF77/erf_.c, libF77/erfc_.c, libF77/exit.c,
-	libF77/getarg_.c, libF77/getenv_.c, libF77/iargc_.c,
-	libF77/s_cat.c, libF77/signal_.c, libF77/system_.c,
-	libI77/close.c, libI77/ftell_.c, libU77/access_.c,
-	libU77/bes.c, libU77/chdir_.c, libU77/chmod_.c, libU77/ctime_.c,
-	libU77/date_.c, libU77/dbes.c, libU77/dtime_.c, libU77/etime_.c,
-	libU77/fdate_.c, libU77/fgetc_.c, libU77/flush1_.c,
-	libU77/fnum_.c, libU77/fputc_.c, libU77/fstat_.c,
-	libU77/gerror_.c, libU77/getcwd_.c, libU77/getgid_.c,
-	libU77/getlog_.c, libU77/getpid_.c, libU77/getuid_.c,
-	libU77/gmtime_.c, libU77/hostnm_.c, libU77/idate_.c,
-	libU77/ierrno_.c, libU77/irand_.c, libU77/isatty_.c,
-	libU77/itime_.c, libU77/kill_.c, libU77/link_.c,
-	libU77/lnblnk_.c, libU77/ltime_.c, libU77/mclock_.c,
-	libU77/perror_.c, libU77/rand_.c, libU77/rename_.c,
-	libU77/secnds_.c, libU77/second_.c, libU77/sleep_.c,
-	libU77/srand_.c, libU77/stat_.c, libU77/symlnk_.c,
-	libU77/system_clock_.c, libU77/time_.c, libU77/ttynam_.c,
-	libU77/umask_.c, libU77/unlink_.c, libU77/vxtidate_.c,
-	libU77/vxttime_.c: Completed renaming routines that are directly
-	callable from g77 to internal names of the form
-	G77_xxxx_0 that are known as intrinsics by g77.
-
-Apr 8 1997  Daniel Pettet  <dan.pettet@bchydro.bc.ca>
-
-	* Makefile.in: Add libU77/mclock_.o and libU77/symlnk_.o to UOBJ.
-	* libU77/Makefile.in: Add mclock_.c to SRCS.
-	Add mclock_.o and symlnk_.o to OBJS.
-	Add mclock_.o dependency.
-
-Apr 8 1997  Daniel Pettet  <dan.pettet@bchydro.bc.ca>
-
-	* libU77/symlnk_.c: Added a couple of (char*) casts to malloc
-	to silence the compiler.
-
-1997-03-17  Dave Love  <d.love@dl.ac.uk>
-
-	* libU77/access_.c, libU77/chdir_.c, libU77/chmod_.c,
-	libU77/link_.c, libU77/lstat_.c, libU77/rename_.c, libU77/stat_.c,
-	libU77/symlnk_.c, libU77/u77-test.f, libU77/unlink_.c: Strip
-	trailing blanks from file names for consistency with other
-	implementations (notably Sun's).
-
-	* libU77/chmod_.c: Quote the file name given to the shell.
-
-Mon Mar 10 00:19:17 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libI77/uio.c (do_ud) [PAD_UDread]: Add semicolon to err()
-	invocation when macro not defined (from Mumit Khan
-	<khan@xraylith.wisc.edu>).
-
-Fri Feb 28 13:16:50 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* Version 0.5.20 released.
-
-Wed Feb 26 20:28:53 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* Makefile.in: $(MAKE) invocations now explicitly
-	specify `-f Makefile', just in case the `makefile's
-	from the netlib distribution would get used instead.
-
-Mon Feb 24 16:43:39 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libU77/Makefile.in (check): Specify driver, and
-	don't bother enabling already-enabled intrinsic groups.
-	Also, get the $(srcdir) version of u77-test.f.
-
-Sat Feb 22 14:08:42 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libU77/u77-test.f: Explicitly declare intrinsics, get
-	rid of useless CHARACTER declarations on intrinsics (maybe
-	someday appropriate to implement meaning of that in g77
-	and restore them?).
-	Add spin loop just to fatten up the timings a bit.
-	Clarify ETIME output as having three fields.
-	Call TIME with CHARACTER*8, not CHARACTER*6, argument.
-	Call new SECOND intrinsic subroutine, after calling
-	new DUMDUM subroutine just to ensure the correct value
-	doesn't get left around in a register or something.
-
-Thu Feb 20 15:22:42 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libU77/bes.c: Comment out all the code, as g77 avoids actually
-	calling it, going directly to the system's library instead.
-
-Mon Feb 17 02:27:41 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libU77/fgetc_.c (fgetc_): Allow return value to be
-	CHARACTER*(*), properly handle CHARACTER*0 and blank-pad
-	CHARACTER*n where n>1.
-
-Tue Feb 11 14:12:19 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* Makefile.in: Clarify role of $(srcdir) here.  Fix
-	various targets accordingly.  Don't rely at all on
-	gcc/f/include/ being a link to gcc/include/ -- just
-	use it directly.
-	(${srcdir}/configure, ${srcdir}/libU77/configure):
-	Remove the config.cache files in build directory before
-	cd'ing to source directory as well.
-
-	* libF77/Makefile.in, libI77/Makefile.in (ALL_CFLAGS):
-	Include `-I.' to pick up build directory.
-	Use gcc/include/ directly.
-	* libU77/Makefile.in (ALL_CFLAGS): Include `-I$(srcdir)'
-	to pick up source directory.
-	(OBJS): Fix typo in `chmod_.o' (was `chmod.o').
-
-Mon Feb 10 12:54:47 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* Makefile.in (UOBJ), libU77/Makefile.in (OBJS): Add
-	libU77/chmod_.o to list of objects.
-	* libU77/chmod_.c: Fix up headers.
-	Fix implementation to not prematurely truncate command
-	string and make room for trailing null.
-
-	* libU77/ctime_.c: Incoming xstime argument is now longint.
-	* libU77/mclock_.c: Now returns longint.
-	* libU77/time_.c: Now returns longint.
-
-1997-02-10  Dave Love  <d.love@dl.ac.uk>
-
-	* etime_.c, dtime_.c: Typo rounded times to seconds.
-
-	* date_.c: Add missing return.
-
-	* hostnm_.c: #include unistd.h.
-
-Sat Feb  8 03:30:19 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	INTEGER*8 support built in to f2c.h and libf2c (since
-	gcc will be used to compile relevant code anyway):
-	* Makefile.in, libF77/Makefile.in: Add pow_qq.o,
-	qbitbits.o, and qbitshft.o to $POW and $F90BIT macros,
-	as appropriate.
-	* f2c.h.in: Define appropriate types and macros.
-	Place #error directive correctly.
-	* configure.in: Determine appropriate types for long
-	integer (F2C_LONGINT).
-	Meanwhile, quote strings in #error, for consistency.
-	Fix restoring of ac_cpp macro.
-	* configure: Regenerated using autoconf-2.12.
-
-	* libF77/Version.c, libI77/Version.c, libU77/Version.c:
-	Update version numbers.
-	Change names and code for g77-specific version-printing
-	routines (shorter names should be safer to link on
-	weird, 8-char systems).
-
-	* libF77/c_cos.c, libF77/c_div.c, libF77/c_exp.c,
-	libF77/c_log.c, libF77/c_sin.c, libF77/c_sqrt.c,
-	libF77/d_cnjg.c, libF77/pow_zi.c, libF77/r_cnjg.c,
-	libF77/z_cos.c, libF77/z_div.c, libF77/z_exp.c,
-	libF77/z_log.c, libF77/z_sin.c, libF77/z_sqrt.c:
-	Changed to work properly even when result is aliased
-	with any inputs.
-
-	* libF77/makefile, libI77/makefile: Leave these in
-	the g77 distribution, so it is easier to track changes
-	to official libf2c.
-
-	* libF77/signal_.c: Eliminate redundant `return 0;'.
-
-	* libI77/fio.h (err, errfl): Fix these so they work
-	(and must be expressed) as statements.
-	Fix up many users of err() to include trailing semicolon.
-
-	* Incorporate changes by Bell Labs to libf2c through 1997-02-07.
-
-1997-02-06  Dave Love  <d.love@dl.ac.uk>
-
-	* libU77/etime_.c, libU77/dtime_.c: Fix getrusage stuff.
-
-	* libU77/config.h.in: Regenerate for HAVE_GETRUSAGE.
-
-	* libU77/Makefile.in, libI77/Makefile.in, libF77/Makefile.in:
-	Redo *clean targets; distclean and maintainer-clean remove the stage?
-	and include links.  This probably want looking at further.
-
-Wed Feb  5 00:21:23 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	Add libU77 library from Dave Love <d.love@dl.ac.uk>:
-	* Makefile.in: Add libU77 directory, rules, etc.
-	* configure.in: New libU77 directory, Makefile, etc.
-
-	* Makefile.in, libF77/Makefile.in, libI77/Makefile.in,
-	libU77/Makefile.in: Reorganize these so $(AR) commands
-	handled by the top-level Makefile instead of the
-	subordinates.  This permits it to do $(AR) only when
-	one or more object files actually change, instead of
-	having to force-update it as was necessary before.
-	And that had the disadvantage of requiring, e.g., user
-	root to have access to $(AR) to the library simply to
-	install g77, which might be problematic on an NFS setup.
-	(mostlyclean, clean, distclean, maintainer-clean):
-	Properly handle these rules.
-
-	* Makefile.in: Don't invoke config.status here -- let
-	compiler-level stuff handle all that.
-
-	* err.c [MISSING_FILE_ELEMS]: Declare malloc in this case
-	too, so it doesn't end up as an integer.
-
-Sat Feb  1 02:43:48 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libF77/Makefile.in: More fixup for $(F90BIT) -- wasn't
-	in list for ar command, and it wasn't correctly listed
-	in the list of things depending on f2c.h.
-
-	* f2c.h.in: Fix up #error directive.
-
-1997-01-31  Dave Love  <d.love@dl.ac.uk>
-
-	* libF77/Makefile.in ($(lib)): Add $(F90BIT); shouldn't exclude
-	stuff f2c needs so we can share the library.
-
-Sat Jan 18 19:39:03 1997  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* configure.in: No longer define ALWAYS_FLUSH, the
-	resulting performance is too low.
-
-Wed Dec 18 12:06:02 1996  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	Patch from Mumit Khan <khan@xraylith.wisc.edu>:
-	* libF77/s_paus.c: Add __CYGWIN32__ to list of macros
-	controlling how to pause.
-
-Sun Dec  1 21:25:27 1996  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* configure: Regenerated using autoconf-2.12.
-
-Mon Nov 25 21:16:15 1996  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* configure: Regenerated using autoconf-2.11.
-
-1996-11-19  Dave Love  <d.love@dl.ac.uk>
-
-	* libI77/backspace.c: Include sys/types.h for size_t.
-
-Wed Nov  6 14:17:27 1996  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* f2c.h.in: Properly comment out the unsupported stuff so
-	we don't get build-time errors.
-
-	* libF77/Version.c, libI77/Version.c: Restore macro definition
-	of version information.
-
-	* libI77/Makefile.in (OBJ): Add ftell_.o to list of objects.
-
-	* libI77/uio.c (do_ud): Fix up casts in PAD_UDread case just
-	like they were fixed in the other case.
-
-Thu Oct 31 22:27:45 1996  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libI77/ftell_.c (fseek_): Map incoming whence argument to
-	system's actual SEEK_CUR, SEEK_SET, or SEEK_END macro for
-	fseek(), and crash (gracefully) if the argument is invalid.
-
-1996-10-19  Dave Love  <d.love@dl.ac.uk>
-
-	* configure.in: Add check that we have the tools to cross-compile
- 	if appropriate.
-	(NO_EOF_CHAR_CHECK,Skip_f2c_Undefs): Define.
-
-	* libF77/Makefile.in (F90BIT): New routines from Netlib.
-
-	* f2c.h.in:
-	Use more sanitary #error (indented for K&R compliance if necessary) if
-	f2c_i2 defined.
-	Sync with Netlib: Add `uninteger'.  (Commented out) integer*8 stuff.
-	bit_{test,clear,set} macros.
-
-1996-10-19  Dave Love  <d.love@dl.ac.uk>
-
-	Update to Netlib version of 1996-09-26.
-	
-	* libI77/Version.c: Use <stdio.h>, not "stdio.h".
-	* libF77/Version.c: Likewise.
-
-Wed Aug 28 13:25:29 1996  Dave Love  <d.love@dl.ac.uk>
-
-	* libI77/rsne.c (x_rsne): Use size_t instead of int.
-
-	* libI77/endfile.c (copy): Use size_t in place of int.
-
-Wed Aug 28 13:22:20 1996  Dave Love  <d.love@dl.ac.uk>
-
-	* libI77/backspace.c (f_back): Cast fread arg to size_t.
-
-Tue Aug 27 19:11:30 1996  Dave Love  <d.love@dl.ac.uk>
-
-	* libI77/Version.c: Supply */ to avoid apparent nested comment.
-
-Tue Aug 20 09:21:43 1996  Dave Love  <d.love@dl.ac.uk>
-
-	* libF77/Makefile.in (ALL_CFLAGS): Fix missing ../ for include.
-	* libI77/Makefile.in (ALL_CFLAGS): Likewise.
-
-Sat Aug 17 13:00:47 1996  Dave Love  <d.love@dl.ac.uk>
-
-	* (libF77/qbitshft.c, libF77/qbitbits.c, libF77/lbitshft.c,
- 	libF77/lbitbits.c): New file from Netlib.  qbit... not currently
-	compiled.
-
-Sun Jul  7 18:06:33 1996  Dave Love  <d.love@dl.ac.uk>
-
-	* libF77/z_sqrt.c, libF77/z_sin.c, libF77/z_exp.c, libF77/z_log.c,
- 	libF77/system_.c, libF77/z_cos.c, libF77/signal_.c,
- 	libF77/s_stop.c, libF77/sig_die.c, libF77/s_paus.c,
- 	libF77/s_rnge.c, libF77/s_cat.c, libF77/r_tan.c, libF77/r_tanh.c,
- 	libF77/r_sinh.c, libF77/r_sqrt.c, libF77/r_sin.c, libF77/r_mod.c,
- 	libF77/r_nint.c, libF77/r_lg10.c, libF77/r_log.c, libF77/r_exp.c,
- 	libF77/r_int.c, libF77/r_cosh.c, libF77/r_atn2.c, libF77/r_cos.c,
- 	libF77/r_asin.c, libF77/r_atan.c, libF77/r_acos.c,
- 	libF77/pow_dd.c, libF77/pow_zz.c, libF77/main.c, libF77/i_dnnt.c,
- 	libF77/i_nint.c, libF77/h_dnnt.c, libF77/h_nint.c, libF77/exit.c,
- 	libF77/d_tan.c, libF77/d_tanh.c, libF77/d_sqrt.c, libF77/d_sin.c,
- 	libF77/d_sinh.c, libF77/d_mod.c, libF77/d_nint.c, libF77/d_log.c,
- 	libF77/d_int.c, libF77/d_lg10.c, libF77/d_cosh.c, libF77/d_exp.c,
- 	libF77/d_atn2.c, libF77/d_cos.c, libF77/d_atan.c, libF77/d_acos.c,
- 	libF77/d_asin.c, libF77/c_sqrt.c, libF77/cabs.c, libF77/c_sin.c,
- 	libF77/c_exp.c, libF77/c_log.c, libF77/c_cos.c, libF77/F77_aloc.c,
- 	libF77/abort_.c, libI77/xwsne.c, libI77/wref.c, libI77/util.c,
- 	libI77/uio.c, libI77/rsne.c, libI77/rdfmt.c, libI77/rawio.h,
- 	libI77/open.c, libI77/lread.c, libI77/inquire.c, libI77/fio.h,
- 	libI77/err.c, libI77/endfile.c, libI77/close.c:
-	Use #include <...>, not #include "..." for mkdeps
-
-Sat Jul  6 21:39:21 1996  Dave Love  <d.love@dl.ac.uk>
-
-	* libI77/ftell_.c: Added from Netlib distribution.
-
-Sat Mar 30 20:57:24 1996  Dave Love  <d.love@dl.ac.uk>
-
-	* configure.in: Eliminate explicit use of
- 	{RANLIB,AR}_FOR_TARGET.
-	* Makefile.in: Likewise.
-	* libF77/Makefile.in: Likewise.
-	* libI77/Makefile.in: Likewise.
-	* configure: Regenerated.
-
-Sat Mar 30 21:02:03 1996  Dave Love  <d.love@dl.ac.uk>
-
-	* Makefile.in: Eliminate explicit use of
- 	{RANLIB,AR}_FOR_TARGET.
-
-Tue Mar 26 23:39:59 1996  Dave Love  <d.love@dl.ac.uk>
-
-	* Makefile.in: Remove hardwired RANLIB and RANLIB_TEST (unnoted
- 	change).
-
-Mon Mar 25 21:04:56 1996  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* Incorporate changes by Bell Labs to libf2c through 1996-03-23,
-	including changes to dmg and netlib email addresses.
-
-Tue Mar 19 13:10:02 1996  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* Incorporate changes by AT&T/Bellcore to libf2c through 1996-03-19.
-
-	* Makefile.in (rebuilt): New target.
-
-	* lib[FI]77/Makefile.in: Use $AR_FOR_TARGET, not $AR.
-
-Tue Mar 19 12:53:19 1996  Dave Love  <d.love@dl.ac.uk>
-
-	* configure.in (ac_cpp): #include <stdio.h> instead
-	of <features.h>.
-
-Tue Mar 19 12:52:09 1996  Mumit Khan  <khan@xraylith.wisc.edu>
-
-	* configure.in (ac_cpp): For f2c integer type,
-	add -I$srcdir/../.. to make it work on mips-ultrix4.2.
-
-Sat Mar  9 17:37:15 1996  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* libI77/Makefile.in (.c.o): Add -DAllow_TYQUAD, to enable
-	I/O support for INTEGER*8.
-	* f2c.h.in: Turn on longint type.
-
-Fri Dec 29 18:22:01 1995  Craig Burley  <burley@gnu.ai.mit.edu>
-
-	* Makefile.in: Reorganize the *clean rules to more closely
-	parallel gcc's.
-
-	* lib[FI]77/Makefile.in: Ignore error from $(AR) command,
-	in case just doing an install and installer has no write
-	access to library (this is a kludge fix -- perhaps install
-	targets should never try updating anything?).
-
-Sat Nov 18 19:37:22 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* Version 0.5.17 released.
-
-Thu Nov 16 07:20:35 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* Incorporate changes by AT&T/Bellcore to libf2c through 1995-11-15.
-
-Fri Sep 22 02:19:59 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* libI77/backspace.c, libI77/close.c, libI77/endfile.c,
-	libI77/fio.h, libI77/inquire.c, libI77/rawio.h,
-	libF77/s_paus.c: Not an MSDOS system if GO32
-	is defined, in the sense that the run-time environment
-	is thus more UNIX-like.
-
-Wed Sep 20 02:24:51 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* libF77/Makefile.in, libI77/Makefile.in: Comment out `ld -r -x'
-	and `mv' line pairs, since `-x' isn't supported on systems
-	such as Solaris, and these lines don't seem to do anything
-	useful after all.
-
-Wed Aug 30 15:58:35 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* Version 0.5.16 released.
-
-	* Incorporate changes by AT&T/Bellcore to libf2c through 950829.
-
-Mon Aug 28 12:50:34 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* libF77/Makefile.in, libI77/Makefile.in ($(lib)): Force ar'ing
-	and ranlib'ing of libf2c.a, else after rm'ing libf2c.a and
-	doing a make, only libI77 or libF77 would be added to
-	the newly created archive.
-	Also, instead of `$?' list all targets explicitly so all
-	objects are updated in libf2c.a even if only one actually
-	needs recompiling, for similar reason -- we can't easily tell
-	if a given object is really up-to-date in libf2c.a, or even
-	present there.
-
-Sun Aug 27 14:54:24 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* libF77/Makefile.in, libI77/Makefile.in: Fix spacing so
-	initial tabs are present in all appropriate places.
-	Move identical $(AR) commands in if then/else clauses
-	to single command preceding if.
-	(.c.o, Version[FI].o): Use $@ instead of $* because AIX (RS/6000)
-	says $@ means source, not object, basename, and $@ seems to work
-	everywhere.
-
-Wed Aug 23 15:44:25 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* libF77/system_.c (system_): Declare as returning `ftnint',
-	consistent with signal_, instead of defaulting to `int'.
-	Hope dmg@research.att.com agrees, else probably will
-	change to whatever he determines is correct (and change
-	g77 accordingly).
-
-Thu Aug 17 08:46:17 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* libI77/rsne.c (s_rsne): Call f_init if not already done.
-
-Thu Aug 17 04:35:28 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* Incorporate changes by Bellcore to libf2c through 950817.
-	And this text is for EMACS: (foo at bar).
-
-Wed Aug 16 17:33:06 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* libF77/Makefile.in, libI77/Makefile.in (CFLAGS): Put -g1
-	after configured CFLAGS but before GCC_CFLAGS, so by default
-	the libraries are built with minimal debugging information.
-
-Fri Jul 28 10:30:15 1995  Dave Love  <d.love@dl.ac.uk>
-
-	* libI77/open.c (f_open): Call f_init if not already done.
-
-Sat Jul  1 19:31:56 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* libF77/system_.c (system_): Make buff one byte bigger so
-	following byte doesn't get overwritten by call with large
-	string.
-
-Tue Jun 27 23:28:16 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* Incorporate changes by Bellcore to libf2c through 950613.
-
-	* libF77/Version.c (__G77_LIBF77_VERSION__): Add this string
-	to track g77 mods to libf2c.
-
-	* libI77/Version.c (__G77_LIBI77_VERSION__): Add this string
-	to track g77 mods to libf2c.
-
-	* libI77/rawio.h: #include <rawio.h> only conditionally,
-	using macro intended for that purpose.
-
-Fri May 19 11:20:00 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* configure.in: Incorporate change made by d.love,
-
-	* configure: Regenerated.
-
-Wed Apr 26 21:08:57 BST 1995  Dave Love  <d.love@dl.ac.uk>
-
-	* configure.in: Fix quoting problem in atexit check.
-
-	* configure: Regenerated (with current autoconf).
-
-Wed Mar 15 12:49:58 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* Incorporate changes by Bellcore to libf2c through 950315.
-
-Sun Mar  5 18:54:29 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* README: Tell people not to read lib[fi]77/README.
-
-Wed Feb 15 14:30:58 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* configure.in: Update copyright notice at top of file.
-
-	* f2c.h.in (f2c_i2): Make sure defining this crashes compilations.
-
-	* libI77/Makefile.in (F2C_H): Fix typo in definition of this
-	symbol (was FF2C_H=...).
-
-Sun Feb 12 13:39:36 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* README: Remove some obsolete items.
-	Add date.
-
-	* TODO: Add date.
-
-Sat Feb 11 22:07:54 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* Makefile.in (libf77, libi77): Add rules to .PHONY list.
-
-	* f2c.h.in (flag): Make same type as friends.
-
-	* libF77/Makefile.in (libf77): Rename to $(lib), remove from
-	.PHONY list.  Fix some typos.
-
-	* libI77/Makefile.in (libi77): Rename to $(lib), remove from
-	.PHONY list.  Fix some typos.
-
-Thu Feb  2 12:22:41 1995  Craig Burley  (burley@gnu.ai.mit.edu)
-
-	* Makefile.in (libF77/Makefile): Fix typos in this rule's name
-	and dependencies.
-
-	* libF77/Makefile.in (libf77): Add rule to .PHONY list.
-
-	* libI77/Makefile.in (libi77): Add rule to .PHONY list.
diff --git a/gcc/f/runtime/Makefile.in b/gcc/f/runtime/Makefile.in
deleted file mode 100644
index e923c06..0000000
--- a/gcc/f/runtime/Makefile.in
+++ /dev/null
@@ -1,253 +0,0 @@
-# Makefile for GNU F77 compiler runtime.
-#   Copyright (C) 1995-1997 Free Software Foundation, Inc.
-#   Contributed by Dave Love (d.love@dl.ac.uk).
-#
-#This file is part of GNU Fortran.
-#
-#GNU Fortran 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 Fortran 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 Fortran; see the file COPYING.  If not, write to
-#the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-#02111-1307, USA.
-
-#### Start of system configuration section. ####
-
-# $(srcdir) must be set to the g77 runtime source directory
-# (g77/f/runtime/).
-
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-top_srcdir = @top_srcdir@
-
-INSTALL = @INSTALL@		# installs aren't actually done from here
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_DATA = @INSTALL_DATA@
-RANLIB = @RANLIB@
-RANLIB_TEST = @RANLIB_TEST@
-
-CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@ @DEFS@
-LDFLAGS = @LDFLAGS@
-LIBS = @LIBS@
-CGFLAGS = -g0
-
-GCC_FOR_TARGET = @CC@
-CC = $(GCC_FOR_TARGET)
-
-CROSS = @CROSS@
-
-objext = .o
-
-transform=@program_transform_name@
-
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-AR = ar
-AR_FLAGS = rc
-
-# Directory in which to install scripts.
-bindir = $(exec_prefix)/bin
-
-# Directory in which to install library files.
-libdir = $(prefix)/lib
-
-# Directory in which to install documentation info files.
-infodir = $(prefix)/info
-
-#### End of system configuration section. ####
-
-SHELL = /bin/sh
-
-lib = ../../libf2c.a
-
-SUBDIRS = libI77 libF77 libU77
-
-MISC =	libF77/F77_aloc.o libF77/VersionF.o libF77/main.o libF77/s_rnge.o \
-	libF77/abort_.o libF77/getarg_.o libF77/iargc_.o libF77/getenv_.o \
-	libF77/signal_.o libF77/s_stop.o libF77/s_paus.o libF77/system_.o \
-	libF77/cabs.o libF77/derf_.o libF77/derfc_.o libF77/erf_.o \
-	libF77/erfc_.o libF77/sig_die.o libF77/exit_.o
-POW =	libF77/pow_ci.o libF77/pow_dd.o libF77/pow_di.o libF77/pow_hh.o \
-	libF77/pow_ii.o  libF77/pow_ri.o libF77/pow_zi.o libF77/pow_zz.o \
-	libF77/pow_qq.o
-CX =	libF77/c_abs.o libF77/c_cos.o libF77/c_div.o libF77/c_exp.o \
-	libF77/c_log.o libF77/c_sin.o libF77/c_sqrt.o
-DCX =	libF77/z_abs.o libF77/z_cos.o libF77/z_div.o libF77/z_exp.o \
-	libF77/z_log.o libF77/z_sin.o libF77/z_sqrt.o
-REAL =	libF77/r_abs.o libF77/r_acos.o libF77/r_asin.o libF77/r_atan.o \
-	libF77/r_atn2.o libF77/r_cnjg.o libF77/r_cos.o libF77/r_cosh.o \
-	libF77/r_dim.o libF77/r_exp.o libF77/r_imag.o libF77/r_int.o \
-	libF77/r_lg10.o libF77/r_log.o libF77/r_mod.o libF77/r_nint.o \
-	libF77/r_sign.o libF77/r_sin.o libF77/r_sinh.o libF77/r_sqrt.o \
-	libF77/r_tan.o libF77/r_tanh.o
-DBL =	libF77/d_abs.o libF77/d_acos.o libF77/d_asin.o libF77/d_atan.o \
-	libF77/d_atn2.o libF77/d_cnjg.o libF77/d_cos.o libF77/d_cosh.o \
-	libF77/d_dim.o libF77/d_exp.o libF77/d_imag.o libF77/d_int.o \
-	libF77/d_lg10.o libF77/d_log.o libF77/d_mod.o libF77/d_nint.o \
-	libF77/d_prod.o libF77/d_sign.o libF77/d_sin.o libF77/d_sinh.o \
-	libF77/d_sqrt.o libF77/d_tan.o libF77/d_tanh.o
-INT =	libF77/i_abs.o libF77/i_dim.o libF77/i_dnnt.o libF77/i_indx.o \
-	libF77/i_len.o libF77/i_mod.o libF77/i_nint.o libF77/i_sign.o
-HALF =	libF77/h_abs.o libF77/h_dim.o libF77/h_dnnt.o libF77/h_indx.o \
-	libF77/h_len.o libF77/h_mod.o  libF77/h_nint.o libF77/h_sign.o
-CMP =	libF77/l_ge.o libF77/l_gt.o libF77/l_le.o libF77/l_lt.o \
-	libF77/hl_ge.o libF77/hl_gt.o libF77/hl_le.o libF77/hl_lt.o
-EFL =	libF77/ef1asc_.o libF77/ef1cmc_.o
-CHAR =	libF77/s_cat.o libF77/s_cmp.o libF77/s_copy.o
-F90BIT = libF77/lbitbits.o libF77/lbitshft.o libF77/qbitbits.o \
-	libF77/qbitshft.o
-FOBJ = $(MISC) $(POW) $(CX) $(DCX) $(REAL) $(DBL) $(INT) $(HALF) $(CMP) \
- $(EFL) $(CHAR) $(F90BIT)
-
-IOBJ =	libI77/VersionI.o libI77/backspace.o libI77/close.o libI77/dfe.o \
-	libI77/dolio.o libI77/due.o libI77/endfile.o libI77/err.o \
-	libI77/fmt.o libI77/fmtlib.o libI77/iio.o libI77/ilnw.o \
-	libI77/inquire.o libI77/lread.o libI77/lwrite.o libI77/open.o \
-	libI77/rdfmt.o libI77/rewind.o libI77/rsfe.o libI77/rsli.o \
-	libI77/rsne.o libI77/sfe.o libI77/sue.o libI77/typesize.o \
-	libI77/uio.o libI77/util.o libI77/wref.o libI77/wrtfmt.o \
-	libI77/wsfe.o libI77/wsle.o libI77/wsne.o libI77/xwsne.o \
-	libI77/ftell_.o
-
-UOBJ =  libU77/VersionU.o libU77/gerror_.o libU77/perror_.o libU77/ierrno_.o \
-	libU77/itime_.o libU77/time_.o libU77/unlink_.o libU77/fnum_.o \
-	libU77/getpid_.o libU77/getuid_.o libU77/getgid_.o libU77/kill_.o \
-	libU77/rand_.o libU77/srand_.o libU77/irand_.o libU77/sleep_.o \
-	libU77/idate_.o libU77/ctime_.o libU77/etime_.o libU77/dtime_.o \
-	libU77/isatty_.o libU77/ltime_.o libU77/fstat_.o libU77/stat_.o \
-	libU77/lstat_.o libU77/access_.o libU77/link_.o libU77/getlog_.o \
-	libU77/ttynam_.o libU77/getcwd_.o libU77/vxttime_.o \
-	libU77/vxtidate_.o libU77/gmtime_.o libU77/fdate_.o libU77/secnds_.o \
-	libU77/bes.o libU77/dbes.o libU77/chdir_.o libU77/chmod_.o \
-	libU77/lnblnk_.o libU77/hostnm_.o libU77/rename_.o libU77/fgetc_.o \
-	libU77/fputc_.o libU77/umask_.o libU77/system_clock_.o libU77/date_.o \
-	libU77/second_.o libU77/flush1_.o libU77/alarm_.o libU77/mclock_.o \
-	libU77/symlnk_.o
-
-F2CEXT = abort derf derfc ef1asc ef1cmc erf erfc exit getarg getenv iargc \
-	signal system flush ftell fseek access besj0 besj1 besjn besy0 besy1 \
-	besyn chdir chmod ctime date dbesj0 dbesj1 dbesjn dbesy0 dbesy1 dbesyn \
-	dtime etime fdate fgetc fget flush1 fnum fputc fput fstat gerror \
-	getcwd getgid getlog getpid getuid gmtime hostnm idate ierrno irand \
-	isatty itime kill link lnblnk lstat ltime mclock perror rand rename \
-	secnds second sleep srand stat symlnk sclock time ttynam umask unlink \
-	vxtidt vxttim alarm
-
-# flags_to_pass to recursive makes & configure (hence the quoting style)
-FLAGS_TO_PASS = \
-	CROSS="$(CROSS)" \
-	AR_FLAGS="$(AR_FLAGS)" \
-	AR="$(AR)" \
-	GCCFLAGS="$(GCCFLAGS)" \
-	GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
-	CC="$(GCC_FOR_TARGET)" \
-	LDFLAGS="$(LDFLAGS)" \
-	RANLIB="$(RANLIB)" \
-	RANLIB_TEST="$(RANLIB_TEST)" \
-	SHELL="$(SHELL)"
-
-CROSS_FLAGS_TO_PASS = \
-	CROSS="$(CROSS)" \
-	AR_FLAGS="$(AR_FLAGS)" \
-	AR="$(AR)" \
-	GCCFLAGS="$(GCCFLAGS)" \
-	GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
-	CC="$(GCC_FOR_TARGET)" \
-	LDFLAGS="$(LDFLAGS)" \
-	RANLIB="$(RANLIB)" \
-	RANLIB_TEST="$(RANLIB_TEST)" \
-	SHELL="$(SHELL)"
-
-all: ../../include/f2c.h libi77 libf77 libu77 $(lib)
-
-$(lib): stamp-lib ; @true
-stamp-lib: $(FOBJ) $(IOBJ) $(UOBJ)
-	rm -f stamp-lib
-	$(AR) $(AR_FLAGS) $(lib) $?
-	rm -fr libE77
-	mkdir libE77
-	for name in $(F2CEXT); \
-	do \
-	  echo $${name}; \
-	  $(GCC_FOR_TARGET) -c -I. -I$(srcdir) -I../../include $(CPPFLAGS) $(CFLAGS) $(CGFLAGS) \
-	    -DL$${name} $(srcdir)/f2cext.c -o libE77/L$${name}$(objext); \
-	  if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
-	done
-	$(AR) $(AR_FLAGS) $(lib) libE77/*$(object)
-	rm -fr libE77
-	if $(RANLIB_TEST); then $(RANLIB) $(lib); \
-	  else true; fi
-	touch stamp-lib
-
-libi77: libI77/Makefile
-	if test "$(CROSS)"; then \
-	  cd libI77;  $(MAKE) -f Makefile $(CROSS_FLAGS_TO_PASS) all ; \
-	else \
-	  cd libI77;  $(MAKE) -f Makefile $(FLAGS_TO_PASS) all ; \
-	fi
-
-libf77: libF77/Makefile
-	if test "$(CROSS)"; then \
-	  cd libF77;  $(MAKE) -f Makefile $(CROSS_FLAGS_TO_PASS) all ; \
-	else \
-	  cd libF77;  $(MAKE) -f Makefile $(FLAGS_TO_PASS) all ; \
-	fi
-
-libu77: libU77/Makefile
-	if test "$(CROSS)"; then \
-	  cd libU77;  $(MAKE) -f Makefile $(CROSS_FLAGS_TO_PASS) all ; \
-	else \
-	  cd libU77;  $(MAKE) -f Makefile $(FLAGS_TO_PASS) all ; \
-	fi
-
-${srcdir}/configure: ${srcdir}/configure.in
-	rm -f config.cache && cd ${srcdir} && autoconf && rm -f config.cache
-${srcdir}/libU77/configure: ${srcdir}/libU77/configure.in
-	rm -f libU77/config.cache && cd ${srcdir}/libU77 && autoconf && rm -f config.cache
-#../include/f2c.h libI77/Makefile libF77/Makefile libU77/Makefile Makefile: ${srcdir}/Makefile.in \
-#  config.status libU77/config.status
-#	$(FLAGS_TO_PASS) CONFIG_SITE=/dev/null $(SHELL) config.status
-#	cd libU77; $(FLAGS_TO_PASS) CONFIG_SITE=/dev/null $(SHELL) config.status
-
-# Extra dependencies for the targets above:
-libI77/Makefile: $(srcdir)/libI77/Makefile.in
-libF77/Makefile: $(srcdir)/libF77/Makefile.in
-libU77/Makefile: $(srcdir)/libU77/Makefile.in
-../../include/f2c.h: $(srcdir)/f2c.h.in
-
-#config.status: ${srcdir}/configure
-#	$(FLAGS_TO_PASS) CONFIG_SITE=/dev/null $(SHELL) config.status --recheck
-#libU77/config.status: ${srcdir}/libU77/configure
-#	cd libU77; $(FLAGS_TO_PASS) CONFIG_SITE=/dev/null $(SHELL) config.status --recheck
-
-mostlyclean:
-	for i in libI77 libF77 libU77; do cd $$i; $(MAKE) -f Makefile mostlyclean; cd ..;  done
-
-clean:
-	-rm -f config.log config.cache
-	for i in libI77 libF77 libU77; do cd $$i; $(MAKE) -f Makefile clean; cd ..;  done
-
-distclean: clean
-	-rm -f Makefile lib?77/Makefile config.status libU77/config.status ../../include/f2c.h
-
-maintainer-clean: distclean
-	-rm -f $(srcdir)/configure $(srcdir)/libU77/configure
-
-uninstall:
-	rm ../../include/f2c.h
-
-rebuilt: ${srcdir}/configure ${srcdir}/libU77/configure
-
-.PHONY: libf77 libi77 libu77 rebuilt mostlyclean clean distclean maintainer-clean \
-  uninstall all
diff --git a/gcc/f/runtime/README b/gcc/f/runtime/README
deleted file mode 100644
index 9419af7..0000000
--- a/gcc/f/runtime/README
+++ /dev/null
@@ -1,46 +0,0 @@
-970811
-
-This directory contains the f2c library packaged for use with g77 to configure
-and build automatically (in principle!) as part of the top-level configure and
-make steps.  This depends on the makefile and configure fragments in ../f.
-
-Some small changes have been made to the f2c distributions of lib[FI]77 which
-come from <ftp:bell-labs.com/netlib/f2c/> and are maintained (excellently) by
-David M. Gay <dmg@bell-labs.com>.  See the Notice files for copyright
-information.  I'll try to get the changes rolled into the f2c distribution.
-
-Files that come directly from netlib are either maintained in the
-gcc/f/runtime/ directory under their original names or, if they
-are not pertinent for g77's version of libf2c, under their original
-names with `.netlib' appended.  For example, gcc/f/runtime/permissions.netlib
-is a copy of f2c's top-level`permissions' file in the netlib distribution.
-In this case, it applies only to the relevant portions of the libF77/ and
-libI77/ directories; it does not apply to the libU77/ directory, which is
-distributed under different licensing arrangements.  Similarly,
-the `makefile.netlib' files in libF77/ and libI77/ are copies of
-the respective `makefile' files in the netlib distribution, but
-are not used when building g77's version of libf2c.
-
-The `README.netlib' files in libF77/ and libI77/ thus might be
-interesting, but should not be taken as guidelines for how to
-configure and build libf2c in g77's distribution.
-
-The packaging for auto-configuration was done by Dave Love <d.love@dl.ac.uk>.
-Minor changes have been made by James Craig Burley <burley@gnu.ai.mit.edu>,
-who probably broke things Dave had working.  :-)
-
-Among the user-visible changes (choices) g77 makes in its
-version of libf2c:
-
--  f2c.h configured to default to padding unformatted direct reads
-   (#define Pad_UDread), because that's the behavior most users
-   expect.
-
--  f2c.h configured to default to outputting leading zeros before
-   decimal points in formatted and list-directed output, to be compatible
-   with many other compilers (#define WANT_LEAD_0).  Either way is
-   standard-conforming, however, and you should try to avoid writing
-   code that assumes one format or another.
-
--  dtime_() and etime_() are from Dave Love's libU77, not from
-   netlib's libF77.
diff --git a/gcc/f/runtime/TODO b/gcc/f/runtime/TODO
deleted file mode 100644
index a44d1ed..0000000
--- a/gcc/f/runtime/TODO
+++ /dev/null
@@ -1,17 +0,0 @@
-970811
-
-TODO list for the g77 library
-
-* `Makefile.in's should be brought up to standard; I'm not sure they
-  have a complete set of targets at present.
-
-* Investigate building shared libraries on systems we know about
-  (probably in 0.5.22, using libtool-1.0 from the FSF, which looks
-  quite useful).
-
-* Test cases.
-
-* Allow the library to be stripped to save space.
-
-* An interface to IEEE maths functions from libc where this makes
-  sense.
diff --git a/gcc/f/runtime/changes.netlib b/gcc/f/runtime/changes.netlib
deleted file mode 100644
index 1827154..0000000
--- a/gcc/f/runtime/changes.netlib
+++ /dev/null
@@ -1,2841 +0,0 @@
-31 Aug. 1989:
-   1. A(min(i,j)) now is translated correctly (where A is an array).
-   2. 7 and 8 character variable names are allowed (but elicit a
-      complaint under -ext).
-   3. LOGICAL*1 is treated as LOGICAL, with just one error message
-      per LOGICAL*1 statement (rather than one per variable declared
-      in that statement).  [Note that LOGICAL*1 is not in Fortran 77.]
-      Like f77, f2c now allows the format in a read or write statement
-      to be an integer array.
-
-5 Sept. 1989:
-   Fixed botch in argument passing of substrings of equivalenced
-variables.
-
-15 Sept. 1989:
-   Warn about incorrect code generated when a character-valued
-function is not declared external and is passed as a parameter
-(in violation of the Fortran 77 standard) before it is invoked.
-Example:
-
-	subroutine foo(a,b)
-	character*10 a,b
-	call goo(a,b)
-	b = a(3)
-	end
-
-18 Sept. 1989:
-   Complain about overlapping initializations.
-
-20 Sept. 1989:
-   Warn about names declared EXTERNAL but never referenced;
-include such names as externs in the generated C (even
-though most C compilers will discard them).
-
-24 Sept. 1989:
-   New option -w8 to suppress complaint when COMMON or EQUIVALENCE
-forces word alignment of a double.
-   Under -A (for ANSI C), ensure that floating constants (terminated
-by 'f') contain either a decimal point or an exponent field.
-   Repair bugs sometimes encountered with CHAR and ICHAR intrinsic
-functions.
-   Restore f77's optimizations for copying and comparing character
-strings of length 1.
-   Always assume floating-point valued routines in libF77 return
-doubles, even under -R.
-   Repair occasional omission of arguments in routines having multiple
-entry points.
-   Repair bugs in computing offsets of character strings involved
-in EQUIVALENCE.
-   Don't omit structure qualification when COMMON variables are used
-as FORMATs or internal files.
-
-2 Oct. 1989:
-   Warn about variables that appear only in data stmts; don't emit them.
-   Fix bugs in character DATA for noncharacter variables
-involved in EQUIVALENCE.
-   Treat noncharacter variables initialized (at least partly) with
-character data as though they were equivalenced -- put out a struct
-and #define the variables.  This eliminates the hideous and nonportable
-numeric values that were used to initialize such variables.
-   Treat IMPLICIT NONE as IMPLICIT UNDEFINED(A-Z) .
-   Quit when given invalid options.
-
-8 Oct. 1989:
-  Modified naming scheme for generated intermediate variables;
-more are recycled, fewer distinct ones used.
-  New option -W nn specifies nn characters/word for Hollerith
-data initializing non-character variables.
-  Bug fix: x(i:min(i+10,j)) used to elicit "Can't handle opcode 31 yet".
-  Integer expressions of the form (i+const1) - (i+const2), where
-i is a scalar integer variable, are now simplified to (const1-const2);
-this leads to simpler translation of some substring expressions.
-  Initialize uninitialized portions of character string arrays to 0
-rather than to blanks.
-
-9 Oct. 1989:
-  New option -c to insert comments showing original Fortran source.
-  New option -g to insert line numbers of original Fortran source.
-
-10 Oct. 1989:
-  ! recognized as in-line comment delimiter (a la Fortran 88).
-
-24 Oct. 1989:
-  New options to ease coping with systems that want the structs
-that result from COMMON blocks to be defined just once:
-  -E causes uninitialized COMMON blocks to be declared Extern;
-if Extern is undefined, f2c.h #defines it to be extern.
-  -ec causes a separate .c file to be emitted for each
-uninitialized COMMON block: COMMON /ABC/ yields abc_com.c;
-thus one can compile *_com.c into a library to ensure
-precisely one definition.
-  -e1c is similar to -ec, except that everything goes into
-one file, along with comments that give a sed script for
-splitting the file into the pieces that -ec would give.
-This is for use with netlib's "execute f2c" service (for which
--ec is coerced into -e1c, and the sed script will put everything
-but the COMMON definitions into f2c_out.c ).
-
-28 Oct. 1989:
-  Convert "i = i op ..." into "i op= ...;" even when i is a
-dummy argument.
-
-13 Nov. 1989:
-  Name integer constants (passed as arguments) c__... rather
-than c_... so
-	common /c/stuff
-	call foo(1)
-	...
-is translated correctly.
-
-19 Nov. 1989:
-  Floating-point constants are now kept as strings unless they
-are involved in constant expressions that get simplified.  The
-floating-point constants kept as strings can have arbitrarily
-many significant figures and a very large exponent field (as
-large as long int allows on the machine on which f2c runs).
-Thus, for example, the body of
-
-	subroutine zot(x)
-	double precision x(6), pi
-	parameter (pi=3.1415926535897932384626433832795028841972)
-	x(1) = pi
-	x(2) = pi+1
-	x(3) = 9287349823749272.7429874923740978492734D-298374
-	x(4) = .89
-	x(5) = 4.0005
-	x(6) = 10D7
-	end
-
-now gets translated into
-
-    x[1] = 3.1415926535897932384626433832795028841972;
-    x[2] = 4.1415926535897931;
-    x[3] = 9.2873498237492727429874923740978492734e-298359;
-    x[4] = (float).89;
-    x[5] = (float)4.0005;
-    x[6] = 1e8;
-
-rather than the former
-
-    x[1] = 3.1415926535897931;
-    x[2] = 4.1415926535897931;
-    x[3] = 0.;
-    x[4] = (float)0.89000000000000003;
-    x[5] = (float)4.0004999999999997;
-    x[6] = 100000000.;
-
-  Recognition of f77 machine-constant intrinsics deleted, i.e.,
-epbase, epprec, epemin, epemax, eptiny, ephuge, epmrsp.
-
-22 Nov. 1989:
-  Workarounds for glitches on some Sun systems...
-  libf77: libF77/makefile modified to point out possible need
-to compile libF77/main.c with -Donexit=on_exit .
-  libi77: libI77/wref.c (and libI77/README) modified so non-ANSI
-systems can compile with USE_STRLEN defined, which will cause
-	sprintf(b = buf, "%#.*f", d, x);
-	n = strlen(b) + d1;
-rather than
-	n = sprintf(b = buf, "%#.*f", d, x) + d1;
-to be compiled.
-
-26 Nov. 1989:
-  Longer names are now accepted (up to 50 characters); names may
-contain underscores (in which case they will have two underscores
-appended, to avoid clashes with library names).
-
-28 Nov. 1989:
-  libi77 updated:
-	1. Allow 3 (or, on Crays, 4) digit exponents under format Ew.d .
-	2. Try to get things right on machines where ints have 16 bits.
-
-29 Nov. 1989:
-  Supplied missing semicolon in parameterless subroutines that
-have multiple entry points (all of them parameterless).
-
-30 Nov. 1989:
-  libf77 and libi77 revised to use types from f2c.h.
-  f2c now types floating-point valued C library routines as "double"
-rather than "doublereal" (for use with nonstandard C compilers for
-which "double" is IEEE double extended).
-
-1 Dec. 1989:
-  f2c.h updated to eliminate #defines rendered unnecessary (and,
-indeed, dangerous) by change of 26 Nov. to long names possibly
-containing underscores.
-  libi77 further revised: yesterday's change omitted two tweaks to fmt.h
-(tweaks which only matter if float and real or double and doublereal are
-different types).
-
-2 Dec. 1989:
-  Better error message (than "bad tag") for NAMELIST, which no longer
-inhibits C output.
-
-4 Dec. 1989:
-  Allow capital letters in hex constants (f77 extension; e.g.,
-x'a012BCd', X'A012BCD' and x'a012bcd' are all treated as the integer
-167848909).
-  libi77 further revised: lio.c lio.h lread.c wref.c wrtfmt.c tweaked
-again to allow float and real or double and doublereal to be different.
-
-6 Dec. 1989:
-  Revised f2c.h -- required for the following...
-  Simpler looking translations for abs, min, max, using #defines in
-revised f2c.h .
-  libi77: more corrections to types; additions for NAMELIST.
-  Corrected casts in some I/O calls.
-  Translation of NAMELIST; libi77 must still be revised.  Currently
-libi77 gives you a run-time error message if you attempt NAMELIST I/O.
-
-7 Dec. 1989:
-  Fixed bug that prevented local integer variables that appear in DATA
-stmts from being ASSIGNed statement labels.
-  Fillers (for DATA statements initializing EQUIVALENCEd variables and
-variables in COMMON) typed integer rather than doublereal (for slightly
-more portability, e.g. to Crays).
-  libi77: missing return values supplied in a few places; some tests
-reordered for better working on the Cray.
-  libf77: better accuracy for complex divide, complex square root,
-real mod function (casts to double; double temporaries).
-
-9 Dec. 1989:
-  Fixed bug that caused needless (albeit harmless) empty lines to be
-inserted in the C output when a comment line contained trailing blanks.
-  Further tweak to type of fillers: allow doublereal fillers if the
-struct has doublereal data.
-
-11 Dec. 1989:
-  Alteration of rule for producing external (C) names from names that
-contain underscores.  Now the external name is always obtained by
-appending a pair of underscores.
-
-12 Dec. 1989:
-  C production inhibited after most errors.
-
-15 Dec. 1989:
-  Fixed bug in headers for subroutines having two or more character
-strings arguments:  the length arguments were reversed.
-
-19 Dec. 1989:
-  f2c.h libf77 libi77: adjusted so #undefs in f2c.h should not foil
-compilation of libF77 and libI77.
-  libf77: getenv_ adjusted to work with unsorted environments.
-  libi77: the iostat= specifier should now work right with internal I/O.
-
-20 Dec. 1989:
-  f2c bugs fixed: In the absence of an err= specifier, the iostat=
-specifier was generally set wrong.  Character strings containing
-explicit nulls (\0) were truncated at the first null.
-  Unlabeled DO loops recognized; must be terminated by ENDDO.
-(Don't ask for CYCLE, EXIT, named DO loops, or DO WHILE.)
-
-29 Dec. 1989:
-  Nested unlabeled DO loops now handled properly; new warning for
-extraneous text at end of FORMAT.
-
-30 Dec. 1989:
-  Fixed bug in translating dble(real(...)), dble(sngl(...)), and
-dble(float(...)), where ... is either of type double complex or
-is an expression requiring assignment to intermediate variables (e.g.,
-dble(real(foo(x+1))), where foo is a function and x is a variable).
-Regard nonblank label fields on continuation lines as an error.
-
-3 Jan. 1990:
-  New option -C++ yields output that should be understood
-by C++ compilers.
-
-6 Jan. 1989:
-  -a now excludes variables that appear in a namelist from those
-that it makes automatic.  (As before, it also excludes variables
-that appear in a common, data, equivalence, or save statement.)
-  The syntactically correct Fortran
-	read(*,i) x
-	end
-now yields syntactically correct C (even though both the Fortran
-and C are buggy -- no FORMAT has not been ASSIGNed to i).
-
-7 Jan. 1990:
-  libi77: routines supporting NAMELIST added.  Surrounding quotes
-made optional when no ambiguity arises in a list or namelist READ
-of a character-string value.
-
-9 Jan. 1990:
-  f2c.src made available.
-
-16 Jan. 1990:
-  New options -P to produce ANSI C or C++ prototypes for procedures
-defined.  Change to -A and -C++: f2c tries to infer prototypes for
-invoked procedures unless the new -!P option is given.  New warning
-messages for inconsistent calling sequences among procedures within
-a single file.  Most of f2c/src is affected.
-  f2c.h: typedefs for procedure arguments added; netlib's f2c service
-will insert appropriate typedefs for use with older versions of f2c.h.
-
-17 Jan. 1990:
-  f2c/src: defs.h exec.c format.c proc.c putpcc.c version.c xsum0.out
-updated.  Castargs and protofile made extern in defs.h; exec.c
-modified so superfluous else clauses are diagnosed; unused variables
-omitted from declarations in format.c proc.c putpcc.c .
-
-21 Jan. 1990:
-  No C emitted for procedures declared external but not referenced.
-  f2c.h: more new types added for use with -P.
-  New feature: f2c accepts as arguments files ending in .p or .P;
-such files are assumed to be prototype files, such as produced by
-the -P option.  All prototype files are read before any Fortran files
-and apply globally to all Fortran files.  Suitable prototypes help f2c
-warn about calling-sequence errors and can tell f2c how to type
-procedures declared external but not explicitly typed; the latter is
-mainly of interest for users of the -A and -C++ options.  (Prototype
-arguments are not available to netlib's "execute f2c" service.)
-  New option -it tells f2c to try to infer types of untyped external
-arguments from their use as parameters to prototyped or previously
-defined procedures.
-  f2c/src: many minor cleanups; most modules changed.  Individual
-files in f2c/src are now in "bundle" format.  The former f2c.1 is
-now f2c.1t; "f2c.1t from f2c" and "f2c.1t from f2c/src" are now the
-same, as are "f2c.1 from f2c" and "f2c.1 from f2c/src".  People who
-do not obtain a new copy of "all from f2c/src" should at least add
-	fclose(sortfp);
-after the call on do_init_data(outfile, sortfp) in format_data.c .
-
-22 Jan. 1990:
-  Cleaner man page wording (thanks to Doug McIlroy).
-  -it now also applies to all untyped EXTERNAL procedures, not just
-arguments.
-
-23 Jan. 01:34:00 EST 1990:
-  Bug fixes: under -A and -C++, incorrect C was generated for
-subroutines having multiple entries but no arguments.
-  Under -A -P, subroutines of no arguments were given prototype
-calling sequence () rather than (void).
-  Character-valued functions elicited erroneous warning messages
-about inconsistent calling sequences when referenced by another
-procedure in the same file.
-  f2c.1t: omit first appearance of libF77.a in FILES section;
-load order of libraries is -lF77 -lI77, not vice versa (bug
-introduced in yesterday's edits); define .F macro for those whose
--man lacks it.  (For a while after yesterday's fixes were posted,
-f2c.1t was out of date.  Sorry!)
-
-23 Jan. 9:53:24 EST 1990:
-  Character substring expressions involving function calls having
-character arguments (including the intrinsic len function) yielded
-incorrect C.
-  Procedures defined after invocation (in the same file) with
-conflicting argument types also got an erroneous message about
-the wrong number of arguments.
-
-24 Jan. 11:44:00 EST 1990:
-  Bug fixes: -p omitted #undefs; COMMON block names containing
-underscores had their C names incorrectly computed; a COMMON block
-having the name of a previously defined procedure wreaked havoc;
-if all arguments were .P files, f2c tried reading the second as a
-Fortran file.
-  New feature: -P emits comments showing COMMON block lengths, so one
-can get warnings of incompatible COMMON block lengths by having f2c
-read .P (or .p) files.  Now by running f2c twice, first with -P -!c
-(or -P!c),  then with *.P among the arguments, you can be warned of
-inconsistent COMMON usage, and COMMON blocks having inconsistent
-lengths will be given the maximum length.  (The latter always did
-happen within each input file; now -P lets you extend this behavior
-across files.)
-
-26 Jan. 16:44:00 EST 1990:
-  Option -it made less aggressive: untyped external procedures that
-are invoked are now typed by the rules of Fortran, rather than by
-previous use of procedures to which they are passed as arguments
-before being invoked.
-  Option -P now includes information about references, i.e., called
-procedures, in the prototype files (in the form of special comments).
-This allows iterative invocations of f2c to infer more about untyped
-external names, particularly when multiple Fortran files are involved.
-  As usual, there are some obscure bug fixes:
-1.  Repair of erroneous warning messages about inconsistent number of
-arguments that arose when a character dummy parameter was discovered
-to be a function or when multiple entry points involved character
-variables appearing in a previous entry point.
-2.  Repair of memory fault after error msg about "adjustable character
-function".
-3.  Under -U, allow MAIN_ as a subroutine name (in the same file as a
-main program).
-4.  Change for consistency: a known function invoked as a subroutine,
-then as a function elicits a warning rather than an error.
-
-26 Jan. 22:32:00 EST 1990:
-  Fixed two bugs that resulted in incorrect C for substrings, within
-the body of a character-valued function, of the function's name, when
-those substrings were arguments to another function (even implicitly,
-as in character-string assignment).
-
-28 Jan. 18:32:00 EST 1990:
-  libf77, libi77: checksum files added; "make check" looks for
-transmission errors.  NAMELIST read modified to allow $ rather than &
-to precede a namelist name, to allow $ rather than / to terminate
-input where the name of another variable would otherwise be expected,
-and to regard all nonprinting ASCII characters <= ' ' as spaces.
-
-29 Jan. 02:11:00 EST 1990:
-  "fc from f2c" added.
-  -it option made the default; -!it turns it off.  Type information is
-now updated in a previously missed case.
-  -P option tweaked again; message about when rerunning f2c may change
-prototypes or declarations made more accurate.
-  New option -Ps implies -P and returns exit status 4 if rerunning
-f2c -P with prototype inputs might change prototypes or declarations.
-Now you can execute a crude script like
-
-	cat *.f >zap.F
-	rm -f zap.P
-	while :; do
-		f2c -Ps -!c zap.[FP]
-		case $? in 4) ;; *) break;; esac
-		done
-
-to get a file zap.P of the best prototypes f2c can determine for *.f .
-
-Jan. 29 07:30:21 EST 1990:
-  Forgot to check for error status when setting return code 4 under -Ps;
-error status (1, 2, 3, or, for caught signal, 126) now takes precedence.
-
-Jan 29 14:17:00 EST 1990:
-  Incorrect handling of
-	open(n,'filename')
-repaired -- now treated as
-	open(n,file='filename')
-(and, under -ext, given an error message).
-  New optional source file memset.c for people whose systems don't
-provide memset, memcmp, and memcpy; #include <string.h> in mem.c
-changed to #include "string.h" so BSD people can create a local
-string.h that simply says #include <strings.h> .
-
-Jan 30 10:34:00 EST 1990:
-  Fix erroneous warning at end of definition of a procedure with
-character arguments when the procedure had previously been called with
-a numeric argument instead of a character argument.  (There were two
-warnings, the second one incorrectly complaining of a wrong number of
-arguments.)
-
-Jan 30 16:29:41 EST 1990:
-  Fix case where -P and -Ps erroneously reported another iteration
-necessary.  (Only harm is the extra iteration.)
-
-Feb 3 01:40:00 EST 1990:
-  Supply semicolon occasionally omitted under -c .
-  Try to force correct alignment when numeric variables are initialized
-with character data (a non-standard and non-portable practice).  You
-must use the -W option if your code has such data statements and is
-meant to run on a machine with other than 4 characters/word; e.g., for
-code meant to run on a Cray, you would specify -W8 .
-  Allow parentheses around expressions in output lists (in write and
-print statements).
-  Rename source files so their names are <= 12 characters long
-(so there's room to append .Z and still have <= 14 characters);
-renamed files:  formatdata.c niceprintf.c niceprintf.h safstrncpy.c .
-  f2c material made available by anonymous ftp from research.att.com
-(look in dist/f2c ).
-
-Feb 3 03:49:00 EST 1990:
-  Repair memory fault that arose from use (in an assignment or
-call) of a non-argument variable declared CHARACTER*(*).
-
-Feb 9 01:35:43 EST 1990:
-  Fix erroneous error msg about bad types in
-	subroutine foo(a,adim)
-	dimension a(adim)
-	integer adim
-  Fix improper passing of character args (and possible memory fault)
-in the expression part of a computed goto.
-  Fix botched calling sequences in array references involving
-functions having character args.
-  Fix memory fault caused by invocation of character-valued functions
-of no arguments.
-  Fix botched calling sequence of a character*1-valued function
-assigned to a character*1 variable.
-  Fix bug in error msg for inconsistent number of args in prototypes.
-  Allow generation of C output despite inconsistencies in prototypes,
-but give exit code 8.
-  Simplify include logic (by removing some bogus logic); never
-prepend "/usr/include/" to file names.
-  Minor cleanups (that should produce no visible change in f2c's
-behavior) in intr.c parse.h main.c defs.h formatdata.c p1output.c .
-
-Feb 10 00:19:38 EST 1990:
-  Insert (integer) casts when floating-point expressions are used
-as subscripts.
-  Make SAVE stmt (with no variable list) override -a .
-  Minor cleanups: change field to Field in struct Addrblock (for the
-benefit of buggy C compilers); omit system("/bin/cp ...") in misc.c .
-
-Feb 13 00:39:00 EST 1990:
-  Error msg fix in gram.dcl: change "cannot make %s parameter"
-to "cannot make into parameter".
-
-Feb 14 14:02:00 EST 1990:
-  Various cleanups (invisible on systems with 4-byte ints), thanks
-to Dave Regan: vaxx.c eliminated; %d changed to %ld various places;
-external names adjusted for the benefit of stupid systems (that ignore
-case and recognize only 6 significant characters in external names);
-buffer shortened in xsum.c (e.g. for MS-DOS); fopen modes distinguish
-text and binary files; several unused functions eliminated; missing
-arg supplied to an unlikely fatalstr invocation.
-
-Thu Feb 15 19:15:53 EST 1990:
-  More cleanups (invisible on systems with 4 byte ints); casts inserted
-so most complaints from cyntax(1) and lint(1) go away; a few (int)
-versus (long) casts corrected.
-
-Fri Feb 16 19:55:00 EST 1990:
-  Recognize and translate unnamed Fortran 8x do while statements.
-  Fix bug that occasionally caused improper breaking of character
-strings.
-  New error message for attempts to provide DATA in a type-declaration
-statement.
-
-Sat Feb 17 11:43:00 EST 1990:
-  Fix infinite loop clf -> Fatal -> done -> clf after I/O error.
-  Change "if (addrp->vclass = CLPROC)" to "if (addrp->vclass == CLPROC)"
-in p1_addr (in p1output.c); this was probably harmless.
-  Move a misplaced } in lex.c (which slowed initkey()).
-  Thanks to Gary Word for pointing these things out.
-
-Sun Feb 18 18:07:00 EST 1990:
-  Detect overlapping initializations of arrays and scalar variables
-in previously missed cases.
-  Treat logical*2 as logical (after issuing a warning).
-  Don't pass string literals to p1_comment().
-  Correct a cast (introduced 16 Feb.) in gram.expr; this matters e.g.
-on a Cray.
-  Attempt to isolate UNIX-specific things in sysdep.c (a new source
-file).  Unless sysdep.c is compiled with SYSTEM_SORT defined, the
-intermediate files created for DATA statements are now sorted in-core
-without invoking system().
-
-Tue Feb 20 16:10:35 EST 1990:
-  Move definition of binread and binwrite from init.c to sysdep.c .
-  Recognize Fortran 8x tokens < <= == >= > <> as synonyms for
-.LT. .LE. .EQ. .GE. .GT. .NE.
-  Minor cleanup in putpcc.c:  fully remove simoffset().
-  More discussion of system dependencies added to libI77/README.
-
-Tue Feb 20 21:44:07 EST 1990:
-  Minor cleanups for the benefit of EBCDIC machines -- try to remove
-the assumption that 'a' through 'z' are contiguous.  (Thanks again to
-Gary Word.)  Also, change log2 to log_2 (shouldn't be necessary).
-
-Wed Feb 21 06:24:56 EST 1990:
-  Fix botch in init.c introduced in previous change; only matters
-to non-ASCII machines.
-
-Thu Feb 22 17:29:12 EST 1990:
-  Allow several entry points to mention the same array.  Protect
-parameter adjustments with if's (for the case that an array is not
-an argument to all entrypoints).
-  Under -u, allow
-	subroutine foo(x,n)
-	real x(n)
-	integer n
-  Compute intermediate variables used to evaluate dimension expressions
-at the right time.  Example previously mistranslated:
-	subroutine foo(x,k,m,n)
-	real x(min(k,m,n))
-	...
-	write(*,*) x
-  Detect duplicate arguments.  (The error msg points to the first
-executable stmt -- not wonderful, but not worth fixing.)
-  Minor cleanup of min/max computation (sometimes slightly simpler).
-
-Sun Feb 25 09:39:01 EST 1990:
-  Minor tweak to multiple entry points: protect parameter adjustments
-with if's only for (array) args that do not appear in all entry points.
-  Minor tweaks to format.c and io.c (invisible unless your compiler
-complained at the duplicate #defines of IOSUNIT and IOSFMT or at
-comparisons of p1gets(...) with NULL).
-
-Sun Feb 25 18:40:10 EST 1990:
-  Fix bug introduced Feb. 22: if a subprogram contained DATA and the
-first executable statement was labeled, then the label got lost.
-(Just change INEXEC to INDATA in p1output.c; it occurs just once.)
-
-Mon Feb 26 17:45:10 EST 1990:
-  Fix bug in handling of " and ' in comments.
-
-Wed Mar 28 01:43:06 EST 1990:
-libI77:
- 1. Repair nasty I/O bug: opening two files and closing the first
-(after possibly reading or writing it), then writing the second caused
-the last buffer of the second to be lost.
- 2. Formatted reads of logical values treated all letters other than
-t or T as f (false).
- libI77 files changed: err.c rdfmt.c Version.c
- (Request "libi77 from f2c" -- you can't get these files individually.)
-
-f2c itself:
-  Repair nasty bug in translation of
-	ELSE IF (condition involving complicated abs, min, or max)
--- auxiliary statements were emitted at the wrong place.
-  Supply semicolon previously omitted from the translation of a label
-(of a CONTINUE) immediately preceding an ELSE IF or an ELSE.  This
-bug made f2c produce invalid C.
-  Correct a memory fault that occurred (on some machines) when the
-error message "adjustable dimension on non-argument" should be given.
-  Minor tweaks to remove some harmless warnings by overly chatty C
-compilers.
-  Argument arays having constant dimensions but a variable lower bound
-(e.g., x(n+1:n+3)) had a * omitted from scalar arguments involved in
-the array offset computation.
-
-Wed Mar 28 18:47:59 EST 1990:
-libf77: add exit(0) to end of main [return(0) encounters a Cray bug]
-
-Sun Apr  1 16:20:58 EDT 1990:
-  Avoid dereferencing null when processing equivalences after an error.
-
-Fri Apr  6 08:29:49 EDT 1990:
-  Calls involving alternate return specifiers omitted processing
-needed for things like min, max, abs, and // (concatenation).
-  INTEGER*2 PARAMETERs were treated as INTEGER*4.
-  Convert some O(n^2) parsing to O(n).
-
-Tue Apr 10 20:07:02 EDT 1990:
-  When inconsistent calling sequences involve differing numbers of
-arguments, report the first differing argument rather than the numbers
-of arguments.
-  Fix bug under -a: formatted I/O in which either the unit or the
-format was a local character variable sometimes resulted in invalid C
-(a static struct initialized with an automatic component).
-  Improve error message for invalid flag after elided -.
-  Complain when literal table overflows, rather than infinitely
-looping.  (The complaint mentions the new and otherwise undocumented
--NL option for specifying a larger literal table.)
-  New option -h for forcing strings to word (or, with -hd, double-word)
-boundaries where possible.
-  Repair a bug that could cause improper splitting of strings.
-  Fix bug (cast of c to doublereal) in
-	subroutine foo(c,r)
-	double complex c
-	double precision r
-	c = cmplx(r,real(c))
-	end
-  New include file "sysdep.h" has some things from defs.h (and
-elsewhere) that one may need to modify on some systems.
-  Some large arrays that were previously statically allocated are now
-dynamically allocated when f2c starts running.
-  f2c/src files changed:
-	README cds.c defs.h f2c.1 f2c.1t format.c formatdata.c init.c
-	io.c lex.c main.c makefile mem.c misc.c names.c niceprintf.c
-	output.c parse_args.c pread.c put.c putpcc.c sysdep.h
-	version.c xsum0.out
-
-Wed Apr 11 18:27:12 EDT 1990:
-  Fix bug in argument consistency checking of character, complex, and
-double complex valued functions.  If the same source file contained a
-definition of such a function with arguments not explicitly typed,
-then subsequent references to the function might get erroneous
-warnings of inconsistent calling sequences.
-  Tweaks to sysdep.h for partially ANSI systems.
-  New options -kr and -krd cause f2c to use temporary variables to
-enforce Fortran evaluation-order rules with pernicious, old-style C
-compilers that apply the associative law to floating-point operations.
-
-Sat Apr 14 15:50:15 EDT 1990:
-  libi77: libI77 adjusted to allow list-directed and namelist I/O
-of internal files; bug in namelist I/O of logical and character arrays
-fixed; list input of complex numbers adjusted to permit d or D to
-denote the start of the exponent field of a component.
-  f2c itself: fix bug in handling complicated lower-bound
-expressions for character substrings; e.g., min and max did not work
-right, nor did function invocations involving character arguments.
-  Switch to octal notation, rather than hexadecimal, for nonprinting
-characters in character and string constants.
-  Fix bug (when neither -A nor -C++ was specified) in typing of
-external arguments of type complex, double complex, or character:
-	subroutine foo(c)
-	external c
-	complex c
-now results in
-	/* Complex */ int (*c) ();
-(as, indeed, it once did) rather than
-	complex (*c) ();
-
-Sat Apr 14 22:50:39 EDT 1990:
-  libI77/makefile: updated "make check" to omit lio.c
-  lib[FI]77/makefile: trivial change: define CC = cc, reference $(CC).
-  (Request, e.g., "libi77 from f2c" -- you can't ask for individual
-files from lib[FI]77.)
-
-Wed Apr 18 00:56:37 EDT 1990:
-  Move declaration of atof() from defs.h to sysdep.h, where it is
-now not declared if stdlib.h is included.  (NeXT's stdlib.h has a
-#define atof that otherwise wreaks havoc.)
-  Under -u, provide a more intelligible error message (than "bad tag")
-for an attempt to define a function without specifying its type.
-
-Wed Apr 18 17:26:27 EDT 1990:
-  Recognize \v (vertical tab) in Hollerith as well as quoted strings;
-add recognition of \r (carriage return).
-  New option -!bs turns off recognition of escapes in character strings
-(\0, \\, \b, \f, \n, \r, \t, \v).
-  Move to sysdep.c initialization of some arrays whose initialization
-assumed ASCII; #define Table_size in sysdep.h rather than using
-hard-coded 256 in allocating arrays of size 1 << (bits/byte).
-
-Thu Apr 19 08:13:21 EDT 1990:
-  Warn when escapes would make Hollerith extend beyond statement end.
-  Omit max() definition from misc.c (should be invisible except on
-systems that erroneously #define max in stdlib.h).
-
-Mon Apr 23 22:24:51 EDT 1990:
-  When producing default-style C (no -A or -C++), cast switch
-expressions to (int).
-  Move "-lF77 -lI77 -lm -lc" to link_msg, defined in sysdep.c .
-  Add #define scrub(x) to sysdep.h, with invocations in format.c and
-formatdata.c, so that people who have systems like VMS that would
-otherwise create multiple versions of intermediate files can
-#define scrub(x) unlink(x)
-
-Tue Apr 24 18:28:36 EDT 1990:
-  Pass string lengths once rather than twice to a function of character
-arguments involved in comparison of character strings of length 1.
-
-Fri Apr 27 13:11:52 EDT 1990:
-  Fix bug that made f2c gag on concatenations involving char(...) on
-some systems.
-
-Sat Apr 28 23:20:16 EDT 1990:
-  Fix control-stack bug in
-	if(...) then
-	else if (complicated condition)
-	else
-	endif
-(where the complicated condition causes assignment to an auxiliary
-variable, e.g., max(a*b,c)).
-
-Mon Apr 30 13:30:10 EDT 1990:
-  Change fillers for DATA with holes from substructures to arrays
-(in an attempt to make things work right with C compilers that have
-funny padding rules for substructures, e.g., Sun C compilers).
-  Minor cleanup of exec.c (should not affect generated C).
-
-Mon Apr 30 23:13:51 EDT 1990:
-  Fix bug in handling return values of functions having multiple
-entry points of differing return types.
-
-Sat May  5 01:45:18 EDT 1990:
-  Fix type inference bug in
-	subroutine foo(x)
-	call goo(x)
-	end
-	subroutine goo(i)
-	i = 3
-	end
-Instead of warning of inconsistent calling sequences for goo,
-f2c was simply making i a real variable; now i is correctly
-typed as an integer variable, and f2c issues an error message.
-  Adjust error messages issued at end of declarations so they
-don't blame the first executable statement.
-
-Sun May  6 01:29:07 EDT 1990:
-  Fix bug in -P and -Ps: warn when the definition of a subprogram adds
-information that would change prototypes or previous declarations.
-
-Thu May 10 18:09:15 EDT 1990:
-  Fix further obscure bug with (default) -it: inconsistent calling
-sequences and I/O statements could interact to cause a memory fault.
-Example:
-      SUBROUTINE FOO
-      CALL GOO(' Something') ! Forgot integer first arg
-      END
-      SUBROUTINE GOO(IUNIT,MSG)
-      CHARACTER*(*)MSG
-      WRITE(IUNIT,'(1X,A)') MSG
-      END
-
-Fri May 11 16:49:11 EDT 1990:
-  Under -!c, do not delete any .c files (when there are errors).
-  Avoid dereferencing 0 when a fatal error occurs while reading
-Fortran on stdin.
-
-Wed May 16 18:24:42 EDT 1990:
-  f2c.ps made available.
-
-Mon Jun  4 12:53:08 EDT 1990:
-  Diagnose I/O units of invalid type.
-  Add specific error msg about dummy arguments in common.
-
-Wed Jun 13 12:43:17 EDT 1990:
-  Under -A, supply a missing "[1]" for CHARACTER*1 variables that appear
-both in a DATA statement and in either COMMON or EQUIVALENCE.
-
-Mon Jun 18 16:58:31 EDT 1990:
-  Trivial updates to f2c.ps .  ("Fortran 8x" --> "Fortran 90"; omit
-"(draft)" from "(draft) ANSI C".)
-
-Tue Jun 19 07:36:32 EDT 1990:
-  Fix incorrect code generated for ELSE IF(expression involving
-function call passing non-constant substring).
-  Under -h, preserve the property that strings are null-terminated
-where possible.
-  Remove spaces between # and define in lex.c output.c parse.h .
-
-Mon Jun 25 07:22:59 EDT 1990:
-  Minor tweak to makefile to reduce unnecessary recompilations.
-
-Tue Jun 26 11:49:53 EDT 1990:
-  Fix unintended truncation of some integer constants on machines
-where casting a long to (int) may change the value.  E.g., when f2c
-ran on machines with 16-bit ints, "i = 99999" was being translated
-to "i = -31073;".
-
-Wed Jun 27 11:05:32 EDT 1990:
-  Arrange for CHARACTER-valued PARAMETERs to honor their length
-specifications.  Allow CHAR(nn) in expressions defining such PARAMETERs.
-
-Fri Jul 20 09:17:30 EDT 1990:
-  Avoid dereferencing 0 when a FORMAT statement has no label.
-
-Thu Jul 26 11:09:39 EDT 1990:
-  Remarks about VOID and binread,binwrite added to README.
-  Tweaks to parse_args: should be invisible unless your compiler
-complained at (short)*store.
-
-Thu Aug  2 02:07:58 EDT 1990:
-  f2c.ps: change the first line of page 5 from
-	include stuff
-to
-	include 'stuff'
-
-Tue Aug 14 13:21:24 EDT 1990:
-  libi77: libI77 adjusted to treat tabs as spaces in list input.
-
-Fri Aug 17 07:24:53 EDT 1990:
-  libi77: libI77 adjusted so a blank='ZERO' clause (upper case Z)
-in an open of a currently open file works right.
-
-Tue Aug 28 01:56:44 EDT 1990:
-  Fix bug in warnings of inconsistent calling sequences: if an
-argument to a subprogram was never referenced, then a previous
-invocation of the subprogram (in the same source file) that
-passed something of the wrong type for that argument did not
-elicit a warning message.
-
-Thu Aug 30 09:46:12 EDT 1990:
-  libi77: prevent embedded blanks in list output of complex values;
-omit exponent field in list output of values of magnitude between
-10 and 1e8; prevent writing stdin and reading stdout or stderr;
-don't close stdin, stdout, or stderr when reopening units 5, 6, 0.
-
-Tue Sep  4 12:30:57 EDT 1990:
-  Fix bug in C emitted under -I2 or -i2 for INTEGER*4 FUNCTION.
-  Warn of missing final END even if there are previous errors.
-
-Fri Sep  7 13:55:34 EDT 1990:
-  Remark about "make xsum.out" and "make f2c" added to README.
-
-Tue Sep 18 23:50:01 EDT 1990:
-  Fix null dereference (and, on some systems, writing of bogus *_com.c
-files) under -ec or -e1c when a prototype file (*.p or *.P) describes
-COMMON blocks that do not appear in the Fortran source.
-  libi77:
-    Add some #ifdef lines (#ifdef MSDOS, #ifndef MSDOS) to avoid
-references to stat and fstat on non-UNIX systems.
-    On UNIX systems, add component udev to unit; decide that old
-and new files are the same iff both the uinode and udev components
-of unit agree.
-    When an open stmt specifies STATUS='OLD', use stat rather than
-access (on UNIX systems) to check the existence of the file (in case
-directories leading to the file have funny permissions and this is
-a setuid or setgid program).
-
-Thu Sep 27 16:04:09 EDT 1990:
-  Supply missing entry for Impldoblock in blksize array of cpexpr
-(in expr.c).  No examples are known where this omission caused trouble.
-
-Tue Oct  2 22:58:09 EDT 1990:
-  libf77: test signal(...) == SIG_IGN rather than & 01 in main().
-  libi77: adjust rewind.c so two successive rewinds after a write
-don't clobber the file.
-
-Thu Oct 11 18:00:14 EDT 1990:
-  libi77: minor cleanups: add #include "fcntl.h" to endfile.c, err.c,
-open.c; adjust g_char in util.c for segmented memories; in f_inqu
-(inquire.c), define x appropriately when MSDOS is defined.
-
-Mon Oct 15 20:02:11 EDT 1990:
-  Add #ifdef MSDOS pointer adjustments to mem.c; treat NAME= as a
-synonym for FILE= in OPEN statements.
-
-Wed Oct 17 16:40:37 EDT 1990:
-  libf77, libi77: minor cleanups: _cleanup() and abort() invocations
-replaced by invocations of sig_die in main.c; some error messages
-previously lost in buffers will now appear.
-
-Mon Oct 22 16:11:27 EDT 1990:
-  libf77: separate sig_die from main (for folks who don't want to use
-the main in libF77).
-  libi77: minor tweak to comments in README.
-
-Fri Nov  2 13:49:35 EST 1990:
-  Use two underscores rather than one in generated temporary variable
-names to avoid conflict with COMMON names.  f2c.ps updated to reflect
-this change and the NAME= extension introduced 15 Oct.
-  Repair a rare memory fault in io.c .
-
-Mon Nov  5 16:43:55 EST 1990:
-  libi77: changes to open.c (and err.c): complain if an open stmt
-specifies new= and the file already exists (as specified by Fortrans 77
-and 90); allow file= to be omitted in open stmts and allow
-status='replace' (Fortran 90 extensions).
-
-Fri Nov 30 10:10:14 EST 1990:
-  Adjust malloc.c for unusual systems whose sbrk() can return values
-not properly aligned for doubles.
-  Arrange for slightly more helpful and less repetitive warnings for
-non-character variables initialized with character data; these warnings
-are (still) suppressed by -w66.
-
-Fri Nov 30 15:57:59 EST 1990:
-  Minor tweak to README (about changing VOID in f2c.h).
-
-Mon Dec  3 07:36:20 EST 1990:
-  Fix spelling of "character" in f2c.1t.
-
-Tue Dec  4 09:48:56 EST 1990:
-  Remark about link_msg and libf2c added to f2c/README.
-
-Thu Dec  6 08:33:24 EST 1990:
-  Under -U, render label nnn as L_nnn rather than Lnnn.
-
-Fri Dec  7 18:05:00 EST 1990:
-  Add more names from f2c.h (e.g. integer, real) to the c_keywords
-list of names to which an underscore is appended to avoid confusion.
-
-Mon Dec 10 19:11:15 EST 1990:
-  Minor tweaks to makefile (./xsum) and README (binread/binwrite).
-  libi77: a few modifications for POSIX systems; meant to be invisible
-elsewhere.
-
-Sun Dec 16 23:03:16 EST 1990:
-  Fix null dereference caused by unusual erroneous input, e.g.
-	call foo('abc')
-	end
-	subroutine foo(msg)
-	data n/3/
-	character*(*) msg
-	end
-(Subroutine foo is illegal because the character statement comes after a
-data statement.)
-  Use decimal rather than hex constants in xsum.c (to prevent
-erroneous warning messages about constant overflow).
-
-Mon Dec 17 12:26:40 EST 1990:
-  Fix rare extra underscore in character length parameters passed
-for multiple entry points.
-
-Wed Dec 19 17:19:26 EST 1990:
-  Allow generation of C despite error messages about bad alignment
-forced by equivalence.
-  Allow variable-length concatenations in I/O statements, such as
-	open(3, file=bletch(1:n) // '.xyz')
-
-Fri Dec 28 17:08:30 EST 1990:
-  Fix bug under -p with formats and internal I/O "units" in COMMON,
-as in
-      COMMON /FIGLEA/F
-      CHARACTER*20 F
-      F = '(A)'
-      WRITE (*,FMT=F) 'Hello, world!'
-      END
-
-Tue Jan 15 12:00:24 EST 1991:
-  Fix bug when two equivalence groups are merged, the second with
-nonzero offset, and the result is then merged into a common block.
-Example:
-      INTEGER W(3), X(3), Y(3), Z(3)
-      COMMON /ZOT/ Z
-      EQUIVALENCE (W(1),X(1)), (X(2),Y(1)), (Z(3),X(1))
-***** W WAS GIVEN THE WRONG OFFSET
-  Recognize Fortran 90's optional NML= in NAMELIST READs and WRITEs.
-(Currently NML= and FMT= are treated as synonyms -- there's no
-error message if, e.g., NML= specifies a format.)
-  libi77: minor adjustment to allow internal READs from character
-string constants in read-only memory.
-
-Fri Jan 18 22:56:15 EST 1991:
-  Add comment to README about needing to comment out the typedef of
-size_t in sysdep.h on some systems, e.g. Sun 4.1.
-  Fix misspelling of "statement" in an error message in lex.c
-
-Wed Jan 23 00:38:48 EST 1991:
-  Allow hex, octal, and binary constants to have the qualifying letter
-(z, x, o, or b) either before or after the quoted string containing the
-digits.  For now this change will not be reflected in f2c.ps .
-
-Tue Jan 29 16:23:45 EST 1991:
-  Arrange for character-valued statement functions to give results of
-the right length (that of the statement function's name).
-
-Wed Jan 30 07:05:32 EST 1991:
-  More tweaks for character-valued statement functions: an error
-check and an adjustment so a right-hand side of nonconstant length
-(e.g., a substring) is handled right.
-
-Wed Jan 30 09:49:36 EST 1991:
-  Fix p1_head to avoid printing (char *)0 with %s.
-
-Thu Jan 31 13:53:44 EST 1991:
-  Add a test after the cleanup call generated for I/O statements with
-ERR= or END= clauses to catch the unlikely event that the cleanup
-routine encounters an error.
-
-Mon Feb  4 08:00:58 EST 1991:
-  Minor cleanup: omit unneeded jumps and labels from code generated for
-some NAMELIST READs and WRITEs with IOSTAT=, ERR=, and/or END=.
-
-Tue Feb  5 01:39:36 EST 1991:
-  Change Mktemp to mktmp (for the benefit of systems so brain-damaged
-that they do not distinguish case in external names -- and that for
-some reason want to load mktemp).  Try to get xsum0.out right this
-time (it somehow didn't get updated on 4 Feb. 1991).
-  Add note to libi77/README about adjusting the interpretation of
-RECL= specifiers in OPENs for direct unformatted I/O.
-
-Thu Feb  7 17:24:42 EST 1991:
-  New option -r casts values of REAL functions, including intrinsics,
-to REAL.  This only matters for unportable code like
-	real r
-	r = asin(1.)
-	if (r .eq. asin(1.)) ...
-[The behavior of such code varies with the Fortran compiler used --
-and sometimes is affected by compiler options.]  For now, the man page
-at the end of f2c.ps is the only part of f2c.ps that reflects this new
-option.
-
-Fri Feb  8 18:12:51 EST 1991:
-  Cast pointer differences passed as arguments to the appropriate type.
-This matters, e.g., with MSDOS compilers that yield a long pointer
-difference but have int == short.
-  Disallow nonpositive dimensions.
-
-Fri Feb 15 12:24:15 EST 1991:
-  Change %d to %ld in sprintf call in putpower in putpcc.c.
-  Free more memory (e.g. allowing translation of larger Fortran
-files under MS-DOS).
-  Recognize READ (character expression) and WRITE (character expression)
-as formatted I/O with the format given by the character expression.
-  Update year in Notice.
-
-Sat Feb 16 00:42:32 EST 1991:
-  Recant recognizing WRITE(character expression) as formatted output
--- Fortran 77 is not symmetric in its syntax for READ and WRITE.
-
-Mon Mar  4 15:19:42 EST 1991:
-  Fix bug in passing the real part of a complex argument to an intrinsic
-function.  Omit unneeded parentheses in nested calls to intrinsics.
-Example:
-	subroutine foo(x, y)
-	complex y
-	x = exp(sin(real(y))) + exp(imag(y))
-	end
-
-Fri Mar  8 15:05:42 EST 1991:
-  Fix a comment in expr.c; omit safstrncpy.c (which had bugs in
-cases not used by f2c).
-
-Wed Mar 13 02:27:23 EST 1991:
-  Initialize firstmemblock->next in mem_init in mem.c .  [On most
-systems it was fortuituously 0, but with System V, -lmalloc could
-trip on this missed initialization.]
-
-Wed Mar 13 11:47:42 EST 1991:
-  Fix a reference to freed memory.
-
-Wed Mar 27 00:42:19 EST 1991:
-  Fix a memory fault caused by such illegal Fortran as
-       function foo
-       x = 3
-       logical foo	! declaration among executables
-       foo=.false.	! used to suffer memory fault
-       end
-
-Fri Apr  5 08:30:31 EST 1991:
-  Fix loss of % in some format expressions, e.g.
-	write(*,'(1h%)')
-  Fix botch introduced 27 March 1991 that caused subroutines with
-multiple entry points to have extraneous declarations of ret_val.
-
-Fri Apr  5 12:44:02 EST 1991
-  Try again to omit extraneous ret_val declarations -- this morning's
-fix was sometimes wrong.
-
-Mon Apr  8 13:47:06 EDT 1991:
-  Arrange for s_rnge to have the right prototype under -A -C .
-
-Wed Apr 17 13:36:03 EDT 1991:
-  New fatal error message for apparent invocation of a recursive
-statement function.
-
-Thu Apr 25 15:13:37 EDT 1991:
-  F2c and libi77 adjusted so NAMELIST works with -i2.  (I forgot
-about -i2 when adding NAMELIST.)  This required a change to f2c.h
-(that only affects NAMELIST I/O under -i2.)  Man-page description of
--i2 adjusted to reflect that -i2 stores array lengths in short ints.
-
-Fri Apr 26 02:54:41 EDT 1991:
-  Libi77: fix some bugs in NAMELIST reading of multi-dimensional arrays
-(file rsne.c).
-
-Thu May  9 02:13:51 EDT 1991:
-  Omit a trailing space in expr.c (could cause a false xsum value if
-a mailer drops the trailing blank).
-
-Thu May 16 13:14:59 EDT 1991:
-  Libi77: increase LEFBL in lio.h to overcome a NeXT bug.
-  Tweak for compilers that recognize "nested" comments: inside comments,
-turn /* into /+ (as well as */ into +/).
-
-Sat May 25 11:44:25 EDT 1991:
-  libf77: s_rnge: declare line long int rather than int.
-
-Fri May 31 07:51:50 EDT 1991:
-  libf77: system_: officially return status.
-
-Mon Jun 17 16:52:53 EDT 1991:
-  Minor tweaks: omit unnecessary declaration of strcmp (that caused
-trouble on a system where strcmp was a macro) from misc.c; add
-SHELL = /bin/sh to makefiles.
-  Fix a dereference of null when a CHARACTER*(*) declaration appears
-(illegally) after DATA.  Complain only once per subroutine about
-declarations appearing after DATA.
-
-Mon Jul  1 00:28:13 EDT 1991:
-  Add test and error message for illegal use of subroutine names, e.g.
-      SUBROUTINE ZAP(A)
-      ZAP = A
-      END
-
-Mon Jul  8 21:49:20 EDT 1991:
-  Issue a warning about things like
-	integer i
-	i = 'abc'
-(which is treated as i = ichar('a')).  [It might be nice to treat 'abc'
-as an integer initialized (in a DATA statement) with 'abc', but
-other matters have higher priority.]
-  Render
-	i = ichar('A')
-as
-	i = 'A';
-rather than
-	i = 65;
-(which assumes ASCII).
-
-Fri Jul 12 07:41:30 EDT 1991:
-  Note added to README about erroneous definitions of __STDC__ .
-
-Sat Jul 13 13:38:54 EDT 1991:
-  Fix bugs in double type convesions of complex values, e.g.
-sngl(real(...)) or dble(real(...)) (where ... is complex).
-
-Mon Jul 15 13:21:42 EDT 1991:
-  Fix bug introduced 8 July 1991 that caused erroneous warnings
-"ichar([first char. of] char. string) assumed for conversion to numeric"
-when a subroutine had an array of character strings as an argument.
-
-Wed Aug 28 01:12:17 EDT 1991:
-  Omit an unused function in format.c, an unused variable in proc.c .
-  Under -r8, promote complex to double complex (as the man page claims).
-
-Fri Aug 30 17:19:17 EDT 1991:
-  f2c.ps updated: slightly expand description of intrinsics and,or,xor,
-not; add mention of intrinsics lshift, rshift; add note about f2c
-accepting Fortran 90 inline comments (starting with !); update Cobalt
-Blue address.
-
-Tue Sep 17 07:17:33 EDT 1991:
-  libI77: err.c and open.c modified to use modes "rb" and "wb"
-when (f)opening unformatted files; README updated to point out
-that it may be necessary to change these modes to "r" and "w"
-on some non-ANSI systems.
-
-Tue Oct 15 10:25:49 EDT 1991:
-  Minor tweaks that make some PC compilers happier: insert some
-casts, add args to signal functions.
-  Change -g to emit uncommented #line lines -- and to emit more of them;
-update fc, f2c.1, f2c.1t, f2c.ps to reflect this.
-  Change uchar to Uchar in xsum.c .
-  Bring gram.c up to date.
-
-Thu Oct 17 09:22:05 EDT 1991:
-  libi77: README, fio.h, sue.c, uio.c changed so the length field
-in unformatted sequential records has type long rather than int
-(unless UIOLEN_int is #defined).  This is for systems where sizeof(int)
-can vary, depending on the compiler or compiler options.
-
-Thu Oct 17 13:42:59 EDT 1991:
-  libi77: inquire.c: when MSDOS is defined, don't strcmp units[i].ufnm
-when it is NULL.
-
-Fri Oct 18 15:16:00 EDT 1991:
-  Correct xsum0.out in "all from f2c/src" (somehow botched on 15 Oct.).
-
-Tue Oct 22 18:12:56 EDT 1991:
-  Fix memory fault when a character*(*) argument is used (illegally)
-as a dummy variable in the definition of a statement function.  (The
-memory fault occurred when the statement function was invoked.)
-  Complain about implicit character*(*).
-
-Thu Nov 14 08:50:42 EST 1991:
-  libi77: change uint to Uint in fmt.h, rdfmt.c, wrtfmt.c; this change
-should be invisible unless you're running a brain-damaged system.
-
-Mon Nov 25 19:04:40 EST 1991:
-  libi77: correct botches introduced 17 Oct. 1991 and 14 Nov. 1991
-(change uint to Uint in lwrite.c; other changes that only matter if
-sizeof(int) != sizeof(long)).
-  Add a more meaningful error message when bailing out due to an attempt
-to invoke a COMMON variable as a function.
-
-Sun Dec  1 19:29:24 EST 1991:
-  libi77: uio.c: add test for read failure (seq. unformatted reads);
-adjust an error return from EOF to off end of record.
-
-Tue Dec 10 17:42:28 EST 1991:
-  Add tests to prevent memory faults with bad uses of character*(*).
-
-Thu Dec 12 11:24:41 EST 1991:
-  libi77: fix bug with internal list input that caused the last
-character of each record to be ignored; adjust error message in
-internal formatted input from "end-of-file" to "off end of record"
-if the format specifies more characters than the record contains.
-
-Wed Dec 18 17:48:11 EST 1991:
-  Fix bug in translating nonsensical ichar invocations involving
-concatenations.
-  Fix bug in passing intrinsics lle, llt, lge, lgt as arguments;
-hl_le was being passed rather than l_le, etc.
-  libf77: adjust length parameters from long to ftnlen, for
-compiling with f2c_i2 defined.
-
-Sat Dec 21 15:30:57 EST 1991:
-  Allow DO nnn ... to end with an END DO statement labelled nnn.
-
-Tue Dec 31 13:53:47 EST 1991:
-  Fix bug in handling dimension a(n**3,2) -- pow_ii was called
-incorrectly.
-  Fix bug in translating
-	subroutine x(abc,n)
-	character abc(n)
-	write(abc,'(i10)') 123
-	end
-(omitted declaration and initialiation of abc_dim1).
-  Complain about dimension expressions of such invalid types
-as complex and logical.
-
-Fri Jan 17 11:54:20 EST 1992:
-  Diagnose some illegal uses of main program name (rather than
-memory faulting).
-  libi77:  (1) In list and namelist input, treat "r* ," and "r*,"
-alike (where r is a positive integer constant), and fix a bug in
-handling null values following items with repeat counts (e.g.,
-2*1,,3).  (2) For namelist reading of a numeric array, allow a new
-name-value subsequence to terminate the current one (as though the
-current one ended with the right number of null values).
-(3) [lio.h, lwrite.c]:  omit insignificant zeros in list and namelist
-output.  (Compile with -DOld_list_output to get the old behavior.)
-
-Sat Jan 18 15:58:01 EST 1992:
-  libi77:  make list output consistent with F format by printing .1
-rather than 0.1 (introduced yesterday).
-
-Wed Jan 22 08:32:43 EST 1992:
-  libi77:  add comment to README pointing out preconnection of
-Fortran units 5, 6, 0 to stdin, stdout, stderr (respectively).
-
-Mon Feb  3 11:57:53 EST 1992:
-  libi77:  fix namelist read bug that caused the character following
-a comma to be ignored.
-
-Fri Feb 28 01:04:26 EST 1992:
-  libf77:  fix buggy z_sqrt.c (double precision square root), which
-misbehaved for arguments in the southwest quadrant.
-
-Thu Mar 19 15:05:18 EST 1992:
-  Fix bug (introduced 17 Jan 1992) in handling multiple entry points
-of differing types (with implicitly typed entries appearing after
-the first executable statement).
-  Fix memory fault in the following illegal Fortran:
-        double precision foo(i)
-*	illegal: above should be "double precision function foo(i)"
-        foo = i * 3.2
-        entry moo(i)
-        end
-  Note about ANSI_Libraries (relevant, e.g., to IRIX 4.0.1 and AIX)
-added to README.
-  Abort zero divides during constant simplification.
-
-Sat Mar 21 01:27:09 EST 1992:
-  Tweak ckalloc (misc.c) for systems where malloc(0) = 0; this matters
-for subroutines with multiple entry points but no arguments.
-  Add "struct memblock;" to init.c (irrelevant to most compilers).
-
-Wed Mar 25 13:31:05 EST 1992:
-  Fix bug with IMPLICIT INTEGER*4(...): under -i2 or -I2, the *4 was
-ignored.
-
-Tue May  5 09:53:55 EDT 1992:
-  Tweaks to README; e.g., ANSI_LIbraries changed to ANSI_Libraries .
-
-Wed May  6 23:49:07 EDT 1992
-  Under -A and -C++, have subroutines return 0 (even if they have
-no * arguments).
-  Adjust libi77 (rsne.c and lread.c) for systems where ungetc is
-a macro.  Tweak lib[FI]77/makefile to use unique intermediate file
-names (for parallel makes).
-
-Tue May 19 09:03:05 EDT 1992:
-  Adjust libI77 to make err= work with internal list and formatted I/O.
-
-Sat May 23 18:17:42 EDT 1992:
-  Under -A and -C++, supply "return 0;" after the code generated for
-a STOP statement -- the C compiler doesn't know that s_stop won't
-return.
-  New (mutually exclusive) options:
-	-f	treats all input lines as free-format lines,
-		honoring text that appears after column 72
-		and not padding lines shorter than 72 characters
-		with blanks (which matters if a character string
-		is continued across 2 or more lines).
-	-72	treats text appearing after column 72 as an error.
-
-Sun May 24 09:45:37 EDT 1992:
-  Tweak description of -f in f2c.1 and f2c.1t; update f2c.ps .
-
-Fri May 29 01:17:15 EDT 1992:
-  Complain about externals used as variables.  Example
-	subroutine foo(a,b)
-	external b
-	a = a*b		! illegal use of b; perhaps should be b()
-	end
-
-Mon Jun 15 11:15:27 EDT 1992:
-  Fix bug in handling namelists with names that have underscores.
-
-Sat Jun 27 17:30:59 EDT 1992:
-  Under -A and -C++, end Main program aliases with "return 0;".
-  Under -A and -C++, use .P files and usage in previous subprograms
-in the current file to give prototypes for functions declared EXTERNAL
-but not invoked.
-  Fix memory fault under -d1 -P .
-  Under -A and -C++, cast arguments to the right types in calling
-a function that has been defined in the current file or in a .P file.
-  Fix bug in handling multi-dimensional arrays with array references
-in their leading dimensions.
-  Fix bug in the intrinsic cmplx function when the first argument
-involves an expression for which f2c generates temporary variables,
-e.g. cmplx(abs(real(a)),1.) .
-
-Sat Jul 18 07:36:58 EDT 1992:
-  Fix buglet with -e1c (invisible on most systems) temporary file
-f2c_functions was unlinked before being closed.
-  libf77: fix bugs in evaluating m**n for integer n < 0 and m an
-integer different from 1 or a real or double precision 0.
-Catch SIGTRAP (to print "Trace trap" before aborting).  Programs
-that previously erroneously computed 1 for 0**-1 may now fault.
-Relevant routines: main.c pow_di.c pow_hh.c pow_ii.c pow_ri.c .
-
-Sat Jul 18 08:40:10 EDT 1992:
-  libi77: allow namelist input to end with & (e.g. &end).
-
-Thu Jul 23 00:14:43 EDT 1992
-  Append two underscores rather than one to C keywords used as
-local variables to avoid conflicts with similarly named COMMON blocks.
-
-Thu Jul 23 11:20:55 EDT 1992:
-  libf77, libi77 updated to assume ANSI prototypes unless KR_headers
-is #defined.
-  libi77 now recognizes a Z format item as in Fortran 90;
-the implementation assumes 8-bit bytes and botches character strings
-on little-endian machines (by printing their bytes from right to
-left): expect this bug to persist; fixing it would require a
-change to the I/O calling sequences.
-
-Tue Jul 28 15:18:33 EDT 1992:
-  libi77: insert missed "#ifdef KR_headers" lines around getnum
-header in rsne.c.  Version not updated.
-
-NOTE: "index from f2c" now ends with current timestamps of files in
-"all from f2c/src", sorted by time.  To bring your source up to date,
-obtain source files with a timestamp later than the time shown in your
-version.c.
-
-Fri Aug 14 08:07:09 EDT 1992:
-  libi77: tweak wrt_E in wref.c to avoid signing NaNs.
-
-Sun Aug 23 19:05:22 EDT 1992:
-  fc: supply : after O in getopt invocation (for -O1 -O2 -O3).
-
-Mon Aug 24 18:37:59 EDT 1992:
-  Recant above tweak to fc: getopt is dumber than I thought;
-it's necessary to say -O 1 (etc.).
-  libF77/README: add comments about ABORT, ERF, DERF, ERFC, DERFC,
-GETARG, GETENV, IARGC, SIGNAL, and SYSTEM.
-
-Tue Oct 27 01:57:42 EST 1992:
-  libf77, libi77:
-    1.  Fix botched indirection in signal_.c.
-    2.  Supply missing l_eof = 0 assignment to s_rsne() in rsne.c (so
-end-of-file on other files won't confuse namelist reads of external
-files).
-    3.  Prepend f__ to external names that are only of internal
-interest to lib[FI]77.
-
-Thu Oct 29 12:37:18 EST 1992:
-  libf77: Fix botch in signal_.c when KR_headers is #defined;
-add CFLAGS to makefile.
-  libi77: trivial change to makefile for consistency with
-libF77/makefile.
-
-Wed Feb  3 02:05:16 EST 1993:
-  Recognize types INTEGER*1, LOGICAL*1, LOGICAL*2, INTEGER*8.
-INTEGER*8 is not well tested and will only work reasonably on
-systems where int = 4 bytes, long = 8 bytes; on such systems,
-you'll have to modify f2c.h appropriately, changing integer
-from long to int and adding typedef long longint.  You'll also
-have to compile libI77 with Allow_TYQUAD #defined and adjust
-libF77/makefile to compile pow_qq.c.  In the f2c source, changes
-for INTEGER*8 are delimited by #ifdef TYQUAD ... #endif.  You
-can omit the INTEGER*8 changes by compiling with NO_TYQUAD
-#defined.  Otherwise, the new command-line option -!i8
-disables recognition of INTEGER*8.
-  libf77: add pow_qq.c
-  libi77: add #ifdef Allow_TYQUAD stuff.  Changes for INTEGER*1,
-LOGICAL*1, and LOGICAL*2 came last 23 July 1992.  Fix bug in
-backspace (that only bit when the last character of the second
-or subsequent buffer read was the previous newline).  Guard
-against L_tmpnam being too small in endfile.c.  For MSDOS,
-close and reopen files when copying to truncate.  Lengthen
-LINTW (buffer size in lwrite.c).
-  Add \ to the end of #define lines that get broken.
-  Fix bug in handling NAMELIST of items in EQUIVALENCE.
-  Under -h (or -hd), convert Hollerith to integer in general expressions
-(e.g., assignments), not just when they're passed as arguments, and
-blank-pad rather than 0-pad the Hollerith to a multiple of
-sizeof(integer) or sizeof(doublereal).
-  Add command-line option -s, which instructs f2c preserve multi-
-dimensional subscripts (by emitting and using appropriate #defines).
-  Fix glitch (with default type inferences) in examples like
-	call foo('abc')
-	end
-	subroutine foo(goo)
-	end
-This gave two warning messages:
-	Warning on line 4 of y.f: inconsistent calling sequences for foo:
-	        here 1, previously 2 args and string lengths.
-	Warning on line 4 of y.f: inconsistent calling sequences for foo:
-	        here 2, previously 1 args and string lengths.
-Now the second Warning is suppressed.
-  Complain about all inconsistent arguments, not just the first.
-  Switch to automatic creation of "all from f2c/src".  For folks
-getting f2c source via ftp, this means f2c/src/all.Z is now an
-empty file rather than a bundle.
-  Separate -P and -A: -P no longer implies -A.
-
-Thu Feb  4 00:32:20 EST 1993:
-  Fix some glitches (introduced yesterday) with -h .
-
-Fri Feb  5 01:40:38 EST 1993:
-  Fix bug in types conveyed for namelists (introduced 3 Feb. 1993).
-
-Fri Feb  5 21:26:43 EST 1993:
-  libi77: tweaks to NAMELIST and open (after comments by Harold
-Youngren):
- 1. Reading a ? instead of &name (the start of a namelist) causes
-    the namelist being sought to be written to stdout (unit 6);
-    to omit this feature, compile rsne.c with -DNo_Namelist_Questions.
- 2. Reading the wrong namelist name now leads to an error message
-    and an attempt to skip input until the right namelist name is found;
-    to omit this feature, compile rsne.c with -DNo_Bad_Namelist_Skip.
- 3. Namelist writes now insert newlines before each variable; to omit
-    this feature, compile xwsne.c with -DNo_Extra_Namelist_Newlines.
- 4. For OPEN of sequential files, ACCESS='APPEND' (or
-    access='anything else starting with "A" or "a"') causes the file to
-    be positioned at end-of-file, so a write will append to the file.
-    (This is nonstandard, but does not require modifying data
-    structures.)
-
-Mon Feb  8 14:40:37 EST 1993:
-  Increase number of continuation lines allowed from 19 to 99,
-and allow changing this limit with -NC (e.g. -NC200 for 200 lines).
-  Treat control-Z (at the beginning of a line) as end-of-file: see
-the new penultimate paragraph of README.
-  Fix a rarely seen glitch that could make an error messages to say
-"line 0".
-
-Tue Feb  9 02:05:40 EST 1993
-  libi77: change some #ifdef MSDOS lines to #ifdef NON_UNIX_STDIO,
-and, in err.c under NON_UNIX_STDIO, avoid close(creat(name,0666))
-when the unit has another file descriptor for name.
-
-Tue Feb  9 17:12:49 EST 1993
-  libi77: more tweaks for NON_UNIX_STDIO: use stdio routines
-rather than open, close, creat, seek, fdopen (except for f__isdev).
-
-Fri Feb 12 15:49:33 EST 1993
-  Update src/gram.c (which was forgotten in the recent updates).
-Most folks regenerate it anyway (wity yacc or bison).
-
-Thu Mar  4 17:07:38 EST 1993
-  Increase default max labels in computed gotos and alternate returns
-to 257, and allow -Nl1234 to specify this number.
-  Tweak put.c to check p->tag == TADDR in realpart() and imagpart().
-  Adjust fc script to allow .r (RATFOR) files and -C (check subscripts).
-  Avoid declaring strchr in niceprintf.c under -DANSI_Libraries .
-  gram.c updated again.
-  libi77: err.c, open.c: take declaration of fdopen from rawio.h.
-
-Sat Mar  6 07:09:11 EST 1993
-  libi77: uio.c: adjust off-end-of-record test for sequential
-unformatted reads to respond to err= rather than end= .
-
-Sat Mar  6 16:12:47 EST 1993
-  Treat scalar arguments of the form (v) and v+0, where v is a variable,
-as expressions: assign to a temporary variable, and pass the latter.
-  gram.c updated.
-
-Mon Mar  8 09:35:38 EST 1993
-  "f2c.h from f2c" updated to add types logical1 and integer1 for
-LOGICAL*1 and INTEGER*1.  ("f2c.h from f2c" is supposed to be the
-same as "f2c.h from f2c/src", which was updated 3 Feb. 1993.)
-
-Mon Mar  8 17:57:55 EST 1993
-  Fix rarely seen bug that could cause strange casts in function
-invocations (revealed by an example with msdos/f2c.exe).
-  msdos/f2cx.exe.Z and msdos/f2c.exe.Z updated (ftp access only).
-
-Fri Mar 12 12:37:01 EST 1993
-  Fix bug with -s in handling subscripts involving min, max, and
-complicated expressions requiring temporaries.
-  Fix bug in handling COMMONs that need padding by a char array.
-  msdos/f2cx.exe.Z and msdos/f2c.exe.Z updated (ftp access only).
-
-Fri Mar 12 17:16:16 EST 1993
-  libf77, libi77: updated for compiling under C++.
-
-Mon Mar 15 16:21:37 EST 1993
-  libi77: more minor tweaks (for -DKR_headers); Version.c not changed.
-
-Thu Mar 18 12:37:30 EST 1993
-  Flag -r (for discarding carriage-returns on systems that end lines
-with carriage-return/newline pairs, e.g. PCs) added to xsum, and
-xsum.c converted to ANSI/ISO syntax (with K&R syntax available with
--DKR_headers).  [When time permits, the f2c source will undergo a
-similar conversion.]
-  libi77: tweaks to #includes in endfile.c, err.c, open.c, rawio.h;
-Version.c not changed.
-  f2c.ps updated (to pick up revision of 2 Feb. 1993 to f2c.1).
-
-Fri Mar 19 09:19:26 EST 1993
-  libi77: add (char *) casts to malloc and realloc invocations
-in err.c, open.c; Version.c not changed.
-
-Tue Mar 30 07:17:15 EST 1993
-  Fix bug introduced 6 March 1993: possible memory corruption when
-loops in data statements involve constant subscripts, as in
-	 DATA (GUNIT(1,I),I=0,14)/15*-1/
-
-Tue Mar 30 16:17:42 EST 1993
-  Fix bug with -s: (floating-point array item)*(complex item)
-generates an _subscr() reference for the floating-point array,
-but a #define for the _subscr() was omitted.
-
-Tue Apr  6 12:11:22 EDT 1993
-  libi77: adjust error returns for formatted inputs to flush the current
-input line when err= is specified.  To restore the old behavior (input
-left mid-line), either adjust the #definition of errfl in fio.h or omit
-the invocation of f__doend in err__fl (in err.c).
-
-Tue Apr  6 13:30:04 EDT 1993
-  Fix bug revealed in
-	subroutine foo(i)
-	call goo(int(i))
-	end
-which now passes a copy of i, rather than i itself.
-
-Sat Apr 17 11:41:02 EDT 1993
-  Adjust appending of underscores to conform with f2c.ps ("A Fortran
-to C Converter"): names that conflict with C keywords or f2c type
-names now have just one underscore appended (rather than two); add
-"integer1", "logical1", "longint" to the keyword list.
-  Append underscores to names that appear in EQUIVALENCE and are
-component names in a structure declared in f2c.h, thus avoiding a
-problem caused by the #defines emitted for equivalences.  Example:
-	complex a
-	equivalence (i,j)
-	a = 1	! a.i went awry because of #define i
-	j = 2
-	write(*,*) a, i
-	end
-  Adjust line-breaking logic to avoid splitting very long constants
-(and names).  Example:
-	! The next line starts with tab and thus is a free-format line.
-	a=.012345689012345689012345689012345689012345689012345689012345689012345689
-	end
-  Omit extraneous "return 0;" from entry stubs emitted for multiple
-entry points of type character, complex, or double complex.
-
-Sat Apr 17 14:35:05 EDT 1993
-  Fix bug (introduced 4 Feb.) in separating -P from -A that kept f2c
-from re-reading a .P file written without -A or -C++ describing a
-routine with an external argument.  [See the just-added note about
-separating -P from -A in the changes above for 3 Feb. 1993.]
-  Fix bug (type UNKNOWN for V in the example below) revealed by
-	subroutine a()
-	external c
-	call b(c)
-	end
-	subroutine b(v)
-	end
-
-Sun Apr 18 19:55:26 EDT 1993
-  Fix wrong calling sequence for mem() in yesterday's addition to
-equiv.c .
-
-Wed Apr 21 17:39:46 EDT 1993
-  Fix bug revealed in
-
-      ASSIGN 10 TO L1
-      GO TO 20
- 10   ASSIGN 30 TO L2
-      STOP 10
-
- 20   ASSIGN 10 TO L2	! Bug here because 10 had been assigned
-			! to another label, then defined.
-      GO TO L2
- 30   END
-
-Fri Apr 23 18:38:50 EDT 1993
-  Fix bug with -h revealed in
-	CHARACTER*9 FOO
-	WRITE(FOO,'(I6)') 1
-	WRITE(FOO,'(I6)') 2	! struct icilist io___3 botched
-	END
-
-Tue Apr 27 16:08:28 EDT 1993
-  Tweak to makefile: remove "size f2c".
-
-Tue May  4 23:48:20 EDT 1993
-  libf77: tweak signal_ line of f2ch.add .
-
-Tue Jun  1 13:47:13 EDT 1993
-  Fix bug introduced 3 Feb. 1993 in handling multiple entry
-points with differing return types -- the postfix array in proc.c
-needed a new entry for integer*8 (which resulted in wrong
-Multitype suffixes for non-integral types).
-  For (default) K&R C, generate VOID rather than int functions for
-functions of Fortran type character, complex, and double complex.
-  msdos/f2cx.exe.Z and msdos/f2c.exe.Z updated (ftp access only).
-
-Tue Jun  1 23:11:15 EDT 1993
-  f2c.h: add Multitype component g and commented type longint.
-  proc.c: omit "return 0;" from stubs for complex and double complex
-entries (when entries have multiple types); add test to avoid memory
-fault with illegal combinations of entry types.
-
-Mon Jun  7 12:00:47 EDT 1993
-  Fix memory fault in
-	common /c/ m
-	integer m(1)
-	data m(1)/1/, m(2)/2/	! one too many initializers
-	end
-  msdos/f2cx.exe.Z and msdos/f2c.exe.Z updated (ftp access only).
-
-Fri Jun 18 13:55:51 EDT 1993
-  libi77: change type of signal_ in f2ch.add; change type of il in
-union Uint from long to integer (for machines like the DEC Alpha,
-where integer should be the same as int).  Version.c not changed.
-  Tweak gram.dcl and gram.head: add semicolons after some rules that
-lacked them, and remove an extraneous semicolon.  These changes are
-completely transparent to our local yacc programs, but apparently
-matter on some VMS systems.
-
-Wed Jun 23 01:02:56 EDT 1993
-  Update "fc" shell script, and bring f2c.1 and f2c.1t up to date:
-they're meant to be linked with (i.e., the same as) src/f2c.1 and
-src/f2c.1t .  [In the last update of f2c.1* (2 Feb. 1993), only
-src/f2c.1 and src/f2c.1t got changed -- a mistake.]
-
-Wed Jun 23 09:04:31 EDT 1993
-  libi77: fix bug in format reversions for internal writes.
-Example:
-	character*60 lines(2)
-	write(lines,"('n =',i3,2(' more text',i3))") 3, 4, 5, 6
-	write(*,*) 'lines(1) = ', lines(1)
-	write(*,*) 'lines(2) = ', lines(2)
-	end
-gave an error message that began "iio: off end of record", rather
-than giving the correct output:
-
- lines(1) = n =  3 more text  4 more text  5
- lines(2) =  more text  6 more text
-
-Thu Aug  5 11:31:14 EDT 1993
-  libi77: lread.c: fix bug in handling repetition counts for logical
-data (during list or namelist input).  Change struct f__syl to
-struct syl (for buggy compilers).
-
-Sat Aug  7 16:05:30 EDT 1993
-  libi77: lread.c (again): fix bug in namelist reading of incomplete
-logical arrays.
-  Fix minor calling-sequence errors in format.c, output.c, putpcc.c:
-should be invisible.
-
-Mon Aug  9 09:12:38 EDT 1993
-  Fix erroneous cast under -A in translating
-	character*(*) function getc()
-	getc(2:3)=' '		!wrong cast in first arg to s_copy
-	end
-  libi77: lread.c: fix bug in namelist reading of an incomplete array
-of numeric data followed by another namelist item whose name starts
-with 'd', 'D', 'e', or 'E'.
-
-Fri Aug 20 13:22:10 EDT 1993
-  Fix bug in do while revealed by
-	subroutine skdig (line, i)
-	character line*(*), ch*1
-	integer i
-	logical isdigit
-	isdigit(ch) = ch.ge.'0' .and. ch.le.'9'
-	do while (isdigit(line(i:i)))	! ch__1[0] was set before
-					! "while(...) {...}"
-		i = i + 1
-		enddo
-	end
-
-Fri Aug 27 08:22:54 EDT 1993
-  Add #ifdefs to avoid declaring atol when it is a macro; version.c
-not updated.
-
-Wed Sep  8 12:24:26 EDT 1993
-  libi77: open.c: protect #include "sys/..." with
-#ifndef NON_UNIX_STDIO; Version date not changed.
-
-Thu Sep  9 08:51:21 EDT 1993
-  Adjust "include" to interpret file names relative to the directory
-of the file that contains the "include".
-
-Fri Sep 24 00:56:12 EDT 1993
-  Fix offset error resulting from repeating the same equivalence
-statement twice.  Example:
-	real a(2), b(2)
-	equivalence (a(2), b(2))
-	equivalence (a(2), b(2))
-	end
-  Increase MAXTOKENLEN (to roughly the largest allowed by ANSI C).
-
-Mon Sep 27 08:55:09 EDT 1993
-  libi77: endfile.c: protect #include "sys/types.h" with
-#ifndef NON_UNIX_STDIO; Version.c not changed.
-
-Fri Oct 15 15:37:26 EDT 1993
-  Fix rarely seen parsing bug illustrated by
-	subroutine foo(xabcdefghij)
-	character*(*) xabcdefghij
-               IF (xabcdefghij.NE.'##') GOTO 40
- 40	end
-in which the spacing in the IF line is crucial.
-
-Thu Oct 21 13:55:11 EDT 1993
-  Give more meaningful error message (then "unexpected character in
-cds") when constant simplification leads to Infinity or NaN.
-
-Wed Nov 10 15:01:05 EST 1993
-  libi77: backspace.c: adjust, under -DMSDOS, to cope with MSDOS
-text files, as handled by some popular PC C compilers.  Beware:
-the (defective) libraries associated with these compilers assume lines
-end with \r\n (conventional MS-DOS text files) -- and ftell (and
-hence the current implementation of backspace) screws up if lines with
-just \n.
-
-Thu Nov 18 09:37:47 EST 1993
-  Give a better error (than "control stack empty") for an extraneous
-ENDDO.  Example:
-	enddo
-	end
-  Update comments about ftp in "readme from f2c".
-
-Sun Nov 28 17:26:50 EST 1993
-  Change format of time stamp in version.c to yyyymmdd.
-  Sort parameter adjustments (or complain of impossible dependencies)
-so that dummy arguments are referenced only after being adjusted.
-Example:
-	subroutine foo(a,b)
-	integer a(2)		! a must be adjusted before b
-	double precision b(a(1),a(2))
-	call goo(b(3,4))
-	end
-  Adjust structs for initialized common blocks and equivalence classes
-to omit the trailing struct component added to force alignment when
-padding already forces the desired alignment.  Example:
-	PROGRAM TEST
-	COMMON /Z/ A, CC
-	CHARACTER*4 CC
-	DATA cc /'a'/
-	END
-now gives
-	struct {
-	    integer fill_1[1];
-	    char e_2[4];
-	    } z_ = { {0}, {'a', ' ', ' ', ' '} };
-rather than
-struct {
-    integer fill_1[1];
-    char e_2[4];
-    real e_3;
-    } z_ = { {0}, {'a', ' ', ' ', ' '}, (float)0. };
-
-Wed Dec  8 16:24:43 EST 1993
-  Adjust lex.c to recognize # nnn "filename" lines emitted by cpp;
-this affects the file names and line numbers in error messages and
-the #line lines emitted under -g.
-  Under -g, arrange for a file that starts with an executable
-statement to have the first #line line indicate line 1, rather
-than the line number of the END statement ending the main program.
-  Adjust fc script to run files ending in .F through /lib/cpp.
-  Fix bug ("Impossible tag 2") in
-	if (t .eq. (0,2)) write(*,*) 'Bug!'
-	end
-  libi77: iio.c: adjust internal formatted reads to treat short records
-as though padded with blanks (rather than causing an "off end of record"
-error).
-
-Wed Dec 15 15:19:15 EST 1993
-  fc: adjusted for .F files to pass -D and -I options to cpp.
-
-Fri Dec 17 20:03:38 EST 1993
-  Fix botch introduced 28 Nov. 1993 in vax.c; change "version of"
-to "version".
-
-Tue Jan  4 15:39:52 EST 1994
-  msdos/f2cx.exe.Z and msdos/f2c.exe.Z updated (ftp access only).
-
-Wed Jan 19 08:55:19 EST 1994
-  Arrange to accept
-	integer	Nx, Ny, Nz
-	parameter	(Nx = 10, Ny = 20)
-	parameter	(Nz = max(Nx, Ny))
-	integer	c(Nz)
-	call foo(c)
-	end
-rather than complaining "Declaration error for c: adjustable dimension
-on non-argument".  The necessary changes cause some hitherto unfolded
-constant expressions to be folded.
-  Accept BYTE as a synonym for INTEGER*1.
-
-Thu Jan 27 08:57:40 EST 1994
-  Fix botch in changes of 19 Jan. 1994 that broke entry points with
-multi-dimensional array arguments that did not appear in the subprogram
-argument list and whose leading dimensions depend on arguments.
-
-Mon Feb  7 09:24:30 EST 1994
-  Remove artifact in "fc" script that caused -O to be ignored:
-	87c87
-	<		# lcc ignores -O...
-	---
-	>		CFLAGS="$CFLAGS $O"
-
-Sun Feb 20 17:04:58 EST 1994
-  Fix bugs reading .P files for routines with arguments of type
-INTEGER*1, INTEGER*8, LOGICAL*2.
-  Fix glitch in reporting inconsistent arguments for routines involving
-character arguments:  "arg n" had n too large by the number of
-character arguments.
-
-Tue Feb 22 20:50:08 EST 1994
-  Trivial changes to data.c format.c main.c niceprintf.c output.h and
-sysdep.h (consistency improvements).
-  libI77: lread.c: check for NULL return from realloc.
-
-Fri Feb 25 23:56:08 EST 1994
-  output.c, sysdep.h: arrange for -DUSE_DTOA to use dtoa.c and g_fmt.c
-for correctly rounded decimal values on IEEE-arithmetic machines
-(plus machines with VAX and IBM-mainframe arithmetic).  These
-routines are available from netlib's fp directory.
-  msdos/f2cx.exe.Z and msdos/f2c.exe.Z updated (ftp access only); the
-former uses -DUSE_DTOA to keep 12 from printing as 12.000000000000001.
-  vax.c: fix wrong arguments to badtag and frchain introduced
-28 Nov. 1993.
-  Source for f2c converted to ANSI/ISO format, with the K&R format
-available by compilation with -DKR_headers .
-  Arrange for (double precision expression) relop (single precision
-constant) to retain the single-precision nature of the constant.
-Example:
-	double precision t
-	if (t .eq. 0.3) ...
-
-Mon Feb 28 11:40:24 EST 1994
-  README updated to reflect a modification just made to netlib's
-"dtoa.c from fp":
-96a97,105
-> Also add the rule
->
-> 	dtoa.o: dtoa.c
-> 		$(CC) -c $(CFLAGS) -DMALLOC=ckalloc -DIEEE... dtoa.c
->
-> (without the initial tab) to the makefile, where IEEE... is one of
-> IEEE_MC68k, IEEE_8087, VAX, or IBM, depending on your machine's
-> arithmetic.  See the comments near the start of dtoa.c.
->
-
-Sat Mar  5 09:41:52 EST 1994
-  Complain about functions with the name of a previously declared
-common block (which is illegal).
-  New option -d specifies the directory for output .c and .P files;
-f2c.1 and f2c.1t updated.  The former undocumented debug option -dnnn
-is now -Dnnn.
-
-Thu Mar 10 10:21:44 EST 1994
-  libf77: add #undef min and #undef max lines to s_paus.c s_stop.c
-and system_.c; Version.c not changed.
-  libi77: add -DPad_UDread lines to uio.c and explanation to README:
-    Some buggy Fortran programs use unformatted direct I/O to write
-    an incomplete record and later read more from that record than
-    they have written.  For records other than the last, the unwritten
-    portion of the record reads as binary zeros.  The last record is
-    a special case: attempting to read more from it than was written
-    gives end-of-file -- which may help one find a bug.  Some other
-    Fortran I/O libraries treat the last record no differently than
-    others and thus give no help in finding the bug of reading more
-    than was written.  If you wish to have this behavior, compile
-    uio.c with -DPad_UDread .
-Version.c not changed.
-
-Tue Mar 29 17:27:54 EST 1994
-  Adjust make_param so dimensions involving min, max, and other
-complicated constant expressions do not provoke error messages
-about adjustable dimensions on non-arguments.
-  Fix botch introduced 19 Jan 1994: "adjustable dimension on non-
-argument" messages could cause some things to be freed twice.
-
-Tue May 10 07:55:12 EDT 1994
-  Trivial changes to exec.c, p1output.c, parse_args.c, proc.c,
-and putpcc.c: change arguments from
-	type foo[]
-to
-	type *foo
-for consistency with defs.h.  For most compilers, this makes no
-difference.
-
-Thu Jun  2 12:18:18 EDT 1994
-  Fix bug in handling FORMAT statements that have adjacent character
-(or Hollerith) strings: an extraneous \002 appeared between the
-strings.
-  libf77: under -DNO_ONEXIT, arrange for f_exit to be called just
-once; previously, upon abnormal termination (including stop statements),
-it was called twice.
-
-Mon Jun  6 15:52:57 EDT 1994
-  libf77: Avoid references to SIGABRT and SIGIOT if neither is defined;
-Version.c not changed.
-  libi77: Add cast to definition of errfl() in fio.h; this only matters
-on systems with sizeof(int) < sizeof(long).  Under -DNON_UNIX_STDIO,
-use binary mode for direct formatted files (to avoid any confusion
-connected with \n characters).
-
-Fri Jun 10 16:47:31 EDT 1994
-  Fix bug under -A in handling unreferenced (and undeclared)
-external arguments in subroutines with multiple entry points.  Example:
-	subroutine m(fcn,futil)
-	external fcn,futil
-	call fcn
-	entry mintio(i1) ! (D_fp)0 rather than (U_fp)0 for futil
-	end
-
-Wed Jun 15 10:38:14 EDT 1994
-  Allow char(constant expression) function in parameter declarations.
-(This was probably broken in the changes of 29 March 1994.)
-
-Fri Jul  1 23:54:00 EDT 1994
-  Minor adjustments to makefile (rule for f2c.1 commented out) and
-sysdep.h (#undef KR_headers if __STDC__ is #defined, and base test
-for ANSI_Libraries and ANSI_Prototypes on KR_headers rather than
-__STDC__); version.c touched but not changed.
-  libi77: adjust fp.h so local.h is only needed under -DV10;
-Version.c not changed.
-
-Tue Jul  5 03:05:46 EDT 1994
-  Fix segmentation fault in
-	subroutine foo(a,b,k)
-	data i/1/
-	double precision a(k,1)	! sequence error: must precede data
-	b = a(i,1)
-	end
-  libi77: Fix bug (introduced 6 June 1994?) in reopening files under
-NON_UNIX_STDIO.
-  Fix some error messages caused by illegal Fortran.  Examples:
-* 1.
-	x(i) = 0  !Missing declaration for array x
-	call f(x) !Said Impossible storage class 8 in routine mkaddr
-	end	  !Now says invalid use of statement function x
-* 2.
-	f = g	!No declaration for g; by default it's a real variable
-	call g	!Said invalid class code 2 for function g
-	end	!Now says g cannot be called
-* 3.
-	intrinsic foo	!Invalid intrinsic name
-	a = foo(b)	!Said intrcall: bad intrgroup 0
-	end		!Now just complains about line 1
-
-Tue Jul  5 11:14:26 EDT 1994
-  Fix glitch in handling erroneous statement function declarations.
-Example:
-	a(j(i) - i) = a(j(i) - i) + 1	! bad statement function
-	call foo(a(3))	! Said Impossible type 0 in routine mktmpn
-	end		! Now warns that i and j are not used
-
-Wed Jul  6 17:31:25 EDT 1994
-  Tweak test for statement functions that (illegally) call themselves;
-f2c will now proceed to check for other errors, rather than bailing
-out at the first recursive statement function reference.
-  Warn about but retain divisions by 0 (instead of calling them
-"compiler errors" and quiting).  On IEEE machines, this permits
-	double precision nan, ninf, pinf
-	nan = 0.d0/0.d0
-	pinf = 1.d0/0.d0
-	ninf = -1.d0/0.d0
-	write(*,*) 'nan, pinf, ninf = ', nan, pinf, ninf
-	end
-to print
-	nan, pinf, ninf =   NaN  Infinity -Infinity
-  libi77: wref.c: protect with #ifdef GOOD_SPRINTF_EXPONENT an
-optimization that requires exponents to have 2 digits when 2 digits
-suffice.  lwrite.c wsfe.c (list and formatted external output):
-omit ' ' carriage-control when compiled with -DOMIT_BLANK_CC .
-Off-by-one bug fixed in character count for list output of character
-strings.  Omit '.' in list-directed printing of Nan, Infinity.
-
-Mon Jul 11 13:05:33 EDT 1994
-  src/gram.c updated.
-
-Tue Jul 12 10:24:42 EDT 1994
-  libi77: wrtfmt.c: under G11.4, write 0. as "  .0000    " rather
-than "  .0000E+00".
-
-Thu Jul 14 17:55:46 EDT 1994
-  Fix glitch in changes of 6 July 1994 that could cause erroneous
-"division by zero" warnings (or worse).  Example:
-	subroutine foo(a,b)
-	y = b
-	a = a / y	! erroneous warning of division by zero
-	end
-
-Mon Aug  1 16:45:17 EDT 1994
-  libi77: lread.c rsne.c: for benefit of systems with a buggy stdio.h,
-declare ungetc when neither KR_headers nor ungetc is #defined.
-Version.c not changed.
-
-Wed Aug  3 01:53:00 EDT 1994
-  libi77: lwrite.c (list output): do not insert a newline when
-appending an oversize item to an empty line.
-
-Mon Aug  8 00:51:01 EDT 1994
-  Fix bug (introduced 3 Feb. 1993) that, under -i2, kept LOGICAL*2
-variables from appearing in INQUIRE statements.  Under -I2, allow
-LOGICAL*4 variables to appear in INQUIRE.  Fix intrinsic function
-LEN so it returns a short value under -i2, a long value otherwise.
-  exec.c: fix obscure memory fault possible with bizarre (and highly
-erroneous) DO-loop syntax.
-
-Fri Aug 12 10:45:57 EDT 1994
-  libi77: fix glitch that kept ERR= (in list- or format-directed input)
-from working after a NAMELIST READ.
-
-Thu Aug 25 13:58:26 EDT 1994
-  Suppress -s when -C is specified.
-  Give full pathname (netlib@research.att.com) for netlib in readme and
-src/README.
-
-Wed Sep  7 22:13:20 EDT 1994
-  libi77: typesize.c: adjust to allow types LOGICAL*1, LOGICAL*2,
-INTEGER*1, and (under -DAllow_TYQUAD) INTEGER*8 in NAMELISTs.
-
-Fri Sep 16 17:50:18 EDT 1994
-  Change name adjustment for reserved words: instead of just appending
-"_" (a single underscore), append "_a_" to local variable names to avoid
-trouble when a common block is named a reserved word and the same
-reserved word is also a local variable name.  Example:
-	common /const/ a,b,c
-	real const(3)
-	equivalence (const(1),a)
-	a = 1.234
-	end
-  Arrange for ichar() to treat characters as unsigned.
-  libf77: s_cmp.c: treat characters as unsigned in comparisons.
-These changes for unsignedness only matter for strings that contain
-non-ASCII characters.  Now ichar() should always be >= 0.
-
-Sat Sep 17 11:19:32 EDT 1994
-  fc: set rc=$? before exit (to get exit code right in trap code).
-
-Mon Sep 19 17:49:43 EDT 1994
-  libf77: s_paus.c: flush stderr after PAUSE; add #ifdef MSDOS stuff.
-  libi77: README: point out general need for -DMSDOS under MS-DOS.
-
-Tue Sep 20 11:42:30 EDT 1994
-  Fix bug in comparing identically named common blocks, in which
-all components have the same names and types, but at least one is
-dimensioned (1) and the other is not dimensioned.  Example:
-	subroutine foo
-	common /ab/ a
-	a=1.	!!! translated correctly to ab_1.a = (float)1.;
-	end
-	subroutine goo
-	common /ab/ a(1)
-	a(1)=2.	!!! translated erroneously to ab_1.a[0] = (float)2.
-	end
-
-Tue Sep 27 23:47:34 EDT 1994
-  Fix bug introduced 16 Sept. 1994: don't add _a_ to C keywords
-used as external names.  In fact, return to earlier behavior of
-appending __ to C keywords unless they are used as external names,
-in which case they get just one underscore appended.
-  Adjust constant handling so integer and logical PARAMETERs retain
-type information, particularly under -I2.  Example:
-	SUBROUTINE FOO
-	INTEGER I
-	INTEGER*1 I1
-	INTEGER*2 I2
-	INTEGER*4 I4
-	LOGICAL L
-	LOGICAL*1 L1
-	LOGICAL*2 L2
-	LOGICAL*4 L4
-	PARAMETER (L=.FALSE., L1=.FALSE., L2=.FALSE., L4=.FALSE.)
-	PARAMETER (I=0,I1=0,I2=0,I4=0)
-	CALL DUMMY(I, I1, I2, I4, L, L1, L2, L4)
-	END
-  f2c.1t: Change f\^2c to f2c (omit half-narrow space) in line following
-".SH NAME" for benefit of systems that cannot cope with troff commands
-in this context.
-
-Wed Sep 28 12:45:19 EDT 1994
-  libf77: s_cmp.c fix glitch in -DKR_headers version introduced
-12 days ago.
-
-Thu Oct  6 09:46:53 EDT 1994
-  libi77: util.c: omit f__mvgbt (which is never used).
-  f2c.h: change "long" to "long int" to facilitate the adjustments
-by means of sed described above.  Comment out unused typedef of Long.
-
-Fri Oct 21 18:02:24 EDT 1994
-  libf77: add s_catow.c and adjust README to point out that changing
-"s_cat.o" to "s_catow.o" in the makefile will permit the target of a
-concatenation to appear on its right-hand side (contrary to the
-Fortran 77 Standard and at the cost of some run-time efficiency).
-
-Wed Nov  2 00:03:58 EST 1994
-  Adjust -g output to contain only one #line line per statement,
-inserting \ before the \n ending lines broken because of their
-length [this insertion was recanted 10 Dec. 1994].  This change
-accommodates an idiocy in the ANSI/ISO C standard, which leaves
-undefined the behavior of #line lines that occur within the arguments
-to a macro call.
-
-Wed Nov  2 14:44:27 EST 1994
-  libi77: under compilation with -DALWAYS_FLUSH, flush buffers at
-the end of each write statement, and test (via the return from
-fflush) for write failures, which can be caught with an ERR=
-specifier in the write statement.  This extra flushing slows
-execution, but can abort execution or alter the flow of control
-when a disk fills up.
-  f2c/src/io.c: Add ERR= test to e_wsle invocation (end of
-list-directed external output) to catch write failures when libI77
-is compiled with -DALWAYS_FLUSH.
-
-Thu Nov  3 10:59:13 EST 1994
-  Fix bug in handling dimensions involving certain intrinsic
-functions of constant expressions: the expressions, rather than
-pointers to them, were passed.  Example:
-      subroutine subtest(n,x)
-      real x(2**n,n) ! pow_ii(2,n) was called; now it's pow_ii(&c__2,n)
-      x(2,2)=3.
-      end
-
-Tue Nov  8 23:56:30 EST 1994
-  malloc.c: remove assumption that only malloc calls sbrk.  This
-appears to make malloc.c useful on RS6000 systems.
-
-Sun Nov 13 13:09:38 EST 1994
-  Turn off constant folding of integers used in floating-point
-expressions, so the assignment in
-	subroutine foo(x)
-	double precision x
-	x = x*1000000*500000
-	end
-is rendered as
-	*x = *x * 1000000 * 500000;
-rather than as
-	*x *= 1783793664;
-
-Sat Dec 10 16:31:40 EST 1994
-  Supply a better error message (than "Impossible type 14") for
-	subroutine foo
-	foo = 3
-	end
-  Under -g, convey name of included files to #line lines.
-  Recant insertion of \ introduced (under -g) 2 Nov. 1994.
-
-Thu Dec 15 14:33:55 EST 1994
-  New command-line option -Idir specifies directories in which to
-look for non-absolute include files (after looking in the directory
-of the current input file).  There can be several -Idir options, each
-specifying one directory.  All -Idir options are considered, from
-left to right, until a suitably named file is found.  The -I2 and -I4
-command-line options have precedence, so directories named 2 or 4
-must be spelled by some circumlocation, such as -I./2 .
-  f2c.ps updated to mention the new -Idir option, correct a typo,
-and bring the man page at the end up to date.
-  lex.c: fix bug in reading line numbers in #line lines.
-  fc updated to pass -Idir options to f2c.
-
-Thu Dec 29 09:48:03 EST 1994
-  Fix bug (e.g., addressing fault) in diagnosing inconsistency in
-the type of function eta in the following example:
-	function foo(c1,c2)
-	double complex foo,c1,c2
-	double precision eta
-	foo = eta(c1,c2)
-	end
-	function eta(c1,c2)
-	double complex eta,c1,c2
-	eta = c1*c2
-	end
-
-Mon Jan  2 13:27:26 EST 1995
-  Retain casts for SNGL (or FLOAT) that were erroneously optimized
-away.  Example:
-	subroutine foo(a,b)
-	double precision a,b
-	a = float(b)	! now rendered as *a = (real) (*b);
-	end
-  Use float (rather than double) temporaries in certain expressions
-of type complex.  Example: the temporary for sngl(b) in
-	complex a
-	double precision b
-	a = sngl(b) - (3.,4.)
-is now of type float.
-
-Fri Jan  6 00:00:27 EST 1995
-  Adjust intrinsic function cmplx to act as dcmplx (returning
-double complex rather than complex) if either of its args is of
-type double precision.  The double temporaries used prior to 2 Jan.
-1995 previously gave it this same behavior.
-
-Thu Jan 12 12:31:35 EST 1995
-  Adjust -krd to use double temporaries in some calculations of
-type complex.
-  libf77: pow_[dhiqrz][hiq].c: adjust x**i to work on machines
-that sign-extend right shifts when i is the most negative integer.
-
-Wed Jan 25 00:14:42 EST 1995
-  Fix memory fault in handling overlapping initializations in
-	block data
-	common /zot/ d
-	double precision d(3)
-	character*6 v(4)
-	real r(2)
-	equivalence (d(3),r(1)), (d(1),v(1))
-	data v/'abcdef', 'ghijkl', 'mnopqr', 'stuvwx'/
-	data r/4.,5./
-	end
-  names.c: add "far", "huge", "near" to c_keywords (causing them
-to have __ appended when used as local variables).
-  libf77: add s_copyow.c, an alternative to s_copy.c for handling
-(illegal) character assignments where the right- and left-hand
-sides overlap, as in a(2:4) = a(1:3).
-
-Thu Jan 26 14:21:19 EST 1995
-  libf77: roll s_catow.c and s_copyow.c into s_cat.c and s_copy.c,
-respectively, allowing the left-hand side of a character assignment
-to appear on its right-hand side unless s_cat.c and s_copy.c are
-compiled with -DNO_OVERWRITE (which is a bit more efficient).
-Fortran 77 forbids the left-hand side from participating in the
-right-hand side (of a character assignment), but Fortran 90 allows it.
-  libi77: wref.c: fix glitch in printing the exponent of 0 when
-GOOD_SPRINTF_EXPONENT is not #defined.
-
-Fri Jan 27 12:25:41 EST 1995
-  Under -C++ -ec (or -C++ -e1c), surround struct declarations with
-	#ifdef __cplusplus
-	extern "C" {
-	#endif
-and
-	#ifdef __cplusplus
-	}
-	#endif
-(This isn't needed with cfront, but apparently is necessary with
-some other C++ compilers.)
-  libf77: minor tweak to s_copy.c: copy forward whenever possible
-(for better cache behavior).
-
-Wed Feb  1 10:26:12 EST 1995
-  Complain about parameter statements that assign values to dummy
-arguments, as in
-	subroutine foo(x)
-	parameter(x = 3.4)
-	end
-
-Sat Feb  4 20:22:02 EST 1995
-  fc: omit "lib=/lib/num/lib.lo".
-
-Wed Feb  8 08:41:14 EST 1995
-  Minor changes to exec.c, putpcc.c to avoid "bad tag" or "error
-in frexpr" with certain invalid Fortran.
-
-Sat Feb 11 08:57:39 EST 1995
-  Complain about integer overflows, both in simplifying integer
-expressions, and in converting integers from decimal to binary.
-  Fix a memory fault in putcx1() associated with invalid input.
-
-Thu Feb 23 11:20:59 EST 1995
-  Omit MAXTOKENLEN; realloc token if necessary (to handle very long
-strings).
-
-Fri Feb 24 11:02:00 EST 1995
-  libi77: iio.c: z_getc: insert (unsigned char *) to allow internal
-reading of characters with high-bit set (on machines that sign-extend
-characters).
-
-Tue Mar 14 18:22:42 EST 1995
-  Fix glitch (in io.c) in handling 0-length strings in format
-statements, as in
-	write(*,10)
- 10	format(' ab','','cd')
-  libi77: lread.c and rsfe.c: adjust s_rsle and s_rsfe to check for
-end-of-file (to prevent infinite loops with empty read statements).
-
-Wed Mar 22 10:01:46 EST 1995
-  f2c.ps: adjust discussion of -P on p. 7 to reflect a change made
-3 Feb. 1993: -P no longer implies -A.
-
-Fri Apr 21 18:35:00 EDT 1995
-  fc script: remove absolute paths (since PATH specifies only standard
-places).  On most systems, it's still necessary to adjust the PATH
-assignment at the start of fc to fit the local conventions.
-
-Fri May 26 10:03:17 EDT 1995
-  fc script: add recognition of -P and .P files.
-  libi77: iio.c: z_wnew: fix bug in handling T format items in internal
-writes whose last item is written to an earlier position than some
-previous item.
-
-Wed May 31 11:39:48 EDT 1995
-  libf77: added subroutine exit(rc) (with integer return code rc),
-which works like a stop statement but supplies rc as the program's
-return code.
-
-Fri Jun  2 11:56:50 EDT 1995
-  Fix memory fault in
-	parameter (x=2.)
-	data x /2./
-	end
-This now elicits two error messages; the second ("too many
-initializers"), though not desirable, seems hard to eliminate
-without considerable hassle.
-
-Mon Jul 17 23:24:20 EDT 1995
-  Fix botch in simplifying constants in certain complex
-expressions.  Example:
-	subroutine foo(s,z)
-	double complex z
-	double precision s, M, P
-	parameter ( M = 100.d0, P = 2.d0 )
-	z = M * M  / s  * dcmplx (1.d0, P/M)
-*** The imaginary part of z was miscomputed ***
-	end
-  Under -ext, complain about nonintegral dimensions.
-
-Fri Jul 21 11:18:36 EDT 1995
-  Fix glitch on line 159 of init.c: change
-	"(shortlogical *)0)",
-to
-	"(shortlogical *)0",
-This affects multiple entry points when some but not all have
-arguments of type logical*2.
-  libi77: adjust lwrite.c, wref.c, wrtfmt.c so compiling with
--DWANT_LEAD_0 causes formatted writes of floating-point numbers of
-magnitude < 1 to have an explicit 0 before the decimal point (if the
-field-width permits it).  Note that the Fortran 77 Standard leaves it
-up to the implementation whether to supply these superfluous zeros.
-
-Tue Aug  1 09:25:56 EDT 1995
-  Permit real (or double precision) parameters in dimension expressions.
-
-Mon Aug  7 08:04:00 EDT 1995
-  Append "_eqv" rather than just "_" to names that that appear in
-EQUIVALENCE statements as well as structs in f2c.h (to avoid a
-conflict when these names also name common blocks).
-
-Tue Aug  8 12:49:02 EDT 1995
-  Modify yesterday's change: merge st_fields with c_keywords, to
-cope with equivalences introduced to permit initializing numeric
-variables with character data.  DATA statements causing these
-equivalences can appear after executable statements, so the only
-safe course is to rename all local variable with names in the
-former st_fields list.  This has the unfortunate side effect that
-the common local variable "i" will henceforth be renamed "i__".
-
-Wed Aug 30 00:19:32 EDT 1995
-  libf77: add F77_aloc, now used in s_cat and system_ (to allocate
-memory and check for failure in so doing).
-  libi77: improve MSDOS logic in backspace.c.
-
-Wed Sep  6 09:06:19 EDT 1995
-  libf77: Fix return type of system_ (integer) under -DKR_headers.
-  libi77: Move some f_init calls around for people who do not use
-libF77's main(); now open and namelist read statements that are the
-first I/O statements executed should work right in that context.
-Adjust namelist input to treat a subscripted name whose subscripts do
-not involve colons similarly to the name without a subscript:  accept
-several values, stored in successive elements starting at the
-indicated subscript.  Adjust namelist output to quote character
-strings (avoiding confusion with arrays of character strings).
-
-Thu Sep  7 00:36:04 EDT 1995
-  Fix glitch in integer*8 exponentiation function: it's pow_qq, not
-pow_qi.
-  libi77: fix some bugs with -DAllow_TYQUAD (for integer*8); when
-looking for the &name that starts NAMELIST input, treat lines whose
-first nonblank character is something other than &, $, or ? as
-comment lines (i.e., ignore them), unless rsne.c is compiled with
--DNo_Namelist_Comments.
-
-Thu Sep  7 09:05:40 EDT 1995
-  libi77: rdfmt.c:  one more tweak for -DAllow_TYQUAD.
-
-Tue Sep 19 00:03:02 EDT 1995
-  Adjust handling of floating-point subscript bounds (a questionable
-f2c extension) so subscripts in the generated C are of integral type.
-  Move #define of roundup to proc.c (where its use is commented out);
-version.c left at 19950918.
-
-Wed Sep 20 17:24:19 EDT 1995
-  Fix bug in handling ichar() under -h.
-
-Thu Oct  5 07:52:56 EDT 1995
-  libi77: wrtfmt.c: fix bug with t editing (f__cursor was not always
-zeroed in mv_cur).
-
-Tue Oct 10 10:47:54 EDT 1995
-  Under -ext, warn about X**-Y and X**+Y.  Following the original f77,
-f2c treats these as X**(-Y) and X**(+Y), respectively.  (They are not
-allowed by the official Fortran 77 Standard.)  Some Fortran compilers
-give a bizarre interpretation to larger contexts, making multiplication
-noncommutative: they treat X**-Y*Z as X**(-Y*Z) rather than X**(-Y)*Z,
-which, following the rules of Fortran 77, is the same as (X**(-Y))*Z.
-
-Wed Oct 11 13:27:05 EDT 1995
-  libi77: move defs of f__hiwater, f__svic, f__icptr from wrtfmt.c
-to err.c.  This should work around a problem with buggy loaders and
-sometimes leads to smaller executable programs.
-
-Sat Oct 21 23:54:22 EDT 1995
-  Under -h, fix bug in the treatment of ichar('0') in arithmetic
-expressions.
-  Demote to -dneg (a new command-line option not mentioned in the
-man page) imitation of the original f77's treatment of unary minus
-applied to a REAL operand (yielding a DOUBLE PRECISION result).
-Previously this imitation (which was present for debugging) occurred
-under (the default) -!R.  It is still suppressed by -R.
-
-Tue Nov  7 23:52:57 EST 1995
-  Adjust assigned GOTOs to honor SAVE declarations.
-  Add comments about ranlib to lib[FI]77/README and makefile.
-
-Tue Dec 19 22:54:06 EST 1995
-  libf77: s_cat.c: fix bug when 2nd or later arg overlaps lhs.
-
-Tue Jan  2 17:54:00 EST 1996
-  libi77: rdfmt.c: move #include "ctype.h" up before "stdlib.h"; no
-change to Version.c.
-
-Sun Feb 25 22:20:20 EST 1996
-  Adjust expr.c to permit raising the integer constants 1 and -1 to
-negative constant integral powers.
-  Avoid faulting when -T and -d are not followed by a directory name
-(immediately, without intervening spaces).
-
-Wed Feb 28 12:49:01 EST 1996
-  Fix a glitch in handling complex parameters assigned a "wrong" type.
-Example:
-	complex d, z
-	parameter(z = (0d0,0d0))
-	data d/z/	! elicited "non-constant initializer"
-	call foo(d)
-	end
-
-Thu Feb 29 00:53:12 EST 1996
-  Fix bug in handling character parameters assigned a char() value.
-Example:
-	character*2 b,c
-	character*1 esc
-	parameter(esc = char(27))
-	integer i
-	data (b(i:i),i=1,2)/esc,'a'/
-	data (c(i:i),i=1,2)/esc,'b'/	! memory fault
-	call foo(b,c)
-	end
-
-Fri Mar  1 23:44:51 EST 1996
-  Fix glitch in evaluating .EQ. and .NE. when both operands are
-logical constants (.TRUE. or .FALSE.).
-
-Fri Mar 15 17:29:54 EST 1996
-  libi77: lread.c, rsfe.c: honor END= in READ stmts with empty iolist.
-
-Tue Mar 19 23:08:32 EST 1996
-  lex.c: arrange for a "statement" consisting of a single short bogus
-keyword to elicit an error message showing the whole keyword.  The
-error message formerly omitted the last letter of the bad keyword.
-  libf77: s_cat.c: supply missing break after overlap detection.
-
-Mon May 13 23:35:26 EDT 1996
-  Recognize Fortran 90's /= as a synonym for .NE..  (<> remains a
-synonym for .NE..)
-  Emit an empty int function of no arguments to supply an external
-name to named block data subprograms (so they can be called somewhere
-to force them to be loaded from a library).
-  Fix bug (memory fault) in handling the following illegal Fortran:
-	parameter(i=1)
-	equivalence(i,j)
-	end
-  Treat cdabs, cdcos, cdexp, cdlog, cdsin, and cdsqrt as synonyms for
-the double complex intrinsics zabs, zcos, zexp, zlog, zsin, and zsqrt,
-respectively, unless -cd is specified.
-  Recognize the Fortran 90 bit-manipulation intrinsics btest, iand,
-ibclr, ibits, ibset, ieor, ior, ishft, and ishftc, unless -i90 is
-specified.  Note that iand, ieor, and ior are thus now synonyms for
-"and", "xor", and "or", respectively.
-  Add three macros (bit_test, bit_clear, bit_set) to f2c.h for use
-with btest, ibclr, and ibset, respectively.  Add new functions
-[lq]bit_bits, [lq]bit_shift, and [lq]_bit_cshift to libF77 for
-use with ibits, ishft, and ishftc, respectively.
-  Add integer function ftell(unit) (returning -1 on error) and
-subroutine fseek(unit, offset, whence, *) to libI77 (with branch to
-label * on error).
-
-Tue May 14 23:21:12 EDT 1996
-  Fix glitch (possible memory fault, or worse) in handling multiple
-entry points with names over 28 characters long.
-
-Mon Jun 10 01:20:16 EDT 1996
-  Update netlib E-mail and ftp addresses in f2c/readme and
-f2c/src/readme (which are different files) -- to reflect the upcoming
-breakup of AT&T.
-  libf77: trivial tweaks to F77_aloc.c and system_.c; Version.c not
-changed.
-  libi77: Adjust rsli.c and lread.c so internal list input with too
-few items in the input string will honor end= .
-
-Mon Jun 10 22:59:57 EDT 1996
-  Add Bits_per_Byte to sysdep.h and adjust definition of Table_size
-to depend on Bits_per_Byte (forcing Table_size to be a power of 2); in
-lex.c, change "comstart[c & 0xfff]" to "comstart[c & (Table_size-1)]"
-to avoid an out-of-range subscript on end-of-file.
-
-Wed Jun 12 00:24:28 EDT 1996
-  Fix bug in output.c (dereferencing a freed pointer) revealed in
-	print *		!np in out_call in output.c clobbered by free
-	end		!during out_expr.
-
-Wed Jun 19 08:12:47 EDT 1996
-  f2c.h: add types uinteger, ulongint (for libF77); add qbit_clear
-and qbit_set macros (in a commented-out section) for integer*8.
-  For integer*8, use qbit_clear and qbit_set for ibclr and ibset.
-  libf77: add casts to unsigned in [lq]bitshft.c.
-
-Thu Jun 20 13:30:43 EDT 1996
-  Complain at character*(*) in common (rather than faulting).
-  Fix bug in recognizing hex constants that start with "16#" (e.g.,
-16#1234abcd, which is a synonym for z'1234abcd').
-  Fix bugs in constant folding of expressions involving btest, ibclr,
-and ibset.
-  Fix bug in constant folding of rshift(16#80000000, -31) (on a 32-bit
-machine; more generally, the bug was in constant folding of
-rshift(ibset(0,NBITS-1), 1-NBITS) when f2c runs on a machine with
-long ints having NBITS bits.
-
-Mon Jun 24 07:58:53 EDT 1996
-  Adjust struct Literal and newlabel() function to accommodate huge
-source files (with more than 32767 newlabel() invocations).
-  Omit .c file when the .f file has a missing final end statement.
-
-Wed Jun 26 14:00:02 EDT 1996
-  libi77: Add discussion of MXUNIT (highest allowed Fortran unit number)
-to libI77/README.
-
-Fri Jun 28 14:16:11 EDT 1996
-  Fix glitch with -onetrip: the temporary variable used for nonconstant
-initial loop variable values was recycled too soon.  Example:
-	do i = j+1, k
-		call foo(i+1)	! temp for j+1 was reused here
-		enddo
-	end
-
-Tue Jul  2 16:11:27 EDT 1996
-  formatdata.c: add a 0 to the end of the basetype array (for TYBLANK)
-(an omission that was harmless on most machines).
-  expr.c: fix a dereference of NULL that was only possible with buggy
-input, such as
-	subroutine $sub(s)	! the '$' is erroneous
-	character s*(*)
-	s(1:) = ' '
-	end
-
-Sat Jul  6 00:44:56 EDT 1996
-  Fix glitch in the intrinsic "real" function when applied to a
-complex (or double complex) variable and passed as an argument to
-some intrinsic functions.  Example:
-	complex a
-	b = sqrt(a)
-	end
-  Fix glitch (only visible if you do not use f2c's malloc and the
-malloc you do use is defective in the sense that malloc(0) returns 0)
-in handling include files that end with another include (perhaps
-followed by comments).
-  Fix glitch with character*(*) arguments named "h" and "i" when
-the body of the subroutine invokes the intrinsic LEN function.
-  Arrange that after a previous "f2c -P foo.f" has produced foo.P,
-running "f2c foo.P foo.f" will produce valid C when foo.f contains
-	call sub('1234')
-	end
-	subroutine sub(msg)
-	end
-Specifically, the length argument in "call sub" is now suppressed.
-With or without foo.P, it is also now suppressed when the order of
-subprograms in file foo.f is reversed:
-	subroutine sub(msg)
-	end
-	call sub('1234')
-	end
-  Adjust copyright notices to reflect AT&T breakup.
-
-Wed Jul 10 09:25:49 EDT 1996
-  Fix bug (possible memory fault) in handling erroneously placed
-and inconsistent declarations.  Example that faulted:
-	character*1 w(8)
-	call foo(w)
-	end
-	subroutine foo(m)
-	data h /0.5/
-	integer m(2)	! should be before data
-	end
-  Fix bug (possible fault) in handling illegal "if" constructions.
-Example (that faulted):
-	subroutine foo(i,j)
-	if (i) then		! bug: i is integer, not logical
-	else if (j) then	! bug: j is integer, not logical
-	endif
-	end
-  Fix glitch with character*(*) argument named "ret_len" to a
-character*(*) function.
-
-Wed Jul 10 23:04:16 EDT 1996
-  Fix more glitches in the intrinsic "real" function when applied to a
-complex (or double complex) variable and passed as an argument to
-some intrinsic functions.  Example:
-	complex a, b
-	r = sqrt(real(conjg(a))) + sqrt(real(a*b))
-	end
-
-Thu Jul 11 17:27:16 EDT 1996
-  Fix a memory fault associated with complicated, illegal input.
-Example:
-	subroutine goo
-	character a
-	call foo(a)	! inconsistent with subsequent def and call
-	end
-	subroutine foo(a)
-	end
-	call foo(a)
-	end
-
-Wed Jul 17 19:18:28 EDT 1996
-  Fix yet another case of intrinsic "real" applied to a complex
-argument.  Example:
-	complex a(3)
-	x = sqrt(real(a(2)))	! gave error message about bad tag
-	end
-
-Mon Aug 26 11:28:57 EDT 1996
-  Tweak sysdep.c for non-Unix systems in which process ID's can be
-over 5 digits long.
-
-Tue Aug 27 08:31:32 EDT 1996
-  Adjust the ishft intrinsic to use unsigned right shifts.  (Previously,
-a negative constant second operand resulted in a possibly signed shift.)
-
-Thu Sep 12 14:04:07 EDT 1996
-  equiv.c: fix glitch with -DKR_headers.
-  libi77: fmtlib.c: fix bug in printing the most negative integer.
-
-Fri Sep 13 08:54:40 EDT 1996
-  Diagnose some illegal appearances of substring notation.
-
-Tue Sep 17 17:48:09 EDT 1996
-  Fix fault in handling some complex parameters.  Example:
-	subroutine foo(a)
-	double complex a, b
-	parameter(b = (0,1))
-	a = b	! f2c faulted here
-	end
-
-Thu Sep 26 07:47:10 EDT 1996
-  libi77:  fmt.h:  for formatted writes of negative integer*1 values,
-make ic signed on ANSI systems.  If formatted writes of integer*1
-values trouble you when using a K&R C compiler, switch to an ANSI
-compiler or use a compiler flag that makes characters signed.
-
-Tue Oct  1 14:41:36 EDT 1996
-  Give a better error message when dummy arguments appear in data
-statements.
-
-Thu Oct 17 13:37:22 EDT 1996
-  Fix bug in typechecking arguments to character and complex (or
-double complex) functions; the bug could cause length arguments
-for character arguments to be omitted on invocations appearing
-textually after the first invocation.  For example, in
-	subroutine foo
-	character c
-	complex zot
-	call goo(zot(c), zot(c))
-	end
-the length was omitted from the second invocation of zot, and
-there was an erroneous error message about inconsistent calling
-sequences.
-
-Wed Dec  4 13:59:14 EST 1996
-  Fix bug revealed by
-	subroutine test(cdum,rdum)
-	complex cdum
-	rdum=cos(real(cdum))	! "Unexpected tag 3 in opconv_fudge"
-	end
-  Fix glitch in parsing "DO 10 D0 = 1, 10".
-  Fix glitch in parsing
-	real*8 x
-	real*8 x	! erroneous "incompatible type" message
-	call foo(x)
-	end
-
-Mon Dec  9 23:15:02 EST 1996
-  Fix glitch in parameter adjustments for arrays whose lower
-bound depends on a scalar argument.  Example:
-	subroutine bug(p,z,m,n)
-	integer z(*),m,n
-	double precision p(z(m):z(m) + n)	! p_offset botched
-	call foo(p(0), p(n))
-	end
-  libi77: complain about non-positive rec= in direct read and write
-statements.
-  libf77: trivial adjustments; Version.c not changed.
-
-Wed Feb 12 00:18:03 EST 1997
-  output.c: fix (seldom problematic) glitch in out_call: put parens
-around the ... in a test of the form "if (q->tag == TADDR && ...)".
-  vax.c: fix bug revealed in the "psi_offset =" assignment in the
-following example:
-	subroutine foo(psi,m)
-	integer z(100),m
-	common /a/ z
-	double precision psi(z(m):z(m) + 10)
-	call foo(m+1, psi(0),psi(10))
-	end
-
-Mon Feb 24 23:44:54 EST 1997
-  For consistency with f2c's current treatment of adjacent character
-strings in FORMAT statements, recognize a Hollerith string following
-a string (and merge adjacent strings in FORMAT statements).
-
-Wed Feb 26 13:41:11 EST 1997
-  New libf2c.zip, a combination of the libf77 and libi77 bundles (and
-available only by ftp).
-  libf77: adjust functions with a complex output argument to permit
-aliasing it with input arguments.  (For now, at least, this is just
-for possible benefit of g77.)
-  libi77: tweak to ftell_.c for systems with strange definitions of
-SEEK_SET, etc.
-
-Tue Apr  8 20:57:08 EDT 1997
-  libf77: [cz]_div.c: tweaks invisible on most systems (that may
-improve things slightly with optimized compilation on systems that use
-gratuitous extra precision).
-  libi77: fmt.c: adjust to complain at missing numbers in formats
-(but still treat missing ".nnn" as ".0").
-
-Fri Apr 11 14:05:57 EDT 1997
-  libi77: err.c: attempt to make stderr line buffered rather than
-fully buffered.  (Buffering is needed for format items T and TR.)
-
-Thu Apr 17 22:42:43 EDT 1997
- libf77: add F77_aloc.o to makefile (and makefile.u in libf2c.zip).
-
-Fri Apr 25 19:32:09 EDT 1997
- libf77: add [de]time_.c (which may give trouble on some systems).
-
-Tue May 27 09:18:52 EDT 1997
- libi77: ftell_.c: fix typo that caused the third argument to be
-treated as 2 on some systems.
-
-Mon Jun  9 00:04:37 EDT 1997
- libi77 (and libf2c.zip): adjust include order in err.c lread.c wref.c
-rdfmt.c to include fmt.h (etc.) after system includes.  Version.c not
-changed.
-
-Mon Jul 21 16:04:54 EDT 1997
-  proc.c: fix glitch in logic for "nonpositive dimension" message.
-  libi77: inquire.c: always include string.h (for possible use with
--DNON_UNIX_STDIO); Version.c not changed.
-
-Thu Jul 24 17:11:23 EDT 1997
-  Tweak "Notice" to reflect the AT&T breakup -- we missed it when
-updating the copyright notices in the source files last summer.
-  Adjust src/makefile so malloc.o is not used by default, but can
-be specified with "make MALLOC=malloc.o".
-  Add comments to src/README about the "CRAY" T3E.
-
-Tue Aug  5 14:53:25 EDT 1997
-  Add definition of calloc to malloc.c; this makes f2c's malloc
-work on some systems where trouble hitherto arose because references
-to calloc brought in the system's malloc.  (On sensible systems,
-calloc is defined separately from malloc.  To avoid confusion on
-other systems, f2c/malloc.c now defines calloc.)
-  libi77: lread.c: adjust to accord with a change to the Fortran 8X
-draft (in 1990 or 1991) that rescinded permission to elide quote marks
-in namelist input of character data; to get the old behavior, compile
-with F8X_NML_ELIDE_QUOTES #defined.  wrtfmt.o: wrt_G: tweak to print
-the right number of 0's for zero under G format.
-
-Sat Aug 16 05:45:32 EDT 1997
-  libI77: iio.c: fix bug in internal writes to an array of character
-strings that sometimes caused one more array element than required by
-the format to be blank-filled.  Example: format(1x).
diff --git a/gcc/f/runtime/configure b/gcc/f/runtime/configure
deleted file mode 100755
index 9d7b6f5..0000000
--- a/gcc/f/runtime/configure
+++ /dev/null
@@ -1,2051 +0,0 @@
-#! /bin/sh
-
-# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.12 
-# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-
-# Defaults:
-ac_help=
-ac_default_prefix=/usr/local
-# Any additions from configure.in:
-
-# Initialize some variables set by options.
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-build=NONE
-cache_file=./config.cache
-exec_prefix=NONE
-host=NONE
-no_create=
-nonopt=NONE
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-target=NONE
-verbose=
-x_includes=NONE
-x_libraries=NONE
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
-
-# Initialize some other variables.
-subdirs=
-MFLAGS= MAKEFLAGS=
-# Maximum number of lines to put in a shell here document.
-ac_max_here_lines=12
-
-ac_prev=
-for ac_option
-do
-
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval "$ac_prev=\$ac_option"
-    ac_prev=
-    continue
-  fi
-
-  case "$ac_option" in
-  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
-  *) ac_optarg= ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case "$ac_option" in
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir="$ac_optarg" ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build="$ac_optarg" ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file="$ac_optarg" ;;
-
-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
-  | --da=*)
-    datadir="$ac_optarg" ;;
-
-  -disable-* | --disable-*)
-    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
-      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
-    fi
-    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
-    eval "enable_${ac_feature}=no" ;;
-
-  -enable-* | --enable-*)
-    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
-      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
-    fi
-    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
-    case "$ac_option" in
-      *=*) ;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "enable_${ac_feature}='$ac_optarg'" ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix="$ac_optarg" ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he)
-    # Omit some internal or obsolete options to make the list less imposing.
-    # This message is too long to be a string in the A/UX 3.1 sh.
-    cat << EOF
-Usage: configure [options] [host]
-Options: [defaults in brackets after descriptions]
-Configuration:
-  --cache-file=FILE       cache test results in FILE
-  --help                  print this message
-  --no-create             do not create output files
-  --quiet, --silent       do not print \`checking...' messages
-  --version               print the version of autoconf that created configure
-Directory and file names:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [same as prefix]
-  --bindir=DIR            user executables in DIR [EPREFIX/bin]
-  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
-  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
-  --datadir=DIR           read-only architecture-independent data in DIR
-                          [PREFIX/share]
-  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
-                          [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
-  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
-  --includedir=DIR        C header files in DIR [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
-  --infodir=DIR           info documentation in DIR [PREFIX/info]
-  --mandir=DIR            man documentation in DIR [PREFIX/man]
-  --srcdir=DIR            find the sources in DIR [configure dir or ..]
-  --program-prefix=PREFIX prepend PREFIX to installed program names
-  --program-suffix=SUFFIX append SUFFIX to installed program names
-  --program-transform-name=PROGRAM
-                          run sed PROGRAM on installed program names
-EOF
-    cat << EOF
-Host type:
-  --build=BUILD           configure for building on BUILD [BUILD=HOST]
-  --host=HOST             configure for HOST [guessed]
-  --target=TARGET         configure for TARGET [TARGET=HOST]
-Features and packages:
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --x-includes=DIR        X include files are in DIR
-  --x-libraries=DIR       X library files are in DIR
-EOF
-    if test -n "$ac_help"; then
-      echo "--enable and --with options recognized:$ac_help"
-    fi
-    exit 0 ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host="$ac_optarg" ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir="$ac_optarg" ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir="$ac_optarg" ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir="$ac_optarg" ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir="$ac_optarg" ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst \
-  | --locals | --local | --loca | --loc | --lo)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
-    localstatedir="$ac_optarg" ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir="$ac_optarg" ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir="$ac_optarg" ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix="$ac_optarg" ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix="$ac_optarg" ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix="$ac_optarg" ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name="$ac_optarg" ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir="$ac_optarg" ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir="$ac_optarg" ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site="$ac_optarg" ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir="$ac_optarg" ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir="$ac_optarg" ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target="$ac_optarg" ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers)
-    echo "configure generated by autoconf version 2.12"
-    exit 0 ;;
-
-  -with-* | --with-*)
-    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
-      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
-    fi
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case "$ac_option" in
-      *=*) ;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "with_${ac_package}='$ac_optarg'" ;;
-
-  -without-* | --without-*)
-    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
-      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
-    fi
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    eval "with_${ac_package}=no" ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes="$ac_optarg" ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries="$ac_optarg" ;;
-
-  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
-    ;;
-
-  *)
-    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
-      echo "configure: warning: $ac_option: invalid host type" 1>&2
-    fi
-    if test "x$nonopt" != xNONE; then
-      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
-    fi
-    nonopt="$ac_option"
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
-fi
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-# File descriptor usage:
-# 0 standard input
-# 1 file creation
-# 2 errors and warnings
-# 3 some systems may open it to /dev/tty
-# 4 used on the Kubota Titan
-# 6 checking for... messages and results
-# 5 compiler messages saved in config.log
-if test "$silent" = yes; then
-  exec 6>/dev/null
-else
-  exec 6>&1
-fi
-exec 5>./config.log
-
-echo "\
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-" 1>&5
-
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Also quote any args containing shell metacharacters.
-ac_configure_args=
-for ac_arg
-do
-  case "$ac_arg" in
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c) ;;
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
-  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
-  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
-  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
-  esac
-done
-
-# NLS nuisances.
-# Only set these to C if already set.  These must not be set unconditionally
-# because not all systems understand e.g. LANG=C (notably SCO).
-# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
-# Non-C LC_CTYPE values break the ctype check.
-if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
-if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
-if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
-if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo > confdefs.h
-
-# A filename unique to this package, relative to the directory that
-# configure is in, which we can look for to find out if srcdir is correct.
-ac_unique_file=libF77/Version.c
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then its parent.
-  ac_prog=$0
-  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
-  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
-  srcdir=$ac_confdir
-  if test ! -r $srcdir/$ac_unique_file; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r $srcdir/$ac_unique_file; then
-  if test "$ac_srcdir_defaulted" = yes; then
-    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
-  else
-    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
-  fi
-fi
-srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
-
-# Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
-  fi
-fi
-for ac_site_file in $CONFIG_SITE; do
-  if test -r "$ac_site_file"; then
-    echo "loading site script $ac_site_file"
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  echo "loading cache $cache_file"
-  . $cache_file
-else
-  echo "creating cache $cache_file"
-  > $cache_file
-fi
-
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
-  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
-  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
-    ac_n= ac_c='
-' ac_t='	'
-  else
-    ac_n=-n ac_c= ac_t=
-  fi
-else
-  ac_n= ac_c='\c' ac_t=
-fi
-
-
-
-# From configure.in 1.10
-
-# For g77 we'll set CC to point at the built gcc, but this will get it into
-# the makefiles
-# Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:530: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_CC="gcc"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-fi
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
-  echo "$ac_t""$CC" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:559: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  ac_prog_rejected=no
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
-        ac_prog_rejected=yes
-	continue
-      fi
-      ac_cv_prog_CC="cc"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# -gt 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    set dummy "$ac_dir/$ac_word" "$@"
-    shift
-    ac_cv_prog_CC="$@"
-  fi
-fi
-fi
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
-  echo "$ac_t""$CC" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
-fi
-
-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:607: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
-
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-cat > conftest.$ac_ext <<EOF
-#line 617 "configure"
-#include "confdefs.h"
-main(){return(0);}
-EOF
-if { (eval echo configure:621: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-  ac_cv_prog_cc_works=yes
-  # If we can't run a trivial program, we are probably using a cross compiler.
-  if (./conftest; exit) 2>/dev/null; then
-    ac_cv_prog_cc_cross=no
-  else
-    ac_cv_prog_cc_cross=yes
-  fi
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  ac_cv_prog_cc_works=no
-fi
-rm -fr conftest*
-
-echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
-if test $ac_cv_prog_cc_works = no; then
-  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
-fi
-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:641: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
-echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
-cross_compiling=$ac_cv_prog_cc_cross
-
-echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:646: checking whether we are using GNU C" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.c <<EOF
-#ifdef __GNUC__
-  yes;
-#endif
-EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:655: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
-  ac_cv_prog_gcc=yes
-else
-  ac_cv_prog_gcc=no
-fi
-fi
-
-echo "$ac_t""$ac_cv_prog_gcc" 1>&6
-
-if test $ac_cv_prog_gcc = yes; then
-  GCC=yes
-  ac_test_CFLAGS="${CFLAGS+set}"
-  ac_save_CFLAGS="$CFLAGS"
-  CFLAGS=
-  echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:670: checking whether ${CC-cc} accepts -g" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  echo 'void f(){}' > conftest.c
-if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
-  ac_cv_prog_cc_g=yes
-else
-  ac_cv_prog_cc_g=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
-  if test "$ac_test_CFLAGS" = set; then
-    CFLAGS="$ac_save_CFLAGS"
-  elif test $ac_cv_prog_cc_g = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-O2"
-  fi
-else
-  GCC=
-  test "${CFLAGS+set}" = set || CFLAGS="-g"
-fi
-
-if test "$CROSS";then
-  ac_cv_c_cross=yes
-else
-  ac_cv_c_cross=no
-fi
-
-test "$AR" || AR=ar
-
-if test "$RANLIB"; then :
-  
-  if test -z "$RANLIB_TEST"; then
-    RANLIB_TEST=true
-  fi
-else
-  RANLIB_TEST=true
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:715: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_RANLIB="ranlib"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
-fi
-fi
-RANLIB="$ac_cv_prog_RANLIB"
-if test -n "$RANLIB"; then
-  echo "$ac_t""$RANLIB" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-fi
-
-
-
-
-# Sanity check for the cross-compilation case:
-echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:748: checking how to run the C preprocessor" >&5
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-    # This must be in double quotes, not single quotes, because CPP may get
-  # substituted into the Makefile and "${CC-cc}" will confuse make.
-  CPP="${CC-cc} -E"
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp.
-  cat > conftest.$ac_ext <<EOF
-#line 763 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:769: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out`
-if test -z "$ac_err"; then
-  :
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  CPP="${CC-cc} -E -traditional-cpp"
-  cat > conftest.$ac_ext <<EOF
-#line 780 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:786: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out`
-if test -z "$ac_err"; then
-  :
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  CPP=/lib/cpp
-fi
-rm -f conftest*
-fi
-rm -f conftest*
-  ac_cv_prog_CPP="$CPP"
-fi
-  CPP="$ac_cv_prog_CPP"
-else
-  ac_cv_prog_CPP="$CPP"
-fi
-echo "$ac_t""$CPP" 1>&6
-
-ac_safe=`echo "stdio.h" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for stdio.h""... $ac_c" 1>&6
-echo "configure:810: checking for stdio.h" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 815 "configure"
-#include "confdefs.h"
-#include <stdio.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:820: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out`
-if test -z "$ac_err"; then
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=yes"
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  :
-else
-  echo "$ac_t""no" 1>&6
-{ echo "configure: error: Can't find stdio.h.
-You must have a usable C system for the target already installed, at least
-including headers and, preferably, the library, before you can configure
-the G77 runtime system.  If necessary, install gcc now with \`LANGUAGES=c',
-then the target library, then build with \`LANGUAGES=f77'." 1>&2; exit 1; }
-fi
-
-
-echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:848: checking for ANSI C header files" >&5
-if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 853 "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:861: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out`
-if test -z "$ac_err"; then
-  rm -rf conftest*
-  ac_cv_header_stdc=yes
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-cat > conftest.$ac_ext <<EOF
-#line 878 "configure"
-#include "confdefs.h"
-#include <string.h>
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "memchr" >/dev/null 2>&1; then
-  :
-else
-  rm -rf conftest*
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-cat > conftest.$ac_ext <<EOF
-#line 896 "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "free" >/dev/null 2>&1; then
-  :
-else
-  rm -rf conftest*
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-if test "$cross_compiling" = yes; then
-  :
-else
-  cat > conftest.$ac_ext <<EOF
-#line 917 "configure"
-#include "confdefs.h"
-#include <ctype.h>
-#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int main () { int i; for (i = 0; i < 256; i++)
-if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
-exit (0); }
-
-EOF
-if { (eval echo configure:928: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
-then
-  :
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  ac_cv_header_stdc=no
-fi
-rm -fr conftest*
-fi
-
-fi
-fi
-
-echo "$ac_t""$ac_cv_header_stdc" 1>&6
-if test $ac_cv_header_stdc = yes; then
-  cat >> confdefs.h <<\EOF
-#define STDC_HEADERS 1
-EOF
-
-fi
-
-
-
-echo $ac_n "checking for posix""... $ac_c" 1>&6
-echo "configure:954: checking for posix" >&5
-if eval "test \"`echo '$''{'g77_cv_header_posix'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 959 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <unistd.h>
-#ifdef _POSIX_VERSION
-  yes
-#endif
-
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "yes" >/dev/null 2>&1; then
-  rm -rf conftest*
-  g77_cv_header_posix=yes
-else
-  rm -rf conftest*
-  g77_cv_header_posix=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$g77_cv_header_posix" 1>&6
-
-# We can rely on the GNU library being posix-ish.  I guess checking the 
-# header isn't actually like checking the functions, though...
-echo $ac_n "checking for GNU library""... $ac_c" 1>&6
-echo "configure:985: checking for GNU library" >&5
-if eval "test \"`echo '$''{'g77_cv_lib_gnu'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 990 "configure"
-#include "confdefs.h"
-#include <stdio.h>
-#ifdef __GNU_LIBRARY__
-  yes
-#endif
-
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "yes" >/dev/null 2>&1; then
-  rm -rf conftest*
-  g77_cv_lib_gnu=yes
-else
-  rm -rf conftest*
-  g77_cv_lib_gnu=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$g77_cv_lib_gnu" 1>&6
-
-# Apparently cygwin needs to be special-cased.
-echo $ac_n "checking for cyg\`win'32""... $ac_c" 1>&6
-echo "configure:1014: checking for cyg\`win'32" >&5
-if eval "test \"`echo '$''{'g77_cv_sys_cygwin32'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1019 "configure"
-#include "confdefs.h"
-#ifdef __CYGWIN32__
-  yes
-#endif
-
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "yes" >/dev/null 2>&1; then
-  rm -rf conftest*
-  g77_cv_sys_cygwin32=yes
-else
-  rm -rf conftest*
-  g77_cv_sys_cygwin32=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$g77_cv_sys_cygwin32" 1>&6
-
-ac_safe=`echo "fcntl.h" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for fcntl.h""... $ac_c" 1>&6
-echo "configure:1042: checking for fcntl.h" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1047 "configure"
-#include "confdefs.h"
-#include <fcntl.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1052: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out`
-if test -z "$ac_err"; then
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=yes"
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  test $g77_cv_header_posix = yes && cat >> confdefs.h <<\EOF
-#define _POSIX_SOURCE 1
-EOF
-
-else
-  echo "$ac_t""no" 1>&6
-cat >> confdefs.h <<\EOF
-#define NO_FCNTL 1
-EOF
- cat >> confdefs.h <<\EOF
-#define OPEN_DECL 1
-EOF
-
-fi
-
-
-echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:1085: checking for working const" >&5
-if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1090 "configure"
-#include "confdefs.h"
-
-int main() {
-
-/* Ultrix mips cc rejects this.  */
-typedef int charset[2]; const charset x;
-/* SunOS 4.1.1 cc rejects this.  */
-char const *const *ccp;
-char **p;
-/* NEC SVR4.0.2 mips cc rejects this.  */
-struct point {int x, y;};
-static struct point const zero = {0,0};
-/* AIX XL C 1.02.0.0 rejects this.
-   It does not let you subtract one const X* pointer from another in an arm
-   of an if-expression whose if-part is not a constant expression */
-const char *g = "string";
-ccp = &g + (g ? g-g : 0);
-/* HPUX 7.0 cc rejects these. */
-++ccp;
-p = (char**) ccp;
-ccp = (char const *const *) p;
-{ /* SCO 3.2v4 cc rejects this.  */
-  char *t;
-  char const *s = 0 ? (char *) 0 : (char const *) 0;
-
-  *t++ = 0;
-}
-{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
-  int x[] = {25, 17};
-  const int *foo = &x[0];
-  ++foo;
-}
-{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
-  typedef const int *iptr;
-  iptr p = 0;
-  ++p;
-}
-{ /* AIX XL C 1.02.0.0 rejects this saying
-     "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
-  struct s { int j; const int *ap[3]; };
-  struct s *b; b->j = 5;
-}
-{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
-  const int foo = 10;
-}
-
-; return 0; }
-EOF
-if { (eval echo configure:1139: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  ac_cv_c_const=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_c_const=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_c_const" 1>&6
-if test $ac_cv_c_const = no; then
-  cat >> confdefs.h <<\EOF
-#define const 
-EOF
-
-fi
-
-echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:1160: checking for size_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1165 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
-  rm -rf conftest*
-  ac_cv_type_size_t=yes
-else
-  rm -rf conftest*
-  ac_cv_type_size_t=no
-fi
-rm -f conftest*
-
-fi
-echo "$ac_t""$ac_cv_type_size_t" 1>&6
-if test $ac_cv_type_size_t = no; then
-  cat >> confdefs.h <<\EOF
-#define size_t unsigned
-EOF
-
-fi
-
-
-echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
-echo "configure:1194: checking return type of signal handlers" >&5
-if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1199 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <signal.h>
-#ifdef signal
-#undef signal
-#endif
-#ifdef __cplusplus
-extern "C" void (*signal (int, void (*)(int)))(int);
-#else
-void (*signal ()) ();
-#endif
-
-int main() {
-int i;
-; return 0; }
-EOF
-if { (eval echo configure:1216: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  ac_cv_type_signal=void
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_type_signal=int
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_type_signal" 1>&6
-cat >> confdefs.h <<EOF
-#define RETSIGTYPE $ac_cv_type_signal
-EOF
-
-
-# we'll get atexit by default
-if test $ac_cv_header_stdc != yes; then
-echo $ac_n "checking for atexit""... $ac_c" 1>&6
-echo "configure:1237: checking for atexit" >&5
-if eval "test \"`echo '$''{'ac_cv_func_atexit'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1242 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char atexit(); below.  */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char atexit();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_atexit) || defined (__stub___atexit)
-choke me
-#else
-atexit();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:1265: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-  rm -rf conftest*
-  eval "ac_cv_func_atexit=yes"
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_func_atexit=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'atexit`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  cat >> confdefs.h <<\EOF
-#define onexit atexit
-EOF
-
-else
-  echo "$ac_t""no" 1>&6
-  cat >> confdefs.h <<\EOF
-#define NO_ONEXIT 1
-EOF
-
-  echo $ac_n "checking for onexit""... $ac_c" 1>&6
-echo "configure:1290: checking for onexit" >&5
-if eval "test \"`echo '$''{'ac_cv_func_onexit'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1295 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char onexit(); below.  */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char onexit();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_onexit) || defined (__stub___onexit)
-choke me
-#else
-onexit();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:1318: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-  rm -rf conftest*
-  eval "ac_cv_func_onexit=yes"
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_func_onexit=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'onexit`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  :
-else
-  echo "$ac_t""no" 1>&6
-echo $ac_n "checking for on_exit""... $ac_c" 1>&6
-echo "configure:1336: checking for on_exit" >&5
-if eval "test \"`echo '$''{'ac_cv_func_on_exit'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1341 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char on_exit(); below.  */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char on_exit();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_on_exit) || defined (__stub___on_exit)
-choke me
-#else
-on_exit();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:1364: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-  rm -rf conftest*
-  eval "ac_cv_func_on_exit=yes"
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_func_on_exit=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'on_exit`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  cat >> confdefs.h <<\EOF
-#define onexit on_exit
-EOF
-
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-fi
-
-fi
-
-else true
-fi
-
-# This should always succeed on unix.
-# Apparently positive result on cygwin loses re. NON_UNIX_STDIO
-# (as of cygwin b18).
-echo $ac_n "checking for fstat""... $ac_c" 1>&6
-echo "configure:1397: checking for fstat" >&5
-if eval "test \"`echo '$''{'ac_cv_func_fstat'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1402 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char fstat(); below.  */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char fstat();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_fstat) || defined (__stub___fstat)
-choke me
-#else
-fstat();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:1425: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-  rm -rf conftest*
-  eval "ac_cv_func_fstat=yes"
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_func_fstat=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'fstat`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  :
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-echo $ac_n "checking need for NON_UNIX_STDIO""... $ac_c" 1>&6
-echo "configure:1445: checking need for NON_UNIX_STDIO" >&5
-if test $g77_cv_sys_cygwin32 = yes || test $ac_cv_func_fstat = no; then
-  echo "$ac_t""yes" 1>&6
-  cat >> confdefs.h <<\EOF
-#define NON_UNIX_STDIO 1
-EOF
-
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-# This is necessary for e.g. Linux:
-echo $ac_n "checking for necessary members of struct FILE""... $ac_c" 1>&6
-echo "configure:1458: checking for necessary members of struct FILE" >&5
-if eval "test \"`echo '$''{'g77_cv_struct_FILE'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1463 "configure"
-#include "confdefs.h"
-#include <stdio.h>
-int main() {
-FILE s; s._ptr; s._base; s._flag;
-; return 0; }
-EOF
-if { (eval echo configure:1470: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  g77_cv_struct_FILE=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  g77_cv_struct_FILE=no
-fi
-rm -f conftest*
-fi
-echo "$ac_t""$g77_cv_struct_FILE" 1>&6
-if test $g77_cv_struct_FILE = no; then
-  cat >> confdefs.h <<\EOF
-#define MISSING_FILE_ELEMS 1
-EOF
-
-fi
-
-echo $ac_n "checking for drem in -lm""... $ac_c" 1>&6
-echo "configure:1490: checking for drem in -lm" >&5
-ac_lib_var=`echo m'_'drem | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  ac_save_LIBS="$LIBS"
-LIBS="-lm  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1498 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char drem();
-
-int main() {
-drem()
-; return 0; }
-EOF
-if { (eval echo configure:1509: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  cat >> confdefs.h <<\EOF
-#define IEEE_drem 1
-EOF
-
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-
-
-# posix will guarantee the right behaviour for sprintf, else we can't be
-# sure; HEADER_STDC wouldn't be the right check in sunos4, for instance.
-# However, on my sunos4/gcc setup unistd.h leads us wrongly to believe
-# we're posix-conformant, so always do the test.
-echo $ac_n "checking for ansi/posix sprintf result""... $ac_c" 1>&6
-echo "configure:1539: checking for ansi/posix sprintf result" >&5
-if test "$cross_compiling" = yes; then
-  g77_cv_sys_sprintf_ansi=no
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1544 "configure"
-#include "confdefs.h"
-  #include <stdio.h>
-    /* does sprintf return the number of chars transferred? */
-    main () {char foo[2]; (sprintf(foo, "1") == 1) ? exit(0) : exit(1);}
-
-EOF
-if { (eval echo configure:1551: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
-then
-  g77_cv_sys_sprintf_ansi=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  g77_cv_sys_sprintf_ansi=no
-fi
-rm -fr conftest*
-fi
-
-if eval "test \"`echo '$''{'g77_cv_sys_sprintf_ansi'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  g77_cv_sys_sprintf_ansi=$g77_cv_sys_sprintf_ansi
-fi
-
-if test $ac_cv_c_cross = no; then
-  echo "$ac_t""$g77_cv_sys_sprintf_ansi" 1>&6
-else
-  echo "$ac_t""can't tell -- assuming no" 1>&6
-fi
-# The cygwin patch takes steps to avoid defining USE_STRLEN here -- I don't
-# understand why.
-if test $g77_cv_sys_sprintf_ansi != yes; then 
-  cat >> confdefs.h <<\EOF
-#define USE_STRLEN 1
-EOF
-
-fi
-
-# define NON_ANSI_RW_MODES on unix (can't hurt)
-echo $ac_n "checking NON_ANSI_RW_MODES""... $ac_c" 1>&6
-echo "configure:1585: checking NON_ANSI_RW_MODES" >&5
-cat > conftest.$ac_ext <<EOF
-#line 1587 "configure"
-#include "confdefs.h"
-#ifdef unix
-  yes
-#endif
-#ifdef __unix
-  yes
-#endif
-#ifdef __unix__
-  yes
-#endif
-
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "yes" >/dev/null 2>&1; then
-  rm -rf conftest*
-  is_unix=yes
-else
-  rm -rf conftest*
-  is_unix=no
-fi
-rm -f conftest*
-
-if test $g77_cv_sys_cygwin32 = yes; then
-  echo "$ac_t""no" 1>&6
-else
-  if test $is_unix = yes; then
-    cat >> confdefs.h <<\EOF
-#define NON_ANSI_RW_MODES 1
-EOF
-
-    echo "$ac_t""yes" 1>&6
-  else
-    echo "$ac_t""no" 1>&6
-  fi
-fi
-
-# We have to firkle with the info in hconfig.h to figure out suitable types
-# (via com.h).  proj.h and com.h are in $srcdir/.., config.h which they need
-# is in ../.. and the config files are in $srcdir/../../config.
-echo $ac_n "checking f2c integer type""... $ac_c" 1>&6
-echo "configure:1628: checking f2c integer type" >&5
-late_ac_cpp=$ac_cpp
-ac_cpp="$late_ac_cpp -I$srcdir/.. -I../.. -I$srcdir/../.. -I$srcdir/../../config"
-if eval "test \"`echo '$''{'g77_cv_sys_f2cinteger'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1635 "configure"
-#include "confdefs.h"
-#include "proj.h"
-#define FFECOM_DETERMINE_TYPES 1
-#include "com.h"
-#if FFECOM_f2cINTEGER == FFECOM_f2ccodeLONG
-F2C_INTEGER=long int
-#elif FFECOM_f2cINTEGER == FFECOM_f2ccodeINT
-F2C_INTEGER=int
-#else
-#  error "Cannot find a suitable type for F2C_INTEGER"
-#endif
-
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "F2C_INTEGER=long int" >/dev/null 2>&1; then
-  rm -rf conftest*
-  g77_cv_sys_f2cinteger="long int"
-fi
-rm -f conftest*
-
-if test "$g77_cv_sys_f2cinteger" = ""; then
-  cat > conftest.$ac_ext <<EOF
-#line 1658 "configure"
-#include "confdefs.h"
-#include "proj.h"
-#define FFECOM_DETERMINE_TYPES 1
-#include "com.h"
-#if FFECOM_f2cINTEGER == FFECOM_f2ccodeLONG
-F2C_INTEGER=long int
-#elif FFECOM_f2cINTEGER == FFECOM_f2ccodeINT
-F2C_INTEGER=int
-#else
-#  error "Cannot find a suitable type for F2C_INTEGER"
-#endif
-
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "F2C_INTEGER=int" >/dev/null 2>&1; then
-  rm -rf conftest*
-  g77_cv_sys_f2cinteger=int
-fi
-rm -f conftest*
-
-fi
-if test "$g77_cv_sys_f2cinteger" = ""; then
-  echo "$ac_t""""" 1>&6
-  { echo "configure: error: Can't determine type for f2c integer; config.log may help." 1>&2; exit 1; }
-fi
-
-fi
-
-echo "$ac_t""$g77_cv_sys_f2cinteger" 1>&6
-F2C_INTEGER=$g77_cv_sys_f2cinteger
-ac_cpp=$late_ac_cpp
-
-
-echo $ac_n "checking f2c long int type""... $ac_c" 1>&6
-echo "configure:1693: checking f2c long int type" >&5
-late_ac_cpp=$ac_cpp
-ac_cpp="$late_ac_cpp -I$srcdir/.. -I../.. -I$srcdir/../.. -I$srcdir/../../config"
-if eval "test \"`echo '$''{'g77_cv_sys_f2clongint'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1700 "configure"
-#include "confdefs.h"
-#include "proj.h"
-#define FFECOM_DETERMINE_TYPES 1
-#include "com.h"
-#if FFECOM_f2cLONGINT == FFECOM_f2ccodeLONG
-F2C_LONGINT=long int
-#elif FFECOM_f2cLONGINT == FFECOM_f2ccodeLONGLONG
-F2C_LONGINT=long long int
-#else
-#  error "Cannot find a suitable type for F2C_LONGINT"
-#endif
-
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "F2C_LONGINT=long int" >/dev/null 2>&1; then
-  rm -rf conftest*
-  g77_cv_sys_f2clongint="long int"
-fi
-rm -f conftest*
-
-if test "$g77_cv_sys_f2clongint" = ""; then
-  cat > conftest.$ac_ext <<EOF
-#line 1723 "configure"
-#include "confdefs.h"
-#include "proj.h"
-#define FFECOM_DETERMINE_TYPES 1
-#include "com.h"
-#if FFECOM_f2cLONGINT == FFECOM_f2ccodeLONG
-F2C_LONGINT=long int
-#elif FFECOM_f2cLONGINT == FFECOM_f2ccodeLONGLONG
-F2C_LONGINT=long long int
-#else
-#  error "Cannot find a suitable type for F2C_LONGINT"
-#endif
-
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "F2C_LONGINT=long long int" >/dev/null 2>&1; then
-  rm -rf conftest*
-  g77_cv_sys_f2clongint="long long int"
-fi
-rm -f conftest*
-
-fi
-if test "$g77_cv_sys_f2clongint" = ""; then
-  echo "$ac_t""""" 1>&6
-  { echo "configure: error: Can't determine type for f2c long int; config.log may help." 1>&2; exit 1; }
-fi
-
-fi
-
-echo "$ac_t""$g77_cv_sys_f2clongint" 1>&6
-F2C_LONGINT=$g77_cv_sys_f2clongint
-ac_cpp=$late_ac_cpp
-
-
-
-
-
-
-# This EOF_CHAR is a misfeature on unix.
-cat >> confdefs.h <<\EOF
-#define NO_EOF_CHAR_CHECK 1
-EOF
-
-
-cat >> confdefs.h <<\EOF
-#define Skip_f2c_Undefs 1
-EOF
-
-
-
-
-
-cat >> confdefs.h <<\EOF
-#define Pad_UDread 1
-EOF
-
-
-
-
-
-cat >> confdefs.h <<\EOF
-#define WANT_LEAD_0 1
-EOF
-
-
-# avoid confusion in case the `makefile's from the f2c distribution have
-# got put here
-test -f libF77/makefile && mv libF77/makefile  libF77/makefile.ori
-test -f libI77/makefile && mv libI77/makefile  libI77/makefile.ori
-test -f libU77/makefile && mv libU77/makefile  libU77/makefile.ori
-
-trap '' 1 2 15
-cat > confcache <<\EOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs.  It is not useful on other systems.
-# If it contains results you don't want to keep, you may remove or edit it.
-#
-# By default, configure uses ./config.cache as the cache file,
-# creating it if it does not exist already.  You can give configure
-# the --cache-file=FILE option to use a different cache file; that is
-# what configure does when it calls configure scripts in
-# subdirectories, so they share the cache.
-# Giving --cache-file=/dev/null disables caching, for debugging configure.
-# config.status only pays attention to the cache file if you give it the
-# --recheck option to rerun configure.
-#
-EOF
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(set) 2>&1 |
-  case `(ac_space=' '; set) 2>&1` in
-  *ac_space=\ *)
-    # `set' does not quote correctly, so add quotes (double-quote substitution
-    # turns \\\\ into \\, and sed turns \\ into \).
-    sed -n \
-      -e "s/'/'\\\\''/g" \
-      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
-    ;;
-  *)
-    # `set' quotes correctly as required by POSIX, so do not add quotes.
-    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
-    ;;
-  esac >> confcache
-if cmp -s $cache_file confcache; then
-  :
-else
-  if test -w $cache_file; then
-    echo "updating cache $cache_file"
-    cat confcache > $cache_file
-  else
-    echo "not updating unwritable cache $cache_file"
-  fi
-fi
-rm -f confcache
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# Any assignment to VPATH causes Sun make to only execute
-# the first set of double-colon rules, so remove it if not needed.
-# If there is a colon in the path, we need to keep it.
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
-fi
-
-trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
-
-# Transform confdefs.h into DEFS.
-# Protect against shell expansion while executing Makefile rules.
-# Protect against Makefile macro expansion.
-cat > conftest.defs <<\EOF
-s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
-s%[ 	`~#$^&*(){}\\|;'"<>?]%\\&%g
-s%\[%\\&%g
-s%\]%\\&%g
-s%\$%$$%g
-EOF
-DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
-rm -f conftest.defs
-
-
-# Without the "./", some shells look in PATH for config.status.
-: ${CONFIG_STATUS=./config.status}
-
-echo creating $CONFIG_STATUS
-rm -f $CONFIG_STATUS
-cat > $CONFIG_STATUS <<EOF
-#! /bin/sh
-# Generated automatically by configure.
-# Run this file to recreate the current configuration.
-# This directory was configured as follows,
-# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-#
-# $0 $ac_configure_args
-#
-# Compiler output produced by configure, useful for debugging
-# configure, is in ./config.log if it exists.
-
-ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
-for ac_option
-do
-  case "\$ac_option" in
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
-    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
-  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
-    echo "$CONFIG_STATUS generated by autoconf version 2.12"
-    exit 0 ;;
-  -help | --help | --hel | --he | --h)
-    echo "\$ac_cs_usage"; exit 0 ;;
-  *) echo "\$ac_cs_usage"; exit 1 ;;
-  esac
-done
-
-ac_given_srcdir=$srcdir
-
-trap 'rm -fr `echo "Makefile ../../include/f2c.h:f2c.h.in libI77/Makefile libF77/Makefile libU77/Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-# Protect against being on the right side of a sed subst in config.status.
-sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
- s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
-$ac_vpsub
-$extrasub
-s%@CFLAGS@%$CFLAGS%g
-s%@CPPFLAGS@%$CPPFLAGS%g
-s%@CXXFLAGS@%$CXXFLAGS%g
-s%@DEFS@%$DEFS%g
-s%@LDFLAGS@%$LDFLAGS%g
-s%@LIBS@%$LIBS%g
-s%@exec_prefix@%$exec_prefix%g
-s%@prefix@%$prefix%g
-s%@program_transform_name@%$program_transform_name%g
-s%@bindir@%$bindir%g
-s%@sbindir@%$sbindir%g
-s%@libexecdir@%$libexecdir%g
-s%@datadir@%$datadir%g
-s%@sysconfdir@%$sysconfdir%g
-s%@sharedstatedir@%$sharedstatedir%g
-s%@localstatedir@%$localstatedir%g
-s%@libdir@%$libdir%g
-s%@includedir@%$includedir%g
-s%@oldincludedir@%$oldincludedir%g
-s%@infodir@%$infodir%g
-s%@mandir@%$mandir%g
-s%@CC@%$CC%g
-s%@AR@%$AR%g
-s%@RANLIB@%$RANLIB%g
-s%@RANLIB_TEST@%$RANLIB_TEST%g
-s%@CPP@%$CPP%g
-s%@F2C_INTEGER@%$F2C_INTEGER%g
-s%@F2C_LONGINT@%$F2C_LONGINT%g
-s%@CROSS@%$CROSS%g
-
-CEOF
-EOF
-
-cat >> $CONFIG_STATUS <<\EOF
-
-# Split the substitutions into bite-sized pieces for seds with
-# small command number limits, like on Digital OSF/1 and HP-UX.
-ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
-ac_file=1 # Number of current file.
-ac_beg=1 # First line for current file.
-ac_end=$ac_max_sed_cmds # Line after last line for current file.
-ac_more_lines=:
-ac_sed_cmds=""
-while $ac_more_lines; do
-  if test $ac_beg -gt 1; then
-    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
-  else
-    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
-  fi
-  if test ! -s conftest.s$ac_file; then
-    ac_more_lines=false
-    rm -f conftest.s$ac_file
-  else
-    if test -z "$ac_sed_cmds"; then
-      ac_sed_cmds="sed -f conftest.s$ac_file"
-    else
-      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
-    fi
-    ac_file=`expr $ac_file + 1`
-    ac_beg=$ac_end
-    ac_end=`expr $ac_end + $ac_max_sed_cmds`
-  fi
-done
-if test -z "$ac_sed_cmds"; then
-  ac_sed_cmds=cat
-fi
-EOF
-
-cat >> $CONFIG_STATUS <<EOF
-
-CONFIG_FILES=\${CONFIG_FILES-"Makefile ../../include/f2c.h:f2c.h.in libI77/Makefile libF77/Makefile libU77/Makefile"}
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case "$ac_file" in
-  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
-       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
-  *) ac_file_in="${ac_file}.in" ;;
-  esac
-
-  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
-
-  # Remove last slash and all that follows it.  Not all systems have dirname.
-  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
-  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
-    # The file is in a subdirectory.
-    test ! -d "$ac_dir" && mkdir "$ac_dir"
-    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
-    # A "../" for each directory in $ac_dir_suffix.
-    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
-  else
-    ac_dir_suffix= ac_dots=
-  fi
-
-  case "$ac_given_srcdir" in
-  .)  srcdir=.
-      if test -z "$ac_dots"; then top_srcdir=.
-      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
-  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
-  *) # Relative path.
-    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
-    top_srcdir="$ac_dots$ac_given_srcdir" ;;
-  esac
-
-
-  echo creating "$ac_file"
-  rm -f "$ac_file"
-  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
-  case "$ac_file" in
-  *Makefile*) ac_comsub="1i\\
-# $configure_input" ;;
-  *) ac_comsub= ;;
-  esac
-
-  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
-  sed -e "$ac_comsub
-s%@configure_input@%$configure_input%g
-s%@srcdir@%$srcdir%g
-s%@top_srcdir@%$top_srcdir%g
-" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
-fi; done
-rm -f conftest.s*
-
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-
-exit 0
-EOF
-chmod +x $CONFIG_STATUS
-rm -fr confdefs* $ac_clean_files
-test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
-
-
-
diff --git a/gcc/f/runtime/configure.in b/gcc/f/runtime/configure.in
deleted file mode 100644
index 7b1ed2c..0000000
--- a/gcc/f/runtime/configure.in
+++ /dev/null
@@ -1,375 +0,0 @@
-# Process this file with autoconf to produce a configure script.
-#   Copyright (C) 1995, 1997 Free Software Foundation, Inc.
-#   Contributed by Dave Love (d.love@dl.ac.uk).
-#
-#This file is part of GNU Fortran.
-#
-#GNU Fortran 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 Fortran 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 Fortran; see the file COPYING.  If not, write to
-#the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-#02111-1307, USA.
-
-AC_INIT(libF77/Version.c)
-
-AC_REVISION(1.10)
-
-dnl Checks for programs.
-# For g77 we'll set CC to point at the built gcc, but this will get it into
-# the makefiles
-AC_PROG_CC
-dnl AC_C_CROSS
-dnl Gives misleading `(cached)' message from the check.
-if test "$CROSS";then
-  ac_cv_c_cross=yes
-else
-  ac_cv_c_cross=no
-fi
-
-dnl These should be inherited in the recursive make, but ensure they are
-dnl defined:
-test "$AR" || AR=ar
-AC_SUBST(AR)
-if test "$RANLIB"; then :
-  AC_SUBST(RANLIB)
-dnl Make sure that RANLIB_TEST is set also.
-  if test -z "$RANLIB_TEST"; then
-    RANLIB_TEST=true
-  fi
-else
-  RANLIB_TEST=true
-  AC_PROG_RANLIB
-fi
-AC_SUBST(RANLIB_TEST)
-
-dnl not needed for g77?
-dnl AC_PROG_MAKE_SET
-
-dnl Checks for libraries.
-
-dnl Checks for header files.
-# Sanity check for the cross-compilation case:
-AC_CHECK_HEADER(stdio.h,:,
-  [AC_MSG_ERROR([Can't find stdio.h.
-You must have a usable C system for the target already installed, at least
-including headers and, preferably, the library, before you can configure
-the G77 runtime system.  If necessary, install gcc now with \`LANGUAGES=c',
-then the target library, then build with \`LANGUAGES=f77'.])])
-
-AC_HEADER_STDC
-dnl We could do this if we didn't know we were using gcc
-dnl AC_MSG_CHECKING(for prototype-savvy compiler)
-dnl AC_CACHE_VAL(g77_cv_sys_proto,                
-dnl   [AC_TRY_LINK(,                             
-dnl dnl looks screwy because TRY_LINK expects a function body
-dnl    [return 0;} int foo (int * bar) {],       
-dnl    g77_cv_sys_proto=yes,                      
-dnl    [g77_cv_sys_proto=no                       
-dnl     AC_DEFINE(KR_headers)])])                
-dnl AC_MSG_RESULT($g77_cv_sys_proto)              
-
-dnl for U77
-dnl AC_CHECK_HEADERS(unistd.h)
-
-AC_MSG_CHECKING(for posix)
-AC_CACHE_VAL(g77_cv_header_posix,
-  AC_EGREP_CPP(yes,
-  [#include <sys/types.h>
-#include <unistd.h>
-#ifdef _POSIX_VERSION
-  yes
-#endif
-], 
-  g77_cv_header_posix=yes,
-  g77_cv_header_posix=no))
-AC_MSG_RESULT($g77_cv_header_posix)
-
-# We can rely on the GNU library being posix-ish.  I guess checking the 
-# header isn't actually like checking the functions, though...
-AC_MSG_CHECKING(for GNU library)
-AC_CACHE_VAL(g77_cv_lib_gnu,
-  AC_EGREP_CPP(yes,
-    [#include <stdio.h>
-#ifdef __GNU_LIBRARY__
-  yes
-#endif
-], 
-  g77_cv_lib_gnu=yes, g77_cv_lib_gnu=no))
-AC_MSG_RESULT($g77_cv_lib_gnu)
-
-# Apparently cygwin needs to be special-cased.
-AC_MSG_CHECKING([for cyg\`win'32])
-AC_CACHE_VAL(g77_cv_sys_cygwin32,
-  AC_EGREP_CPP(yes,
-  [#ifdef __CYGWIN32__
-  yes
-#endif
-],
-  g77_cv_sys_cygwin32=yes,
-  g77_cv_sys_cygwin32=no))
-AC_MSG_RESULT($g77_cv_sys_cygwin32)
-
-AC_CHECK_HEADER(fcntl.h,
-   test $g77_cv_header_posix = yes && AC_DEFINE(_POSIX_SOURCE),
-   AC_DEFINE(NO_FCNTL) AC_DEFINE(OPEN_DECL))
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-AC_C_CONST
-AC_TYPE_SIZE_T
-
-dnl Checks for library functions.
-AC_TYPE_SIGNAL
-# we'll get atexit by default
-if test $ac_cv_header_stdc != yes; then
-AC_CHECK_FUNC(atexit,
-  AC_DEFINE(onexit,atexit),dnl just in case
-  [AC_DEFINE(NO_ONEXIT)
-  AC_CHECK_FUNC(onexit,,
-    [AC_CHECK_FUNC(on_exit,
-     AC_DEFINE(onexit,on_exit),)])])
-else true
-fi
-
-# This should always succeed on unix.
-# Apparently positive result on cygwin loses re. NON_UNIX_STDIO
-# (as of cygwin b18).
-AC_CHECK_FUNC(fstat)
-AC_MSG_CHECKING([need for NON_UNIX_STDIO])
-if test $g77_cv_sys_cygwin32 = yes || test $ac_cv_func_fstat = no; then
-  AC_MSG_RESULT(yes)
-  AC_DEFINE(NON_UNIX_STDIO)
-else
-  AC_MSG_RESULT(no)
-fi
-
-# This is necessary for e.g. Linux:
-AC_MSG_CHECKING([for necessary members of struct FILE])
-AC_CACHE_VAL(g77_cv_struct_FILE,
-[AC_TRY_COMPILE([#include <stdio.h>],
-  [FILE s; s._ptr; s._base; s._flag;],g77_cv_struct_FILE=yes,
-  g77_cv_struct_FILE=no)])dnl
-AC_MSG_RESULT($g77_cv_struct_FILE)
-if test $g77_cv_struct_FILE = no; then
-  AC_DEFINE(MISSING_FILE_ELEMS)
-fi
-
-dnl perhaps should check also for remainder
-dnl Unfortunately, the message implies we're just checking for -lm...
-AC_CHECK_LIB(m,drem,AC_DEFINE(IEEE_drem))
-
-dnl for U77:
-dnl AC_CHECK_FUNCS(symlink getcwd lstat)
-dnl test $ac_cv_func_symlink = yes && SYMLNK=symlnk_.o
-dnl test $ac_cv_func_lstat = yes && SYMLNK="$SYMLNK lstat_.o"
-dnl AC_SUBST(SYMLNK)
-
-# posix will guarantee the right behaviour for sprintf, else we can't be
-# sure; HEADER_STDC wouldn't be the right check in sunos4, for instance.
-# However, on my sunos4/gcc setup unistd.h leads us wrongly to believe
-# we're posix-conformant, so always do the test.
-AC_MSG_CHECKING(for ansi/posix sprintf result)
-dnl This loses if included as an argument to AC_CACHE_VAL because the
-dnl changequote doesn't take effect and the [] vanish.
-dnl fixme: use cached value
-AC_TRY_RUN(changequote(<<, >>)dnl
-  <<#include <stdio.h>
-    /* does sprintf return the number of chars transferred? */
-    main () {char foo[2]; (sprintf(foo, "1") == 1) ? exit(0) : exit(1);}
->>changequote([, ]),
-    g77_cv_sys_sprintf_ansi=yes,
-    g77_cv_sys_sprintf_ansi=no,
-    g77_cv_sys_sprintf_ansi=no)
-AC_CACHE_VAL(g77_cv_sys_sprintf_ansi,
-     g77_cv_sys_sprintf_ansi=$g77_cv_sys_sprintf_ansi)
-dnl We get a misleading `(cached)' message...
-if test $ac_cv_c_cross = no; then
-  AC_MSG_RESULT($g77_cv_sys_sprintf_ansi)
-else
-  AC_MSG_RESULT([can't tell -- assuming no])
-fi
-# The cygwin patch takes steps to avoid defining USE_STRLEN here -- I don't
-# understand why.
-if test $g77_cv_sys_sprintf_ansi != yes; then 
-  AC_DEFINE(USE_STRLEN)
-fi
-
-# define NON_ANSI_RW_MODES on unix (can't hurt)
-AC_MSG_CHECKING(NON_ANSI_RW_MODES)
-AC_EGREP_CPP(yes,
-[#ifdef unix
-  yes
-#endif
-#ifdef __unix
-  yes
-#endif
-#ifdef __unix__
-  yes
-#endif
-], is_unix=yes, is_unix=no)
-if test $g77_cv_sys_cygwin32 = yes; then
-  AC_MSG_RESULT(no)
-else
-  if test $is_unix = yes; then
-    AC_DEFINE(NON_ANSI_RW_MODES)
-    AC_MSG_RESULT(yes)
-  else
-    AC_MSG_RESULT(no)
-  fi
-fi
-
-# We have to firkle with the info in hconfig.h to figure out suitable types
-# (via com.h).  proj.h and com.h are in $srcdir/.., config.h which they need
-# is in ../.. and the config files are in $srcdir/../../config.
-AC_MSG_CHECKING(f2c integer type)
-late_ac_cpp=$ac_cpp
-ac_cpp="$late_ac_cpp -I$srcdir/.. -I../.. -I$srcdir/../.. -I$srcdir/../../config"
-AC_CACHE_VAL(g77_cv_sys_f2cinteger,
-AC_EGREP_CPP(F2C_INTEGER=long int,
-[#include "proj.h"
-#define FFECOM_DETERMINE_TYPES 1
-#include "com.h"
-#if FFECOM_f2cINTEGER == FFECOM_f2ccodeLONG
-F2C_INTEGER=long int
-#elif FFECOM_f2cINTEGER == FFECOM_f2ccodeINT
-F2C_INTEGER=int
-#else
-#  error "Cannot find a suitable type for F2C_INTEGER"
-#endif
-],
- g77_cv_sys_f2cinteger="long int",)
-if test "$g77_cv_sys_f2cinteger" = ""; then
-  AC_EGREP_CPP(F2C_INTEGER=int,
-[#include "proj.h"
-#define FFECOM_DETERMINE_TYPES 1
-#include "com.h"
-#if FFECOM_f2cINTEGER == FFECOM_f2ccodeLONG
-F2C_INTEGER=long int
-#elif FFECOM_f2cINTEGER == FFECOM_f2ccodeINT
-F2C_INTEGER=int
-#else
-#  error "Cannot find a suitable type for F2C_INTEGER"
-#endif
-],
-   g77_cv_sys_f2cinteger=int,)
-fi
-if test "$g77_cv_sys_f2cinteger" = ""; then
-  AC_MSG_RESULT("")
-  AC_MSG_ERROR([Can't determine type for f2c integer; config.log may help.])
-fi
-)
-AC_MSG_RESULT($g77_cv_sys_f2cinteger)
-F2C_INTEGER=$g77_cv_sys_f2cinteger
-ac_cpp=$late_ac_cpp
-AC_SUBST(F2C_INTEGER)
-
-AC_MSG_CHECKING(f2c long int type)
-late_ac_cpp=$ac_cpp
-ac_cpp="$late_ac_cpp -I$srcdir/.. -I../.. -I$srcdir/../.. -I$srcdir/../../config"
-AC_CACHE_VAL(g77_cv_sys_f2clongint,
-AC_EGREP_CPP(F2C_LONGINT=long int,
-[#include "proj.h"
-#define FFECOM_DETERMINE_TYPES 1
-#include "com.h"
-#if FFECOM_f2cLONGINT == FFECOM_f2ccodeLONG
-F2C_LONGINT=long int
-#elif FFECOM_f2cLONGINT == FFECOM_f2ccodeLONGLONG
-F2C_LONGINT=long long int
-#else
-#  error "Cannot find a suitable type for F2C_LONGINT"
-#endif
-],
- g77_cv_sys_f2clongint="long int",)
-if test "$g77_cv_sys_f2clongint" = ""; then
-  AC_EGREP_CPP(F2C_LONGINT=long long int,
-[#include "proj.h"
-#define FFECOM_DETERMINE_TYPES 1
-#include "com.h"
-#if FFECOM_f2cLONGINT == FFECOM_f2ccodeLONG
-F2C_LONGINT=long int
-#elif FFECOM_f2cLONGINT == FFECOM_f2ccodeLONGLONG
-F2C_LONGINT=long long int
-#else
-#  error "Cannot find a suitable type for F2C_LONGINT"
-#endif
-],
-   g77_cv_sys_f2clongint="long long int",)
-fi
-if test "$g77_cv_sys_f2clongint" = ""; then
-  AC_MSG_RESULT("")
-  AC_MSG_ERROR([Can't determine type for f2c long int; config.log may help.])
-fi
-)
-AC_MSG_RESULT($g77_cv_sys_f2clongint)
-F2C_LONGINT=$g77_cv_sys_f2clongint
-ac_cpp=$late_ac_cpp
-AC_SUBST(F2C_LONGINT)
-
-dnl maybe check for drem/remainder
-
-AC_SUBST(CROSS)
-
-
-# This EOF_CHAR is a misfeature on unix.
-AC_DEFINE(NO_EOF_CHAR_CHECK)
-
-AC_DEFINE(Skip_f2c_Undefs)
-
-dnl Craig had these in f2c.h, but they're only relevant for building libf2c
-dnl anyway.
-
-dnl   For GNU Fortran (g77), we always enable the following behaviors for
-dnl   libf2c, to make things easy on the programmer.  The alternate
-dnl   behaviors have their uses, and g77 might provide them as compiler,
-dnl   rather than library, options, so only a single copy of a shared libf2c
-dnl   need be built for a system.
-
-dnl   This makes unformatted I/O more consistent in relation to other
-dnl   systems.  It is not required by the F77 standard.
-
-AC_DEFINE(Pad_UDread)
-
-dnl   This makes ERR= and IOSTAT= returns work properly in disk-full
-dnl   situations, making things work more as expected.  It slows things
-dnl   down, so g77 will probably someday choose the original implementation
-dnl   on a case-by-case basis when it can be shown to not be necessary
-dnl   (e.g. no ERR= or IOSTAT=) or when it is given the appropriate
-dnl   compile-time option or, perhaps, source-code directive.
-
-dnl AC_DEFINE(ALWAYS_FLUSH)
-
-dnl   Most Fortran implementations do this, so to make it easier
-dnl   to compare the output of g77-compiled programs to those compiled
-dnl   by most other compilers, tell libf2c to put leading zeros in
-dnl   appropriate places on output
-
-AC_DEFINE(WANT_LEAD_0)
-
-# avoid confusion in case the `makefile's from the f2c distribution have
-# got put here
-test -f libF77/makefile && mv libF77/makefile  libF77/makefile.ori
-test -f libI77/makefile && mv libI77/makefile  libI77/makefile.ori
-test -f libU77/makefile && mv libU77/makefile  libU77/makefile.ori
-
-AC_OUTPUT(Makefile ../../include/f2c.h:f2c.h.in libI77/Makefile libF77/Makefile libU77/Makefile)
-
-dnl We might have configuration options to:
-dnl * allow non-standard string concatenation (use libF77 s_catow.o,
-dnl   not s_cat.o)
-dnl * change unit preconnexion in libI77/err.c (f_init.c)
-dnl * -DALWAYS_FLUSH in libI77
-dnl * -DOMIT_BLANK_CC in libI77
-
-dnl Local Variables:
-dnl comment-start: "dnl "
-dnl comment-end: ""
-dnl comment-start-skip: "\\bdnl\\b\\s *"
-dnl End:
diff --git a/gcc/f/runtime/disclaimer.netlib b/gcc/f/runtime/disclaimer.netlib
deleted file mode 100644
index a11108f..0000000
--- a/gcc/f/runtime/disclaimer.netlib
+++ /dev/null
@@ -1,15 +0,0 @@
-f2c is a Fortran to C converter under development since 1990 by
-	David M. Gay (then AT&T Bell Labs, now Bell Labs, Lucent Technologies)
-	Stu Feldman (then at Bellcore, now at IBM)
-	Mark Maimone (Carnegie-Mellon University)
-	Norm Schryer (then AT&T Bell Labs, now AT&T Labs)
-Please send bug reports to dmg@research.bell-labs.com .
-
-AT&T, Bellcore and Lucent disclaim all warranties with regard to this
-software, including all implied warranties of merchantability
-and fitness.  In no event shall AT&T, Bellcore or Lucent be liable for
-any special, indirect or consequential damages or any damages
-whatsoever resulting from loss of use, data or profits, whether
-in an action of contract, negligence or other tortious action,
-arising out of or in connection with the use or performance of
-this software.
diff --git a/gcc/f/runtime/f2c.h.in b/gcc/f/runtime/f2c.h.in
deleted file mode 100644
index 9037467..0000000
--- a/gcc/f/runtime/f2c.h.in
+++ /dev/null
@@ -1,227 +0,0 @@
-/* f2c.h  --  Standard Fortran to C header file */
-
-/**  barf  [ba:rf]  2.  "He suggested using FORTRAN, and everybody barfed."
-
-	- From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */
-
-#ifndef F2C_INCLUDE
-#define F2C_INCLUDE
-
-/* F2C_INTEGER will normally be `int' but would be `long' on 16-bit systems */
-/* we assume short, float are OK */
-typedef @F2C_INTEGER@ /* long int */ integer;
-typedef unsigned @F2C_INTEGER@ /* long */ uinteger;
-typedef char *address;
-typedef short int shortint;
-typedef float real;
-typedef double doublereal;
-typedef struct { real r, i; } complex;
-typedef struct { doublereal r, i; } doublecomplex;
-typedef @F2C_INTEGER@ /* long int */ logical;
-typedef short int shortlogical;
-typedef char logical1;
-typedef char integer1;
-typedef @F2C_LONGINT@ /* long long */ longint;		/* system-dependent */
-typedef unsigned @F2C_LONGINT@ /* long long */ ulongint;	/* system-dependent */
-#define qbit_clear(a,b)	((a) & ~((ulongint)1 << (b)))
-#define qbit_set(a,b)	((a) |  ((ulongint)1 << (b)))
-
-#define TRUE_ (1)
-#define FALSE_ (0)
-
-/* Extern is for use with -E */
-#ifndef Extern
-#define Extern extern
-#endif
-
-/* I/O stuff */
-
-#ifdef f2c_i2
-#error "f2c_i2 will not work with g77!!!!"
-/* for -i2 */
-typedef short flag;
-typedef short ftnlen;
-typedef short ftnint;
-#else
-typedef @F2C_INTEGER@ /* long int */ flag;
-typedef @F2C_INTEGER@ /* long int */ ftnlen;
-typedef @F2C_INTEGER@ /* long int */ ftnint;
-#endif
-
-/*external read, write*/
-typedef struct
-{	flag cierr;
-	ftnint ciunit;
-	flag ciend;
-	char *cifmt;
-	ftnint cirec;
-} cilist;
-
-/*internal read, write*/
-typedef struct
-{	flag icierr;
-	char *iciunit;
-	flag iciend;
-	char *icifmt;
-	ftnint icirlen;
-	ftnint icirnum;
-} icilist;
-
-/*open*/
-typedef struct
-{	flag oerr;
-	ftnint ounit;
-	char *ofnm;
-	ftnlen ofnmlen;
-	char *osta;
-	char *oacc;
-	char *ofm;
-	ftnint orl;
-	char *oblnk;
-} olist;
-
-/*close*/
-typedef struct
-{	flag cerr;
-	ftnint cunit;
-	char *csta;
-} cllist;
-
-/*rewind, backspace, endfile*/
-typedef struct
-{	flag aerr;
-	ftnint aunit;
-} alist;
-
-/* inquire */
-typedef struct
-{	flag inerr;
-	ftnint inunit;
-	char *infile;
-	ftnlen infilen;
-	ftnint	*inex;	/*parameters in standard's order*/
-	ftnint	*inopen;
-	ftnint	*innum;
-	ftnint	*innamed;
-	char	*inname;
-	ftnlen	innamlen;
-	char	*inacc;
-	ftnlen	inacclen;
-	char	*inseq;
-	ftnlen	inseqlen;
-	char 	*indir;
-	ftnlen	indirlen;
-	char	*infmt;
-	ftnlen	infmtlen;
-	char	*inform;
-	ftnint	informlen;
-	char	*inunf;
-	ftnlen	inunflen;
-	ftnint	*inrecl;
-	ftnint	*innrec;
-	char	*inblank;
-	ftnlen	inblanklen;
-} inlist;
-
-#define VOID void
-
-union Multitype {	/* for multiple entry points */
-	integer1 g;
-	shortint h;
-	integer i;
-	/* longint j; */
-	real r;
-	doublereal d;
-	complex c;
-	doublecomplex z;
-	};
-
-typedef union Multitype Multitype;
-
-/*typedef long int Long;*/	/* No longer used; formerly in Namelist */
-
-struct Vardesc {	/* for Namelist */
-	char *name;
-	char *addr;
-	ftnlen *dims;
-	int  type;
-	};
-typedef struct Vardesc Vardesc;
-
-struct Namelist {
-	char *name;
-	Vardesc **vars;
-	int nvars;
-	};
-typedef struct Namelist Namelist;
-
-#define abs(x) ((x) >= 0 ? (x) : -(x))
-#define dabs(x) (doublereal)abs(x)
-#define min(a,b) ((a) <= (b) ? (a) : (b))
-#define max(a,b) ((a) >= (b) ? (a) : (b))
-#define dmin(a,b) (doublereal)min(a,b)
-#define dmax(a,b) (doublereal)max(a,b)
-#define bit_test(a,b)	((a) >> (b) & 1)
-#define bit_clear(a,b)	((a) & ~((uinteger)1 << (b)))
-#define bit_set(a,b)	((a) |  ((uinteger)1 << (b)))
-
-/* procedure parameter types for -A and -C++ */
-
-#define F2C_proc_par_types 1
-#ifdef __cplusplus
-typedef int /* Unknown procedure type */ (*U_fp)(...);
-typedef shortint (*J_fp)(...);
-typedef integer (*I_fp)(...);
-typedef real (*R_fp)(...);
-typedef doublereal (*D_fp)(...), (*E_fp)(...);
-typedef /* Complex */ VOID (*C_fp)(...);
-typedef /* Double Complex */ VOID (*Z_fp)(...);
-typedef logical (*L_fp)(...);
-typedef shortlogical (*K_fp)(...);
-typedef /* Character */ VOID (*H_fp)(...);
-typedef /* Subroutine */ int (*S_fp)(...);
-#else
-typedef int /* Unknown procedure type */ (*U_fp)();
-typedef shortint (*J_fp)();
-typedef integer (*I_fp)();
-typedef real (*R_fp)();
-typedef doublereal (*D_fp)(), (*E_fp)();
-typedef /* Complex */ VOID (*C_fp)();
-typedef /* Double Complex */ VOID (*Z_fp)();
-typedef logical (*L_fp)();
-typedef shortlogical (*K_fp)();
-typedef /* Character */ VOID (*H_fp)();
-typedef /* Subroutine */ int (*S_fp)();
-#endif
-/* E_fp is for real functions when -R is not specified */
-typedef VOID C_f;	/* complex function */
-typedef VOID H_f;	/* character function */
-typedef VOID Z_f;	/* double complex function */
-typedef doublereal E_f;	/* real function with -R not specified */
-
-/* undef any lower-case symbols that your C compiler predefines, e.g.: */
-
-#ifndef Skip_f2c_Undefs
-/* (No such symbols should be defined in a strict ANSI C compiler.
-   We can avoid trouble with f2c-translated code by using
-   gcc -ansi [-traditional].) */
-#undef cray
-#undef gcos
-#undef mc68010
-#undef mc68020
-#undef mips
-#undef pdp11
-#undef sgi
-#undef sparc
-#undef sun
-#undef sun2
-#undef sun3
-#undef sun4
-#undef u370
-#undef u3b
-#undef u3b2
-#undef u3b5
-#undef unix
-#undef vax
-#endif
-#endif
diff --git a/gcc/f/runtime/f2cext.c b/gcc/f/runtime/f2cext.c
deleted file mode 100644
index d5ac815..0000000
--- a/gcc/f/runtime/f2cext.c
+++ /dev/null
@@ -1,562 +0,0 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
-This file is part of GNU Fortran run-time library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-
-#include <f2c.h>
-typedef int (*sig_proc)(int);
-
-#ifdef Labort
-int abort_ (void) {
-    extern int G77_abort_0 (void);
-    return G77_abort_0 ();
-}
-#endif
-
-#ifdef Lderf
-double derf_ (doublereal *x) {
-    extern double G77_derf_0 (doublereal *x);
-    return G77_derf_0 (x);
-}
-#endif
-
-#ifdef Lderfc
-double derfc_ (doublereal *x) {
-    extern double G77_derfc_0 (doublereal *x);
-    return G77_derfc_0 (x);
-}
-#endif
-
-#ifdef Lef1asc
-int ef1asc_ (ftnint *a, ftnlen *la, ftnint *b, ftnlen *lb) {
-    extern int G77_ef1asc_0 (ftnint *a, ftnlen *la, ftnint *b, ftnlen *lb);
-    return G77_ef1asc_0 (a, la, b, lb);
-}
-#endif
-
-#ifdef Lef1cmc
-integer ef1cmc_ (ftnint *a, ftnlen *la, ftnint *b, ftnlen *lb) {
-    extern integer G77_ef1cmc_0 (ftnint *a, ftnlen *la, ftnint *b, ftnlen *lb);
-    return G77_ef1cmc_0 (a, la, b, lb);
-}
-#endif
-
-#ifdef Lerf
-double erf_ (real *x) {
-    extern double G77_erf_0 (real *x);
-    return G77_erf_0 (x);
-}
-#endif
-
-#ifdef Lerfc
-double erfc_ (real *x) {
-    extern double G77_erfc_0 (real *x);
-    return G77_erfc_0 (x);
-}
-#endif
-
-#ifdef Lexit
-void exit_ (integer *rc) {
-    extern void G77_exit_0 (integer *rc);
-    G77_exit_0 (rc);
-}
-#endif
-
-#ifdef Lgetarg
-void getarg_ (ftnint *n, char *s, ftnlen ls) {
-    extern void G77_getarg_0 (ftnint *n, char *s, ftnlen ls);
-    G77_getarg_0 (n, s, ls);
-}
-#endif
-
-#ifdef Lgetenv
-void getenv_ (char *fname, char *value, ftnlen flen, ftnlen vlen) {
-    extern void G77_getenv_0 (char *fname, char *value, ftnlen flen, ftnlen vlen);
-    G77_getenv_0 (fname, value, flen, vlen);
-}
-#endif
-
-#ifdef Liargc
-ftnint iargc_ (void) {
-    extern ftnint G77_iargc_0 (void);
-    return G77_iargc_0 ();
-}
-#endif
-
-#ifdef Lsignal
-ftnint signal_ (integer *sigp, sig_proc proc) {
-    extern ftnint G77_signal_0 (integer *sigp, sig_proc proc);
-    return G77_signal_0 (sigp, proc);
-}
-#endif
-
-#ifdef Lsystem
-integer system_ (char *s, ftnlen n) {
-    extern integer G77_system_0 (char *s, ftnlen n);
-    return G77_system_0 (s, n);
-}
-#endif
-
-#ifdef Lflush
-int flush_ (void) {
-    extern int G77_flush_0 (void);
-    return G77_flush_0 ();
-}
-#endif
-
-#ifdef Lftell
-integer ftell_ (integer *Unit) {
-    extern integer G77_ftell_0 (integer *Unit);
-    return G77_ftell_0 (Unit);
-}
-#endif
-
-#ifdef Lfseek
-integer fseek_ (integer *Unit, integer *offset, integer *xwhence) {
-    extern integer G77_fseek_0 (integer *Unit, integer *offset, integer *xwhence);
-    return G77_fseek_0 (Unit, offset, xwhence);
-}
-#endif
-
-#ifdef Laccess
-integer access_ (const char *name, const char *mode, ftnlen Lname, ftnlen Lmode) {
-    extern integer G77_access_0 (const char *name, const char *mode, ftnlen Lname, ftnlen Lmode);
-    return G77_access_0 (name, mode, Lname, Lmode);
-}
-#endif
-
-#ifdef Lalarm
-integer alarm_ (integer *seconds, sig_proc proc, integer *status) {
-    extern integer G77_alarm_0 (integer *seconds, sig_proc proc);
-    return G77_alarm_0 (seconds, proc);
-}
-#endif
-
-#ifdef Lbesj0
-double besj0_ (const real *x) {
-    return j0 (*x);
-}
-#endif
-
-#ifdef Lbesj1
-double besj1_ (const real *x) {
-    return j1 (*x);
-}
-#endif
-
-#ifdef Lbesjn
-double besjn_ (const integer *n, real *x) {
-    return jn (*n, *x);
-}
-#endif
-
-#ifdef Lbesy0
-double besy0_ (const real *x) {
-    return y0 (*x);
-}
-#endif
-
-#ifdef Lbesy1
-double besy1_ (const real *x) {
-    return y1 (*x);
-}
-#endif
-
-#ifdef Lbesyn
-double besyn_ (const integer *n, real *x) {
-    return yn (*n, *x);
-}
-#endif
-
-#ifdef Lchdir
-integer chdir_ (const char *name, const ftnlen Lname) {
-    extern integer G77_chdir_0 (const char *name, const ftnlen Lname);
-    return G77_chdir_0 (name, Lname);
-}
-#endif
-
-#ifdef Lchmod
-integer chmod_ (const char *name, const char *mode, const ftnlen Lname, const ftnlen Lmode) {
-    extern integer G77_chmod_0 (const char *name, const char *mode, const ftnlen Lname, const ftnlen Lmode);
-    return G77_chmod_0 (name, mode, Lname, Lmode);
-}
-#endif
-
-#ifdef Lctime
-void ctime_ (char *chtime, const ftnlen Lchtime, longint *xstime) {
-    extern void G77_ctime_0 (char *chtime, const ftnlen Lchtime, longint *xstime);
-    G77_ctime_0 (chtime, Lchtime, xstime);
-}
-#endif
-
-#ifdef Ldate
-int date_ (char *buf, ftnlen buf_len) {
-    extern int G77_date_0 (char *buf, ftnlen buf_len);
-    return G77_date_0 (buf, buf_len);
-}
-#endif
-
-#ifdef Ldbesj0
-double dbesj0_ (const double *x) {
-    return j0 (*x);
-}
-#endif
-
-#ifdef Ldbesj1
-double dbesj1_ (const double *x) {
-    return j1 (*x);
-}
-#endif
-
-#ifdef Ldbesjn
-double dbesjn_ (const integer *n, double *x) {
-    return jn (*n, *x);
-}
-#endif
-
-#ifdef Ldbesy0
-double dbesy0_ (const double *x) {
-    return y0 (*x);
-}
-#endif
-
-#ifdef Ldbesy1
-double dbesy1_ (const double *x) {
-    return y1 (*x);
-}
-#endif
-
-#ifdef Ldbesyn
-double dbesyn_ (const integer *n, double *x) {
-    return yn (*n, *x);
-}
-#endif
-
-#ifdef Ldtime
-double dtime_ (real tarray[2]) {
-    extern double G77_dtime_0 (real tarray[2]);
-    return G77_dtime_0 (tarray);
-}
-#endif
-
-#ifdef Letime
-double etime_ (real tarray[2]) {
-    extern double G77_etime_0 (real tarray[2]);
-    return G77_etime_0 (tarray);
-}
-#endif
-
-#ifdef Lfdate
-void fdate_ (char *ret_val, ftnlen ret_val_len) {
-    extern void G77_fdate_0 (char *ret_val, ftnlen ret_val_len);
-    G77_fdate_0 (ret_val, ret_val_len);
-}
-#endif
-
-#ifdef Lfgetc
-integer fgetc_ (const integer *lunit, char *c, ftnlen Lc) {
-    extern integer G77_fgetc_0 (const integer *lunit, char *c, ftnlen Lc);
-    return G77_fgetc_0 (lunit, c, Lc);
-}
-#endif
-
-#ifdef Lfget
-integer fget_ (char *c, const ftnlen Lc) {
-    extern integer G77_fget_0 (char *c, const ftnlen Lc);
-    return G77_fget_0 (c, Lc);
-}
-#endif
-
-#ifdef Lflush1
-int flush1_ (const integer *lunit) {
-    extern int G77_flush1_0 (const integer *lunit);
-    return G77_flush1_0 (lunit);
-}
-#endif
-
-#ifdef Lfnum
-integer fnum_ (integer *lunit) {
-    extern integer G77_fnum_0 (integer *lunit);
-    return G77_fnum_0 (lunit);
-}
-#endif
-
-#ifdef Lfputc
-integer fputc_ (const integer *lunit, const char *c, const ftnlen Lc) {
-    extern integer G77_fputc_0 (const integer *lunit, const char *c, const ftnlen Lc);
-    return G77_fputc_0 (lunit, c, Lc);
-}
-#endif
-
-#ifdef Lfput
-integer fput_ (const char *c, const ftnlen Lc) {
-    extern integer G77_fput_0 (const char *c, const ftnlen Lc);
-    return G77_fput_0 (c, Lc);
-}
-#endif
-
-#ifdef Lfstat
-integer fstat_ (const integer *lunit, integer statb[13]) {
-    extern integer G77_fstat_0 (const integer *lunit, integer statb[13]);
-    return G77_fstat_0 (lunit, statb);
-}
-#endif
-
-#ifdef Lgerror
-int gerror_ (char *str, ftnlen Lstr) {
-    extern int G77_gerror_0 (char *str, ftnlen Lstr);
-    return G77_gerror_0 (str,  Lstr);
-}
-#endif
-
-#ifdef Lgetcwd
-integer getcwd_ (char *str, const ftnlen Lstr) {
-    extern integer G77_getcwd_0 (char *str, const ftnlen Lstr);
-    return G77_getcwd_0 (str, Lstr);
-}
-#endif
-
-#ifdef Lgetgid
-integer getgid_ (void) {
-    extern integer G77_getgid_0 (void);
-    return G77_getgid_0 ();
-}
-#endif
-
-#ifdef Lgetlog
-int getlog_ (char *str, const ftnlen Lstr) {
-    extern int G77_getlog_0 (char *str, const ftnlen Lstr);
-    return G77_getlog_0 (str, Lstr);
-}
-#endif
-
-#ifdef Lgetpid
-integer getpid_ (void) {
-    extern integer G77_getpid_0 (void);
-    return G77_getpid_0 ();
-}
-#endif
-
-#ifdef Lgetuid
-integer getuid_ (void) {
-    extern integer G77_getuid_0 (void);
-    return G77_getuid_0 ();
-}
-#endif
-
-#ifdef Lgmtime
-int gmtime_ (const integer *stime, integer tarray[9]) {
-    extern int G77_gmtime_0 (const integer *stime, integer tarray[9]);
-    return G77_gmtime_0 (stime, tarray);
-}
-#endif
-
-#ifdef Lhostnm
-integer hostnm_ (char *name, ftnlen Lname) {
-    extern integer G77_hostnm_0 (char *name, ftnlen Lname);
-    return G77_hostnm_0 (name, Lname);
-}
-#endif
-
-#ifdef Lidate
-int idate_ (int iarray[3]) {
-    extern int G77_idate_0 (int iarray[3]);
-    return G77_idate_0 (iarray);
-}
-#endif
-
-#ifdef Lierrno
-integer ierrno_ (void) {
-    extern integer G77_ierrno_0 (void);
-    return G77_ierrno_0 ();
-}
-#endif
-
-#ifdef Lirand
-integer irand_ (integer *flag) {
-    extern integer G77_irand_0 (integer *flag);
-    return G77_irand_0 (flag);
-}
-#endif
-
-#ifdef Lisatty
-logical isatty_ (integer *lunit) {
-    extern logical G77_isatty_0 (integer *lunit);
-    return G77_isatty_0 (lunit);
-}
-#endif
-
-#ifdef Litime
-int itime_ (integer tarray[3]) {
-    extern int G77_itime_0 (integer tarray[3]);
-    return G77_itime_0 (tarray);
-}
-#endif
-
-#ifdef Lkill
-integer kill_ (const integer *pid, const integer *signum) {
-    extern integer G77_kill_0 (const integer *pid, const integer *signum);
-    return G77_kill_0 (pid, signum);
-}
-#endif
-
-#ifdef Llink
-integer link_ (const char *path1, const char *path2, const ftnlen Lpath1, const ftnlen Lpath2) {
-    extern integer G77_link_0 (const char *path1, const char *path2, const ftnlen Lpath1, const ftnlen Lpath2);
-    return G77_link_0 (path1, path2, Lpath1, Lpath2);
-}
-#endif
-
-#ifdef Llnblnk
-integer lnblnk_ (char *str, ftnlen str_len) {
-    extern integer G77_lnblnk_0 (char *str, ftnlen str_len);
-    return G77_lnblnk_0 (str, str_len);
-}
-#endif
-
-#ifdef Llstat
-integer lstat_ (const char *name, integer statb[13], const ftnlen Lname) {
-    extern integer G77_lstat_0 (const char *name, integer statb[13], const ftnlen Lname);
-    return G77_lstat_0 (name, statb, Lname);
-}
-#endif
-
-#ifdef Lltime
-int ltime_ (const integer *stime, integer tarray[9]) {
-    extern int G77_ltime_0 (const integer *stime, integer tarray[9]);
-    return G77_ltime_0 (stime, tarray);
-}
-#endif
-
-#ifdef Lmclock
-longint mclock_ (void) {
-    extern longint G77_mclock_0 (void);
-    return G77_mclock_0 ();
-}
-#endif
-
-#ifdef Lperror
-int perror_ (const char *str, const ftnlen Lstr) {
-    extern int G77_perror_0 (const char *str, const ftnlen Lstr);
-    return G77_perror_0 (str, Lstr);
-}
-#endif
-
-#ifdef Lrand
-double rand_ (integer *flag) {
-    extern double G77_rand_0 (integer *flag);
-    return G77_rand_0 (flag);
-}
-#endif
-
-#ifdef Lrename
-integer rename_ (const char *path1, const char *path2, const ftnlen Lpath1, const ftnlen Lpath2) {
-    extern integer G77_rename_0 (const char *path1, const char *path2, const ftnlen Lpath1, const ftnlen Lpath2);
-    return G77_rename_0 (path1, path2, Lpath1, Lpath2);
-}
-#endif
-
-#ifdef Lsecnds
-double secnds_ (real *r) {
-    extern double G77_secnds_0 (real *r);
-    return G77_secnds_0 (r);
-}
-#endif
-
-#ifdef Lsecond
-double second_ () {
-    extern double G77_second_0 ();
-    return G77_second_0 ();
-}
-#endif
-
-#ifdef Lsleep
-int sleep_ (const integer *seconds) {
-    extern int G77_sleep_0 (const integer *seconds);
-    return G77_sleep_0 (seconds);
-}
-#endif
-
-#ifdef Lsrand
-int srand_ (const integer *seed) {
-    extern int G77_srand_0 (const integer *seed);
-    return G77_srand_0 (seed);
-}
-#endif
-
-#ifdef Lstat
-integer stat_ (const char *name, integer statb[13], const ftnlen Lname) {
-    extern integer G77_stat_0 (const char *name, integer statb[13], const ftnlen Lname);
-    return G77_stat_0 (name, statb, Lname);
-}
-#endif
-
-#ifdef Lsymlnk
-integer symlnk_ (const char *path1, const char *path2, const ftnlen Lpath1, const ftnlen Lpath2) {
-    extern integer G77_symlnk_0 (const char *path1, const char *path2, const ftnlen Lpath1, const ftnlen Lpath2);
-    return G77_symlnk_0 (path1, path2, Lpath1, Lpath2);
-}
-#endif
-
-#ifdef Lsclock
-int system_clock_ (integer *count, integer *count_rate, integer *count_max) {
-    extern int G77_system_clock_0 (integer *count, integer *count_rate, integer *count_max);
-    return G77_system_clock_0 (count, count_rate, count_max);
-}
-#endif
-
-#ifdef Ltime
-longint time_ (void) {
-    extern longint G77_time_0 (void);
-    return G77_time_0 ();
-}
-#endif
-
-#ifdef Lttynam
-void ttynam_ (char *ret_val, ftnlen ret_val_len, integer *lunit) {
-    extern void G77_ttynam_0 (char *ret_val, ftnlen ret_val_len, integer *lunit);
-    G77_ttynam_0 (ret_val, ret_val_len, lunit);
-}
-#endif
-
-#ifdef Lumask
-integer umask_ (integer *mask) {
-    extern integer G77_umask_0 (integer *mask);
-    return G77_umask_0 (mask);
-}
-#endif
-
-#ifdef Lunlink
-integer unlink_ (const char *str, const ftnlen Lstr) {
-    extern integer G77_unlink_0 (const char *str, const ftnlen Lstr);
-    return G77_unlink_0 (str, Lstr);
-}
-#endif
-
-#ifdef Lvxtidt
-int vxtidate_ (integer *m, integer *d, integer *y) {
-    extern int G77_vxtidate_0 (integer *m, integer *d, integer *y);
-    return G77_vxtidate_0 (m, d, y);
-}
-#endif
-
-#ifdef Lvxttim
-void vxttime_ (char chtime[8], const ftnlen Lchtime) {
-    extern void G77_vxttime_0 (char chtime[8], const ftnlen Lchtime);
-    G77_vxttime_0 (chtime, Lchtime);
-}
-#endif
diff --git a/gcc/f/runtime/libF77/F77_aloc.c b/gcc/f/runtime/libF77/F77_aloc.c
deleted file mode 100644
index 8754fe2..0000000
--- a/gcc/f/runtime/libF77/F77_aloc.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include "f2c.h"
-#undef abs
-#undef min
-#undef max
-#include <stdio.h>
-
-static integer memfailure = 3;
-
-#ifdef KR_headers
-extern char *malloc();
-extern void G77_exit_0 ();
-
- char *
-F77_aloc(Len, whence) integer Len; char *whence;
-#else
-#include <stdlib.h>
-extern void G77_exit_0 (integer*);
-
- char *
-F77_aloc(integer Len, char *whence)
-#endif
-{
-	char *rv;
-	unsigned int uLen = (unsigned int) Len;	/* for K&R C */
-
-	if (!(rv = (char*)malloc(uLen))) {
-		fprintf(stderr, "malloc(%u) failure in %s\n",
-			uLen, whence);
-		G77_exit_0 (&memfailure);
-		}
-	return rv;
-	}
diff --git a/gcc/f/runtime/libF77/Makefile.in b/gcc/f/runtime/libF77/Makefile.in
deleted file mode 100644
index 208626c..0000000
--- a/gcc/f/runtime/libF77/Makefile.in
+++ /dev/null
@@ -1,95 +0,0 @@
-# Makefile for GNU F77 compiler runtime.
-# Copyright 1990 - 1994 by AT&T Bell Laboratories and Bellcore (see the
-# file `Notice').
-#   Portions of this file Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-#   Contributed by Dave Love (d.love@dl.ac.uk).
-#
-#This file is part of GNU Fortran.
-#
-#GNU Fortran 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 Fortran 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 Fortran; see the file COPYING.  If not, write to
-#the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-#02111-1307, USA.
-
-SHELL = /bin/sh
-
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-#### Start of system configuration section. ####
-
-# The _FOR_TARGET things are appropriate for a cross-make, passed by the
-# superior makefile
-GCC_FOR_TARGET = @CC@
-CC = $(GCC_FOR_TARGET)
-CFLAGS = @CFLAGS@ $(GCC_FLAGS)
-CPPFLAGS = @CPPFLAGS@
-DEFS = @DEFS@
-CGFLAGS = -g0
-# f2c.h should already be installed in xgcc's include directory but add that
-# to -I anyhow in case not using xgcc.
-ALL_CFLAGS = -I. -I$(srcdir) -I../../../include $(CPPFLAGS) $(DEFS) $(CFLAGS)
-AR = @AR@
-AR_FLAGS = rc
-RANLIB = @RANLIB@
-RANLIB_TEST = @RANLIB_TEST@
-CROSS = @CROSS@
-
-.SUFFIXES:
-.SUFFIXES: .c .o
-
-.c.o:
-	$(CC) -c -DSkip_f2c_Undefs $(ALL_CFLAGS) $(CGFLAGS) $<
-
-MISC =	F77_aloc.o VersionF.o main.o s_rnge.o abort_.o getarg_.o iargc_.o\
-	getenv_.o signal_.o s_stop.o s_paus.o system_.o cabs.o\
-	derf_.o derfc_.o erf_.o erfc_.o sig_die.o exit_.o
-POW =	pow_ci.o pow_dd.o pow_di.o pow_hh.o pow_ii.o  pow_ri.o pow_zi.o pow_zz.o \
-	pow_qq.o
-CX =	c_abs.o c_cos.o c_div.o c_exp.o c_log.o c_sin.o c_sqrt.o
-DCX =	z_abs.o z_cos.o z_div.o z_exp.o z_log.o z_sin.o z_sqrt.o
-REAL =	r_abs.o r_acos.o r_asin.o r_atan.o r_atn2.o r_cnjg.o r_cos.o\
-	r_cosh.o r_dim.o r_exp.o r_imag.o r_int.o\
-	r_lg10.o r_log.o r_mod.o r_nint.o r_sign.o\
-	r_sin.o r_sinh.o r_sqrt.o r_tan.o r_tanh.o
-DBL =	d_abs.o d_acos.o d_asin.o d_atan.o d_atn2.o\
-	d_cnjg.o d_cos.o d_cosh.o d_dim.o d_exp.o\
-	d_imag.o d_int.o d_lg10.o d_log.o d_mod.o\
-	d_nint.o d_prod.o d_sign.o d_sin.o d_sinh.o\
-	d_sqrt.o d_tan.o d_tanh.o
-INT =	i_abs.o i_dim.o i_dnnt.o i_indx.o i_len.o i_mod.o i_nint.o i_sign.o
-HALF =	h_abs.o h_dim.o h_dnnt.o h_indx.o h_len.o h_mod.o  h_nint.o h_sign.o
-CMP =	l_ge.o l_gt.o l_le.o l_lt.o hl_ge.o hl_gt.o hl_le.o hl_lt.o
-EFL =	ef1asc_.o ef1cmc_.o
-CHAR =	s_cat.o s_cmp.o s_copy.o
-F90BIT = lbitbits.o lbitshft.o qbitbits.o qbitshft.o
-
-F2C_H = ../../../include/f2c.h
-
-all: $(MISC) $(POW) $(CX) $(DCX) $(REAL) $(DBL) $(INT) \
-	 $(HALF) $(CMP) $(EFL) $(CHAR) $(F90BIT)
-
-VersionF.o: Version.c
-	$(CC) -c $(CGFLAGS) -o $@ $(srcdir)/Version.c
-
-mostlyclean clean:
-	-rm -f *.o
-
-distclean maintainer-clean: clean
-	-rm -f stage? include Makefile
-
-# Not quite all these actually do depend on f2c.h...
-$(MISC) $(POW) $(CX) $(DCX) $(REAL) $(DBL) $(INT) \
-  $(HALF) $(CMP) $(EFL) $(CHAR) $(F90BIT): $(F2C_H)
-
-.PHONY: mostlyclean clean distclean maintainer-clean all
diff --git a/gcc/f/runtime/libF77/Notice b/gcc/f/runtime/libF77/Notice
deleted file mode 100644
index 261b719..0000000
--- a/gcc/f/runtime/libF77/Notice
+++ /dev/null
@@ -1,23 +0,0 @@
-/****************************************************************
-Copyright 1990 - 1997 by AT&T, Lucent Technologies and Bellcore.
-
-Permission to use, copy, modify, and distribute this software
-and its documentation for any purpose and without fee is hereby
-granted, provided that the above copyright notice appear in all
-copies and that both that the copyright notice and this
-permission notice and warranty disclaimer appear in supporting
-documentation, and that the names of AT&T, Bell Laboratories,
-Lucent or Bellcore or any of their entities not be used in
-advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-AT&T, Lucent and Bellcore disclaim all warranties with regard to
-this software, including all implied warranties of
-merchantability and fitness.  In no event shall AT&T, Lucent or
-Bellcore be liable for any special, indirect or consequential
-damages or any damages whatsoever resulting from loss of use,
-data or profits, whether in an action of contract, negligence or
-other tortious action, arising out of or in connection with the
-use or performance of this software.
-****************************************************************/
-
diff --git a/gcc/f/runtime/libF77/README.netlib b/gcc/f/runtime/libF77/README.netlib
deleted file mode 100644
index 7668215..0000000
--- a/gcc/f/runtime/libF77/README.netlib
+++ /dev/null
@@ -1,108 +0,0 @@
-If your compiler does not recognize ANSI C headers,
-compile with KR_headers defined:  either add -DKR_headers
-to the definition of CFLAGS in the makefile, or insert
-
-#define KR_headers
-
-at the top of f2c.h , cabs.c , main.c , and sig_die.c .
-
-Under MS-DOS, compile s_paus.c with -DMSDOS.
-
-If you have a really ancient K&R C compiler that does not understand
-void, add -Dvoid=int to the definition of CFLAGS in the makefile.
-
-If you use a C++ compiler, first create a local f2c.h by appending
-f2ch.add to the usual f2c.h, e.g., by issuing the command
-	make f2c.h
-which assumes f2c.h is installed in /usr/include .
-
-If your system lacks onexit() and you are not using an ANSI C
-compiler, then you should compile main.c, s_paus.c, s_stop.c, and
-sig_die.c with NO_ONEXIT defined.  See the comments about onexit in
-the makefile.
-
-If your system has a double drem() function such that drem(a,b)
-is the IEEE remainder function (with double a, b), then you may
-wish to compile r_mod.c and d_mod.c with IEEE_drem defined.
-On some systems, you may also need to compile with -Ddrem=remainder .
-
-To check for transmission errors, issue the command
-	make check
-This assumes you have the xsum program whose source, xsum.c,
-is distributed as part of "all from f2c/src".  If you do not
-have xsum, you can obtain xsum.c by sending the following E-mail
-message to netlib@netlib.bell-labs.com
-	send xsum.c from f2c/src
-
-The makefile assumes you have installed f2c.h in a standard
-place (and does not cause recompilation when f2c.h is changed);
-f2c.h comes with "all from f2c" (the source for f2c) and is
-available separately ("f2c.h from f2c").
-
-Most of the routines in libF77 are support routines for Fortran
-intrinsic functions or for operations that f2c chooses not
-to do "in line".  There are a few exceptions, summarized below --
-functions and subroutines that appear to your program as ordinary
-external Fortran routines.
-
-1.	CALL ABORT prints a message and causes a core dump.
-
-2.	ERF(r) and DERF(d) and the REAL and DOUBLE PRECISION
-	error functions (with x REAL and d DOUBLE PRECISION);
-	DERF must be declared DOUBLE PRECISION in your program.
-	Both ERF and DERF assume your C library provides the
-	underlying erf() function (which not all systems do).
-
-3.	ERFC(r) and DERFC(d) are the complementary error functions:
-	ERFC(r) = 1 - ERF(r) and DERFC(d) = 1.d0 - DERFC(d)
-	(except that their results may be more accurate than
-	explicitly evaluating the above formulae would give).
-	Again, ERFC and r are REAL, and DERFC and d are DOUBLE
-	PRECISION (and must be declared as such in your program),
-	and ERFC and DERFC rely on your system's erfc().
-
-4.	CALL GETARG(n,s), where n is an INTEGER and s is a CHARACTER
-	variable, sets s to the n-th command-line argument (or to
-	all blanks if there are fewer than n command-line arguments);
-	CALL GETARG(0,s) sets s to the name of the program (on systems
-	that support this feature).  See IARGC below.
-
-5.	CALL GETENV(name, value), where name and value are of type
-	CHARACTER, sets value to the environment value, $name, of
-	name (or to blanks if $name has not been set).
-
-6.	NARGS = IARGC() sets NARGS to the number of command-line
-	arguments (an INTEGER value).
-
-7.	CALL SIGNAL(n,func), where n is an INTEGER and func is an
-	EXTERNAL procedure, arranges for func to be invoked when
-	signal n occurs (on systems where this makes sense).
-
-8.	CALL SYSTEM(cmd), where cmd is of type CHARACTER, passes
-	cmd to the system's command processor (on systems where
-	this can be done).
-
-The makefile does not attempt to compile pow_qq.c, qbitbits.c,
-and qbitshft.c, which are meant for use with INTEGER*8.  To use
-INTEGER*8, you must modify f2c.h to declare longint and ulongint
-appropriately; then add pow_qq.o to the POW = line in the makefile,
-and add " qbitbits.o qbitshft.o" to the makefile's F90BIT = line.
-
-Following Fortran 90, s_cat.c and s_copy.c allow the target of a
-(character string) assignment to be appear on its right-hand, at
-the cost of some extra overhead for all run-time concatenations.
-If you prefer the  extra efficiency that comes with the Fortran 77
-requirement that the left-hand side of a character assignment not
-be involved in the right-hand side, compile s_cat.c and s_copy.c
-with -DNO_OVERWRITE .
-
-If your system lacks a ranlib command, you don't need it.
-Either comment out the makefile's ranlib invocation, or install
-a harmless "ranlib" command somewhere in your PATH, such as the
-one-line shell script
-
-	exit 0
-
-or (on some systems)
-
-	exec /usr/bin/ar lts $1 >/dev/null
diff --git a/gcc/f/runtime/libF77/Version.c b/gcc/f/runtime/libF77/Version.c
deleted file mode 100644
index 8644f3f..0000000
--- a/gcc/f/runtime/libF77/Version.c
+++ /dev/null
@@ -1,65 +0,0 @@
-static char junk[] = "\n@(#)LIBF77 VERSION 19970404\n";
-
-/*
-*/
-
-char __G77_LIBF77_VERSION__[] = "0.5.21";
-
-/*
-2.00	11 June 1980.  File version.c added to library.
-2.01	31 May 1988.  s_paus() flushes stderr; names of hl_* fixed
-	[ d]erf[c ] added
-	 8 Aug. 1989: #ifdefs for f2c -i2 added to s_cat.c
-	29 Nov. 1989: s_cmp returns long (for f2c)
-	30 Nov. 1989: arg types from f2c.h
-	12 Dec. 1989: s_rnge allows long names
-	19 Dec. 1989: getenv_ allows unsorted environment
-	28 Mar. 1990: add exit(0) to end of main()
-	 2 Oct. 1990: test signal(...) == SIG_IGN rather than & 01 in main
-	17 Oct. 1990: abort() calls changed to sig_die(...,1)
-	22 Oct. 1990: separate sig_die from main
-	25 Apr. 1991: minor, theoretically invisible tweaks to s_cat, sig_die
-	31 May  1991: make system_ return status
-	18 Dec. 1991: change long to ftnlen (for -i2) many places
-	28 Feb. 1992: repair z_sqrt.c (scribbled on input, gave wrong answer)
-	18 July 1992: for n < 0, repair handling of 0**n in pow_[dr]i.c
-			and m**n in pow_hh.c and pow_ii.c;
-			catch SIGTRAP in main() for error msg before abort
-	23 July 1992: switch to ANSI prototypes unless KR_headers is #defined
-	23 Oct. 1992: fix botch in signal_.c (erroneous deref of 2nd arg);
-			change Cabs to f__cabs.
-	12 March 1993: various tweaks for C++
-	 2 June 1994: adjust so abnormal terminations invoke f_exit just once
-	16 Sept. 1994: s_cmp: treat characters as unsigned in comparisons.
-	19 Sept. 1994: s_paus: flush after end of PAUSE; add -DMSDOS
-	12 Jan. 1995:	pow_[dhiqrz][hiq]: adjust x**i to work on machines
-			that sign-extend right shifts when i is the most
-			negative integer.
-	26 Jan. 1995: adjust s_cat.c, s_copy.c to permit the left-hand side
-			of character assignments to appear on the right-hand
-			side (unless compiled with -DNO_OVERWRITE).
-	27 Jan. 1995: minor tweak to s_copy.c: copy forward whenever
-			possible (for better cache behavior).
-	30 May 1995:  added subroutine exit(rc) integer rc. Version not changed.
-	29 Aug. 1995: add F77_aloc.c; use it in s_cat.c and system_.c.
-	6 Sept. 1995: fix return type of system_ under -DKR_headers.
-	19 Dec. 1995: s_cat.c: fix bug when 2nd or later arg overlaps lhs.
-	19 Mar. 1996: s_cat.c: supply missing break after overlap detection.
-	13 May 1996:  add [lq]bitbits.c and [lq]bitshft.c (f90 bit intrinsics).
-	19 June 1996: add casts to unsigned in [lq]bitshft.c.
-	26 Feb. 1997: adjust functions with a complex output argument
-			to permit aliasing it with input arguments.
-			(For now, at least, this is just for possible
-			benefit of g77.)
-	4 April 1997: [cz]_div.c: tweaks invisible on most systems (that may
-			affect systems using gratuitous extra precision).
-*/
-
-#include <stdio.h>
-
-void
-g77__fvers__ ()
-{
-  fprintf (stderr, "__G77_LIBF77_VERSION__: %s", __G77_LIBF77_VERSION__);
-  fputs (junk, stderr);
-}
diff --git a/gcc/f/runtime/libF77/abort_.c b/gcc/f/runtime/libF77/abort_.c
deleted file mode 100644
index 8efdc42..0000000
--- a/gcc/f/runtime/libF77/abort_.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <stdio.h>
-#include "f2c.h"
-
-#ifdef KR_headers
-extern VOID sig_die();
-
-int G77_abort_0 ()
-#else
-extern void sig_die(char*,int);
-
-int G77_abort_0 (void)
-#endif
-{
-sig_die("Fortran abort routine called", 1);
-#ifdef __cplusplus
-return 0;
-#endif
-}
diff --git a/gcc/f/runtime/libF77/c_abs.c b/gcc/f/runtime/libF77/c_abs.c
deleted file mode 100644
index 041fbd3..0000000
--- a/gcc/f/runtime/libF77/c_abs.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern double f__cabs();
-
-double c_abs(z) complex *z;
-#else
-extern double f__cabs(double, double);
-
-double c_abs(complex *z)
-#endif
-{
-return( f__cabs( z->r, z->i ) );
-}
diff --git a/gcc/f/runtime/libF77/c_cos.c b/gcc/f/runtime/libF77/c_cos.c
deleted file mode 100644
index 9e833c1..0000000
--- a/gcc/f/runtime/libF77/c_cos.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern double sin(), cos(), sinh(), cosh();
-
-VOID c_cos(resx, z) complex *resx, *z;
-#else
-#undef abs
-#include <math.h>
-
-void c_cos(complex *resx, complex *z)
-#endif
-{
-complex res;
-
-res.r = cos(z->r) * cosh(z->i);
-res.i = - sin(z->r) * sinh(z->i);
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libF77/c_div.c b/gcc/f/runtime/libF77/c_div.c
deleted file mode 100644
index 9568354..0000000
--- a/gcc/f/runtime/libF77/c_div.c
+++ /dev/null
@@ -1,40 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern VOID sig_die();
-VOID c_div(resx, a, b)
-complex *a, *b, *resx;
-#else
-extern void sig_die(char*,int);
-void c_div(complex *resx, complex *a, complex *b)
-#endif
-{
-double ratio, den;
-double abr, abi;
-complex res;
-
-if( (abr = b->r) < 0.)
-	abr = - abr;
-if( (abi = b->i) < 0.)
-	abi = - abi;
-if( abr <= abi )
-	{
-	if(abi == 0)
-		sig_die("complex division by zero", 1);
-	ratio = (double)b->r / b->i ;
-	den = b->i * (1 + ratio*ratio);
-	res.r = (a->r*ratio + a->i) / den;
-	res.i = (a->i*ratio - a->r) / den;
-	}
-
-else
-	{
-	ratio = (double)b->i / b->r ;
-	den = b->r * (1 + ratio*ratio);
-	res.r = (a->r + a->i*ratio) / den;
-	res.i = (a->i - a->r*ratio) / den;
-	}
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libF77/c_exp.c b/gcc/f/runtime/libF77/c_exp.c
deleted file mode 100644
index 8d3d33d..0000000
--- a/gcc/f/runtime/libF77/c_exp.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern double exp(), cos(), sin();
-
- VOID c_exp(resx, z) complex *resx, *z;
-#else
-#undef abs
-#include <math.h>
-
-void c_exp(complex *resx, complex *z)
-#endif
-{
-double expx;
-complex res;
-
-expx = exp(z->r);
-res.r = expx * cos(z->i);
-res.i = expx * sin(z->i);
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libF77/c_log.c b/gcc/f/runtime/libF77/c_log.c
deleted file mode 100644
index 6715131..0000000
--- a/gcc/f/runtime/libF77/c_log.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern double log(), f__cabs(), atan2();
-VOID c_log(resx, z) complex *resx, *z;
-#else
-#undef abs
-#include <math.h>
-extern double f__cabs(double, double);
-
-void c_log(complex *resx, complex *z)
-#endif
-{
-complex res;
-
-res.i = atan2(z->i, z->r);
-res.r = log( f__cabs(z->r, z->i) );
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libF77/c_sin.c b/gcc/f/runtime/libF77/c_sin.c
deleted file mode 100644
index 7bf3e39..0000000
--- a/gcc/f/runtime/libF77/c_sin.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern double sin(), cos(), sinh(), cosh();
-
-VOID c_sin(resx, z) complex *resx, *z;
-#else
-#undef abs
-#include <math.h>
-
-void c_sin(complex *resx, complex *z)
-#endif
-{
-complex res;
-
-res.r = sin(z->r) * cosh(z->i);
-res.i = cos(z->r) * sinh(z->i);
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libF77/c_sqrt.c b/gcc/f/runtime/libF77/c_sqrt.c
deleted file mode 100644
index 775977a..0000000
--- a/gcc/f/runtime/libF77/c_sqrt.c
+++ /dev/null
@@ -1,38 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern double sqrt(), f__cabs();
-
-VOID c_sqrt(resx, z) complex *resx, *z;
-#else
-#undef abs
-#include <math.h>
-extern double f__cabs(double, double);
-
-void c_sqrt(complex *resx, complex *z)
-#endif
-{
-double mag, t;
-complex res;
-
-if( (mag = f__cabs(z->r, z->i)) == 0.)
-	res.r = res.i = 0.;
-else if(z->r > 0)
-	{
-	res.r = t = sqrt(0.5 * (mag + z->r) );
-	t = z->i / t;
-	res.i = 0.5 * t;
-	}
-else
-	{
-	t = sqrt(0.5 * (mag - z->r) );
-	if(z->i < 0)
-		t = -t;
-	res.i = t;
-	t = z->i / t;
-	res.r = 0.5 * t;
-	}
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libF77/cabs.c b/gcc/f/runtime/libF77/cabs.c
deleted file mode 100644
index 2fad044..0000000
--- a/gcc/f/runtime/libF77/cabs.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifdef KR_headers
-extern double sqrt();
-double f__cabs(real, imag) double real, imag;
-#else
-#undef abs
-#include <math.h>
-double f__cabs(double real, double imag)
-#endif
-{
-double temp;
-
-if(real < 0)
-	real = -real;
-if(imag < 0)
-	imag = -imag;
-if(imag > real){
-	temp = real;
-	real = imag;
-	imag = temp;
-}
-if((real+imag) == real)
-	return(real);
-
-temp = imag/real;
-temp = real*sqrt(1.0 + temp*temp);  /*overflow!!*/
-return(temp);
-}
diff --git a/gcc/f/runtime/libF77/d_abs.c b/gcc/f/runtime/libF77/d_abs.c
deleted file mode 100644
index cb157e0..0000000
--- a/gcc/f/runtime/libF77/d_abs.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double d_abs(x) doublereal *x;
-#else
-double d_abs(doublereal *x)
-#endif
-{
-if(*x >= 0)
-	return(*x);
-return(- *x);
-}
diff --git a/gcc/f/runtime/libF77/d_acos.c b/gcc/f/runtime/libF77/d_acos.c
deleted file mode 100644
index 33da536..0000000
--- a/gcc/f/runtime/libF77/d_acos.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double acos();
-double d_acos(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_acos(doublereal *x)
-#endif
-{
-return( acos(*x) );
-}
diff --git a/gcc/f/runtime/libF77/d_asin.c b/gcc/f/runtime/libF77/d_asin.c
deleted file mode 100644
index 79b33ca..0000000
--- a/gcc/f/runtime/libF77/d_asin.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double asin();
-double d_asin(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_asin(doublereal *x)
-#endif
-{
-return( asin(*x) );
-}
diff --git a/gcc/f/runtime/libF77/d_atan.c b/gcc/f/runtime/libF77/d_atan.c
deleted file mode 100644
index caea4a4..0000000
--- a/gcc/f/runtime/libF77/d_atan.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double atan();
-double d_atan(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_atan(doublereal *x)
-#endif
-{
-return( atan(*x) );
-}
diff --git a/gcc/f/runtime/libF77/d_atn2.c b/gcc/f/runtime/libF77/d_atn2.c
deleted file mode 100644
index 6748a55..0000000
--- a/gcc/f/runtime/libF77/d_atn2.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double atan2();
-double d_atn2(x,y) doublereal *x, *y;
-#else
-#undef abs
-#include <math.h>
-double d_atn2(doublereal *x, doublereal *y)
-#endif
-{
-return( atan2(*x,*y) );
-}
diff --git a/gcc/f/runtime/libF77/d_cnjg.c b/gcc/f/runtime/libF77/d_cnjg.c
deleted file mode 100644
index 1afa3bc..0000000
--- a/gcc/f/runtime/libF77/d_cnjg.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include "f2c.h"
-
- VOID
-#ifdef KR_headers
-d_cnjg(resx, z) doublecomplex *resx, *z;
-#else
-d_cnjg(doublecomplex *resx, doublecomplex *z)
-#endif
-{
-doublecomplex res;
-
-res.r = z->r;
-res.i = - z->i;
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libF77/d_cos.c b/gcc/f/runtime/libF77/d_cos.c
deleted file mode 100644
index fa4d6ca..0000000
--- a/gcc/f/runtime/libF77/d_cos.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double cos();
-double d_cos(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_cos(doublereal *x)
-#endif
-{
-return( cos(*x) );
-}
diff --git a/gcc/f/runtime/libF77/d_cosh.c b/gcc/f/runtime/libF77/d_cosh.c
deleted file mode 100644
index edc0ebc..0000000
--- a/gcc/f/runtime/libF77/d_cosh.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double cosh();
-double d_cosh(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_cosh(doublereal *x)
-#endif
-{
-return( cosh(*x) );
-}
diff --git a/gcc/f/runtime/libF77/d_dim.c b/gcc/f/runtime/libF77/d_dim.c
deleted file mode 100644
index 1d0ecb7..0000000
--- a/gcc/f/runtime/libF77/d_dim.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double d_dim(a,b) doublereal *a, *b;
-#else
-double d_dim(doublereal *a, doublereal *b)
-#endif
-{
-return( *a > *b ? *a - *b : 0);
-}
diff --git a/gcc/f/runtime/libF77/d_exp.c b/gcc/f/runtime/libF77/d_exp.c
deleted file mode 100644
index be12fd7..0000000
--- a/gcc/f/runtime/libF77/d_exp.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double exp();
-double d_exp(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_exp(doublereal *x)
-#endif
-{
-return( exp(*x) );
-}
diff --git a/gcc/f/runtime/libF77/d_imag.c b/gcc/f/runtime/libF77/d_imag.c
deleted file mode 100644
index 793a3f9..0000000
--- a/gcc/f/runtime/libF77/d_imag.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double d_imag(z) doublecomplex *z;
-#else
-double d_imag(doublecomplex *z)
-#endif
-{
-return(z->i);
-}
diff --git a/gcc/f/runtime/libF77/d_int.c b/gcc/f/runtime/libF77/d_int.c
deleted file mode 100644
index beff1e7..0000000
--- a/gcc/f/runtime/libF77/d_int.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double floor();
-double d_int(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_int(doublereal *x)
-#endif
-{
-return( (*x>0) ? floor(*x) : -floor(- *x) );
-}
diff --git a/gcc/f/runtime/libF77/d_lg10.c b/gcc/f/runtime/libF77/d_lg10.c
deleted file mode 100644
index c0892bd..0000000
--- a/gcc/f/runtime/libF77/d_lg10.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include "f2c.h"
-
-#define log10e 0.43429448190325182765
-
-#ifdef KR_headers
-double log();
-double d_lg10(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_lg10(doublereal *x)
-#endif
-{
-return( log10e * log(*x) );
-}
diff --git a/gcc/f/runtime/libF77/d_log.c b/gcc/f/runtime/libF77/d_log.c
deleted file mode 100644
index 592015b..0000000
--- a/gcc/f/runtime/libF77/d_log.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double log();
-double d_log(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_log(doublereal *x)
-#endif
-{
-return( log(*x) );
-}
diff --git a/gcc/f/runtime/libF77/d_mod.c b/gcc/f/runtime/libF77/d_mod.c
deleted file mode 100644
index 23f1929..0000000
--- a/gcc/f/runtime/libF77/d_mod.c
+++ /dev/null
@@ -1,40 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-#ifdef IEEE_drem
-double drem();
-#else
-double floor();
-#endif
-double d_mod(x,y) doublereal *x, *y;
-#else
-#ifdef IEEE_drem
-double drem(double, double);
-#else
-#undef abs
-#include <math.h>
-#endif
-double d_mod(doublereal *x, doublereal *y)
-#endif
-{
-#ifdef IEEE_drem
-	double xa, ya, z;
-	if ((ya = *y) < 0.)
-		ya = -ya;
-	z = drem(xa = *x, ya);
-	if (xa > 0) {
-		if (z < 0)
-			z += ya;
-		}
-	else if (z > 0)
-		z -= ya;
-	return z;
-#else
-	double quotient;
-	if( (quotient = *x / *y) >= 0)
-		quotient = floor(quotient);
-	else
-		quotient = -floor(-quotient);
-	return(*x - (*y) * quotient );
-#endif
-}
diff --git a/gcc/f/runtime/libF77/d_nint.c b/gcc/f/runtime/libF77/d_nint.c
deleted file mode 100644
index 064beff..0000000
--- a/gcc/f/runtime/libF77/d_nint.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double floor();
-double d_nint(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_nint(doublereal *x)
-#endif
-{
-return( (*x)>=0 ?
-	floor(*x + .5) : -floor(.5 - *x) );
-}
diff --git a/gcc/f/runtime/libF77/d_prod.c b/gcc/f/runtime/libF77/d_prod.c
deleted file mode 100644
index 3d4cef7..0000000
--- a/gcc/f/runtime/libF77/d_prod.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double d_prod(x,y) real *x, *y;
-#else
-double d_prod(real *x, real *y)
-#endif
-{
-return( (*x) * (*y) );
-}
diff --git a/gcc/f/runtime/libF77/d_sign.c b/gcc/f/runtime/libF77/d_sign.c
deleted file mode 100644
index 514ff0b..0000000
--- a/gcc/f/runtime/libF77/d_sign.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double d_sign(a,b) doublereal *a, *b;
-#else
-double d_sign(doublereal *a, doublereal *b)
-#endif
-{
-double x;
-x = (*a >= 0 ? *a : - *a);
-return( *b >= 0 ? x : -x);
-}
diff --git a/gcc/f/runtime/libF77/d_sin.c b/gcc/f/runtime/libF77/d_sin.c
deleted file mode 100644
index fdd699e..0000000
--- a/gcc/f/runtime/libF77/d_sin.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double sin();
-double d_sin(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_sin(doublereal *x)
-#endif
-{
-return( sin(*x) );
-}
diff --git a/gcc/f/runtime/libF77/d_sinh.c b/gcc/f/runtime/libF77/d_sinh.c
deleted file mode 100644
index 77f3690..0000000
--- a/gcc/f/runtime/libF77/d_sinh.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double sinh();
-double d_sinh(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_sinh(doublereal *x)
-#endif
-{
-return( sinh(*x) );
-}
diff --git a/gcc/f/runtime/libF77/d_sqrt.c b/gcc/f/runtime/libF77/d_sqrt.c
deleted file mode 100644
index b5cf83b..0000000
--- a/gcc/f/runtime/libF77/d_sqrt.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double sqrt();
-double d_sqrt(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_sqrt(doublereal *x)
-#endif
-{
-return( sqrt(*x) );
-}
diff --git a/gcc/f/runtime/libF77/d_tan.c b/gcc/f/runtime/libF77/d_tan.c
deleted file mode 100644
index af94a05..0000000
--- a/gcc/f/runtime/libF77/d_tan.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double tan();
-double d_tan(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_tan(doublereal *x)
-#endif
-{
-return( tan(*x) );
-}
diff --git a/gcc/f/runtime/libF77/d_tanh.c b/gcc/f/runtime/libF77/d_tanh.c
deleted file mode 100644
index 92a02d4..0000000
--- a/gcc/f/runtime/libF77/d_tanh.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double tanh();
-double d_tanh(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-double d_tanh(doublereal *x)
-#endif
-{
-return( tanh(*x) );
-}
diff --git a/gcc/f/runtime/libF77/derf_.c b/gcc/f/runtime/libF77/derf_.c
deleted file mode 100644
index fba6b6b..0000000
--- a/gcc/f/runtime/libF77/derf_.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double erf();
-double G77_derf_0 (x) doublereal *x;
-#else
-extern double erf(double);
-double G77_derf_0 (doublereal *x)
-#endif
-{
-return( erf(*x) );
-}
diff --git a/gcc/f/runtime/libF77/derfc_.c b/gcc/f/runtime/libF77/derfc_.c
deleted file mode 100644
index ae1ac74..0000000
--- a/gcc/f/runtime/libF77/derfc_.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern double erfc();
-
-double G77_derfc_0 (x) doublereal *x;
-#else
-extern double erfc(double);
-
-double G77_derfc_0 (doublereal *x)
-#endif
-{
-return( erfc(*x) );
-}
diff --git a/gcc/f/runtime/libF77/dtime_.c b/gcc/f/runtime/libF77/dtime_.c
deleted file mode 100644
index 2e775c6..0000000
--- a/gcc/f/runtime/libF77/dtime_.c
+++ /dev/null
@@ -1,45 +0,0 @@
-#include "time.h"
-#ifndef USE_CLOCK
-#include "sys/types.h"
-#include "sys/times.h"
-#endif
-
-#undef Hz
-#ifdef CLK_TCK
-#define Hz CLK_TCK
-#else
-#ifdef HZ
-#define Hz HZ
-#else
-#define Hz 60
-#endif
-#endif
-
- float
-#ifdef KR_headers
-dtime_(tarray) float *tarray;
-#else
-dtime_(float *tarray)
-#endif
-{
-#ifdef USE_CLOCK
-#ifndef CLOCKS_PER_SECOND
-#define CLOCKS_PER_SECOND Hz
-#endif
-	static double t0;
-	double t = clock();
-	tarray[1] = 0;
-	tarray[0] = (t - t0) / CLOCKS_PER_SECOND;
-	t0 = t;
-	return tarray[0];
-#else
-	struct tms t;
-	static struct tms t0;
-
-	times(&t);
-	tarray[0] = (t.tms_utime - t0.tms_utime) / Hz;
-	tarray[1] = (t.tms_stime - t0.tms_stime) / Hz;
-	t0 = t;
-	return tarray[0] + tarray[1];
-#endif
-	}
diff --git a/gcc/f/runtime/libF77/ef1asc_.c b/gcc/f/runtime/libF77/ef1asc_.c
deleted file mode 100644
index a922a1d..0000000
--- a/gcc/f/runtime/libF77/ef1asc_.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* EFL support routine to copy string b to string a */
-
-#include "f2c.h"
-
-
-#define M	( (long) (sizeof(long) - 1) )
-#define EVEN(x)	( ( (x)+ M) & (~M) )
-
-#ifdef KR_headers
-extern VOID s_copy();
-G77_ef1asc_0 (a, la, b, lb) ftnint *a, *b; ftnlen *la, *lb;
-#else
-extern void s_copy(char*,char*,ftnlen,ftnlen);
-int G77_ef1asc_0 (ftnint *a, ftnlen *la, ftnint *b, ftnlen *lb)
-#endif
-{
-s_copy( (char *)a, (char *)b, EVEN(*la), *lb );
-#ifdef __cplusplus
-return 0;
-#endif
-}
diff --git a/gcc/f/runtime/libF77/ef1cmc_.c b/gcc/f/runtime/libF77/ef1cmc_.c
deleted file mode 100644
index f471172..0000000
--- a/gcc/f/runtime/libF77/ef1cmc_.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/* EFL support routine to compare two character strings */
-
-#include "f2c.h"
-
-#ifdef KR_headers
-extern integer s_cmp();
-integer G77_ef1cmc_0 (a, la, b, lb) ftnint *a, *b; ftnlen *la, *lb;
-#else
-extern integer s_cmp(char*,char*,ftnlen,ftnlen);
-integer G77_ef1cmc_0 (ftnint *a, ftnlen *la, ftnint *b, ftnlen *lb)
-#endif
-{
-return( s_cmp( (char *)a, (char *)b, *la, *lb) );
-}
diff --git a/gcc/f/runtime/libF77/erf_.c b/gcc/f/runtime/libF77/erf_.c
deleted file mode 100644
index 1ba4350..0000000
--- a/gcc/f/runtime/libF77/erf_.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double erf();
-double G77_erf_0 (x) real *x;
-#else
-extern double erf(double);
-double G77_erf_0 (real *x)
-#endif
-{
-return( erf(*x) );
-}
diff --git a/gcc/f/runtime/libF77/erfc_.c b/gcc/f/runtime/libF77/erfc_.c
deleted file mode 100644
index f44b1d4..0000000
--- a/gcc/f/runtime/libF77/erfc_.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double erfc();
-double G77_erfc_0 (x) real *x;
-#else
-extern double erfc(double);
-double G77_erfc_0 (real *x)
-#endif
-{
-return( erfc(*x) );
-}
diff --git a/gcc/f/runtime/libF77/etime_.c b/gcc/f/runtime/libF77/etime_.c
deleted file mode 100644
index 0fb658a..0000000
--- a/gcc/f/runtime/libF77/etime_.c
+++ /dev/null
@@ -1,38 +0,0 @@
-#include "time.h"
-#ifndef USE_CLOCK
-#include "sys/types.h"
-#include "sys/times.h"
-#endif
-
-#undef Hz
-#ifdef CLK_TCK
-#define Hz CLK_TCK
-#else
-#ifdef HZ
-#define Hz HZ
-#else
-#define Hz 60
-#endif
-#endif
-
- float
-#ifdef KR_headers
-etime_(tarray) float *tarray;
-#else
-etime_(float *tarray)
-#endif
-{
-#ifdef USE_CLOCK
-#ifndef CLOCKS_PER_SECOND
-#define CLOCKS_PER_SECOND Hz
-#endif
-	double t = clock();
-	tarray[1] = 0;
-	return tarray[0] = t / CLOCKS_PER_SECOND;
-#else
-	struct tms t;
-
-	times(&t);
-	return (tarray[0] = t.tms_utime/Hz) + (tarray[1] = t.tms_stime/Hz);
-#endif
-	}
diff --git a/gcc/f/runtime/libF77/exit_.c b/gcc/f/runtime/libF77/exit_.c
deleted file mode 100644
index 4c0582a..0000000
--- a/gcc/f/runtime/libF77/exit_.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* This gives the effect of
-
-	subroutine exit(rc)
-	integer*4 rc
-	stop
-	end
-
- * with the added side effect of supplying rc as the program's exit code.
- */
-
-#include "f2c.h"
-#undef abs
-#undef min
-#undef max
-#ifndef KR_headers
-#include <stdlib.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
-extern void f_exit(void);
-#endif
-
- void
-#ifdef KR_headers
-G77_exit_0 (rc) integer *rc;
-#else
-G77_exit_0 (integer *rc)
-#endif
-{
-#ifdef NO_ONEXIT
-	f_exit();
-#endif
-	exit(*rc);
-	}
-#ifdef __cplusplus
-}
-#endif
diff --git a/gcc/f/runtime/libF77/f2ch.add b/gcc/f/runtime/libF77/f2ch.add
deleted file mode 100644
index a2acc17..0000000
--- a/gcc/f/runtime/libF77/f2ch.add
+++ /dev/null
@@ -1,162 +0,0 @@
-/* If you are using a C++ compiler, append the following to f2c.h
-   for compiling libF77 and libI77. */
-
-#ifdef __cplusplus
-extern "C" {
-extern int abort_(void);
-extern double c_abs(complex *);
-extern void c_cos(complex *, complex *);
-extern void c_div(complex *, complex *, complex *);
-extern void c_exp(complex *, complex *);
-extern void c_log(complex *, complex *);
-extern void c_sin(complex *, complex *);
-extern void c_sqrt(complex *, complex *);
-extern double d_abs(double *);
-extern double d_acos(double *);
-extern double d_asin(double *);
-extern double d_atan(double *);
-extern double d_atn2(double *, double *);
-extern void d_cnjg(doublecomplex *, doublecomplex *);
-extern double d_cos(double *);
-extern double d_cosh(double *);
-extern double d_dim(double *, double *);
-extern double d_exp(double *);
-extern double d_imag(doublecomplex *);
-extern double d_int(double *);
-extern double d_lg10(double *);
-extern double d_log(double *);
-extern double d_mod(double *, double *);
-extern double d_nint(double *);
-extern double d_prod(float *, float *);
-extern double d_sign(double *, double *);
-extern double d_sin(double *);
-extern double d_sinh(double *);
-extern double d_sqrt(double *);
-extern double d_tan(double *);
-extern double d_tanh(double *);
-extern double derf_(double *);
-extern double derfc_(double *);
-extern integer do_fio(ftnint *, char *, ftnlen);
-extern integer do_lio(ftnint *, ftnint *, char *, ftnlen);
-extern integer do_uio(ftnint *, char *, ftnlen);
-extern integer e_rdfe(void);
-extern integer e_rdue(void);
-extern integer e_rsfe(void);
-extern integer e_rsfi(void);
-extern integer e_rsle(void);
-extern integer e_rsli(void);
-extern integer e_rsue(void);
-extern integer e_wdfe(void);
-extern integer e_wdue(void);
-extern integer e_wsfe(void);
-extern integer e_wsfi(void);
-extern integer e_wsle(void);
-extern integer e_wsli(void);
-extern integer e_wsue(void);
-extern int ef1asc_(ftnint *, ftnlen *, ftnint *, ftnlen *);
-extern integer ef1cmc_(ftnint *, ftnlen *, ftnint *, ftnlen *);
-extern double erf(double);
-extern double erf_(float *);
-extern double erfc(double);
-extern double erfc_(float *);
-extern integer f_back(alist *);
-extern integer f_clos(cllist *);
-extern integer f_end(alist *);
-extern void f_exit(void);
-extern integer f_inqu(inlist *);
-extern integer f_open(olist *);
-extern integer f_rew(alist *);
-extern int flush_(void);
-extern void getarg_(integer *, char *, ftnlen);
-extern void getenv_(char *, char *, ftnlen, ftnlen);
-extern short h_abs(short *);
-extern short h_dim(short *, short *);
-extern short h_dnnt(double *);
-extern short h_indx(char *, char *, ftnlen, ftnlen);
-extern short h_len(char *, ftnlen);
-extern short h_mod(short *, short *);
-extern short h_nint(float *);
-extern short h_sign(short *, short *);
-extern short hl_ge(char *, char *, ftnlen, ftnlen);
-extern short hl_gt(char *, char *, ftnlen, ftnlen);
-extern short hl_le(char *, char *, ftnlen, ftnlen);
-extern short hl_lt(char *, char *, ftnlen, ftnlen);
-extern integer i_abs(integer *);
-extern integer i_dim(integer *, integer *);
-extern integer i_dnnt(double *);
-extern integer i_indx(char *, char *, ftnlen, ftnlen);
-extern integer i_len(char *, ftnlen);
-extern integer i_mod(integer *, integer *);
-extern integer i_nint(float *);
-extern integer i_sign(integer *, integer *);
-extern integer iargc_(void);
-extern ftnlen l_ge(char *, char *, ftnlen, ftnlen);
-extern ftnlen l_gt(char *, char *, ftnlen, ftnlen);
-extern ftnlen l_le(char *, char *, ftnlen, ftnlen);
-extern ftnlen l_lt(char *, char *, ftnlen, ftnlen);
-extern void pow_ci(complex *, complex *, integer *);
-extern double pow_dd(double *, double *);
-extern double pow_di(double *, integer *);
-extern short pow_hh(short *, shortint *);
-extern integer pow_ii(integer *, integer *);
-extern double pow_ri(float *, integer *);
-extern void pow_zi(doublecomplex *, doublecomplex *, integer *);
-extern void pow_zz(doublecomplex *, doublecomplex *, doublecomplex *);
-extern double r_abs(float *);
-extern double r_acos(float *);
-extern double r_asin(float *);
-extern double r_atan(float *);
-extern double r_atn2(float *, float *);
-extern void r_cnjg(complex *, complex *);
-extern double r_cos(float *);
-extern double r_cosh(float *);
-extern double r_dim(float *, float *);
-extern double r_exp(float *);
-extern double r_imag(complex *);
-extern double r_int(float *);
-extern double r_lg10(float *);
-extern double r_log(float *);
-extern double r_mod(float *, float *);
-extern double r_nint(float *);
-extern double r_sign(float *, float *);
-extern double r_sin(float *);
-extern double r_sinh(float *);
-extern double r_sqrt(float *);
-extern double r_tan(float *);
-extern double r_tanh(float *);
-extern void s_cat(char *, char **, integer *, integer *, ftnlen);
-extern integer s_cmp(char *, char *, ftnlen, ftnlen);
-extern void s_copy(char *, char *, ftnlen, ftnlen);
-extern int s_paus(char *, ftnlen);
-extern integer s_rdfe(cilist *);
-extern integer s_rdue(cilist *);
-extern integer s_rnge(char *, integer, char *, integer);
-extern integer s_rsfe(cilist *);
-extern integer s_rsfi(icilist *);
-extern integer s_rsle(cilist *);
-extern integer s_rsli(icilist *);
-extern integer s_rsne(cilist *);
-extern integer s_rsni(icilist *);
-extern integer s_rsue(cilist *);
-extern int s_stop(char *, ftnlen);
-extern integer s_wdfe(cilist *);
-extern integer s_wdue(cilist *);
-extern integer s_wsfe(cilist *);
-extern integer s_wsfi(icilist *);
-extern integer s_wsle(cilist *);
-extern integer s_wsli(icilist *);
-extern integer s_wsne(cilist *);
-extern integer s_wsni(icilist *);
-extern integer s_wsue(cilist *);
-extern void sig_die(char *, int);
-extern integer signal_(integer *, void (*)(int));
-extern integer system_(char *, ftnlen);
-extern double z_abs(doublecomplex *);
-extern void z_cos(doublecomplex *, doublecomplex *);
-extern void z_div(doublecomplex *, doublecomplex *, doublecomplex *);
-extern void z_exp(doublecomplex *, doublecomplex *);
-extern void z_log(doublecomplex *, doublecomplex *);
-extern void z_sin(doublecomplex *, doublecomplex *);
-extern void z_sqrt(doublecomplex *, doublecomplex *);
-	}
-#endif
diff --git a/gcc/f/runtime/libF77/getarg_.c b/gcc/f/runtime/libF77/getarg_.c
deleted file mode 100644
index eaded2e..0000000
--- a/gcc/f/runtime/libF77/getarg_.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "f2c.h"
-
-/*
- * subroutine getarg(k, c)
- * returns the kth unix command argument in fortran character
- * variable argument c
-*/
-
-#ifdef KR_headers
-VOID G77_getarg_0 (n, s, ls) ftnint *n; register char *s; ftnlen ls;
-#else
-void G77_getarg_0 (ftnint *n, register char *s, ftnlen ls)
-#endif
-{
-extern int xargc;
-extern char **xargv;
-register char *t;
-register int i;
-
-if(*n>=0 && *n<xargc)
-	t = xargv[*n];
-else
-	t = "";
-for(i = 0; i<ls && *t!='\0' ; ++i)
-	*s++ = *t++;
-for( ; i<ls ; ++i)
-	*s++ = ' ';
-}
diff --git a/gcc/f/runtime/libF77/getenv_.c b/gcc/f/runtime/libF77/getenv_.c
deleted file mode 100644
index b9916e6..0000000
--- a/gcc/f/runtime/libF77/getenv_.c
+++ /dev/null
@@ -1,51 +0,0 @@
-#include "f2c.h"
-
-/*
- * getenv - f77 subroutine to return environment variables
- *
- * called by:
- *	call getenv (ENV_NAME, char_var)
- * where:
- *	ENV_NAME is the name of an environment variable
- *	char_var is a character variable which will receive
- *		the current value of ENV_NAME, or all blanks
- *		if ENV_NAME is not defined
- */
-
-#ifdef KR_headers
-VOID G77_getenv_0 (fname, value, flen, vlen) char *value, *fname; ftnlen vlen, flen;
-#else
-void G77_getenv_0 (char *fname, char *value, ftnlen flen, ftnlen vlen)
-#endif
-{
-extern char **environ;
-register char *ep, *fp, *flast;
-register char **env = environ;
-
-flast = fname + flen;
-for(fp = fname ; fp < flast ; ++fp)
-	if(*fp == ' ')
-		{
-		flast = fp;
-		break;
-		}
-
-while (ep = *env++)
-	{
-	for(fp = fname; fp<flast ; )
-		if(*fp++ != *ep++)
-			goto endloop;
-
-	if(*ep++ == '=') {	/* copy right hand side */
-		while( *ep && --vlen>=0 )
-			*value++ = *ep++;
-
-		goto blank;
-		}
-endloop: ;
-	}
-
-blank:
-	while( --vlen >= 0 )
-		*value++ = ' ';
-}
diff --git a/gcc/f/runtime/libF77/h_abs.c b/gcc/f/runtime/libF77/h_abs.c
deleted file mode 100644
index 73b8215..0000000
--- a/gcc/f/runtime/libF77/h_abs.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-shortint h_abs(x) shortint *x;
-#else
-shortint h_abs(shortint *x)
-#endif
-{
-if(*x >= 0)
-	return(*x);
-return(- *x);
-}
diff --git a/gcc/f/runtime/libF77/h_dim.c b/gcc/f/runtime/libF77/h_dim.c
deleted file mode 100644
index ceff660..0000000
--- a/gcc/f/runtime/libF77/h_dim.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-shortint h_dim(a,b) shortint *a, *b;
-#else
-shortint h_dim(shortint *a, shortint *b)
-#endif
-{
-return( *a > *b ? *a - *b : 0);
-}
diff --git a/gcc/f/runtime/libF77/h_dnnt.c b/gcc/f/runtime/libF77/h_dnnt.c
deleted file mode 100644
index 9d0aa25..0000000
--- a/gcc/f/runtime/libF77/h_dnnt.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double floor();
-shortint h_dnnt(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-shortint h_dnnt(doublereal *x)
-#endif
-{
-return( (*x)>=0 ?
-	floor(*x + .5) : -floor(.5 - *x) );
-}
diff --git a/gcc/f/runtime/libF77/h_indx.c b/gcc/f/runtime/libF77/h_indx.c
deleted file mode 100644
index a211cc7..0000000
--- a/gcc/f/runtime/libF77/h_indx.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-shortint h_indx(a, b, la, lb) char *a, *b; ftnlen la, lb;
-#else
-shortint h_indx(char *a, char *b, ftnlen la, ftnlen lb)
-#endif
-{
-ftnlen i, n;
-char *s, *t, *bend;
-
-n = la - lb + 1;
-bend = b + lb;
-
-for(i = 0 ; i < n ; ++i)
-	{
-	s = a + i;
-	t = b;
-	while(t < bend)
-		if(*s++ != *t++)
-			goto no;
-	return((shortint)i+1);
-	no: ;
-	}
-return(0);
-}
diff --git a/gcc/f/runtime/libF77/h_len.c b/gcc/f/runtime/libF77/h_len.c
deleted file mode 100644
index 00a2151..0000000
--- a/gcc/f/runtime/libF77/h_len.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-shortint h_len(s, n) char *s; ftnlen n;
-#else
-shortint h_len(char *s, ftnlen n)
-#endif
-{
-return(n);
-}
diff --git a/gcc/f/runtime/libF77/h_mod.c b/gcc/f/runtime/libF77/h_mod.c
deleted file mode 100644
index 43431c1..0000000
--- a/gcc/f/runtime/libF77/h_mod.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-shortint h_mod(a,b) short *a, *b;
-#else
-shortint h_mod(short *a, short *b)
-#endif
-{
-return( *a % *b);
-}
diff --git a/gcc/f/runtime/libF77/h_nint.c b/gcc/f/runtime/libF77/h_nint.c
deleted file mode 100644
index 0af3735..0000000
--- a/gcc/f/runtime/libF77/h_nint.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double floor();
-shortint h_nint(x) real *x;
-#else
-#undef abs
-#include <math.h>
-shortint h_nint(real *x)
-#endif
-{
-return( (*x)>=0 ?
-	floor(*x + .5) : -floor(.5 - *x) );
-}
diff --git a/gcc/f/runtime/libF77/h_sign.c b/gcc/f/runtime/libF77/h_sign.c
deleted file mode 100644
index 7b06c15..0000000
--- a/gcc/f/runtime/libF77/h_sign.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-shortint h_sign(a,b) shortint *a, *b;
-#else
-shortint h_sign(shortint *a, shortint *b)
-#endif
-{
-shortint x;
-x = (*a >= 0 ? *a : - *a);
-return( *b >= 0 ? x : -x);
-}
diff --git a/gcc/f/runtime/libF77/hl_ge.c b/gcc/f/runtime/libF77/hl_ge.c
deleted file mode 100644
index 4c29527..0000000
--- a/gcc/f/runtime/libF77/hl_ge.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern integer s_cmp();
-shortlogical hl_ge(a,b,la,lb) char *a, *b; ftnlen la, lb;
-#else
-extern integer s_cmp(char *, char *, ftnlen, ftnlen);
-shortlogical hl_ge(char *a, char *b, ftnlen la, ftnlen lb)
-#endif
-{
-return(s_cmp(a,b,la,lb) >= 0);
-}
diff --git a/gcc/f/runtime/libF77/hl_gt.c b/gcc/f/runtime/libF77/hl_gt.c
deleted file mode 100644
index c4f345a..0000000
--- a/gcc/f/runtime/libF77/hl_gt.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern integer s_cmp();
-shortlogical hl_gt(a,b,la,lb) char *a, *b; ftnlen la, lb;
-#else
-extern integer s_cmp(char *, char *, ftnlen, ftnlen);
-shortlogical hl_gt(char *a, char *b, ftnlen la, ftnlen lb)
-#endif
-{
-return(s_cmp(a,b,la,lb) > 0);
-}
diff --git a/gcc/f/runtime/libF77/hl_le.c b/gcc/f/runtime/libF77/hl_le.c
deleted file mode 100644
index a9cce59..0000000
--- a/gcc/f/runtime/libF77/hl_le.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern integer s_cmp();
-shortlogical hl_le(a,b,la,lb) char *a, *b; ftnlen la, lb;
-#else
-extern integer s_cmp(char *, char *, ftnlen, ftnlen);
-shortlogical hl_le(char *a, char *b, ftnlen la, ftnlen lb)
-#endif
-{
-return(s_cmp(a,b,la,lb) <= 0);
-}
diff --git a/gcc/f/runtime/libF77/hl_lt.c b/gcc/f/runtime/libF77/hl_lt.c
deleted file mode 100644
index 162d919..0000000
--- a/gcc/f/runtime/libF77/hl_lt.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern integer s_cmp();
-shortlogical hl_lt(a,b,la,lb) char *a, *b; ftnlen la, lb;
-#else
-extern integer s_cmp(char *, char *, ftnlen, ftnlen);
-shortlogical hl_lt(char *a, char *b, ftnlen la, ftnlen lb)
-#endif
-{
-return(s_cmp(a,b,la,lb) < 0);
-}
diff --git a/gcc/f/runtime/libF77/i_abs.c b/gcc/f/runtime/libF77/i_abs.c
deleted file mode 100644
index be21295..0000000
--- a/gcc/f/runtime/libF77/i_abs.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-integer i_abs(x) integer *x;
-#else
-integer i_abs(integer *x)
-#endif
-{
-if(*x >= 0)
-	return(*x);
-return(- *x);
-}
diff --git a/gcc/f/runtime/libF77/i_dim.c b/gcc/f/runtime/libF77/i_dim.c
deleted file mode 100644
index 6e1b170..0000000
--- a/gcc/f/runtime/libF77/i_dim.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-integer i_dim(a,b) integer *a, *b;
-#else
-integer i_dim(integer *a, integer *b)
-#endif
-{
-return( *a > *b ? *a - *b : 0);
-}
diff --git a/gcc/f/runtime/libF77/i_dnnt.c b/gcc/f/runtime/libF77/i_dnnt.c
deleted file mode 100644
index 8fcecb6..0000000
--- a/gcc/f/runtime/libF77/i_dnnt.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double floor();
-integer i_dnnt(x) doublereal *x;
-#else
-#undef abs
-#include <math.h>
-integer i_dnnt(doublereal *x)
-#endif
-{
-return( (*x)>=0 ?
-	floor(*x + .5) : -floor(.5 - *x) );
-}
diff --git a/gcc/f/runtime/libF77/i_indx.c b/gcc/f/runtime/libF77/i_indx.c
deleted file mode 100644
index 96e7bc5..0000000
--- a/gcc/f/runtime/libF77/i_indx.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-integer i_indx(a, b, la, lb) char *a, *b; ftnlen la, lb;
-#else
-integer i_indx(char *a, char *b, ftnlen la, ftnlen lb)
-#endif
-{
-ftnlen i, n;
-char *s, *t, *bend;
-
-n = la - lb + 1;
-bend = b + lb;
-
-for(i = 0 ; i < n ; ++i)
-	{
-	s = a + i;
-	t = b;
-	while(t < bend)
-		if(*s++ != *t++)
-			goto no;
-	return(i+1);
-	no: ;
-	}
-return(0);
-}
diff --git a/gcc/f/runtime/libF77/i_len.c b/gcc/f/runtime/libF77/i_len.c
deleted file mode 100644
index 4020fee..0000000
--- a/gcc/f/runtime/libF77/i_len.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-integer i_len(s, n) char *s; ftnlen n;
-#else
-integer i_len(char *s, ftnlen n)
-#endif
-{
-return(n);
-}
diff --git a/gcc/f/runtime/libF77/i_mod.c b/gcc/f/runtime/libF77/i_mod.c
deleted file mode 100644
index 6937c42..0000000
--- a/gcc/f/runtime/libF77/i_mod.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-integer i_mod(a,b) integer *a, *b;
-#else
-integer i_mod(integer *a, integer *b)
-#endif
-{
-return( *a % *b);
-}
diff --git a/gcc/f/runtime/libF77/i_nint.c b/gcc/f/runtime/libF77/i_nint.c
deleted file mode 100644
index c0f6795..0000000
--- a/gcc/f/runtime/libF77/i_nint.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double floor();
-integer i_nint(x) real *x;
-#else
-#undef abs
-#include <math.h>
-integer i_nint(real *x)
-#endif
-{
-return( (*x)>=0 ?
-	floor(*x + .5) : -floor(.5 - *x) );
-}
diff --git a/gcc/f/runtime/libF77/i_sign.c b/gcc/f/runtime/libF77/i_sign.c
deleted file mode 100644
index 94009b8..0000000
--- a/gcc/f/runtime/libF77/i_sign.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-integer i_sign(a,b) integer *a, *b;
-#else
-integer i_sign(integer *a, integer *b)
-#endif
-{
-integer x;
-x = (*a >= 0 ? *a : - *a);
-return( *b >= 0 ? x : -x);
-}
diff --git a/gcc/f/runtime/libF77/iargc_.c b/gcc/f/runtime/libF77/iargc_.c
deleted file mode 100644
index 7ce5e08..0000000
--- a/gcc/f/runtime/libF77/iargc_.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-ftnint G77_iargc_0 ()
-#else
-ftnint G77_iargc_0 (void)
-#endif
-{
-extern int xargc;
-return ( xargc - 1 );
-}
diff --git a/gcc/f/runtime/libF77/l_ge.c b/gcc/f/runtime/libF77/l_ge.c
deleted file mode 100644
index 86b4a1f..0000000
--- a/gcc/f/runtime/libF77/l_ge.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern integer s_cmp();
-logical l_ge(a,b,la,lb) char *a, *b; ftnlen la, lb;
-#else
-extern integer s_cmp(char *, char *, ftnlen, ftnlen);
-logical l_ge(char *a, char *b, ftnlen la, ftnlen lb)
-#endif
-{
-return(s_cmp(a,b,la,lb) >= 0);
-}
diff --git a/gcc/f/runtime/libF77/l_gt.c b/gcc/f/runtime/libF77/l_gt.c
deleted file mode 100644
index c4b52f5..0000000
--- a/gcc/f/runtime/libF77/l_gt.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern integer s_cmp();
-logical l_gt(a,b,la,lb) char *a, *b; ftnlen la, lb;
-#else
-extern integer s_cmp(char *, char *, ftnlen, ftnlen);
-logical l_gt(char *a, char *b, ftnlen la, ftnlen lb)
-#endif
-{
-return(s_cmp(a,b,la,lb) > 0);
-}
diff --git a/gcc/f/runtime/libF77/l_le.c b/gcc/f/runtime/libF77/l_le.c
deleted file mode 100644
index f2740a2..0000000
--- a/gcc/f/runtime/libF77/l_le.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern integer s_cmp();
-logical l_le(a,b,la,lb) char *a, *b; ftnlen la, lb;
-#else
-extern integer s_cmp(char *, char *, ftnlen, ftnlen);
-logical l_le(char *a, char *b, ftnlen la, ftnlen lb)
-#endif
-{
-return(s_cmp(a,b,la,lb) <= 0);
-}
diff --git a/gcc/f/runtime/libF77/l_lt.c b/gcc/f/runtime/libF77/l_lt.c
deleted file mode 100644
index c48dc94..0000000
--- a/gcc/f/runtime/libF77/l_lt.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern integer s_cmp();
-logical l_lt(a,b,la,lb) char *a, *b; ftnlen la, lb;
-#else
-extern integer s_cmp(char *, char *, ftnlen, ftnlen);
-logical l_lt(char *a, char *b, ftnlen la, ftnlen lb)
-#endif
-{
-return(s_cmp(a,b,la,lb) < 0);
-}
diff --git a/gcc/f/runtime/libF77/lbitbits.c b/gcc/f/runtime/libF77/lbitbits.c
deleted file mode 100644
index 75e9f9c..0000000
--- a/gcc/f/runtime/libF77/lbitbits.c
+++ /dev/null
@@ -1,62 +0,0 @@
-#include "f2c.h"
-
-#ifndef LONGBITS
-#define LONGBITS 32
-#endif
-
- integer
-#ifdef KR_headers
-lbit_bits(a, b, len) integer a, b, len;
-#else
-lbit_bits(integer a, integer b, integer len)
-#endif
-{
-	/* Assume 2's complement arithmetic */
-
-	unsigned long x, y;
-
-	x = (unsigned long) a;
-	y = (unsigned long)-1L;
-	x >>= b;
-	y <<= len;
-	return (integer)(x & ~y);
-	}
-
- integer
-#ifdef KR_headers
-lbit_cshift(a, b, len) integer a, b, len;
-#else
-lbit_cshift(integer a, integer b, integer len)
-#endif
-{
-	unsigned long x, y, z;
-
-	x = (unsigned long)a;
-	if (len <= 0) {
-		if (len == 0)
-			return 0;
-		goto full_len;
-		}
-	if (len >= LONGBITS) {
- full_len:
-		if (b >= 0) {
-			b %= LONGBITS;
-			return (integer)(x << b | x >> LONGBITS -b );
-			}
-		b = -b;
-		b %= LONGBITS;
-		return (integer)(x << LONGBITS - b | x >> b);
-		}
-	y = z = (unsigned long)-1;
-	y <<= len;
-	z &= ~y;
-	y &= x;
-	x &= z;
-	if (b >= 0) {
-		b %= len;
-		return (integer)(y | z & (x << b | x >> len - b));
-		}
-	b = -b;
-	b %= len;
-	return (integer)(y | z & (x >> b | x << len - b));
-	}
diff --git a/gcc/f/runtime/libF77/lbitshft.c b/gcc/f/runtime/libF77/lbitshft.c
deleted file mode 100644
index 81b0fdb..0000000
--- a/gcc/f/runtime/libF77/lbitshft.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include "f2c.h"
-
- integer
-#ifdef KR_headers
-lbit_shift(a, b) integer a; integer b;
-#else
-lbit_shift(integer a, integer b)
-#endif
-{
-	return b >= 0 ? a << b : (integer)((uinteger)a >> -b);
-	}
diff --git a/gcc/f/runtime/libF77/main.c b/gcc/f/runtime/libF77/main.c
deleted file mode 100644
index 469a64b..0000000
--- a/gcc/f/runtime/libF77/main.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */
-
-#include <stdio.h>
-#include "signal1.h"
-
-#ifndef SIGIOT
-#ifdef SIGABRT
-#define SIGIOT SIGABRT
-#endif
-#endif
-
-#ifndef KR_headers
-#undef VOID
-#include <stdlib.h>
-#endif
-
-#ifndef VOID
-#define VOID void
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef NO__STDC
-#define ONEXIT onexit
-extern VOID f_exit();
-#else
-#ifndef KR_headers
-extern void f_exit(void);
-#ifndef NO_ONEXIT
-#define ONEXIT atexit
-extern int atexit(void (*)(void));
-#endif
-#else
-#ifndef NO_ONEXIT
-#define ONEXIT onexit
-extern VOID f_exit();
-#endif
-#endif
-#endif
-
-#ifdef KR_headers
-extern VOID f_init(), sig_die();
-extern int MAIN__();
-#define Int /* int */
-#else
-extern void f_init(void), sig_die(char*, int);
-extern int MAIN__(void);
-#define Int int
-#endif
-
-static VOID sigfdie(Int n)
-{
-sig_die("Floating Exception", 1);
-}
-
-
-static VOID sigidie(Int n)
-{
-sig_die("IOT Trap", 1);
-}
-
-#ifdef SIGQUIT
-static VOID sigqdie(Int n)
-{
-sig_die("Quit signal", 1);
-}
-#endif
-
-
-static VOID sigindie(Int n)
-{
-sig_die("Interrupt", 0);
-}
-
-static VOID sigtdie(Int n)
-{
-sig_die("Killed", 0);
-}
-
-#ifdef SIGTRAP
-static VOID sigtrdie(Int n)
-{
-sig_die("Trace trap", 1);
-}
-#endif
-
-
-int xargc;
-char **xargv;
-
-#ifdef __cplusplus
-	}
-#endif
-
-#ifdef KR_headers
-main(argc, argv) int argc; char **argv;
-#else
-main(int argc, char **argv)
-#endif
-{
-xargc = argc;
-xargv = argv;
-signal1(SIGFPE, sigfdie);	/* ignore underflow, enable overflow */
-#ifdef SIGIOT
-signal1(SIGIOT, sigidie);
-#endif
-#ifdef SIGTRAP
-signal1(SIGTRAP, sigtrdie);
-#endif
-#ifdef SIGQUIT
-if(signal1(SIGQUIT,sigqdie) == SIG_IGN)
-	signal1(SIGQUIT, SIG_IGN);
-#endif
-if(signal1(SIGINT, sigindie) == SIG_IGN)
-	signal1(SIGINT, SIG_IGN);
-signal1(SIGTERM,sigtdie);
-
-#ifdef pdp11
-	ldfps(01200); /* detect overflow as an exception */
-#endif
-
-f_init();
-#ifndef NO_ONEXIT
-ONEXIT(f_exit);
-#endif
-MAIN__();
-#ifdef NO_ONEXIT
-f_exit();
-#endif
-exit(0);	/* exit(0) rather than return(0) to bypass Cray bug */
-return 0;	/* For compilers that complain of missing return values; */
-		/* others will complain that this is unreachable code. */
-}
diff --git a/gcc/f/runtime/libF77/makefile.netlib b/gcc/f/runtime/libF77/makefile.netlib
deleted file mode 100644
index 230ca7e..0000000
--- a/gcc/f/runtime/libF77/makefile.netlib
+++ /dev/null
@@ -1,103 +0,0 @@
-.SUFFIXES: .c .o
-CC = cc
-SHELL = /bin/sh
-CFLAGS = -O
-
-# If your system lacks onexit() and you are not using an
-# ANSI C compiler, then you should add -DNO_ONEXIT to CFLAGS,
-# e.g., by changing the above "CFLAGS =" line to
-# CFLAGS = -O -DNO_ONEXIT
-
-# On at least some Sun systems, it is more appropriate to change the
-# "CFLAGS =" line to
-# CFLAGS = -O -Donexit=on_exit
-
-# compile, then strip unnecessary symbols
-.c.o:
-	$(CC) -c -DSkip_f2c_Undefs $(CFLAGS) $*.c
-	ld -r -x -o $*.xxx $*.o
-	mv $*.xxx $*.o
-## Under Solaris (and other systems that do not understand ld -x),
-## omit -x in the ld line above.
-## If your system does not have the ld command, comment out
-## or remove both the ld and mv lines above.
-
-MISC =	F77_aloc.o Version.o main.o s_rnge.o abort_.o getarg_.o iargc_.o \
-	getenv_.o signal_.o s_stop.o s_paus.o system_.o cabs.o\
-	derf_.o derfc_.o erf_.o erfc_.o sig_die.o exit_.o
-POW =	pow_ci.o pow_dd.o pow_di.o pow_hh.o pow_ii.o  pow_ri.o pow_zi.o pow_zz.o
-CX =	c_abs.o c_cos.o c_div.o c_exp.o c_log.o c_sin.o c_sqrt.o
-DCX =	z_abs.o z_cos.o z_div.o z_exp.o z_log.o z_sin.o z_sqrt.o
-REAL =	r_abs.o r_acos.o r_asin.o r_atan.o r_atn2.o r_cnjg.o r_cos.o\
-	r_cosh.o r_dim.o r_exp.o r_imag.o r_int.o\
-	r_lg10.o r_log.o r_mod.o r_nint.o r_sign.o\
-	r_sin.o r_sinh.o r_sqrt.o r_tan.o r_tanh.o
-DBL =	d_abs.o d_acos.o d_asin.o d_atan.o d_atn2.o\
-	d_cnjg.o d_cos.o d_cosh.o d_dim.o d_exp.o\
-	d_imag.o d_int.o d_lg10.o d_log.o d_mod.o\
-	d_nint.o d_prod.o d_sign.o d_sin.o d_sinh.o\
-	d_sqrt.o d_tan.o d_tanh.o
-INT =	i_abs.o i_dim.o i_dnnt.o i_indx.o i_len.o i_mod.o i_nint.o i_sign.o
-HALF =	h_abs.o h_dim.o h_dnnt.o h_indx.o h_len.o h_mod.o  h_nint.o h_sign.o
-CMP =	l_ge.o l_gt.o l_le.o l_lt.o hl_ge.o hl_gt.o hl_le.o hl_lt.o
-EFL =	ef1asc_.o ef1cmc_.o
-CHAR =	F77_aloc.o s_cat.o s_cmp.o s_copy.o
-F90BIT = lbitbits.o lbitshft.o
-QINT =	pow_qq.o qbitbits.o qbitshft.o
-TIME =	dtime_.o etime_.o
-
-all: signal1.h libF77.a
-
-# You may need to adjust signal1.h suitably for your system...
-signal1.h: signal1.h0
-	cp signal1.h0 signal1.h
-
-# If you get an error compiling dtime_.c or etime_.c, try adding
-# -DUSE_CLOCK to the CFLAGS assignment above; if that does not work,
-# omit $(TIME) from the dependency list for libF77.a below.
-
-# For INTEGER*8 support (which requires system-dependent adjustments to
-# f2c.h), add $(QINT) to the libf2c.a dependency list below...
-
-libF77.a : $(MISC) $(POW) $(CX) $(DCX) $(REAL) $(DBL) $(INT) \
-	$(HALF) $(CMP) $(EFL) $(CHAR) $(F90BIT) $(TIME)
-	ar r libF77.a $?
-	-ranlib libF77.a
-
-### If your system lacks ranlib, you don't need it; see README.
-
-Version.o: Version.c
-	$(CC) -c Version.c
-
-# To compile with C++, first "make f2c.h"
-f2c.h: f2ch.add
-	cat /usr/include/f2c.h f2ch.add >f2c.h
-
-install:	libF77.a
-	mv libF77.a /usr/lib
-	ranlib /usr/lib/libF77.a
-
-clean:
-	rm -f libF77.a *.o
-
-check:
-	xsum F77_aloc.c Notice README Version.c abort_.c c_abs.c c_cos.c \
-	c_div.c c_exp.c c_log.c c_sin.c c_sqrt.c cabs.c d_abs.c d_acos.c \
-	d_asin.c d_atan.c d_atn2.c d_cnjg.c d_cos.c d_cosh.c d_dim.c \
-	d_exp.c d_imag.c d_int.c d_lg10.c d_log.c d_mod.c d_nint.c \
-	d_prod.c d_sign.c d_sin.c d_sinh.c d_sqrt.c d_tan.c d_tanh.c \
-	derf_.c derfc_.c dtime_.c \
-	ef1asc_.c ef1cmc_.c erf_.c erfc_.c etime_.c exit_.c f2ch.add \
-	getarg_.c getenv_.c h_abs.c h_dim.c h_dnnt.c h_indx.c h_len.c \
-	h_mod.c h_nint.c h_sign.c hl_ge.c hl_gt.c hl_le.c hl_lt.c \
-	i_abs.c i_dim.c i_dnnt.c i_indx.c i_len.c i_mod.c i_nint.c \
-	i_sign.c iargc_.c l_ge.c l_gt.c l_le.c l_lt.c lbitbits.c lbitshft.c \
-	main.c makefile pow_ci.c pow_dd.c pow_di.c pow_hh.c pow_ii.c \
-	pow_qq.c pow_ri.c pow_zi.c pow_zz.c qbitbits.c qbitshft.c \
-	r_abs.c r_acos.c r_asin.c r_atan.c r_atn2.c \
-	r_cnjg.c r_cos.c r_cosh.c r_dim.c r_exp.c r_imag.c r_int.c r_lg10.c \
-	r_log.c r_mod.c r_nint.c r_sign.c r_sin.c r_sinh.c r_sqrt.c \
-	r_tan.c r_tanh.c s_cat.c s_cmp.c s_copy.c \
-	s_paus.c s_rnge.c s_stop.c sig_die.c signal1.h0 signal_.c system_.c \
-	z_abs.c z_cos.c z_div.c z_exp.c z_log.c z_sin.c z_sqrt.c >zap
-	cmp zap libF77.xsum && rm zap || diff libF77.xsum zap
diff --git a/gcc/f/runtime/libF77/pow_ci.c b/gcc/f/runtime/libF77/pow_ci.c
deleted file mode 100644
index 37e2ce0..0000000
--- a/gcc/f/runtime/libF77/pow_ci.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-VOID pow_ci(p, a, b) 	/* p = a**b  */
- complex *p, *a; integer *b;
-#else
-extern void pow_zi(doublecomplex*, doublecomplex*, integer*);
-void pow_ci(complex *p, complex *a, integer *b) 	/* p = a**b  */
-#endif
-{
-doublecomplex p1, a1;
-
-a1.r = a->r;
-a1.i = a->i;
-
-pow_zi(&p1, &a1, b);
-
-p->r = p1.r;
-p->i = p1.i;
-}
diff --git a/gcc/f/runtime/libF77/pow_dd.c b/gcc/f/runtime/libF77/pow_dd.c
deleted file mode 100644
index d0dd0ff..0000000
--- a/gcc/f/runtime/libF77/pow_dd.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double pow();
-double pow_dd(ap, bp) doublereal *ap, *bp;
-#else
-#undef abs
-#include <math.h>
-double pow_dd(doublereal *ap, doublereal *bp)
-#endif
-{
-return(pow(*ap, *bp) );
-}
diff --git a/gcc/f/runtime/libF77/pow_di.c b/gcc/f/runtime/libF77/pow_di.c
deleted file mode 100644
index affed62..0000000
--- a/gcc/f/runtime/libF77/pow_di.c
+++ /dev/null
@@ -1,35 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double pow_di(ap, bp) doublereal *ap; integer *bp;
-#else
-double pow_di(doublereal *ap, integer *bp)
-#endif
-{
-double pow, x;
-integer n;
-unsigned long u;
-
-pow = 1;
-x = *ap;
-n = *bp;
-
-if(n != 0)
-	{
-	if(n < 0)
-		{
-		n = -n;
-		x = 1/x;
-		}
-	for(u = n; ; )
-		{
-		if(u & 01)
-			pow *= x;
-		if(u >>= 1)
-			x *= x;
-		else
-			break;
-		}
-	}
-return(pow);
-}
diff --git a/gcc/f/runtime/libF77/pow_hh.c b/gcc/f/runtime/libF77/pow_hh.c
deleted file mode 100644
index 24a0197..0000000
--- a/gcc/f/runtime/libF77/pow_hh.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-shortint pow_hh(ap, bp) shortint *ap, *bp;
-#else
-shortint pow_hh(shortint *ap, shortint *bp)
-#endif
-{
-	shortint pow, x, n;
-	unsigned u;
-
-	x = *ap;
-	n = *bp;
-
-	if (n <= 0) {
-		if (n == 0 || x == 1)
-			return 1;
-		if (x != -1)
-			return x == 0 ? 1/x : 0;
-		n = -n;
-		}
-	u = n;
-	for(pow = 1; ; )
-		{
-		if(u & 01)
-			pow *= x;
-		if(u >>= 1)
-			x *= x;
-		else
-			break;
-		}
-	return(pow);
-	}
diff --git a/gcc/f/runtime/libF77/pow_ii.c b/gcc/f/runtime/libF77/pow_ii.c
deleted file mode 100644
index 84d1c7e..0000000
--- a/gcc/f/runtime/libF77/pow_ii.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-integer pow_ii(ap, bp) integer *ap, *bp;
-#else
-integer pow_ii(integer *ap, integer *bp)
-#endif
-{
-	integer pow, x, n;
-	unsigned long u;
-
-	x = *ap;
-	n = *bp;
-
-	if (n <= 0) {
-		if (n == 0 || x == 1)
-			return 1;
-		if (x != -1)
-			return x == 0 ? 1/x : 0;
-		n = -n;
-		}
-	u = n;
-	for(pow = 1; ; )
-		{
-		if(u & 01)
-			pow *= x;
-		if(u >>= 1)
-			x *= x;
-		else
-			break;
-		}
-	return(pow);
-	}
diff --git a/gcc/f/runtime/libF77/pow_qq.c b/gcc/f/runtime/libF77/pow_qq.c
deleted file mode 100644
index 3bc80e0..0000000
--- a/gcc/f/runtime/libF77/pow_qq.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-longint pow_qq(ap, bp) longint *ap, *bp;
-#else
-longint pow_qq(longint *ap, longint *bp)
-#endif
-{
-	longint pow, x, n;
-	unsigned long long u;	/* system-dependent */
-
-	x = *ap;
-	n = *bp;
-
-	if (n <= 0) {
-		if (n == 0 || x == 1)
-			return 1;
-		if (x != -1)
-			return x == 0 ? 1/x : 0;
-		n = -n;
-		}
-	u = n;
-	for(pow = 1; ; )
-		{
-		if(u & 01)
-			pow *= x;
-		if(u >>= 1)
-			x *= x;
-		else
-			break;
-		}
-	return(pow);
-	}
diff --git a/gcc/f/runtime/libF77/pow_ri.c b/gcc/f/runtime/libF77/pow_ri.c
deleted file mode 100644
index 6e5816b..0000000
--- a/gcc/f/runtime/libF77/pow_ri.c
+++ /dev/null
@@ -1,35 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double pow_ri(ap, bp) real *ap; integer *bp;
-#else
-double pow_ri(real *ap, integer *bp)
-#endif
-{
-double pow, x;
-integer n;
-unsigned long u;
-
-pow = 1;
-x = *ap;
-n = *bp;
-
-if(n != 0)
-	{
-	if(n < 0)
-		{
-		n = -n;
-		x = 1/x;
-		}
-	for(u = n; ; )
-		{
-		if(u & 01)
-			pow *= x;
-		if(u >>= 1)
-			x *= x;
-		else
-			break;
-		}
-	}
-return(pow);
-}
diff --git a/gcc/f/runtime/libF77/pow_zi.c b/gcc/f/runtime/libF77/pow_zi.c
deleted file mode 100644
index 898ea6b..0000000
--- a/gcc/f/runtime/libF77/pow_zi.c
+++ /dev/null
@@ -1,61 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-VOID pow_zi(resx, a, b) 	/* p = a**b  */
- doublecomplex *resx, *a; integer *b;
-#else
-extern void z_div(doublecomplex*, doublecomplex*, doublecomplex*);
-void pow_zi(doublecomplex *resx, doublecomplex *a, integer *b) 	/* p = a**b  */
-#endif
-{
-integer n;
-unsigned long u;
-double t;
-doublecomplex x;
-doublecomplex res;
-static doublecomplex one = {1.0, 0.0};
-
-n = *b;
-
-if(n == 0)
-	{
-	resx->r = 1;
-	resx->i = 0;
-	return;
-	}
-
-res.r = 1;
-res.i = 0;
-
-if(n < 0)
-	{
-	n = -n;
-	z_div(&x, &one, a);
-	}
-else
-	{
-	x.r = a->r;
-	x.i = a->i;
-	}
-
-for(u = n; ; )
-	{
-	if(u & 01)
-		{
-		t = res.r * x.r - res.i * x.i;
-		res.i = res.r * x.i + res.i * x.r;
-		res.r = t;
-		}
-	if(u >>= 1)
-		{
-		t = x.r * x.r - x.i * x.i;
-		x.i = 2 * x.r * x.i;
-		x.r = t;
-		}
-	else
-		break;
-	}
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libF77/pow_zz.c b/gcc/f/runtime/libF77/pow_zz.c
deleted file mode 100644
index 20faf29..0000000
--- a/gcc/f/runtime/libF77/pow_zz.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double log(), exp(), cos(), sin(), atan2(), f__cabs();
-VOID pow_zz(r,a,b) doublecomplex *r, *a, *b;
-#else
-#undef abs
-#include <math.h>
-extern double f__cabs(double,double);
-void pow_zz(doublecomplex *r, doublecomplex *a, doublecomplex *b)
-#endif
-{
-double logr, logi, x, y;
-
-logr = log( f__cabs(a->r, a->i) );
-logi = atan2(a->i, a->r);
-
-x = exp( logr * b->r - logi * b->i );
-y = logr * b->i + logi * b->r;
-
-r->r = x * cos(y);
-r->i = x * sin(y);
-}
diff --git a/gcc/f/runtime/libF77/qbitbits.c b/gcc/f/runtime/libF77/qbitbits.c
deleted file mode 100644
index ad4ac96..0000000
--- a/gcc/f/runtime/libF77/qbitbits.c
+++ /dev/null
@@ -1,66 +0,0 @@
-#include "f2c.h"
-
-#ifndef LONGBITS
-#define LONGBITS 32
-#endif
-
-#ifndef LONG8BITS
-#define LONG8BITS (2*LONGBITS)
-#endif
-
- integer
-#ifdef KR_headers
-qbit_bits(a, b, len) longint a; integer b, len;
-#else
-qbit_bits(longint a, integer b, integer len)
-#endif
-{
-	/* Assume 2's complement arithmetic */
-
-	ulongint x, y;
-
-	x = (ulongint) a;
-	y = (ulongint)-1L;
-	x >>= b;
-	y <<= len;
-	return (longint)(x & y);
-	}
-
- longint
-#ifdef KR_headers
-qbit_cshift(a, b, len) longint a; integer b, len;
-#else
-qbit_cshift(longint a, integer b, integer len)
-#endif
-{
-	ulongint x, y, z;
-
-	x = (ulongint)a;
-	if (len <= 0) {
-		if (len == 0)
-			return 0;
-		goto full_len;
-		}
-	if (len >= LONG8BITS) {
- full_len:
-		if (b >= 0) {
-			b %= LONG8BITS;
-			return (longint)(x << b | x >> LONG8BITS - b );
-			}
-		b = -b;
-		b %= LONG8BITS;
-		return (longint)(x << LONG8BITS - b | x >> b);
-		}
-	y = z = (unsigned long)-1;
-	y <<= len;
-	z &= ~y;
-	y &= x;
-	x &= z;
-	if (b >= 0) {
-		b %= len;
-		return (longint)(y | z & (x << b | x >> len - b));
-		}
-	b = -b;
-	b %= len;
-	return (longint)(y | z & (x >> b | x << len - b));
-	}
diff --git a/gcc/f/runtime/libF77/qbitshft.c b/gcc/f/runtime/libF77/qbitshft.c
deleted file mode 100644
index 87fffb9..0000000
--- a/gcc/f/runtime/libF77/qbitshft.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include "f2c.h"
-
- longint
-#ifdef KR_headers
-qbit_shift(a, b) longint a; integer b;
-#else
-qbit_shift(longint a, integer b)
-#endif
-{
-	return b >= 0 ? a << b : (longint)((ulongint)a >> -b);
-	}
diff --git a/gcc/f/runtime/libF77/r_abs.c b/gcc/f/runtime/libF77/r_abs.c
deleted file mode 100644
index 7b22296..0000000
--- a/gcc/f/runtime/libF77/r_abs.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double r_abs(x) real *x;
-#else
-double r_abs(real *x)
-#endif
-{
-if(*x >= 0)
-	return(*x);
-return(- *x);
-}
diff --git a/gcc/f/runtime/libF77/r_acos.c b/gcc/f/runtime/libF77/r_acos.c
deleted file mode 100644
index 330f88a..0000000
--- a/gcc/f/runtime/libF77/r_acos.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double acos();
-double r_acos(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_acos(real *x)
-#endif
-{
-return( acos(*x) );
-}
diff --git a/gcc/f/runtime/libF77/r_asin.c b/gcc/f/runtime/libF77/r_asin.c
deleted file mode 100644
index 45ece4b..0000000
--- a/gcc/f/runtime/libF77/r_asin.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double asin();
-double r_asin(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_asin(real *x)
-#endif
-{
-return( asin(*x) );
-}
diff --git a/gcc/f/runtime/libF77/r_atan.c b/gcc/f/runtime/libF77/r_atan.c
deleted file mode 100644
index 36479c9..0000000
--- a/gcc/f/runtime/libF77/r_atan.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double atan();
-double r_atan(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_atan(real *x)
-#endif
-{
-return( atan(*x) );
-}
diff --git a/gcc/f/runtime/libF77/r_atn2.c b/gcc/f/runtime/libF77/r_atn2.c
deleted file mode 100644
index 9347e1f..0000000
--- a/gcc/f/runtime/libF77/r_atn2.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double atan2();
-double r_atn2(x,y) real *x, *y;
-#else
-#undef abs
-#include <math.h>
-double r_atn2(real *x, real *y)
-#endif
-{
-return( atan2(*x,*y) );
-}
diff --git a/gcc/f/runtime/libF77/r_cnjg.c b/gcc/f/runtime/libF77/r_cnjg.c
deleted file mode 100644
index b6175ee..0000000
--- a/gcc/f/runtime/libF77/r_cnjg.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-VOID r_cnjg(resx, z) complex *resx, *z;
-#else
-VOID r_cnjg(complex *resx, complex *z)
-#endif
-{
-complex res;
-
-res.r = z->r;
-res.i = - z->i;
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libF77/r_cos.c b/gcc/f/runtime/libF77/r_cos.c
deleted file mode 100644
index 5bda158..0000000
--- a/gcc/f/runtime/libF77/r_cos.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double cos();
-double r_cos(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_cos(real *x)
-#endif
-{
-return( cos(*x) );
-}
diff --git a/gcc/f/runtime/libF77/r_cosh.c b/gcc/f/runtime/libF77/r_cosh.c
deleted file mode 100644
index 7ae72cc..0000000
--- a/gcc/f/runtime/libF77/r_cosh.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double cosh();
-double r_cosh(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_cosh(real *x)
-#endif
-{
-return( cosh(*x) );
-}
diff --git a/gcc/f/runtime/libF77/r_dim.c b/gcc/f/runtime/libF77/r_dim.c
deleted file mode 100644
index baca95c..0000000
--- a/gcc/f/runtime/libF77/r_dim.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double r_dim(a,b) real *a, *b;
-#else
-double r_dim(real *a, real *b)
-#endif
-{
-return( *a > *b ? *a - *b : 0);
-}
diff --git a/gcc/f/runtime/libF77/r_exp.c b/gcc/f/runtime/libF77/r_exp.c
deleted file mode 100644
index d1dea75..0000000
--- a/gcc/f/runtime/libF77/r_exp.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double exp();
-double r_exp(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_exp(real *x)
-#endif
-{
-return( exp(*x) );
-}
diff --git a/gcc/f/runtime/libF77/r_imag.c b/gcc/f/runtime/libF77/r_imag.c
deleted file mode 100644
index d51252b..0000000
--- a/gcc/f/runtime/libF77/r_imag.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double r_imag(z) complex *z;
-#else
-double r_imag(complex *z)
-#endif
-{
-return(z->i);
-}
diff --git a/gcc/f/runtime/libF77/r_int.c b/gcc/f/runtime/libF77/r_int.c
deleted file mode 100644
index 8378e77..0000000
--- a/gcc/f/runtime/libF77/r_int.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double floor();
-double r_int(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_int(real *x)
-#endif
-{
-return( (*x>0) ? floor(*x) : -floor(- *x) );
-}
diff --git a/gcc/f/runtime/libF77/r_lg10.c b/gcc/f/runtime/libF77/r_lg10.c
deleted file mode 100644
index 51f8420..0000000
--- a/gcc/f/runtime/libF77/r_lg10.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include "f2c.h"
-
-#define log10e 0.43429448190325182765
-
-#ifdef KR_headers
-double log();
-double r_lg10(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_lg10(real *x)
-#endif
-{
-return( log10e * log(*x) );
-}
diff --git a/gcc/f/runtime/libF77/r_log.c b/gcc/f/runtime/libF77/r_log.c
deleted file mode 100644
index 4873fb4..0000000
--- a/gcc/f/runtime/libF77/r_log.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double log();
-double r_log(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_log(real *x)
-#endif
-{
-return( log(*x) );
-}
diff --git a/gcc/f/runtime/libF77/r_mod.c b/gcc/f/runtime/libF77/r_mod.c
deleted file mode 100644
index faea344..0000000
--- a/gcc/f/runtime/libF77/r_mod.c
+++ /dev/null
@@ -1,40 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-#ifdef IEEE_drem
-double drem();
-#else
-double floor();
-#endif
-double r_mod(x,y) real *x, *y;
-#else
-#ifdef IEEE_drem
-double drem(double, double);
-#else
-#undef abs
-#include <math.h>
-#endif
-double r_mod(real *x, real *y)
-#endif
-{
-#ifdef IEEE_drem
-	double xa, ya, z;
-	if ((ya = *y) < 0.)
-		ya = -ya;
-	z = drem(xa = *x, ya);
-	if (xa > 0) {
-		if (z < 0)
-			z += ya;
-		}
-	else if (z > 0)
-		z -= ya;
-	return z;
-#else
-	double quotient;
-	if( (quotient = (double)*x / *y) >= 0)
-		quotient = floor(quotient);
-	else
-		quotient = -floor(-quotient);
-	return(*x - (*y) * quotient );
-#endif
-}
diff --git a/gcc/f/runtime/libF77/r_nint.c b/gcc/f/runtime/libF77/r_nint.c
deleted file mode 100644
index f5382af..0000000
--- a/gcc/f/runtime/libF77/r_nint.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double floor();
-double r_nint(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_nint(real *x)
-#endif
-{
-return( (*x)>=0 ?
-	floor(*x + .5) : -floor(.5 - *x) );
-}
diff --git a/gcc/f/runtime/libF77/r_sign.c b/gcc/f/runtime/libF77/r_sign.c
deleted file mode 100644
index df6d02a..0000000
--- a/gcc/f/runtime/libF77/r_sign.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double r_sign(a,b) real *a, *b;
-#else
-double r_sign(real *a, real *b)
-#endif
-{
-double x;
-x = (*a >= 0 ? *a : - *a);
-return( *b >= 0 ? x : -x);
-}
diff --git a/gcc/f/runtime/libF77/r_sin.c b/gcc/f/runtime/libF77/r_sin.c
deleted file mode 100644
index 095b951..0000000
--- a/gcc/f/runtime/libF77/r_sin.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double sin();
-double r_sin(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_sin(real *x)
-#endif
-{
-return( sin(*x) );
-}
diff --git a/gcc/f/runtime/libF77/r_sinh.c b/gcc/f/runtime/libF77/r_sinh.c
deleted file mode 100644
index 3bf4bb1..0000000
--- a/gcc/f/runtime/libF77/r_sinh.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double sinh();
-double r_sinh(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_sinh(real *x)
-#endif
-{
-return( sinh(*x) );
-}
diff --git a/gcc/f/runtime/libF77/r_sqrt.c b/gcc/f/runtime/libF77/r_sqrt.c
deleted file mode 100644
index d0203d3..0000000
--- a/gcc/f/runtime/libF77/r_sqrt.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double sqrt();
-double r_sqrt(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_sqrt(real *x)
-#endif
-{
-return( sqrt(*x) );
-}
diff --git a/gcc/f/runtime/libF77/r_tan.c b/gcc/f/runtime/libF77/r_tan.c
deleted file mode 100644
index fc0009e..0000000
--- a/gcc/f/runtime/libF77/r_tan.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double tan();
-double r_tan(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_tan(real *x)
-#endif
-{
-return( tan(*x) );
-}
diff --git a/gcc/f/runtime/libF77/r_tanh.c b/gcc/f/runtime/libF77/r_tanh.c
deleted file mode 100644
index 818c6a8..0000000
--- a/gcc/f/runtime/libF77/r_tanh.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double tanh();
-double r_tanh(x) real *x;
-#else
-#undef abs
-#include <math.h>
-double r_tanh(real *x)
-#endif
-{
-return( tanh(*x) );
-}
diff --git a/gcc/f/runtime/libF77/s_cat.c b/gcc/f/runtime/libF77/s_cat.c
deleted file mode 100644
index f462fd2..0000000
--- a/gcc/f/runtime/libF77/s_cat.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Unless compiled with -DNO_OVERWRITE, this variant of s_cat allows the
- * target of a concatenation to appear on its right-hand side (contrary
- * to the Fortran 77 Standard, but in accordance with Fortran 90).
- */
-
-#include "f2c.h"
-#ifndef NO_OVERWRITE
-#include <stdio.h>
-#undef abs
-#ifdef KR_headers
- extern char *F77_aloc();
- extern void free();
- extern void G77_exit_0 ();
-#else
-#undef min
-#undef max
-#include <stdlib.h>
- extern char *F77_aloc(ftnlen, char*);
-#endif
-#include <string.h>
-#endif /* NO_OVERWRITE */
-
- VOID
-#ifdef KR_headers
-s_cat(lp, rpp, rnp, np, ll) char *lp, *rpp[]; ftnlen rnp[], *np, ll;
-#else
-s_cat(char *lp, char *rpp[], ftnlen rnp[], ftnlen *np, ftnlen ll)
-#endif
-{
-	ftnlen i, nc;
-	char *rp;
-	ftnlen n = *np;
-#ifndef NO_OVERWRITE
-	ftnlen L, m;
-	char *lp0, *lp1;
-
-	lp0 = 0;
-	lp1 = lp;
-	L = ll;
-	i = 0;
-	while(i < n) {
-		rp = rpp[i];
-		m = rnp[i++];
-		if (rp >= lp1 || rp + m <= lp) {
-			if ((L -= m) <= 0) {
-				n = i;
-				break;
-				}
-			lp1 += m;
-			continue;
-			}
-		lp0 = lp;
-		lp = lp1 = F77_aloc(L = ll, "s_cat");
-		break;
-		}
-	lp1 = lp;
-#endif /* NO_OVERWRITE */
-	for(i = 0 ; i < n ; ++i) {
-		nc = ll;
-		if(rnp[i] < nc)
-			nc = rnp[i];
-		ll -= nc;
-		rp = rpp[i];
-		while(--nc >= 0)
-			*lp++ = *rp++;
-		}
-	while(--ll >= 0)
-		*lp++ = ' ';
-#ifndef NO_OVERWRITE
-	if (lp0) {
-		memcpy(lp0, lp1, L);
-		free(lp1);
-		}
-#endif
-	}
diff --git a/gcc/f/runtime/libF77/s_cmp.c b/gcc/f/runtime/libF77/s_cmp.c
deleted file mode 100644
index 1e052f286..0000000
--- a/gcc/f/runtime/libF77/s_cmp.c
+++ /dev/null
@@ -1,44 +0,0 @@
-#include "f2c.h"
-
-/* compare two strings */
-
-#ifdef KR_headers
-integer s_cmp(a0, b0, la, lb) char *a0, *b0; ftnlen la, lb;
-#else
-integer s_cmp(char *a0, char *b0, ftnlen la, ftnlen lb)
-#endif
-{
-register unsigned char *a, *aend, *b, *bend;
-a = (unsigned char *)a0;
-b = (unsigned char *)b0;
-aend = a + la;
-bend = b + lb;
-
-if(la <= lb)
-	{
-	while(a < aend)
-		if(*a != *b)
-			return( *a - *b );
-		else
-			{ ++a; ++b; }
-
-	while(b < bend)
-		if(*b != ' ')
-			return( ' ' - *b );
-		else	++b;
-	}
-
-else
-	{
-	while(b < bend)
-		if(*a == *b)
-			{ ++a; ++b; }
-		else
-			return( *a - *b );
-	while(a < aend)
-		if(*a != ' ')
-			return(*a - ' ');
-		else	++a;
-	}
-return(0);
-}
diff --git a/gcc/f/runtime/libF77/s_copy.c b/gcc/f/runtime/libF77/s_copy.c
deleted file mode 100644
index d167351..0000000
--- a/gcc/f/runtime/libF77/s_copy.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Unless compiled with -DNO_OVERWRITE, this variant of s_copy allows the
- * target of an assignment to appear on its right-hand side (contrary
- * to the Fortran 77 Standard, but in accordance with Fortran 90),
- * as in  a(2:5) = a(4:7) .
- */
-
-#include "f2c.h"
-
-/* assign strings:  a = b */
-
-#ifdef KR_headers
-VOID s_copy(a, b, la, lb) register char *a, *b; ftnlen la, lb;
-#else
-void s_copy(register char *a, register char *b, ftnlen la, ftnlen lb)
-#endif
-{
-	register char *aend, *bend;
-
-	aend = a + la;
-
-	if(la <= lb)
-#ifndef NO_OVERWRITE
-		if (a <= b || a >= b + la)
-#endif
-			while(a < aend)
-				*a++ = *b++;
-#ifndef NO_OVERWRITE
-		else
-			for(b += la; a < aend; )
-				*--aend = *--b;
-#endif
-
-	else {
-		bend = b + lb;
-#ifndef NO_OVERWRITE
-		if (a <= b || a >= bend)
-#endif
-			while(b < bend)
-				*a++ = *b++;
-#ifndef NO_OVERWRITE
-		else {
-			a += lb;
-			while(b < bend)
-				*--a = *--bend;
-			a += lb;
-			}
-#endif
-		while(a < aend)
-			*a++ = ' ';
-		}
-	}
diff --git a/gcc/f/runtime/libF77/s_paus.c b/gcc/f/runtime/libF77/s_paus.c
deleted file mode 100644
index 1317008..0000000
--- a/gcc/f/runtime/libF77/s_paus.c
+++ /dev/null
@@ -1,88 +0,0 @@
-#include <stdio.h>
-#include "f2c.h"
-#define PAUSESIG 15
-
-#ifdef KR_headers
-#define Void /* void */
-#define Int /* int */
-#else
-#define Void void
-#define Int int
-#undef abs
-#undef min
-#undef max
-#include <stdlib.h>
-#include "signal1.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-extern int getpid(void), isatty(int), pause(void);
-#endif
-
-extern VOID f_exit(Void);
-
- static VOID
-waitpause(Int n)
-{	n = n; /* shut up compiler warning */
-	return;
-	}
-
- static VOID
-#ifdef KR_headers
-s_1paus(fin) FILE *fin;
-#else
-s_1paus(FILE *fin)
-#endif
-{
-	fprintf(stderr,
-	"To resume execution, type go.  Other input will terminate the job.\n");
-	fflush(stderr);
-	if( getc(fin)!='g' || getc(fin)!='o' || getc(fin)!='\n' ) {
-		fprintf(stderr, "STOP\n");
-#ifdef NO_ONEXIT
-		f_exit();
-#endif
-		exit(0);
-		}
-	}
-
- int
-#ifdef KR_headers
-s_paus(s, n) char *s; ftnlen n;
-#else
-s_paus(char *s, ftnlen n)
-#endif
-{
-	fprintf(stderr, "PAUSE ");
-	if(n > 0)
-		fprintf(stderr, " %.*s", (int)n, s);
-	fprintf(stderr, " statement executed\n");
-	if( isatty(fileno(stdin)) )
-		s_1paus(stdin);
-	else {
-#if (defined (MSDOS) && !defined (GO32)) || defined(__CYGWIN32__)
-		FILE *fin;
-		fin = fopen("con", "r");
-		if (!fin) {
-			fprintf(stderr, "s_paus: can't open con!\n");
-			fflush(stderr);
-			exit(1);
-			}
-		s_1paus(fin);
-		fclose(fin);
-#else
-		fprintf(stderr,
-		"To resume execution, execute a   kill -%d %d   command\n",
-			PAUSESIG, getpid() );
-		signal1(PAUSESIG, waitpause);
-		fflush(stderr);
-		pause();
-#endif
-		}
-	fprintf(stderr, "Execution resumes after PAUSE.\n");
-	fflush(stderr);
-	return 0; /* NOT REACHED */
-#ifdef __cplusplus
-	}
-#endif
-}
diff --git a/gcc/f/runtime/libF77/s_rnge.c b/gcc/f/runtime/libF77/s_rnge.c
deleted file mode 100644
index 189b524..0000000
--- a/gcc/f/runtime/libF77/s_rnge.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-#include "f2c.h"
-
-/* called when a subscript is out of range */
-
-#ifdef KR_headers
-extern VOID sig_die();
-integer s_rnge(varn, offset, procn, line) char *varn, *procn; ftnint offset, line;
-#else
-extern VOID sig_die(char*,int);
-integer s_rnge(char *varn, ftnint offset, char *procn, ftnint line)
-#endif
-{
-register int i;
-
-fprintf(stderr, "Subscript out of range on file line %ld, procedure ", line);
-while((i = *procn) && i != '_' && i != ' ')
-	putc(*procn++, stderr);
-fprintf(stderr, ".\nAttempt to access the %ld-th element of variable ", offset+1);
-while((i = *varn) && i != ' ')
-	putc(*varn++, stderr);
-sig_die(".", 1);
-#ifdef __cplusplus
-return 0;
-#endif
-}
diff --git a/gcc/f/runtime/libF77/s_stop.c b/gcc/f/runtime/libF77/s_stop.c
deleted file mode 100644
index 2e3f103..0000000
--- a/gcc/f/runtime/libF77/s_stop.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <stdio.h>
-#include "f2c.h"
-
-#ifdef KR_headers
-extern void f_exit();
-VOID s_stop(s, n) char *s; ftnlen n;
-#else
-#undef abs
-#undef min
-#undef max
-#include <stdlib.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
-void f_exit(void);
-
-int s_stop(char *s, ftnlen n)
-#endif
-{
-int i;
-
-if(n > 0)
-	{
-	fprintf(stderr, "STOP ");
-	for(i = 0; i<n ; ++i)
-		putc(*s++, stderr);
-	fprintf(stderr, " statement executed\n");
-	}
-#ifdef NO_ONEXIT
-f_exit();
-#endif
-exit(0);
-#ifdef __cplusplus
-return 0; /* NOT REACHED */
-}
-#endif
-}
diff --git a/gcc/f/runtime/libF77/sig_die.c b/gcc/f/runtime/libF77/sig_die.c
deleted file mode 100644
index bebb1e7..0000000
--- a/gcc/f/runtime/libF77/sig_die.c
+++ /dev/null
@@ -1,45 +0,0 @@
-#include <stdio.h>
-#include <signal.h>
-
-#ifndef SIGIOT
-#ifdef SIGABRT
-#define SIGIOT SIGABRT
-#endif
-#endif
-
-#ifdef KR_headers
-void sig_die(s, kill) register char *s; int kill;
-#else
-#include <stdlib.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
- extern void f_exit(void);
-
-void sig_die(register char *s, int kill)
-#endif
-{
-	/* print error message, then clear buffers */
-	fprintf(stderr, "%s\n", s);
-
-	if(kill)
-		{
-		fflush(stderr);
-		f_exit();
-		fflush(stderr);
-		/* now get a core */
-#ifdef SIGIOT
-		signal(SIGIOT, SIG_DFL);
-#endif
-		abort();
-		}
-	else {
-#ifdef NO_ONEXIT
-		f_exit();
-#endif
-		exit(1);
-		}
-	}
-#ifdef __cplusplus
-}
-#endif
diff --git a/gcc/f/runtime/libF77/signal1.h b/gcc/f/runtime/libF77/signal1.h
deleted file mode 100644
index b559211..0000000
--- a/gcc/f/runtime/libF77/signal1.h
+++ /dev/null
@@ -1,5 +0,0 @@
-/* The g77 implementation of libf2c directly includes signal1.h0,
-   instead of copying it to signal1.h, since that seems easier to
-   cope with at this point.  */
-
-#include "signal1.h0"
diff --git a/gcc/f/runtime/libF77/signal1.h0 b/gcc/f/runtime/libF77/signal1.h0
deleted file mode 100644
index 8800a18..0000000
--- a/gcc/f/runtime/libF77/signal1.h0
+++ /dev/null
@@ -1,25 +0,0 @@
-/* You may need to adjust the definition of signal1 to supply a */
-/* cast to the correct argument type.  This detail is system- and */
-/* compiler-dependent.   The #define below assumes signal.h declares */
-/* type SIG_PF for the signal function's second argument. */
-
-#include <signal.h>
-
-#ifndef Sigret_t
-#define Sigret_t void
-#endif
-#ifndef Sigarg_t
-#ifdef KR_headers
-#define Sigarg_t
-#else
-#define Sigarg_t int
-#endif
-#endif /*Sigarg_t*/
-
-#ifdef USE_SIG_PF	/* compile with -DUSE_SIG_PF under IRIX */
-#define sig_pf SIG_PF
-#else
-typedef Sigret_t (*sig_pf)(Sigarg_t);
-#endif
-
-#define signal1(a,b) signal(a,(sig_pf)b)
diff --git a/gcc/f/runtime/libF77/signal_.c b/gcc/f/runtime/libF77/signal_.c
deleted file mode 100644
index 1ac8139..0000000
--- a/gcc/f/runtime/libF77/signal_.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "f2c.h"
-#include "signal1.h"
-
-#ifdef KR_headers
-ftnint G77_signal_0 (sigp, proc) integer *sigp; sig_pf proc;
-#else
-ftnint G77_signal_0 (integer *sigp, sig_pf proc)
-#endif
-{
-	int sig;
-	sig = (int)*sigp;
-
-	return (ftnint)signal(sig, proc);
-	}
diff --git a/gcc/f/runtime/libF77/system_.c b/gcc/f/runtime/libF77/system_.c
deleted file mode 100644
index ed024a1..0000000
--- a/gcc/f/runtime/libF77/system_.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* f77 interface to system routine */
-
-#include "f2c.h"
-
-#ifdef KR_headers
-extern char *F77_aloc();
-
- integer
-G77_system_0 (s, n) register char *s; ftnlen n;
-#else
-#undef abs
-#undef min
-#undef max
-#include <stdlib.h>
-extern char *F77_aloc(ftnlen, char*);
-
- integer
-G77_system_0 (register char *s, ftnlen n)
-#endif
-{
-	char buff0[256], *buff;
-	register char *bp, *blast;
-	integer rv;
-
-	buff = bp = n < sizeof(buff0)
-			? buff0 : F77_aloc(n+1, "system_");
-	blast = bp + n;
-
-	while(bp < blast && *s)
-		*bp++ = *s++;
-	*bp = 0;
-	rv = system(buff);
-	if (buff != buff0)
-		free(buff);
-	return rv;
-	}
diff --git a/gcc/f/runtime/libF77/z_abs.c b/gcc/f/runtime/libF77/z_abs.c
deleted file mode 100644
index 7e67ad2..0000000
--- a/gcc/f/runtime/libF77/z_abs.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double f__cabs();
-double z_abs(z) doublecomplex *z;
-#else
-double f__cabs(double, double);
-double z_abs(doublecomplex *z)
-#endif
-{
-return( f__cabs( z->r, z->i ) );
-}
diff --git a/gcc/f/runtime/libF77/z_cos.c b/gcc/f/runtime/libF77/z_cos.c
deleted file mode 100644
index a811bbe..0000000
--- a/gcc/f/runtime/libF77/z_cos.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double sin(), cos(), sinh(), cosh();
-VOID z_cos(resx, z) doublecomplex *resx, *z;
-#else
-#undef abs
-#include <math.h>
-void z_cos(doublecomplex *resx, doublecomplex *z)
-#endif
-{
-doublecomplex res;
-
-res.r = cos(z->r) * cosh(z->i);
-res.i = - sin(z->r) * sinh(z->i);
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libF77/z_div.c b/gcc/f/runtime/libF77/z_div.c
deleted file mode 100644
index 4a987ab..0000000
--- a/gcc/f/runtime/libF77/z_div.c
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-extern VOID sig_die();
-VOID z_div(resx, a, b) doublecomplex *a, *b, *resx;
-#else
-extern void sig_die(char*, int);
-void z_div(doublecomplex *resx, doublecomplex *a, doublecomplex *b)
-#endif
-{
-double ratio, den;
-double abr, abi;
-doublecomplex res;
-
-if( (abr = b->r) < 0.)
-	abr = - abr;
-if( (abi = b->i) < 0.)
-	abi = - abi;
-if( abr <= abi )
-	{
-	if(abi == 0)
-		sig_die("complex division by zero", 1);
-	ratio = b->r / b->i ;
-	den = b->i * (1 + ratio*ratio);
-	res.r = (a->r*ratio + a->i) / den;
-	res.i = (a->i*ratio - a->r) / den;
-	}
-
-else
-	{
-	ratio = b->i / b->r ;
-	den = b->r * (1 + ratio*ratio);
-	res.r = (a->r + a->i*ratio) / den;
-	res.i = (a->i - a->r*ratio) / den;
-	}
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libF77/z_exp.c b/gcc/f/runtime/libF77/z_exp.c
deleted file mode 100644
index 85fb63e..0000000
--- a/gcc/f/runtime/libF77/z_exp.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double exp(), cos(), sin();
-VOID z_exp(resx, z) doublecomplex *resx, *z;
-#else
-#undef abs
-#include <math.h>
-void z_exp(doublecomplex *resx, doublecomplex *z)
-#endif
-{
-double expx;
-doublecomplex res;
-
-expx = exp(z->r);
-res.r = expx * cos(z->i);
-res.i = expx * sin(z->i);
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libF77/z_log.c b/gcc/f/runtime/libF77/z_log.c
deleted file mode 100644
index 48afca6..0000000
--- a/gcc/f/runtime/libF77/z_log.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double log(), f__cabs(), atan2();
-VOID z_log(resx, z) doublecomplex *resx, *z;
-#else
-#undef abs
-#include <math.h>
-extern double f__cabs(double, double);
-void z_log(doublecomplex *resx, doublecomplex *z)
-#endif
-{
-doublecomplex res;
-
-res.i = atan2(z->i, z->r);
-res.r = log( f__cabs( z->r, z->i ) );
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libF77/z_sin.c b/gcc/f/runtime/libF77/z_sin.c
deleted file mode 100644
index 94456c9..0000000
--- a/gcc/f/runtime/libF77/z_sin.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double sin(), cos(), sinh(), cosh();
-VOID z_sin(resx, z) doublecomplex *resx, *z;
-#else
-#undef abs
-#include <math.h>
-void z_sin(doublecomplex *resx, doublecomplex *z)
-#endif
-{
-doublecomplex res;
-
-res.r = sin(z->r) * cosh(z->i);
-res.i = cos(z->r) * sinh(z->i);
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libF77/z_sqrt.c b/gcc/f/runtime/libF77/z_sqrt.c
deleted file mode 100644
index f5db565..0000000
--- a/gcc/f/runtime/libF77/z_sqrt.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include "f2c.h"
-
-#ifdef KR_headers
-double sqrt(), f__cabs();
-VOID z_sqrt(resx, z) doublecomplex *resx, *z;
-#else
-#undef abs
-#include <math.h>
-extern double f__cabs(double, double);
-void z_sqrt(doublecomplex *resx, doublecomplex *z)
-#endif
-{
-double mag;
-doublecomplex res;
-
-if( (mag = f__cabs(z->r, z->i)) == 0.)
-	res.r = res.i = 0.;
-else if(z->r > 0)
-	{
-	res.r = sqrt(0.5 * (mag + z->r) );
-	res.i = z->i / res.r / 2;
-	}
-else
-	{
-	res.i = sqrt(0.5 * (mag - z->r) );
-	if(z->i < 0)
-		res.i = - res.i;
-	res.r = z->i / res.i / 2;
-	}
-
-resx->r = res.r;
-resx->i = res.i;
-}
diff --git a/gcc/f/runtime/libI77/Makefile.in b/gcc/f/runtime/libI77/Makefile.in
deleted file mode 100644
index 34bc5fa..0000000
--- a/gcc/f/runtime/libI77/Makefile.in
+++ /dev/null
@@ -1,129 +0,0 @@
-# Makefile for GNU F77 compiler runtime.
-# Copyright 1990 - 1994 by AT&T Bell Laboratories and Bellcore (see the
-# file `Notice').
-#   Portions of this file Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-#   Contributed by Dave Love (d.love@dl.ac.uk).
-#
-#This file is part of GNU Fortran.
-#
-#GNU Fortran 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 Fortran 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 Fortran; see the file COPYING.  If not, write to
-#the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-#02111-1307, USA.
-
-SHELL = /bin/sh
-
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-#### Start of system configuration section. ####
-
-# The _FOR_TARGET things are appropriate for a cross-make, passed by the
-# superior makefile
-GCC_FOR_TARGET = @CC@
-CC = $(GCC_FOR_TARGET)
-CFLAGS = @CFLAGS@ $(GCC_FLAGS)
-CPPFLAGS = @CPPFLAGS@
-DEFS = @DEFS@
-CGFLAGS = -g0
-# f2c.h should already be installed in xgcc's include directory but add that
-# to -I anyhow in case not using xgcc.
-ALL_CFLAGS = -I. -I$(srcdir) -I../../../include $(CPPFLAGS) $(DEFS) $(CFLAGS)
-AR = @AR@
-AR_FLAGS = rc
-RANLIB = @RANLIB@
-RANLIB_TEST = @RANLIB_TEST@
-CROSS = @CROSS@
-
-.SUFFIXES:
-.SUFFIXES: .c .o
-
-.c.o:
-	$(CC) -c -DSkip_f2c_Undefs -DAllow_TYQUAD $(ALL_CFLAGS) $(CGFLAGS) $<
-
-OBJ =	VersionI.o backspace.o close.o dfe.o dolio.o due.o endfile.o err.o \
-	fmt.o fmtlib.o iio.o ilnw.o inquire.o lread.o lwrite.o open.o \
-	rdfmt.o rewind.o rsfe.o rsli.o rsne.o sfe.o sue.o typesize.o uio.o \
-	util.o wref.o wrtfmt.o wsfe.o wsle.o wsne.o xwsne.o \
-	ftell_.o
-
-F2C_H = ../../../include/f2c.h
-
-all: $(OBJ)
-
-VersionI.o: Version.c
-	$(CC) -c $(CGFLAGS) -o $@ $(srcdir)/Version.c
-
-mostlyclean clean:
-	-rm -f $(OBJ)
-
-distclean maintainer-clean: mostlyclean
-	-rm -f stage? include Makefile
-
-backspace.o:	fio.h
-close.o:	fio.h
-dfe.o:		fio.h
-dfe.o:		fmt.h
-due.o:		fio.h
-endfile.o:	fio.h rawio.h
-err.o:		fio.h rawio.h
-fmt.o:		fio.h
-fmt.o:		fmt.h
-ftell_.o:	fio.h
-iio.o:		fio.h
-iio.o:		fmt.h
-ilnw.o:		fio.h
-ilnw.o:		lio.h
-inquire.o:	fio.h
-lread.o:	fio.h
-lread.o:	fmt.h
-lread.o:	lio.h
-lread.o:	fp.h
-lwrite.o:	fio.h
-lwrite.o:	fmt.h
-lwrite.o:	lio.h
-open.o:		fio.h rawio.h
-rdfmt.o:	fio.h
-rdfmt.o:	fmt.h
-rdfmt.o:	fp.h
-rewind.o:	fio.h
-rsfe.o:		fio.h
-rsfe.o:		fmt.h
-rsli.o:		fio.h
-rsli.o:		lio.h
-rsne.o:		fio.h
-rsne.o:		lio.h
-sfe.o:		fio.h
-sue.o:		fio.h
-uio.o:		fio.h
-util.o:		fio.h
-wref.o:		fio.h
-wref.o:		fmt.h
-wref.o:		fp.h
-wrtfmt.o:	fio.h
-wrtfmt.o:	fmt.h
-wsfe.o:		fio.h
-wsfe.o:		fmt.h
-wsle.o:		fio.h
-wsle.o:		fmt.h
-wsle.o:		lio.h
-wsne.o:		fio.h
-wsne.o:		lio.h
-xwsne.o:	fio.h
-xwsne.o:	lio.h
-xwsne.o:	fmt.h
-
-# May be pessimistic:
-$(OBJ): $(F2C_H)
-
-.PHONY: mostlyclean clean distclean maintainer-clean all
diff --git a/gcc/f/runtime/libI77/Notice b/gcc/f/runtime/libI77/Notice
deleted file mode 100644
index 261b719..0000000
--- a/gcc/f/runtime/libI77/Notice
+++ /dev/null
@@ -1,23 +0,0 @@
-/****************************************************************
-Copyright 1990 - 1997 by AT&T, Lucent Technologies and Bellcore.
-
-Permission to use, copy, modify, and distribute this software
-and its documentation for any purpose and without fee is hereby
-granted, provided that the above copyright notice appear in all
-copies and that both that the copyright notice and this
-permission notice and warranty disclaimer appear in supporting
-documentation, and that the names of AT&T, Bell Laboratories,
-Lucent or Bellcore or any of their entities not be used in
-advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-AT&T, Lucent and Bellcore disclaim all warranties with regard to
-this software, including all implied warranties of
-merchantability and fitness.  In no event shall AT&T, Lucent or
-Bellcore be liable for any special, indirect or consequential
-damages or any damages whatsoever resulting from loss of use,
-data or profits, whether in an action of contract, negligence or
-other tortious action, arising out of or in connection with the
-use or performance of this software.
-****************************************************************/
-
diff --git a/gcc/f/runtime/libI77/README.netlib b/gcc/f/runtime/libI77/README.netlib
deleted file mode 100644
index 30dd5b5..0000000
--- a/gcc/f/runtime/libI77/README.netlib
+++ /dev/null
@@ -1,225 +0,0 @@
-If your compiler does not recognize ANSI C headers,
-compile with KR_headers defined:  either add -DKR_headers
-to the definition of CFLAGS in the makefile, or insert
-
-#define KR_headers
-
-at the top of f2c.h and fmtlib.c .
-
-
-If you have a really ancient K&R C compiler that does not understand
-void, add -Dvoid=int to the definition of CFLAGS in the makefile.
-
-If you use a C++ compiler, first create a local f2c.h by appending
-f2ch.add to the usual f2c.h, e.g., by issuing the command
-	make f2c.h
-which assumes f2c.h is installed in /usr/include .
-
-If your system lacks /usr/include/fcntl.h , then you
-should simply create an empty fcntl.h in this directory.
-If your compiler then complains about creat and open not
-having a prototype, compile with OPEN_DECL defined.
-On many systems, open and creat are declared in fcntl.h .
-
-If your system has /usr/include/fcntl.h, you may need to add
--D_POSIX_SOURCE to the makefile's definition of CFLAGS.
-
-If your system's sprintf does not work the way ANSI C
-specifies -- specifically, if it does not return the
-number of characters transmitted -- then insert the line
-
-#define USE_STRLEN
-
-at the end of fmt.h .  This is necessary with
-at least some versions of Sun and DEC software.
-In particular, if you get a warning about an improper
-pointer/integer combination in compiling wref.c, then
-you need to compile with -DUSE_STRLEN .
-
-If your system's fopen does not like the ANSI binary
-reading and writing modes "rb" and "wb", then you should
-compile open.c with NON_ANSI_RW_MODES #defined.
-
-If you get error messages about references to cf->_ptr
-and cf->_base when compiling wrtfmt.c and wsfe.c or to
-stderr->_flag when compiling err.c, then insert the line
-
-#define NON_UNIX_STDIO
-
-at the beginning of fio.h, and recompile everything (or
-at least those modules that contain NON_UNIX_STDIO).
-
-Unformatted sequential records consist of a length of record
-contents, the record contents themselves, and the length of
-record contents again (for backspace).  Prior to 17 Oct. 1991,
-the length was of type int; now it is of type long, but you
-can change it back to int by inserting
-
-#define UIOLEN_int
-
-at the beginning of fio.h.  This affects only sue.c and uio.c .
-
-On VAX, Cray, or Research Tenth-Edition Unix systems, you may
-need to add -DVAX, -DCRAY, or -DV10 (respectively) to CFLAGS
-to make fp.h work correctly.  Alternatively, you may need to
-edit fp.h to suit your machine.
-
-You may need to supply the following non-ANSI routines:
-
-  fstat(int fileds, struct stat *buf) is similar
-to stat(char *name, struct stat *buf), except that
-the first argument, fileds, is the file descriptor
-returned by open rather than the name of the file.
-fstat is used in the system-dependent routine
-canseek (in the libI77 source file err.c), which
-is supposed to return 1 if it's possible to issue
-seeks on the file in question, 0 if it's not; you may
-need to suitably modify err.c .  On non-UNIX systems,
-you can avoid references to fstat and stat by compiling
-with NON_UNIX_STDIO defined; in that case, you may need
-to supply access(char *Name,0), which is supposed to
-return 0 if file Name exists, nonzero otherwise.
-
-  char * mktemp(char *buf) is supposed to replace the
-6 trailing X's in buf with a unique number and then
-return buf.  The idea is to get a unique name for
-a temporary file.
-
-On non-UNIX systems, you may need to change a few other,
-e.g.: the form of name computed by mktemp() in endfile.c and
-open.c; the use of the open(), close(), and creat() system
-calls in endfile.c, err.c, open.c; and the modes in calls on
-fopen() and fdopen() (and perhaps the use of fdopen() itself
--- it's supposed to return a FILE* corresponding to a given
-an integer file descriptor) in err.c and open.c (component ufmt
-of struct unit is 1 for formatted I/O -- text mode on some systems
--- and 0 for unformatted I/O -- binary mode on some systems).
-Compiling with -DNON_UNIX_STDIO omits all references to creat()
-and almost all references to open() and close(), the exception
-being in the function f__isdev() (in open.c).
-
-For MS-DOS, compile all of libI77 with -DMSDOS (which implies
--DNON_UNIX_STDIO).  You may need to make other compiler-dependent
-adjustments; for example, for Turbo C++ you need to adjust the mktemp
-invocations and to #undef ungetc in lread.c and rsne.c .
-
-If you want to be able to load against libI77 but not libF77,
-then you will need to add sig_die.o (from libF77) to libI77.
-
-If you wish to use translated Fortran that has funny notions
-of record length for direct unformatted I/O (i.e., that assumes
-RECL= values in OPEN statements are not bytes but rather counts
-of some other units -- e.g., 4-character words for VMS), then you
-should insert an appropriate #define for url_Adjust at the
-beginning of open.c .  For VMS Fortran, for example,
-#define url_Adjust(x) x *= 4
-would suffice.
-
-To check for transmission errors, issue the command
-	make check
-This assumes you have the xsum program whose source, xsum.c,
-is distributed as part of "all from f2c/src".  If you do not
-have xsum, you can obtain xsum.c by sending the following E-mail
-message to netlib@netlib.bell-labs.com
-	send xsum.c from f2c/src
-
-The makefile assumes you have installed f2c.h in a standard
-place (and does not cause recompilation when f2c.h is changed);
-f2c.h comes with "all from f2c" (the source for f2c) and is
-available separately ("f2c.h from f2c").
-
-By default, Fortran I/O units 5, 6, and 0 are pre-connected to
-stdin, stdout, and stderr, respectively.  You can change this
-behavior by changing f_init() in err.c to suit your needs.
-Note that f2c assumes READ(*... means READ(5... and WRITE(*...
-means WRITE(6... .  Moreover, an OPEN(n,... statement that does
-not specify a file name (and does not specify STATUS='SCRATCH')
-assumes FILE='fort.n' .  You can change this by editing open.c
-and endfile.c suitably.
-
-Unless you adjust the "#define MXUNIT" line in fio.h, Fortran units
-0, 1, ..., 99 are available, i.e., the highest allowed unit number
-is MXUNIT - 1.
-
-Lines protected from compilation by #ifdef Allow_TYQUAD
-are for a possible extension to 64-bit integers in which
-integer = int = 32 bits and longint = long = 64 bits.
-
-Extensions (Feb. 1993) to NAMELIST processing:
- 1. Reading a ? instead of &name (the start of a namelist) causes
-the namelist being sought to be written to stdout (unit 6);
-to omit this feature, compile rsne.c with -DNo_Namelist_Questions.
- 2. Reading the wrong namelist name now leads to an error message
-and an attempt to skip input until the right namelist name is found;
-to omit this feature, compile rsne.c with -DNo_Bad_Namelist_Skip.
- 3. Namelist writes now insert newlines before each variable; to omit
-this feature, compile xwsne.c with -DNo_Extra_Namelist_Newlines.
- 4. (Sept. 1995) When looking for the &name that starts namelist
-input, lines whose first non-blank character is something other
-than &, $, or ? are treated as comment lines and ignored, unless
-rsne.c is compiled with -DNo_Namelist_Comments.
-
-Nonstandard extension (Feb. 1993) to open: for sequential files,
-ACCESS='APPEND' (or access='anything else starting with "A" or "a"')
-causes the file to be positioned at end-of-file, so a write will
-append to the file.
-
-Some buggy Fortran programs use unformatted direct I/O to write
-an incomplete record and later read more from that record than
-they have written.  For records other than the last, the unwritten
-portion of the record reads as binary zeros.  The last record is
-a special case: attempting to read more from it than was written
-gives end-of-file -- which may help one find a bug.  Some other
-Fortran I/O libraries treat the last record no differently than
-others and thus give no help in finding the bug of reading more
-than was written.  If you wish to have this behavior, compile
-uio.c with -DPad_UDread .
-
-If you want to be able to catch write failures (e.g., due to a
-disk being full) with an ERR= specifier, compile dfe.c, due.c,
-sfe.c, sue.c, and wsle.c with -DALWAYS_FLUSH.  This will lead to
-slower execution and more I/O, but should make ERR= work as
-expected, provided fflush returns an error return when its
-physical write fails.
-
-Carriage controls are meant to be interpreted by the UNIX col
-program (or a similar program).  Sometimes it's convenient to use
-only ' ' as the carriage control character (normal single spacing).
-If you compile lwrite.c and wsfe.c with -DOMIT_BLANK_CC, formatted
-external output lines will have an initial ' ' quietly omitted,
-making use of the col program unnecessary with output that only
-has ' ' for carriage control.
-
-The Fortran 77 Standard leaves it up to the implementation whether
-formatted writes of floating-point numbers of absolute value < 1 have
-a zero before the decimal point.  By default, libI77 omits such
-superfluous zeros, but you can cause them to appear by compiling
-lwrite.c, wref.c, and wrtfmt.c with -DWANT_LEAD_0 .
-
-If your system lacks a ranlib command, you don't need it.
-Either comment out the makefile's ranlib invocation, or install
-a harmless "ranlib" command somewhere in your PATH, such as the
-one-line shell script
-
-	exit 0
-
-or (on some systems)
-
-	exec /usr/bin/ar lts $1 >/dev/null
-
-Most of the routines in libI77 are support routines for Fortran
-I/O.  There are a few exceptions, summarized below -- I/O related
-functions and subroutines that appear to your program as ordinary
-external Fortran routines.
-
-1.	CALL FLUSH flushes all buffers.
-
-2.	FTELL(i) is an INTEGER function that returns the current
-	offset of Fortran unit i (or -1 if unit i is not open).
-
-3.	CALL FSEEK(i, offset, whence, *errlab) attemps to move
-	Fortran unit i to the specified offset: absolute offset
-	if whence = 0; relative to the current offset if whence = 1;
-	relative to the end of the file if whence = 2.  It branches
-	to label errlab if unit i is not open or if the call
-	otherwise fails.
diff --git a/gcc/f/runtime/libI77/Version.c b/gcc/f/runtime/libI77/Version.c
deleted file mode 100644
index cbb63c9..0000000
--- a/gcc/f/runtime/libI77/Version.c
+++ /dev/null
@@ -1,276 +0,0 @@
-static char junk[] = "\n@(#) LIBI77 VERSION pjw,dmg-mods 19970816\n";
-
-/*
-*/
-
-char __G77_LIBI77_VERSION__[] = "0.5.21";
-
-/*
-2.01	$ format added
-2.02	Coding bug in open.c repaired
-2.03	fixed bugs in lread.c (read * with negative f-format) and lio.c
-	and lio.h (e-format conforming to spec)
-2.04	changed open.c and err.c (fopen and freopen respectively) to
-	update to new c-library (append mode)
-2.05	added namelist capability
-2.06	allow internal list and namelist I/O
-*/
-
-/*
-close.c:
-	allow upper-case STATUS= values
-endfile.c
-	create fort.nnn if unit nnn not open;
-	else if (file length == 0) use creat() rather than copy;
-	use local copy() rather than forking /bin/cp;
-	rewind, fseek to clear buffer (for no reading past EOF)
-err.c
-	use neither setbuf nor setvbuf; make stderr buffered
-fio.h
-	#define _bufend
-inquire.c
-	upper case responses;
-	omit byfile test from SEQUENTIAL=
-	answer "YES" to DIRECT= for unopened file (open to debate)
-lio.c
-	flush stderr, stdout at end of each stmt
-	space before character strings in list output only at line start
-lio.h
-	adjust LEW, LED consistent with old libI77
-lread.c
-	use atof()
-	allow "nnn*," when reading complex constants
-open.c
-	try opening for writing when open for read fails, with
-	special uwrt value (2) delaying creat() to first write;
-	set curunit so error messages don't drop core;
-	no file name ==> fort.nnn except for STATUS='SCRATCH'
-rdfmt.c
-	use atof(); trust EOF == end-of-file (so don't read past
-	end-of-file after endfile stmt)
-sfe.c
-	flush stderr, stdout at end of each stmt
-wrtfmt.c:
-	use upper case
-	put wrt_E and wrt_F into wref.c, use sprintf()
-		rather than ecvt() and fcvt() [more accurate on VAX]
-*/
-
-/* 16 Oct. 1988: uwrt = 3 after write, rewind, so close won't zap the file. */
-
-/* 10 July 1989: change _bufend to buf_end in fio.h, wsfe.c, wrtfmt.c */
-
-/* 28 Nov. 1989: corrections for IEEE and Cray arithmetic */
-/* 29 Nov. 1989: change various int return types to long for f2c */
-/* 30 Nov. 1989: various types from f2c.h */
-/*  6 Dec. 1989: types corrected various places */
-/* 19 Dec. 1989: make iostat= work right for internal I/O */
-/*  8 Jan. 1990: add rsne, wsne -- routines for handling NAMELIST */
-/* 28 Jan. 1990: have NAMELIST read treat $ as &, general white
-		 space as blank */
-/* 27 Mar. 1990: change an = to == in rd_L(rdfmt.c) so formatted reads
-		 of logical values reject letters other than fFtT;
-		 have nowwriting reset cf */
-/* 14 Aug. 1990: adjust lread.c to treat tabs as spaces in list input */
-/* 17 Aug. 1990: adjust open.c to recognize blank='Z...' as well as
-		 blank='z...' when reopening an open file */
-/* 30 Aug. 1990: prevent embedded blanks in list output of complex values;
-		 omit exponent field in list output of values of
-		 magnitude between 10 and 1e8; prevent writing stdin
-		 and reading stdout or stderr; don't close stdin, stdout,
-		 or stderr when reopening units 5, 6, 0. */
-/* 18 Sep. 1990: add component udev to unit and consider old == new file
-		 iff uinode and udev values agree; use stat rather than
-		 access to check existence of file (when STATUS='OLD')*/
-/* 2 Oct. 1990:  adjust rewind.c so two successive rewinds after a write
-		 don't clobber the file. */
-/* 9 Oct. 1990:  add #include "fcntl.h" to endfile.c, err.c, open.c;
-		 adjust g_char in util.c for segmented memories. */
-/* 17 Oct. 1990: replace abort() and _cleanup() with calls on
-		 sig_die(...,1) (defined in main.c). */
-/* 5 Nov. 1990:  changes to open.c: complain if new= is specified and the
-		 file already exists; allow file= to be omitted in open stmts
-		 and allow status='replace' (Fortran 90 extensions). */
-/* 11 Dec. 1990: adjustments for POSIX. */
-/* 15 Jan. 1991: tweak i_ungetc in rsli.c to allow reading from
-		 strings in read-only memory. */
-/* 25 Apr. 1991: adjust namelist stuff to work with f2c -i2 */
-/* 26 Apr. 1991: fix some bugs with NAMELIST read of multi-dim. arrays */
-/* 16 May 1991:  increase LEFBL in lio.h to bypass NeXT bug */
-/* 17 Oct. 1991: change type of length field in sequential unformatted
-		 records from int to long (for systems where sizeof(int)
-		 can vary, depending on the compiler or compiler options). */
-/* 14 Nov. 1991: change uint to Uint in fmt.h, rdfmt.c, wrtfmt.c. */
-/* 25 Nov. 1991: change uint to Uint in lwrite.c; change sizeof(int) to
-		 sizeof(uioint) in fseeks in sue.c (missed on 17 Oct.). */
-/* 1 Dec. 1991:  uio.c: add test for read failure (seq. unformatted reads);
-		 adjust an error return from EOF to off end of record */
-/* 12 Dec. 1991: rsli.c: fix bug with internal list input that caused
-		 the last character of each record to be ignored.
-		 iio.c: adjust error message in internal formatted
-		 input from "end-of-file" to "off end of record" if
-		 the format specifies more characters than the
-		 record contains. */
-/* 17 Jan. 1992: lread.c, rsne.c: in list and namelist input,
-		 treat "r* ," and "r*," alike (where r is a
-		 positive integer constant), and fix a bug in
-		 handling null values following items with repeat
-		 counts (e.g., 2*1,,3); for namelist reading
-		 of a numeric array, allow a new name-value subsequence
-		 to terminate the current one (as though the current
-		 one ended with the right number of null values).
-		 lio.h, lwrite.c: omit insignificant zeros in
-		 list and namelist output. To get the old
-		 behavior, compile with -DOld_list_output . */
-/* 18 Jan. 1992: make list output consistent with F format by
-		 printing .1 rather than 0.1 (introduced yesterday). */
-/* 3 Feb. 1992:  rsne.c: fix namelist read bug that caused the
-		 character following a comma to be ignored. */
-/* 19 May 1992:  adjust iio.c, ilnw.c, rdfmt.c and rsli.c to make err=
-		 work with internal list and formatted I/O. */
-/* 18 July 1992: adjust rsne.c to allow namelist input to stop at
-		 an & (e.g. &end). */
-/* 23 July 1992: switch to ANSI prototypes unless KR_headers is #defined ;
-		 recognize Z format (assuming 8-bit bytes). */
-/* 14 Aug. 1992: tweak wrt_E in wref.c to avoid -NaN */
-/* 23 Oct. 1992: Supply missing l_eof = 0 assignment to s_rsne() in rsne.c
-		 (so end-of-file on other files won't confuse namelist
-		 reads of external files).  Prepend f__ to external
-		 names that are only of internal interest to lib[FI]77. */
-/* 1 Feb. 1993:  backspace.c: fix bug that bit when last char of 2nd
-		 buffer == '\n'.
-		 endfile.c: guard against tiny L_tmpnam; close and reopen
-		 files in t_runc().
-		 lio.h: lengthen LINTW (buffer size in lwrite.c).
-		 err.c, open.c: more prepending of f__ (to [rw]_mode). */
-/* 5 Feb. 1993:  tweaks to NAMELIST: rsne.c: ? prints the namelist being
-		 sought; namelists of the wrong name are skipped (after
-		 an error message; xwsne.c: namelist writes have a
-		 newline before each new variable.
-		 open.c: ACCESS='APPEND' positions sequential files
-		 at EOF (nonstandard extension -- that doesn't require
-		 changing data structures). */
-/* 9 Feb. 1993:  Change some #ifdef MSDOS lines to #ifdef NON_UNIX_STDIO.
-		 err.c: under NON_UNIX_STDIO, avoid close(creat(name,0666))
-		 when the unit has another file descriptor for name. */
-/* 4 March 1993: err.c, open.c: take declaration of fdopen from rawio.h;
-		 open.c: always give f__w_mode[] 4 elements for use
-		 in t_runc (in endfile.c -- for change of 1 Feb. 1993). */
-/* 6 March 1993: uio.c: adjust off-end-of-record test for sequential
-		 unformatted reads to respond to err= rather than end=. */
-/* 12 March 1993: various tweaks for C++ */
-/* 6 April 1993: adjust error returns for formatted inputs to flush
-		 the current input line when err=label is specified.
-		 To restore the old behavior (input left mid-line),
-		 either adjust the #definition of errfl in fio.h or
-		 omit the invocation of f__doend in err__fl (in err.c).	*/
-/* 23 June 1993: iio.c: fix bug in format reversions for internal writes. */
-/* 5 Aug. 1993:  lread.c: fix bug in handling repetition counts for
-		 logical data (during list or namelist input).
-		 Change struct f__syl to struct syl (for buggy compilers). */
-/* 7 Aug. 1993:  lread.c: fix bug in namelist reading of incomplete
-		 logical arrays. */
-/* 9 Aug. 1993:  lread.c: fix bug in namelist reading of an incomplete
-		 array of numeric data followed by another namelist
-		 item whose name starts with 'd', 'D', 'e', or 'E'. */
-/* 8 Sept. 1993: open.c: protect #include "sys/..." with
-		 #ifndef NON_UNIX_STDIO; Version date not changed. */
-/* 10 Nov. 1993: backspace.c: add nonsense for #ifdef MSDOS */
-/* 8 Dec. 1993:  iio.c: adjust internal formatted reads to treat
-		 short records as though padded with blanks
-		 (rather than causing an "off end of record" error). */
-/* 22 Feb. 1994: lread.c: check that realloc did not return NULL. */
-/* 6 June 1994:  Under NON_UNIX_STDIO, use binary mode for direct
-		 formatted files (avoiding any confusion regarding \n). */
-/* 5 July 1994:  Fix bug (introduced 6 June 1994?) in reopening files
-		 under NON_UNIX_STDIO. */
-/* 6 July 1994:  wref.c: protect with #ifdef GOOD_SPRINTF_EXPONENT an
-		 optimization that requires exponents to have 2 digits
-		 when 2 digits suffice.
-		 lwrite.c wsfe.c (list and formatted external output):
-		 omit ' ' carriage-control when compiled with
-		 -DOMIT_BLANK_CC .  Off-by-one bug fixed in character
-		 count for list output of character strings.
-		 Omit '.' in list-directed printing of Nan, Infinity. */
-/* 12 July 1994: wrtfmt.c: under G11.4, write 0. as "  .0000    " rather
-		 than "  .0000E+00". */
-/* 3 Aug. 1994:  lwrite.c: do not insert a newline when appending an
-		 oversize item to an empty line. */
-/* 12 Aug. 1994: rsli.c rsne.c: fix glitch (reset nml_read) that kept
-		 ERR= (in list- or format-directed input) from working
-		 after a NAMELIST READ. */
-/* 7 Sept. 1994: typesize.c: adjust to allow types LOGICAL*1, LOGICAL*2,
-		 INTEGER*1, and (under -DAllow_TYQUAD) INTEGER*8
-		 in NAMELISTs. */
-/* 6 Oct. 1994:  util.c: omit f__mvgbt, as it is never used. */
-/* 2 Nov. 1994:  add #ifdef ALWAYS_FLUSH logic. */
-/* 26 Jan. 1995: wref.c: fix glitch in printing the exponent of 0 when
-		 GOOD_SPRINTF_EXPONENT is not #defined. */
-/* 24 Feb. 1995: iio.c: z_getc: insert (unsigned char *) to allow
-		 internal reading of characters with high-bit set
-		 (on machines that sign-extend characters). */
-/* 14 March 1995:lread.c and rsfe.c: adjust s_rsle and s_rsfe to
-		 check for end-of-file (to prevent infinite loops
-		 with empty read statements). */
-/* 26 May 1995:  iio.c: z_wnew: fix bug in handling T format items
-		 in internal writes whose last item is written to
-		 an earlier position than some previous item. */
-/* 29 Aug. 1995: backspace.c: adjust MSDOS logic. */
-/* 6 Sept. 1995: Adjust namelist input to treat a subscripted name
-		 whose subscripts do not involve colons similarly
-		 to the name without a subscript: accept several
-		 values, stored in successive elements starting at
-		 the indicated subscript.  Adjust namelist output
-		 to quote character strings (avoiding confusion with
-		 arrays of character strings).  Adjust f_init calls
-		 for people who don't use libF77's main(); now open and
-		 namelist read statements invoke f_init if needed. */
-/* 7 Sept. 1995: Fix some bugs with -DAllow_TYQUAD (for integer*8).
-		 Add -DNo_Namelist_Comments lines to rsne.c. */
-/* 5 Oct. 1995:  wrtfmt.c: fix bug with t editing (f__cursor was not
-		 always zeroed in mv_cur). */
-/* 11 Oct. 1995: move defs of f__hiwater, f__svic, f__icptr from wrtfmt.c
-		 to err.c */
-/* 15 Mar. 1996: lread.c, rsfe.c: honor END= in READ stmt with empty iolist */
-
-/* 13 May 1996:  add ftell_.c and fseek_.c */
-/* 9 June 1996:  Adjust rsli.c and lread.c so internal list input with
-		 too few items in the input string will honor end= . */
-/* 12 Sept. 1995:fmtlib.c: fix glitch in printing the most negative integer. */
-/* 25 Sept. 1995:fmt.h: for formatted writes of negative integer*1 values,
-		 make ic signed on ANSI systems.  If formatted writes of
-		 integer*1 values trouble you when using a K&R C compiler,
-		 switch to an ANSI compiler or use a compiler flag that
-		 makes characters signed. */
-/* 9 Dec. 1996:	 d[fu]e.c, err.c: complain about non-positive rec=
-		 in direct read and write statements.
-		 ftell_.c: change param "unit" to "Unit" for -DKR_headers. */
-/* 26 Feb. 1997: ftell_.c: on systems that define SEEK_SET, etc., use
-		 SEEK_SET, SEEK_CUR, SEEK_END for *whence = 0, 1, 2. */
-/* 7 Apr. 1997:	 fmt.c: adjust to complain at missing numbers in formats
-		 (but still treat missing ".nnn" as ".0"). */
-/* 11 Apr. 1997: err.c: attempt to make stderr line buffered rather
-		 than fully buffered.  (Buffering is needed for format
-		 items T and TR.) */
-/* 27 May 1997:  ftell_.c: fix typo (that caused the third argument to be
-		 treated as 2 on some systems). */
-/* 5 Aug. 1997:  lread.c: adjust to accord with a change to the Fortran 8X
-		 draft (in 1990 or 1991) that rescinded permission to elide
-		 quote marks in namelist input of character data; compile
-		 with -DF8X_NML_ELIDE_QUOTES to get the old behavior.
-		 wrtfmt.o: wrt_G: tweak to print the right number of 0's
-		 for zero under G format. */
-/* 16 Aug. 1997: iio.c: fix bug in internal writes to an array of character
-		 strings that sometimes caused one more array element than
-		 required by the format to be blank-filled.  Example:
-		 format(1x). */
-/* 17 June 1997: detect recursive I/O and call f__fatal explaining it. */
-
-#include <stdio.h>
-
-void
-g77__ivers__ ()
-{
-  fprintf (stderr, "__G77_LIBI77_VERSION__: %s", __G77_LIBI77_VERSION__);
-  fputs (junk, stderr);
-}
diff --git a/gcc/f/runtime/libI77/backspace.c b/gcc/f/runtime/libI77/backspace.c
deleted file mode 100644
index 8413d5f..0000000
--- a/gcc/f/runtime/libI77/backspace.c
+++ /dev/null
@@ -1,101 +0,0 @@
-#include <sys/types.h>
-#include "f2c.h"
-#include "fio.h"
-#ifdef KR_headers
-integer f_back(a) alist *a;
-#else
-integer f_back(alist *a)
-#endif
-{	unit *b;
-	int i, n, ndec;
-#if defined (MSDOS) && !defined (GO32)
-	int j, k;
-	long w, z;
-#endif
-	long x, y;
-	char buf[32];
-	if (f__init & 2)
-		f__fatal (131, "I/O recursion");
-	if(a->aunit >= MXUNIT || a->aunit < 0)
-		err(a->aerr,101,"backspace");
-	b= &f__units[a->aunit];
-	if(b->useek==0) err(a->aerr,106,"backspace");
-	if(b->ufd==NULL) {
-		fk_open(1, 1, a->aunit);
-		return(0);
-		}
-	if(b->uend==1)
-	{	b->uend=0;
-		return(0);
-	}
-	if(b->uwrt) {
-		(void) t_runc(a);
-		if (f__nowreading(b))
-			err(a->aerr,errno,"backspace");
-		}
-	if(b->url>0)
-	{
-		x=ftell(b->ufd);
-		y = x % b->url;
-		if(y == 0) x--;
-		x /= b->url;
-		x *= b->url;
-		(void) fseek(b->ufd,x,SEEK_SET);
-		return(0);
-	}
-
-	if(b->ufmt==0)
-	{	(void) fseek(b->ufd,-(long)sizeof(int),SEEK_CUR);
-		(void) fread((char *)&n,sizeof(int),1,b->ufd);
-		(void) fseek(b->ufd,-(long)n-2*sizeof(int),SEEK_CUR);
-		return(0);
-	}
-#if defined (MSDOS) && !defined (GO32)
-	w = -1;
-#endif
-	for(ndec = 1;; ndec = 0)
-	{
-		y = x = ftell(b->ufd);
-		if(x < sizeof(buf))
-			x = 0;
-		else
-			x -= sizeof(buf);
-		(void) fseek(b->ufd,x,SEEK_SET);
-		n=fread(buf,1,(size_t)(y-x), b->ufd);
-		for(i = n - ndec; --i >= 0; )
-		{
-			if(buf[i]!='\n') continue;
-#if defined (MSDOS) && !defined (GO32)
-			for(j = k = 0; j <= i; j++)
-				if (buf[j] == '\n')
-					k++;
-			fseek(b->ufd,x,SEEK_SET);
-			for(;;)
-				if (getc(b->ufd) == '\n') {
-					if ((z = ftell(b->ufd)) >= y && ndec) {
-						if (w == -1)
-							goto break2;
-						break;
-						}
-					if (--k <= 0)
-						return 0;
-					w = z;
-					}
-			fseek(b->ufd, w, SEEK_SET);
-#else
-			fseek(b->ufd,(long)(i+1-n),SEEK_CUR);
-#endif
-			return(0);
-		}
-#if defined (MSDOS) && !defined (GO32)
- break2:
-#endif
-		if(x==0)
-			{
-			(void) fseek(b->ufd, 0L, SEEK_SET);
-			return(0);
-			}
-		else if(n<=0) err(a->aerr,(EOF),"backspace");
-		(void) fseek(b->ufd, x, SEEK_SET);
-	}
-}
diff --git a/gcc/f/runtime/libI77/close.c b/gcc/f/runtime/libI77/close.c
deleted file mode 100644
index 691f931..0000000
--- a/gcc/f/runtime/libI77/close.c
+++ /dev/null
@@ -1,99 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#ifdef KR_headers
-integer f_clos(a) cllist *a;
-#else
-#undef abs
-#undef min
-#undef max
-#include <stdlib.h>
-#ifdef NON_UNIX_STDIO
-#ifndef unlink
-#define unlink remove
-#endif
-#else
-#if defined (MSDOS) && !defined (GO32)
-#include "io.h"
-#else
-#ifdef __cplusplus
-extern "C" int unlink(const char*);
-#else
-extern int unlink(const char*);
-#endif
-#endif
-#endif
-
-integer f_clos(cllist *a)
-#endif
-{	unit *b;
-
-	if (f__init & 2)
-		f__fatal (131, "I/O recursion");
-	if(a->cunit >= MXUNIT) return(0);
-	b= &f__units[a->cunit];
-	if(b->ufd==NULL)
-		goto done;
-	if (!a->csta)
-		if (b->uscrtch == 1)
-			goto Delete;
-		else
-			goto Keep;
-	switch(*a->csta) {
-		default:
-	 	Keep:
-		case 'k':
-		case 'K':
-			if(b->uwrt == 1)
-				t_runc((alist *)a);
-			if(b->ufnm) {
-				fclose(b->ufd);
-				free(b->ufnm);
-				}
-			break;
-		case 'd':
-		case 'D':
-		Delete:
-			if(b->ufnm) {
-				fclose(b->ufd);
-				unlink(b->ufnm); /*SYSDEP*/
-				free(b->ufnm);
-				}
-		}
-	b->ufd=NULL;
- done:
-	b->uend=0;
-	b->ufnm=NULL;
-	return(0);
-	}
- void
-#ifdef KR_headers
-f_exit()
-#else
-f_exit(void)
-#endif
-{	int i;
-	static cllist xx;
-	if (! (f__init & 1))
-		return;		/* Not initialized, so no open units. */
-	if (!xx.cerr) {
-		xx.cerr=1;
-		xx.csta=NULL;
-		for(i=0;i<MXUNIT;i++)
-		{
-			xx.cunit=i;
-			(void) f_clos(&xx);
-		}
-	}
-}
- int
-#ifdef KR_headers
-G77_flush_0 ()
-#else
-G77_flush_0 (void)
-#endif
-{	int i;
-	for(i=0;i<MXUNIT;i++)
-		if(f__units[i].ufd != NULL && f__units[i].uwrt)
-			fflush(f__units[i].ufd);
-return 0;
-}
diff --git a/gcc/f/runtime/libI77/dfe.c b/gcc/f/runtime/libI77/dfe.c
deleted file mode 100644
index e229e0e..0000000
--- a/gcc/f/runtime/libI77/dfe.c
+++ /dev/null
@@ -1,156 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#include "fmt.h"
-
-y_rsk(Void)
-{
-	if(f__curunit->uend || f__curunit->url <= f__recpos
-		|| f__curunit->url == 1) return 0;
-	do {
-		getc(f__cf);
-	} while(++f__recpos < f__curunit->url);
-	return 0;
-}
-y_getc(Void)
-{
-	int ch;
-	if(f__curunit->uend) return(-1);
-	if((ch=getc(f__cf))!=EOF)
-	{
-		f__recpos++;
-		if(f__curunit->url>=f__recpos ||
-			f__curunit->url==1)
-			return(ch);
-		else	return(' ');
-	}
-	if(feof(f__cf))
-	{
-		f__curunit->uend=1;
-		errno=0;
-		return(-1);
-	}
-	err(f__elist->cierr,errno,"readingd");
-}
-#ifdef KR_headers
-y_putc(c)
-#else
-y_putc(int c)
-#endif
-{
-	f__recpos++;
-	if(f__recpos <= f__curunit->url || f__curunit->url==1)
-		putc(c,f__cf);
-	else
-		err(f__elist->cierr,110,"dout");
-	return(0);
-}
-y_rev(Void)
-{	/*what about work done?*/
-	if(f__curunit->url==1 || f__recpos==f__curunit->url)
-		return(0);
-	while(f__recpos<f__curunit->url)
-		(*f__putn)(' ');
-	f__recpos=0;
-	return(0);
-}
-y_err(Void)
-{
-	err(f__elist->cierr, 110, "dfe");
-}
-
-y_newrec(Void)
-{
-	if(f__curunit->url == 1 || f__recpos == f__curunit->url) {
-		f__hiwater = f__recpos = f__cursor = 0;
-		return(1);
-	}
-	if(f__hiwater > f__recpos)
-		f__recpos = f__hiwater;
-	y_rev();
-	f__hiwater = f__cursor = 0;
-	return(1);
-}
-
-#ifdef KR_headers
-c_dfe(a) cilist *a;
-#else
-c_dfe(cilist *a)
-#endif
-{
-	f__sequential=0;
-	f__formatted=f__external=1;
-	f__elist=a;
-	f__cursor=f__scale=f__recpos=0;
-	if(a->ciunit>MXUNIT || a->ciunit<0)
-		err(a->cierr,101,"startchk");
-	f__curunit = &f__units[a->ciunit];
-	if(f__curunit->ufd==NULL && fk_open(DIR,FMT,a->ciunit))
-		err(a->cierr,104,"dfe");
-	f__cf=f__curunit->ufd;
-	if(!f__curunit->ufmt) err(a->cierr,102,"dfe");
-	if(!f__curunit->useek) err(a->cierr,104,"dfe");
-	f__fmtbuf=a->cifmt;
-	if(a->cirec <= 0)
-		err(a->cierr,130,"dfe");
-	(void) fseek(f__cf,(long)f__curunit->url * (a->cirec-1),SEEK_SET);
-	f__curunit->uend = 0;
-	return(0);
-}
-#ifdef KR_headers
-integer s_rdfe(a) cilist *a;
-#else
-integer s_rdfe(cilist *a)
-#endif
-{
-	int n;
-	if(f__init != 1) f_init();
-	f__init = 3;
-	f__reading=1;
-	if(n=c_dfe(a))return(n);
-	if(f__curunit->uwrt && f__nowreading(f__curunit))
-		err(a->cierr,errno,"read start");
-	f__getn = y_getc;
-	f__doed = rd_ed;
-	f__doned = rd_ned;
-	f__dorevert = f__donewrec = y_err;
-	f__doend = y_rsk;
-	if(pars_f(f__fmtbuf)<0)
-		err(a->cierr,100,"read start");
-	fmt_bg();
-	return(0);
-}
-#ifdef KR_headers
-integer s_wdfe(a) cilist *a;
-#else
-integer s_wdfe(cilist *a)
-#endif
-{
-	int n;
-	if(f__init != 1) f_init();
-	f__init = 3;
-	f__reading=0;
-	if(n=c_dfe(a)) return(n);
-	if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit))
-		err(a->cierr,errno,"startwrt");
-	f__putn = y_putc;
-	f__doed = w_ed;
-	f__doned= w_ned;
-	f__dorevert = y_err;
-	f__donewrec = y_newrec;
-	f__doend = y_rev;
-	if(pars_f(f__fmtbuf)<0)
-		err(a->cierr,100,"startwrt");
-	fmt_bg();
-	return(0);
-}
-integer e_rdfe(Void)
-{
-	f__init = 1;
-	(void) en_fio();
-	return(0);
-}
-integer e_wdfe(Void)
-{
-	f__init = 1;
-	return en_fio();
-}
diff --git a/gcc/f/runtime/libI77/dolio.c b/gcc/f/runtime/libI77/dolio.c
deleted file mode 100644
index 4b5a2ca..0000000
--- a/gcc/f/runtime/libI77/dolio.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include "f2c.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-#ifdef KR_headers
-extern int (*f__lioproc)();
-
-integer do_lio(type,number,ptr,len) ftnint *number,*type; char *ptr; ftnlen len;
-#else
-extern int (*f__lioproc)(ftnint*, char*, ftnlen, ftnint);
-
-integer do_lio(ftnint *type, ftnint *number, char *ptr, ftnlen len)
-#endif
-{
-	return((*f__lioproc)(number,ptr,len,*type));
-}
-#ifdef __cplusplus
-	}
-#endif
diff --git a/gcc/f/runtime/libI77/due.c b/gcc/f/runtime/libI77/due.c
deleted file mode 100644
index dec5865..0000000
--- a/gcc/f/runtime/libI77/due.c
+++ /dev/null
@@ -1,73 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-
-#ifdef KR_headers
-c_due(a) cilist *a;
-#else
-c_due(cilist *a)
-#endif
-{
-	if(f__init != 1) f_init();
-	f__init = 3;
-	if(a->ciunit>=MXUNIT || a->ciunit<0)
-		err(a->cierr,101,"startio");
-	f__sequential=f__formatted=f__recpos=0;
-	f__external=1;
-	f__curunit = &f__units[a->ciunit];
-	f__elist=a;
-	if(f__curunit->ufd==NULL && fk_open(DIR,UNF,a->ciunit) ) err(a->cierr,104,"due");
-	f__cf=f__curunit->ufd;
-	if(f__curunit->ufmt) err(a->cierr,102,"cdue");
-	if(!f__curunit->useek) err(a->cierr,104,"cdue");
-	if(f__curunit->ufd==NULL) err(a->cierr,114,"cdue");
-	if(a->cirec <= 0)
-		err(a->cierr,130,"due");
-	(void) fseek(f__cf,(long)(a->cirec-1)*f__curunit->url,SEEK_SET);
-	f__curunit->uend = 0;
-	return(0);
-}
-#ifdef KR_headers
-integer s_rdue(a) cilist *a;
-#else
-integer s_rdue(cilist *a)
-#endif
-{
-	int n;
-	f__reading=1;
-	if(n=c_due(a)) return(n);
-	if(f__curunit->uwrt && f__nowreading(f__curunit))
-		err(a->cierr,errno,"read start");
-	return(0);
-}
-#ifdef KR_headers
-integer s_wdue(a) cilist *a;
-#else
-integer s_wdue(cilist *a)
-#endif
-{
-	int n;
-	f__reading=0;
-	if(n=c_due(a)) return(n);
-	if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit))
-		err(a->cierr,errno,"write start");
-	return(0);
-}
-integer e_rdue(Void)
-{
-	f__init = 1;
-	if(f__curunit->url==1 || f__recpos==f__curunit->url)
-		return(0);
-	(void) fseek(f__cf,(long)(f__curunit->url-f__recpos),SEEK_CUR);
-	if(ftell(f__cf)%f__curunit->url)
-		err(f__elist->cierr,200,"syserr");
-	return(0);
-}
-integer e_wdue(Void)
-{
-	f__init = 1;
-#ifdef ALWAYS_FLUSH
-	if (fflush(f__cf))
-		err(f__elist->cierr,errno,"write end");
-#endif
-	return(e_rdue());
-}
diff --git a/gcc/f/runtime/libI77/endfile.c b/gcc/f/runtime/libI77/endfile.c
deleted file mode 100644
index 6050d1e..0000000
--- a/gcc/f/runtime/libI77/endfile.c
+++ /dev/null
@@ -1,195 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#include <sys/types.h>
-#include "rawio.h"
-
-#ifdef KR_headers
-extern char *strcpy();
-#else
-#undef abs
-#undef min
-#undef max
-#include <stdlib.h>
-#include <string.h>
-#endif
-
-#ifdef NON_UNIX_STDIO
-#ifndef unlink
-#define unlink remove
-#endif
-#else
-#if defined (MSDOS) && !defined (GO32)
-#include "io.h"
-#endif
-#endif
-
-#ifdef NON_UNIX_STDIO
-extern char *f__r_mode[], *f__w_mode[];
-#endif
-
-#ifdef KR_headers
-integer f_end(a) alist *a;
-#else
-integer f_end(alist *a)
-#endif
-{
-	unit *b;
-	if (f__init & 2)
-		f__fatal (131, "I/O recursion");
-	if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"endfile");
-	b = &f__units[a->aunit];
-	if(b->ufd==NULL) {
-		char nbuf[10];
-		(void) sprintf(nbuf,"fort.%ld",a->aunit);
-#ifdef NON_UNIX_STDIO
-		{ FILE *tf;
-			if (tf = fopen(nbuf, f__w_mode[0]))
-				fclose(tf);
-			}
-#else
-		close(creat(nbuf, 0666));
-#endif
-		return(0);
-		}
-	b->uend=1;
-	return(b->useek ? t_runc(a) : 0);
-}
-
- static int
-#ifdef NON_UNIX_STDIO
-#ifdef KR_headers
-copy(from, len, to) char *from, *to; register long len;
-#else
-copy(FILE *from, register long len, FILE *to)
-#endif
-{
-	int k, len1;
-	char buf[BUFSIZ];
-
-	while(fread(buf, len1 = len > BUFSIZ ? BUFSIZ : (int)len, 1, from)) {
-		if (!fwrite(buf, len1, 1, to))
-			return 1;
-		if ((len -= len1) <= 0)
-			break;
-		}
-	return 0;
-	}
-#else
-#ifdef KR_headers
-copy(from, len, to) char *from, *to; register long len;
-#else
-copy(char *from, register long len, char *to)
-#endif
-{
-	register size_t n;
-	int k, rc = 0, tmp;
-	char buf[BUFSIZ];
-
-	if ((k = open(from, O_RDONLY)) < 0)
-		return 1;
-	if ((tmp = creat(to,0666)) < 0)
-		return 1;
-	while((n = read(k, buf, (size_t) (len > BUFSIZ ? BUFSIZ : (int)len))) > 0) {
-		if (write(tmp, buf, n) != n)
-			{ rc = 1; break; }
-		if ((len -= n) <= 0)
-			break;
-		}
-	close(k);
-	close(tmp);
-	return n < 0 ? 1 : rc;
-	}
-#endif
-
-#ifndef L_tmpnam
-#define L_tmpnam 16
-#endif
-
- int
-#ifdef KR_headers
-t_runc(a) alist *a;
-#else
-t_runc(alist *a)
-#endif
-{
-	char nm[L_tmpnam+12];	/* extra space in case L_tmpnam is tiny */
-	long loc, len;
-	unit *b;
-#ifdef NON_UNIX_STDIO
-	FILE *bf, *tf;
-#else
-	FILE *bf;
-#endif
-	int rc = 0;
-
-	b = &f__units[a->aunit];
-	if(b->url)
-		return(0);	/*don't truncate direct files*/
-	loc=ftell(bf = b->ufd);
-	fseek(bf,0L,SEEK_END);
-	len=ftell(bf);
-	if (loc >= len || b->useek == 0 || b->ufnm == NULL)
-		return(0);
-#ifdef NON_UNIX_STDIO
-	fclose(b->ufd);
-#else
-	rewind(b->ufd);	/* empty buffer */
-#endif
-	if (!loc) {
-#ifdef NON_UNIX_STDIO
-		if (!(bf = fopen(b->ufnm, f__w_mode[b->ufmt])))
-#else
-		if (close(creat(b->ufnm,0666)))
-#endif
-			rc = 1;
-		if (b->uwrt)
-			b->uwrt = 1;
-		goto done;
-		}
-#ifdef _POSIX_SOURCE
-	tmpnam(nm);
-#else
-	strcpy(nm,"tmp.FXXXXXX");
-	mktemp(nm);
-#endif
-#ifdef NON_UNIX_STDIO
-	if (!(bf = fopen(b->ufnm, f__r_mode[0]))) {
- bad:
-		rc = 1;
-		goto done;
-		}
-	if (!(tf = fopen(nm, f__w_mode[0])))
-		goto bad;
-	if (copy(bf, loc, tf)) {
- bad1:
-		rc = 1;
-		goto done1;
-		}
-	if (!(bf = freopen(b->ufnm, f__w_mode[0], bf)))
-		goto bad1;
-	if (!(tf = freopen(nm, f__r_mode[0], tf)))
-		goto bad1;
-	if (copy(tf, loc, bf))
-		goto bad1;
-	if (f__w_mode[0] != f__w_mode[b->ufmt]) {
-	 	if (!(bf = freopen(b->ufnm, f__w_mode[b->ufmt|2], bf)))
-			goto bad1;
-		fseek(bf, loc, SEEK_SET);
-		}
-done1:
-	fclose(tf);
-	unlink(nm);
-done:
-	f__cf = b->ufd = bf;
-#else
-	if (copy(b->ufnm, loc, nm)
-	 || copy(nm, loc, b->ufnm))
-		rc = 1;
-	unlink(nm);
-	fseek(b->ufd, loc, SEEK_SET);
-done:
-#endif
-	if (rc)
-		err(a->aerr,111,"endfile");
-	return 0;
-	}
diff --git a/gcc/f/runtime/libI77/err.c b/gcc/f/runtime/libI77/err.c
deleted file mode 100644
index 1d01887..0000000
--- a/gcc/f/runtime/libI77/err.c
+++ /dev/null
@@ -1,298 +0,0 @@
-#ifndef NON_UNIX_STDIO
-#include <sys/types.h>
-#include <sys/stat.h>
-#endif
-#include "f2c.h"
-#if defined (NON_UNIX_STDIO) || defined (MISSING_FILE_ELEMS)
-#ifdef KR_headers
-extern char *malloc();
-#else
-#undef abs
-#undef min
-#undef max
-#include <stdlib.h>
-#endif
-#endif
-#include "fio.h"
-#include "fmt.h"	/* for struct syl */
-#include "rawio.h"	/* for fcntl.h, fdopen */
-
-/*global definitions*/
-unit f__units[MXUNIT];	/*unit table*/
-int f__init;	/*bit 0: set after initializations;
-		  bit 1: set during I/O involving returns to
-		    caller of library (or calls to user code)*/
-cilist *f__elist;	/*active external io list*/
-icilist *f__svic;	/*active internal io list*/
-flag f__reading;	/*1 if reading, 0 if writing*/
-flag f__cplus,f__cblank;
-char *f__fmtbuf;
-flag f__external;	/*1 if external io, 0 if internal */
-#ifdef KR_headers
-int (*f__doed)(),(*f__doned)();
-int (*f__doend)(),(*f__donewrec)(),(*f__dorevert)();
-int (*f__getn)(),(*f__putn)();	/*for formatted io*/
-#else
-int (*f__getn)(void),(*f__putn)(int);	/*for formatted io*/
-int (*f__doed)(struct syl*, char*, ftnlen),(*f__doned)(struct syl*);
-int (*f__dorevert)(void),(*f__donewrec)(void),(*f__doend)(void);
-#endif
-flag f__sequential;	/*1 if sequential io, 0 if direct*/
-flag f__formatted;	/*1 if formatted io, 0 if unformatted*/
-FILE *f__cf;	/*current file*/
-unit *f__curunit;	/*current unit*/
-int f__recpos;	/*place in current record*/
-int f__cursor, f__hiwater, f__scale;
-char *f__icptr;
-
-/*error messages*/
-char *F_err[] =
-{
-	"error in format",				/* 100 */
-	"illegal unit number",				/* 101 */
-	"formatted io not allowed",			/* 102 */
-	"unformatted io not allowed",			/* 103 */
-	"direct io not allowed",			/* 104 */
-	"sequential io not allowed",			/* 105 */
-	"can't backspace file",				/* 106 */
-	"null file name",				/* 107 */
-	"can't stat file",				/* 108 */
-	"unit not connected",				/* 109 */
-	"off end of record",				/* 110 */
-	"truncation failed in endfile",			/* 111 */
-	"incomprehensible list input",			/* 112 */
-	"out of free space",				/* 113 */
-	"unit not connected",				/* 114 */
-	"read unexpected character",			/* 115 */
-	"bad logical input field",			/* 116 */
-	"bad variable type",				/* 117 */
-	"bad namelist name",				/* 118 */
-	"variable not in namelist",			/* 119 */
-	"no end record",				/* 120 */
-	"variable count incorrect",			/* 121 */
-	"subscript for scalar variable",		/* 122 */
-	"invalid array section",			/* 123 */
-	"substring out of bounds",			/* 124 */
-	"subscript out of bounds",			/* 125 */
-	"can't read file",				/* 126 */
-	"can't write file",				/* 127 */
-	"'new' file exists",				/* 128 */
-	"can't append to file",				/* 129 */
-	"non-positive record number",			/* 130 */
-	"I/O started while already doing I/O"		/* 131 */
-};
-#define MAXERR (sizeof(F_err)/sizeof(char *)+100)
-
-#ifdef KR_headers
-f__canseek(f) FILE *f; /*SYSDEP*/
-#else
-f__canseek(FILE *f) /*SYSDEP*/
-#endif
-{
-#ifdef NON_UNIX_STDIO
-	return !isatty(fileno(f));
-#else
-	struct stat x;
-
-	if (fstat(fileno(f),&x) < 0)
-		return(0);
-#ifdef S_IFMT
-	switch(x.st_mode & S_IFMT) {
-	case S_IFDIR:
-	case S_IFREG:
-		if(x.st_nlink > 0)	/* !pipe */
-			return(1);
-		else
-			return(0);
-	case S_IFCHR:
-		if(isatty(fileno(f)))
-			return(0);
-		return(1);
-#ifdef S_IFBLK
-	case S_IFBLK:
-		return(1);
-#endif
-	}
-#else
-#ifdef S_ISDIR
-	/* POSIX version */
-	if (S_ISREG(x.st_mode) || S_ISDIR(x.st_mode)) {
-		if(x.st_nlink > 0)	/* !pipe */
-			return(1);
-		else
-			return(0);
-		}
-	if (S_ISCHR(x.st_mode)) {
-		if(isatty(fileno(f)))
-			return(0);
-		return(1);
-		}
-	if (S_ISBLK(x.st_mode))
-		return(1);
-#else
-	Help! How does fstat work on this system?
-#endif
-#endif
-	return(0);	/* who knows what it is? */
-#endif
-}
-
- void
-#ifdef KR_headers
-f__fatal(n,s) char *s;
-#else
-f__fatal(int n, char *s)
-#endif
-{
-	static int dead = 0;
-
-	if(n<100 && n>=0) perror(s); /*SYSDEP*/
-	else if(n >= (int)MAXERR || n < -1)
-	{	fprintf(stderr,"%s: illegal error number %d\n",s,n);
-	}
-	else if(n == -1) fprintf(stderr,"%s: end of file\n",s);
-	else
-		fprintf(stderr,"%s: %s\n",s,F_err[n-100]);
-	if (dead) {
-		fprintf (stderr, "(libf2c f__fatal already called, aborting.)");
-		abort();
-	}
-	dead = 1;
-	if (f__init & 1) {
-		if (f__curunit) {
-			fprintf(stderr,"apparent state: unit %d ",f__curunit-f__units);
-			fprintf(stderr, f__curunit->ufnm ? "named %s\n" : "(unnamed)\n",
-				f__curunit->ufnm);
-			}
-		else
-			fprintf(stderr,"apparent state: internal I/O\n");
-		if (f__fmtbuf)
-			fprintf(stderr,"last format: %s\n",f__fmtbuf);
-		fprintf(stderr,"lately %s %s %s %s",f__reading?"reading":"writing",
-			f__sequential?"sequential":"direct",f__formatted?"formatted":"unformatted",
-			f__external?"external":"internal");
-	}
-	f__init &= ~2;	/* No longer doing I/O (no more user code to be called). */
-	sig_die(" IO", 1);
-}
-/*initialization routine*/
- VOID
-f_init(Void)
-{	unit *p;
-
-	if (f__init & 2)
-		f__fatal (131, "I/O recursion");
-	f__init = 1;
-	p= &f__units[0];
-	p->ufd=stderr;
-	p->useek=f__canseek(stderr);
-#ifdef _IOLBF
-	setvbuf(stderr, (char*)malloc(BUFSIZ+8), _IOLBF, BUFSIZ+8);
-#else
-#if defined (NON_UNIX_STDIO) || defined (MISSING_FILE_ELEMS)
-	setbuf(stderr, (char *)malloc(BUFSIZ+8));
-#else
-	stderr->_flag &= ~_IONBF;
-#endif
-#endif
-	p->ufmt=1;
-	p->uwrt=1;
-	p = &f__units[5];
-	p->ufd=stdin;
-	p->useek=f__canseek(stdin);
-	p->ufmt=1;
-	p->uwrt=0;
-	p= &f__units[6];
-	p->ufd=stdout;
-	p->useek=f__canseek(stdout);
-	p->ufmt=1;
-	p->uwrt=1;
-}
-#ifdef KR_headers
-f__nowreading(x) unit *x;
-#else
-f__nowreading(unit *x)
-#endif
-{
-	long loc;
-	int ufmt;
-	extern char *f__r_mode[];
-
-	if (!x->ufnm)
-		goto cantread;
-	ufmt = x->ufmt;
-	loc=ftell(x->ufd);
-	if(freopen(x->ufnm,f__r_mode[ufmt],x->ufd) == NULL) {
- cantread:
-		errno = 126;
-		return(1);
-		}
-	x->uwrt=0;
-	(void) fseek(x->ufd,loc,SEEK_SET);
-	return(0);
-}
-#ifdef KR_headers
-f__nowwriting(x) unit *x;
-#else
-f__nowwriting(unit *x)
-#endif
-{
-	long loc;
-	int ufmt;
-	extern char *f__w_mode[];
-#ifndef NON_UNIX_STDIO
-	int k;
-#endif
-
-	if (!x->ufnm)
-		goto cantwrite;
-	ufmt = x->ufmt;
-#ifdef NON_UNIX_STDIO
-	ufmt |= 2;
-#endif
-	if (x->uwrt == 3) { /* just did write, rewind */
-#ifdef NON_UNIX_STDIO
-		if (!(f__cf = x->ufd =
-				freopen(x->ufnm,f__w_mode[ufmt],x->ufd)))
-#else
-		if (close(creat(x->ufnm,0666)))
-#endif
-			goto cantwrite;
-		}
-	else {
-		loc=ftell(x->ufd);
-#ifdef NON_UNIX_STDIO
-		if (!(f__cf = x->ufd =
-			freopen(x->ufnm, f__w_mode[ufmt], x->ufd)))
-#else
-		if (fclose(x->ufd) < 0
-		|| (k = x->uwrt == 2 ? creat(x->ufnm,0666)
-				     : open(x->ufnm,O_WRONLY)) < 0
-		|| (f__cf = x->ufd = fdopen(k,f__w_mode[ufmt])) == NULL)
-#endif
-			{
-			x->ufd = NULL;
- cantwrite:
-			errno = 127;
-			return(1);
-			}
-		(void) fseek(x->ufd,loc,SEEK_SET);
-		}
-	x->uwrt = 1;
-	return(0);
-}
-
- int
-#ifdef KR_headers
-err__fl(f, m, s) int f, m; char *s;
-#else
-err__fl(int f, int m, char *s)
-#endif
-{
-	if (!f)
-		f__fatal(m, s);
-	if (f__doend)
-		(*f__doend)();
-	f__init &= ~2;
-	return errno = m;
-	}
diff --git a/gcc/f/runtime/libI77/f2ch.add b/gcc/f/runtime/libI77/f2ch.add
deleted file mode 100644
index a2acc17..0000000
--- a/gcc/f/runtime/libI77/f2ch.add
+++ /dev/null
@@ -1,162 +0,0 @@
-/* If you are using a C++ compiler, append the following to f2c.h
-   for compiling libF77 and libI77. */
-
-#ifdef __cplusplus
-extern "C" {
-extern int abort_(void);
-extern double c_abs(complex *);
-extern void c_cos(complex *, complex *);
-extern void c_div(complex *, complex *, complex *);
-extern void c_exp(complex *, complex *);
-extern void c_log(complex *, complex *);
-extern void c_sin(complex *, complex *);
-extern void c_sqrt(complex *, complex *);
-extern double d_abs(double *);
-extern double d_acos(double *);
-extern double d_asin(double *);
-extern double d_atan(double *);
-extern double d_atn2(double *, double *);
-extern void d_cnjg(doublecomplex *, doublecomplex *);
-extern double d_cos(double *);
-extern double d_cosh(double *);
-extern double d_dim(double *, double *);
-extern double d_exp(double *);
-extern double d_imag(doublecomplex *);
-extern double d_int(double *);
-extern double d_lg10(double *);
-extern double d_log(double *);
-extern double d_mod(double *, double *);
-extern double d_nint(double *);
-extern double d_prod(float *, float *);
-extern double d_sign(double *, double *);
-extern double d_sin(double *);
-extern double d_sinh(double *);
-extern double d_sqrt(double *);
-extern double d_tan(double *);
-extern double d_tanh(double *);
-extern double derf_(double *);
-extern double derfc_(double *);
-extern integer do_fio(ftnint *, char *, ftnlen);
-extern integer do_lio(ftnint *, ftnint *, char *, ftnlen);
-extern integer do_uio(ftnint *, char *, ftnlen);
-extern integer e_rdfe(void);
-extern integer e_rdue(void);
-extern integer e_rsfe(void);
-extern integer e_rsfi(void);
-extern integer e_rsle(void);
-extern integer e_rsli(void);
-extern integer e_rsue(void);
-extern integer e_wdfe(void);
-extern integer e_wdue(void);
-extern integer e_wsfe(void);
-extern integer e_wsfi(void);
-extern integer e_wsle(void);
-extern integer e_wsli(void);
-extern integer e_wsue(void);
-extern int ef1asc_(ftnint *, ftnlen *, ftnint *, ftnlen *);
-extern integer ef1cmc_(ftnint *, ftnlen *, ftnint *, ftnlen *);
-extern double erf(double);
-extern double erf_(float *);
-extern double erfc(double);
-extern double erfc_(float *);
-extern integer f_back(alist *);
-extern integer f_clos(cllist *);
-extern integer f_end(alist *);
-extern void f_exit(void);
-extern integer f_inqu(inlist *);
-extern integer f_open(olist *);
-extern integer f_rew(alist *);
-extern int flush_(void);
-extern void getarg_(integer *, char *, ftnlen);
-extern void getenv_(char *, char *, ftnlen, ftnlen);
-extern short h_abs(short *);
-extern short h_dim(short *, short *);
-extern short h_dnnt(double *);
-extern short h_indx(char *, char *, ftnlen, ftnlen);
-extern short h_len(char *, ftnlen);
-extern short h_mod(short *, short *);
-extern short h_nint(float *);
-extern short h_sign(short *, short *);
-extern short hl_ge(char *, char *, ftnlen, ftnlen);
-extern short hl_gt(char *, char *, ftnlen, ftnlen);
-extern short hl_le(char *, char *, ftnlen, ftnlen);
-extern short hl_lt(char *, char *, ftnlen, ftnlen);
-extern integer i_abs(integer *);
-extern integer i_dim(integer *, integer *);
-extern integer i_dnnt(double *);
-extern integer i_indx(char *, char *, ftnlen, ftnlen);
-extern integer i_len(char *, ftnlen);
-extern integer i_mod(integer *, integer *);
-extern integer i_nint(float *);
-extern integer i_sign(integer *, integer *);
-extern integer iargc_(void);
-extern ftnlen l_ge(char *, char *, ftnlen, ftnlen);
-extern ftnlen l_gt(char *, char *, ftnlen, ftnlen);
-extern ftnlen l_le(char *, char *, ftnlen, ftnlen);
-extern ftnlen l_lt(char *, char *, ftnlen, ftnlen);
-extern void pow_ci(complex *, complex *, integer *);
-extern double pow_dd(double *, double *);
-extern double pow_di(double *, integer *);
-extern short pow_hh(short *, shortint *);
-extern integer pow_ii(integer *, integer *);
-extern double pow_ri(float *, integer *);
-extern void pow_zi(doublecomplex *, doublecomplex *, integer *);
-extern void pow_zz(doublecomplex *, doublecomplex *, doublecomplex *);
-extern double r_abs(float *);
-extern double r_acos(float *);
-extern double r_asin(float *);
-extern double r_atan(float *);
-extern double r_atn2(float *, float *);
-extern void r_cnjg(complex *, complex *);
-extern double r_cos(float *);
-extern double r_cosh(float *);
-extern double r_dim(float *, float *);
-extern double r_exp(float *);
-extern double r_imag(complex *);
-extern double r_int(float *);
-extern double r_lg10(float *);
-extern double r_log(float *);
-extern double r_mod(float *, float *);
-extern double r_nint(float *);
-extern double r_sign(float *, float *);
-extern double r_sin(float *);
-extern double r_sinh(float *);
-extern double r_sqrt(float *);
-extern double r_tan(float *);
-extern double r_tanh(float *);
-extern void s_cat(char *, char **, integer *, integer *, ftnlen);
-extern integer s_cmp(char *, char *, ftnlen, ftnlen);
-extern void s_copy(char *, char *, ftnlen, ftnlen);
-extern int s_paus(char *, ftnlen);
-extern integer s_rdfe(cilist *);
-extern integer s_rdue(cilist *);
-extern integer s_rnge(char *, integer, char *, integer);
-extern integer s_rsfe(cilist *);
-extern integer s_rsfi(icilist *);
-extern integer s_rsle(cilist *);
-extern integer s_rsli(icilist *);
-extern integer s_rsne(cilist *);
-extern integer s_rsni(icilist *);
-extern integer s_rsue(cilist *);
-extern int s_stop(char *, ftnlen);
-extern integer s_wdfe(cilist *);
-extern integer s_wdue(cilist *);
-extern integer s_wsfe(cilist *);
-extern integer s_wsfi(icilist *);
-extern integer s_wsle(cilist *);
-extern integer s_wsli(icilist *);
-extern integer s_wsne(cilist *);
-extern integer s_wsni(icilist *);
-extern integer s_wsue(cilist *);
-extern void sig_die(char *, int);
-extern integer signal_(integer *, void (*)(int));
-extern integer system_(char *, ftnlen);
-extern double z_abs(doublecomplex *);
-extern void z_cos(doublecomplex *, doublecomplex *);
-extern void z_div(doublecomplex *, doublecomplex *, doublecomplex *);
-extern void z_exp(doublecomplex *, doublecomplex *);
-extern void z_log(doublecomplex *, doublecomplex *);
-extern void z_sin(doublecomplex *, doublecomplex *);
-extern void z_sqrt(doublecomplex *, doublecomplex *);
-	}
-#endif
diff --git a/gcc/f/runtime/libI77/fio.h b/gcc/f/runtime/libI77/fio.h
deleted file mode 100644
index 769d360..0000000
--- a/gcc/f/runtime/libI77/fio.h
+++ /dev/null
@@ -1,102 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-#ifndef NULL
-/* ANSI C */
-#include <stddef.h>
-#endif
-
-#ifndef SEEK_SET
-#define SEEK_SET 0
-#define SEEK_CUR 1
-#define SEEK_END 2
-#endif
-
-#if defined (MSDOS) && !defined (GO32)
-#ifndef NON_UNIX_STDIO
-#define NON_UNIX_STDIO
-#endif
-#endif
-
-#ifdef UIOLEN_int
-typedef int uiolen;
-#else
-typedef long uiolen;
-#endif
-
-/*units*/
-typedef struct
-{	FILE *ufd;	/*0=unconnected*/
-	char *ufnm;
-#if !(defined (MSDOS) && !defined (GO32))
-	long uinode;
-	int udev;
-#endif
-	int url;	/*0=sequential*/
-	flag useek;	/*true=can backspace, use dir, ...*/
-	flag ufmt;
-	flag uprnt;
-	flag ublnk;
-	flag uend;
-	flag uwrt;	/*last io was write*/
-	flag uscrtch;
-} unit;
-
-extern int f__init;
-extern cilist *f__elist;	/*active external io list*/
-extern flag f__reading,f__external,f__sequential,f__formatted;
-#undef Void
-#ifdef KR_headers
-#define Void /*void*/
-extern int (*f__getn)(),(*f__putn)();	/*for formatted io*/
-extern long f__inode();
-extern VOID sig_die();
-extern int (*f__donewrec)(), t_putc(), x_wSL();
-extern int c_sfe(), err__fl(), xrd_SL();
-#else
-#define Void void
-#ifdef __cplusplus
-extern "C" {
-#endif
-extern int (*f__getn)(void),(*f__putn)(int);	/*for formatted io*/
-extern long f__inode(char*,int*);
-extern void sig_die(char*,int);
-extern void f__fatal(int,char*);
-extern int t_runc(alist*);
-extern int f__nowreading(unit*), f__nowwriting(unit*);
-extern int fk_open(int,int,ftnint);
-extern int en_fio(void);
-extern void f_init(void);
-extern int (*f__donewrec)(void), t_putc(int), x_wSL(void);
-extern void b_char(char*,char*,ftnlen), g_char(char*,ftnlen,char*);
-extern int c_sfe(cilist*), z_rnew(void);
-extern int isatty(int);
-extern int err__fl(int,int,char*);
-extern int xrd_SL(void);
-#ifdef __cplusplus
-	}
-#endif
-#endif
-extern int (*f__doend)(Void);
-extern FILE *f__cf;	/*current file*/
-extern unit *f__curunit;	/*current unit*/
-extern unit f__units[];
-#define err(f,m,s) do {if(f) {f__init &= ~2; errno= m;} else f__fatal(m,s); return(m);} while(0)
-#define errfl(f,m,s) do {return err__fl((int)f,m,s);} while(0)
-
-/*Table sizes*/
-#define MXUNIT 100
-
-extern int f__recpos;	/*position in current record*/
-extern int f__cursor;	/* offset to move to */
-extern int f__hiwater;	/* so TL doesn't confuse us */
-
-#define WRITE	1
-#define READ	2
-#define SEQ	3
-#define DIR	4
-#define FMT	5
-#define UNF	6
-#define EXT	7
-#define INT	8
-
-#define buf_end(x) (x->_flag & _IONBF ? x->_ptr : x->_base + BUFSIZ)
diff --git a/gcc/f/runtime/libI77/fmt.c b/gcc/f/runtime/libI77/fmt.c
deleted file mode 100644
index a82f821..0000000
--- a/gcc/f/runtime/libI77/fmt.c
+++ /dev/null
@@ -1,516 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#include "fmt.h"
-#define skip(s) while(*s==' ') s++
-#ifdef interdata
-#define SYLMX 300
-#endif
-#ifdef pdp11
-#define SYLMX 300
-#endif
-#ifdef vax
-#define SYLMX 300
-#endif
-#ifndef SYLMX
-#define SYLMX 300
-#endif
-#define GLITCH '\2'
-	/* special quote character for stu */
-extern int f__cursor,f__scale;
-extern flag f__cblank,f__cplus;	/*blanks in I and compulsory plus*/
-struct syl f__syl[SYLMX];
-int f__parenlvl,f__pc,f__revloc;
-
- static
-#ifdef KR_headers
-char *ap_end(s) char *s;
-#else
-char *ap_end(char *s)
-#endif
-{	char quote;
-	quote= *s++;
-	for(;*s;s++)
-	{	if(*s!=quote) continue;
-		if(*++s!=quote) return(s);
-	}
-	if(f__elist->cierr) {
-		errno = 100;
-		return(NULL);
-	}
-	f__fatal(100, "bad string");
-	/*NOTREACHED*/ return 0;
-}
- static
-#ifdef KR_headers
-op_gen(a,b,c,d)
-#else
-op_gen(int a, int b, int c, int d)
-#endif
-{	struct syl *p= &f__syl[f__pc];
-	if(f__pc>=SYLMX)
-	{	fprintf(stderr,"format too complicated:\n");
-		sig_die(f__fmtbuf, 1);
-	}
-	p->op=a;
-	p->p1=b;
-	p->p2=c;
-	p->p3=d;
-	return(f__pc++);
-}
-#ifdef KR_headers
-static char *f_list();
-static char *gt_num(s,n,n1) char *s; int *n, n1;
-#else
-static char *f_list(char*);
-static char *gt_num(char *s, int *n, int n1)
-#endif
-{	int m=0,f__cnt=0;
-	char c;
-	for(c= *s;;c = *s)
-	{	if(c==' ')
-		{	s++;
-			continue;
-		}
-		if(c>'9' || c<'0') break;
-		m=10*m+c-'0';
-		f__cnt++;
-		s++;
-	}
-	if(f__cnt==0) {
-		if (!n1)
-			s = 0;
-		*n=n1;
-		}
-	else *n=m;
-	return(s);
-}
-
- static
-#ifdef KR_headers
-char *f_s(s,curloc) char *s;
-#else
-char *f_s(char *s, int curloc)
-#endif
-{
-	skip(s);
-	if(*s++!='(')
-	{
-		return(NULL);
-	}
-	if(f__parenlvl++ ==1) f__revloc=curloc;
-	if(op_gen(RET1,curloc,0,0)<0 ||
-		(s=f_list(s))==NULL)
-	{
-		return(NULL);
-	}
-	skip(s);
-	return(s);
-}
-
- static
-#ifdef KR_headers
-ne_d(s,p) char *s,**p;
-#else
-ne_d(char *s, char **p)
-#endif
-{	int n,x,sign=0;
-	struct syl *sp;
-	switch(*s)
-	{
-	default:
-		return(0);
-	case ':': (void) op_gen(COLON,0,0,0); break;
-	case '$':
-		(void) op_gen(NONL, 0, 0, 0); break;
-	case 'B':
-	case 'b':
-		if(*++s=='z' || *s == 'Z') (void) op_gen(BZ,0,0,0);
-		else (void) op_gen(BN,0,0,0);
-		break;
-	case 'S':
-	case 's':
-		if(*(s+1)=='s' || *(s+1) == 'S')
-		{	x=SS;
-			s++;
-		}
-		else if(*(s+1)=='p' || *(s+1) == 'P')
-		{	x=SP;
-			s++;
-		}
-		else x=S;
-		(void) op_gen(x,0,0,0);
-		break;
-	case '/': (void) op_gen(SLASH,0,0,0); break;
-	case '-': sign=1;
-	case '+':	s++;	/*OUTRAGEOUS CODING TRICK*/
-	case '0': case '1': case '2': case '3': case '4':
-	case '5': case '6': case '7': case '8': case '9':
-		if (!(s=gt_num(s,&n,0))) {
- bad:			*p = 0;
-			return 1;
-			}
-		switch(*s)
-		{
-		default:
-			return(0);
-		case 'P':
-		case 'p': if(sign) n= -n; (void) op_gen(P,n,0,0); break;
-		case 'X':
-		case 'x': (void) op_gen(X,n,0,0); break;
-		case 'H':
-		case 'h':
-			sp = &f__syl[op_gen(H,n,0,0)];
-			*(char **)&sp->p2 = s + 1;
-			s+=n;
-			break;
-		}
-		break;
-	case GLITCH:
-	case '"':
-	case '\'':
-		sp = &f__syl[op_gen(APOS,0,0,0)];
-		*(char **)&sp->p2 = s;
-		if((*p = ap_end(s)) == NULL)
-			return(0);
-		return(1);
-	case 'T':
-	case 't':
-		if(*(s+1)=='l' || *(s+1) == 'L')
-		{	x=TL;
-			s++;
-		}
-		else if(*(s+1)=='r'|| *(s+1) == 'R')
-		{	x=TR;
-			s++;
-		}
-		else x=T;
-		if (!(s=gt_num(s+1,&n,0)))
-			goto bad;
-		s--;
-		(void) op_gen(x,n,0,0);
-		break;
-	case 'X':
-	case 'x': (void) op_gen(X,1,0,0); break;
-	case 'P':
-	case 'p': (void) op_gen(P,1,0,0); break;
-	}
-	s++;
-	*p=s;
-	return(1);
-}
-
- static
-#ifdef KR_headers
-e_d(s,p) char *s,**p;
-#else
-e_d(char *s, char **p)
-#endif
-{	int i,im,n,w,d,e,found=0,x=0;
-	char *sv=s;
-	s=gt_num(s,&n,1);
-	(void) op_gen(STACK,n,0,0);
-	switch(*s++)
-	{
-	default: break;
-	case 'E':
-	case 'e':	x=1;
-	case 'G':
-	case 'g':
-		found=1;
-		if (!(s=gt_num(s,&w,0))) {
- bad:
-			*p = 0;
-			return 1;
-			}
-		if(w==0) break;
-		if(*s=='.') {
-			if (!(s=gt_num(s+1,&d,0)))
-				goto bad;
-			}
-		else d=0;
-		if(*s!='E' && *s != 'e')
-			(void) op_gen(x==1?E:G,w,d,0);	/* default is Ew.dE2 */
-		else {
-			if (!(s=gt_num(s+1,&e,0)))
-				goto bad;
-			(void) op_gen(x==1?EE:GE,w,d,e);
-			}
-		break;
-	case 'O':
-	case 'o':
-		i = O;
-		im = OM;
-		goto finish_I;
-	case 'Z':
-	case 'z':
-		i = Z;
-		im = ZM;
-		goto finish_I;
-	case 'L':
-	case 'l':
-		found=1;
-		if (!(s=gt_num(s,&w,0)))
-			goto bad;
-		if(w==0) break;
-		(void) op_gen(L,w,0,0);
-		break;
-	case 'A':
-	case 'a':
-		found=1;
-		skip(s);
-		if(*s>='0' && *s<='9')
-		{	s=gt_num(s,&w,1);
-			if(w==0) break;
-			(void) op_gen(AW,w,0,0);
-			break;
-		}
-		(void) op_gen(A,0,0,0);
-		break;
-	case 'F':
-	case 'f':
-		if (!(s=gt_num(s,&w,0)))
-			goto bad;
-		found=1;
-		if(w==0) break;
-		if(*s=='.') {
-			if (!(s=gt_num(s+1,&d,0)))
-				goto bad;
-			}
-		else d=0;
-		(void) op_gen(F,w,d,0);
-		break;
-	case 'D':
-	case 'd':
-		found=1;
-		if (!(s=gt_num(s,&w,0)))
-			goto bad;
-		if(w==0) break;
-		if(*s=='.') {
-			if (!(s=gt_num(s+1,&d,0)))
-				goto bad;
-			}
-		else d=0;
-		(void) op_gen(D,w,d,0);
-		break;
-	case 'I':
-	case 'i':
-		i = I;
-		im = IM;
- finish_I:
-		if (!(s=gt_num(s,&w,0)))
-			goto bad;
-		found=1;
-		if(w==0) break;
-		if(*s!='.')
-		{	(void) op_gen(i,w,0,0);
-			break;
-		}
-		if (!(s=gt_num(s+1,&d,0)))
-			goto bad;
-		(void) op_gen(im,w,d,0);
-		break;
-	}
-	if(found==0)
-	{	f__pc--; /*unSTACK*/
-		*p=sv;
-		return(0);
-	}
-	*p=s;
-	return(1);
-}
- static
-#ifdef KR_headers
-char *i_tem(s) char *s;
-#else
-char *i_tem(char *s)
-#endif
-{	char *t;
-	int n,curloc;
-	if(*s==')') return(s);
-	if(ne_d(s,&t)) return(t);
-	if(e_d(s,&t)) return(t);
-	s=gt_num(s,&n,1);
-	if((curloc=op_gen(STACK,n,0,0))<0) return(NULL);
-	return(f_s(s,curloc));
-}
-
- static
-#ifdef KR_headers
-char *f_list(s) char *s;
-#else
-char *f_list(char *s)
-#endif
-{
-	for(;*s!=0;)
-	{	skip(s);
-		if((s=i_tem(s))==NULL) return(NULL);
-		skip(s);
-		if(*s==',') s++;
-		else if(*s==')')
-		{	if(--f__parenlvl==0)
-			{
-				(void) op_gen(REVERT,f__revloc,0,0);
-				return(++s);
-			}
-			(void) op_gen(GOTO,0,0,0);
-			return(++s);
-		}
-	}
-	return(NULL);
-}
-
-#ifdef KR_headers
-pars_f(s) char *s;
-#else
-pars_f(char *s)
-#endif
-{
-	f__parenlvl=f__revloc=f__pc=0;
-	if(f_s(s,0) == NULL)
-	{
-		return(-1);
-	}
-	return(0);
-}
-#define STKSZ 10
-int f__cnt[STKSZ],f__ret[STKSZ],f__cp,f__rp;
-flag f__workdone, f__nonl;
-
- static
-#ifdef KR_headers
-type_f(n)
-#else
-type_f(int n)
-#endif
-{
-	switch(n)
-	{
-	default:
-		return(n);
-	case RET1:
-		return(RET1);
-	case REVERT: return(REVERT);
-	case GOTO: return(GOTO);
-	case STACK: return(STACK);
-	case X:
-	case SLASH:
-	case APOS: case H:
-	case T: case TL: case TR:
-		return(NED);
-	case F:
-	case I:
-	case IM:
-	case A: case AW:
-	case O: case OM:
-	case L:
-	case E: case EE: case D:
-	case G: case GE:
-	case Z: case ZM:
-		return(ED);
-	}
-}
-#ifdef KR_headers
-integer do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
-#else
-integer do_fio(ftnint *number, char *ptr, ftnlen len)
-#endif
-{	struct syl *p;
-	int n,i;
-	for(i=0;i<*number;i++,ptr+=len)
-	{
-loop:	switch(type_f((p= &f__syl[f__pc])->op))
-	{
-	default:
-		fprintf(stderr,"unknown code in do_fio: %d\n%s\n",
-			p->op,f__fmtbuf);
-		err(f__elist->cierr,100,"do_fio");
-	case NED:
-		if((*f__doned)(p))
-		{	f__pc++;
-			goto loop;
-		}
-		f__pc++;
-		continue;
-	case ED:
-		if(f__cnt[f__cp]<=0)
-		{	f__cp--;
-			f__pc++;
-			goto loop;
-		}
-		if(ptr==NULL)
-			return((*f__doend)());
-		f__cnt[f__cp]--;
-		f__workdone=1;
-		if((n=(*f__doed)(p,ptr,len))>0)
-			errfl(f__elist->cierr,errno,"fmt");
-		if(n<0)
-			err(f__elist->ciend,(EOF),"fmt");
-		continue;
-	case STACK:
-		f__cnt[++f__cp]=p->p1;
-		f__pc++;
-		goto loop;
-	case RET1:
-		f__ret[++f__rp]=p->p1;
-		f__pc++;
-		goto loop;
-	case GOTO:
-		if(--f__cnt[f__cp]<=0)
-		{	f__cp--;
-			f__rp--;
-			f__pc++;
-			goto loop;
-		}
-		f__pc=1+f__ret[f__rp--];
-		goto loop;
-	case REVERT:
-		f__rp=f__cp=0;
-		f__pc = p->p1;
-		if(ptr==NULL)
-			return((*f__doend)());
-		if(!f__workdone) return(0);
-		if((n=(*f__dorevert)()) != 0) return(n);
-		goto loop;
-	case COLON:
-		if(ptr==NULL)
-			return((*f__doend)());
-		f__pc++;
-		goto loop;
-	case NONL:
-		f__nonl = 1;
-		f__pc++;
-		goto loop;
-	case S:
-	case SS:
-		f__cplus=0;
-		f__pc++;
-		goto loop;
-	case SP:
-		f__cplus = 1;
-		f__pc++;
-		goto loop;
-	case P:	f__scale=p->p1;
-		f__pc++;
-		goto loop;
-	case BN:
-		f__cblank=0;
-		f__pc++;
-		goto loop;
-	case BZ:
-		f__cblank=1;
-		f__pc++;
-		goto loop;
-	}
-	}
-	return(0);
-}
-en_fio(Void)
-{	ftnint one=1;
-	return(do_fio(&one,(char *)NULL,(ftnint)0));
-}
- VOID
-fmt_bg(Void)
-{
-	f__workdone=f__cp=f__rp=f__pc=f__cursor=0;
-	f__cnt[0]=f__ret[0]=0;
-}
diff --git a/gcc/f/runtime/libI77/fmt.h b/gcc/f/runtime/libI77/fmt.h
deleted file mode 100644
index 509746e..0000000
--- a/gcc/f/runtime/libI77/fmt.h
+++ /dev/null
@@ -1,99 +0,0 @@
-struct syl
-{	int op,p1,p2,p3;
-};
-#define RET1 1
-#define REVERT 2
-#define GOTO 3
-#define X 4
-#define SLASH 5
-#define STACK 6
-#define I 7
-#define ED 8
-#define NED 9
-#define IM 10
-#define APOS 11
-#define H 12
-#define TL 13
-#define TR 14
-#define T 15
-#define COLON 16
-#define S 17
-#define SP 18
-#define SS 19
-#define P 20
-#define BN 21
-#define BZ 22
-#define F 23
-#define E 24
-#define EE 25
-#define D 26
-#define G 27
-#define GE 28
-#define L 29
-#define A 30
-#define AW 31
-#define O 32
-#define NONL 33
-#define OM 34
-#define Z 35
-#define ZM 36
-extern struct syl f__syl[];
-extern int f__pc,f__parenlvl,f__revloc;
-typedef union
-{	real pf;
-	doublereal pd;
-} ufloat;
-typedef union
-{	short is;
-#ifndef KR_headers
-	signed
-#endif
-		char ic;
-	integer il;
-#ifdef Allow_TYQUAD
-	longint ili;
-#endif
-} Uint;
-#ifdef KR_headers
-extern int (*f__doed)(),(*f__doned)();
-extern int (*f__dorevert)();
-extern int rd_ed(),rd_ned();
-extern int w_ed(),w_ned();
-#else
-#ifdef __cplusplus
-extern "C" {
-#endif
-extern int (*f__doed)(struct syl*, char*, ftnlen),(*f__doned)(struct syl*);
-extern int (*f__dorevert)(void);
-extern void fmt_bg(void);
-extern int pars_f(char*);
-extern int rd_ed(struct syl*, char*, ftnlen),rd_ned(struct syl*);
-extern int w_ed(struct syl*, char*, ftnlen),w_ned(struct syl*);
-extern int wrt_E(ufloat*, int, int, int, ftnlen);
-extern int wrt_F(ufloat*, int, int, ftnlen);
-extern int wrt_L(Uint*, int, ftnlen);
-#ifdef __cplusplus
-	}
-#endif
-#endif
-extern flag f__cblank,f__cplus,f__workdone, f__nonl;
-extern char *f__fmtbuf;
-extern int f__scale;
-#define GET(x) if((x=(*f__getn)())<0) return(x)
-#define VAL(x) (x!='\n'?x:' ')
-#define PUT(x) (*f__putn)(x)
-extern int f__cursor;
-
-#undef TYQUAD
-#ifndef Allow_TYQUAD
-#undef longint
-#define longint long
-#else
-#define TYQUAD 14
-#endif
-
-#ifdef KR_headers
-extern char *f__icvt();
-#else
-extern char *f__icvt(longint, int*, int*, int);
-#endif
diff --git a/gcc/f/runtime/libI77/fmtlib.c b/gcc/f/runtime/libI77/fmtlib.c
deleted file mode 100644
index 91483fc..0000000
--- a/gcc/f/runtime/libI77/fmtlib.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/*	@(#)fmtlib.c	1.2	*/
-#define MAXINTLENGTH 23
-
-#include "f2c.h"
-#ifndef Allow_TYQUAD
-#undef longint
-#define longint long
-#undef ulongint
-#define ulongint unsigned long
-#endif
-
-#ifdef KR_headers
-char *f__icvt(value,ndigit,sign, base) longint value; int *ndigit,*sign;
- register int base;
-#else
-char *f__icvt(longint value, int *ndigit, int *sign, int base)
-#endif
-{
-	static char buf[MAXINTLENGTH+1];
-	register int i;
-	ulongint uvalue;
-
-	if(value > 0) {
-		uvalue = value;
-		*sign = 0;
-		}
-	else if (value < 0) {
-		uvalue = -value;
-		*sign = 1;
-		}
-	else {
-		*sign = 0;
-		*ndigit = 1;
-		buf[MAXINTLENGTH-1] = '0';
-		return &buf[MAXINTLENGTH-1];
-		}
-	i = MAXINTLENGTH;
-	do {
-		buf[--i] = (uvalue%base) + '0';
-		uvalue /= base;
-		}
-		while(uvalue > 0);
-	*ndigit = MAXINTLENGTH - i;
-	return &buf[i];
-	}
diff --git a/gcc/f/runtime/libI77/fp.h b/gcc/f/runtime/libI77/fp.h
deleted file mode 100644
index 40743d7..0000000
--- a/gcc/f/runtime/libI77/fp.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#define FMAX 40
-#define EXPMAXDIGS 8
-#define EXPMAX 99999999
-/* FMAX = max number of nonzero digits passed to atof() */
-/* EXPMAX = 10^EXPMAXDIGS - 1 = largest allowed exponent absolute value */
-
-#ifdef V10 /* Research Tenth-Edition Unix */
-#include "local.h"
-#endif
-
-/* MAXFRACDIGS and MAXINTDIGS are for wrt_F -- bounds (not necessarily
-   tight) on the maximum number of digits to the right and left of
- * the decimal point.
- */
-
-#ifdef VAX
-#define MAXFRACDIGS 56
-#define MAXINTDIGS 38
-#else
-#ifdef CRAY
-#define MAXFRACDIGS 9880
-#define MAXINTDIGS 9864
-#else
-/* values that suffice for IEEE double */
-#define MAXFRACDIGS 344
-#define MAXINTDIGS 308
-#endif
-#endif
diff --git a/gcc/f/runtime/libI77/ftell_.c b/gcc/f/runtime/libI77/ftell_.c
deleted file mode 100644
index 1bd03be..0000000
--- a/gcc/f/runtime/libI77/ftell_.c
+++ /dev/null
@@ -1,46 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-
- static FILE *
-#ifdef KR_headers
-unit_chk(Unit, who) integer Unit; char *who;
-#else
-unit_chk(integer Unit, char *who)
-#endif
-{
-	if (Unit >= MXUNIT || Unit < 0)
-		f__fatal(101, who);
-	return f__units[Unit].ufd;
-	}
-
- integer
-#ifdef KR_headers
-G77_ftell_0 (Unit) integer *Unit;
-#else
-G77_ftell_0 (integer *Unit)
-#endif
-{
-	FILE *f;
-	return (f = unit_chk(*Unit, "ftell")) ? ftell(f) : -1L;
-	}
-
- integer
-#ifdef KR_headers
-G77_fseek_0 (Unit, offset, xwhence) integer *Unit, *offset, *xwhence;
-#else
-G77_fseek_0 (integer *Unit, integer *offset, integer *xwhence)
-#endif
-{
-	FILE *f;
-	int w = (int)*xwhence;
-#ifdef SEEK_SET
-	static int wohin[3] = { SEEK_SET, SEEK_CUR, SEEK_END };
-#endif
-	if (w < 0 || w > 2)
-		w = 0;
-#ifdef SEEK_SET
-	w = wohin[w];
-#endif
-	return	!(f = unit_chk(*Unit, "fseek"))
-		|| fseek(f, *offset, w) ? 1 : 0;
-	}
diff --git a/gcc/f/runtime/libI77/iio.c b/gcc/f/runtime/libI77/iio.c
deleted file mode 100644
index 22eae3f..0000000
--- a/gcc/f/runtime/libI77/iio.c
+++ /dev/null
@@ -1,148 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#include "fmt.h"
-extern char *f__icptr;
-char *f__icend;
-extern icilist *f__svic;
-int f__icnum;
-extern int f__hiwater;
-z_getc(Void)
-{
-	if(f__recpos++ < f__svic->icirlen) {
-		if(f__icptr >= f__icend) err(f__svic->iciend,(EOF),"endfile");
-		return(*(unsigned char *)f__icptr++);
-		}
-	return '\n';
-}
-#ifdef KR_headers
-z_putc(c)
-#else
-z_putc(int c)
-#endif
-{
-	if(f__icptr >= f__icend) err(f__svic->icierr,110,"inwrite");
-	if(f__recpos++ < f__svic->icirlen)
-		*f__icptr++ = c;
-	else	err(f__svic->icierr,110,"recend");
-	return 0;
-}
-z_rnew(Void)
-{
-	f__icptr = f__svic->iciunit + (++f__icnum)*f__svic->icirlen;
-	f__recpos = 0;
-	f__cursor = 0;
-	f__hiwater = 0;
-	return 1;
-}
-
- static int
-z_endp(Void)
-{
-	(*f__donewrec)();
-	return 0;
-	}
-
-#ifdef KR_headers
-c_si(a) icilist *a;
-#else
-c_si(icilist *a)
-#endif
-{
-	if (f__init & 2)
-		f__fatal (131, "I/O recursion");
-	f__init |= 2;
-	f__elist = (cilist *)a;
-	f__fmtbuf=a->icifmt;
-	if(pars_f(f__fmtbuf)<0)
-		err(a->icierr,100,"startint");
-	fmt_bg();
-	f__sequential=f__formatted=1;
-	f__external=0;
-	f__cblank=f__cplus=f__scale=0;
-	f__svic=a;
-	f__icnum=f__recpos=0;
-	f__cursor = 0;
-	f__hiwater = 0;
-	f__icptr = a->iciunit;
-	f__icend = f__icptr + a->icirlen*a->icirnum;
-	f__curunit = 0;
-	f__cf = 0;
-	return(0);
-}
-
- int
-iw_rev(Void)
-{
-	if(f__workdone)
-		z_endp();
-	f__hiwater = f__recpos = f__cursor = 0;
-	return(f__workdone=0);
-	}
-
-#ifdef KR_headers
-integer s_rsfi(a) icilist *a;
-#else
-integer s_rsfi(icilist *a)
-#endif
-{	int n;
-	if(n=c_si(a)) return(n);
-	f__reading=1;
-	f__doed=rd_ed;
-	f__doned=rd_ned;
-	f__getn=z_getc;
-	f__dorevert = z_endp;
-	f__donewrec = z_rnew;
-	f__doend = z_endp;
-	return(0);
-}
-
-z_wnew(Void)
-{
-	if (f__recpos < f__hiwater) {
-		f__icptr += f__hiwater - f__recpos;
-		f__recpos = f__hiwater;
-		}
-	while(f__recpos++ < f__svic->icirlen)
-		*f__icptr++ = ' ';
-	f__recpos = 0;
-	f__cursor = 0;
-	f__hiwater = 0;
-	f__icnum++;
-	return 1;
-}
-#ifdef KR_headers
-integer s_wsfi(a) icilist *a;
-#else
-integer s_wsfi(icilist *a)
-#endif
-{	int n;
-	if(n=c_si(a)) return(n);
-	f__reading=0;
-	f__doed=w_ed;
-	f__doned=w_ned;
-	f__putn=z_putc;
-	f__dorevert = iw_rev;
-	f__donewrec = z_wnew;
-	f__doend = z_endp;
-	return(0);
-}
-integer e_rsfi(Void)
-{	int n;
-	f__init &= ~2;
-	n = en_fio();
-	f__fmtbuf = NULL;
-	return(n);
-}
-integer e_wsfi(Void)
-{
-	int n;
-	f__init &= ~2;
-	n = en_fio();
-	f__fmtbuf = NULL;
-	if(f__icnum >= f__svic->icirnum
-	|| !f__recpos && f__icnum)
-		return(n);
-	while(f__recpos++ < f__svic->icirlen)
-		*f__icptr++ = ' ';
-	return(n);
-}
diff --git a/gcc/f/runtime/libI77/ilnw.c b/gcc/f/runtime/libI77/ilnw.c
deleted file mode 100644
index 08ea2be..0000000
--- a/gcc/f/runtime/libI77/ilnw.c
+++ /dev/null
@@ -1,82 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#include "lio.h"
-extern char *f__icptr;
-extern char *f__icend;
-extern icilist *f__svic;
-extern int f__icnum;
-#ifdef KR_headers
-extern int z_putc();
-#else
-extern int z_putc(int);
-#endif
-
- static int
-z_wSL(Void)
-{
-	while(f__recpos < f__svic->icirlen)
-		z_putc(' ');
-	return z_rnew();
-	}
-
- VOID
-#ifdef KR_headers
-c_liw(a) icilist *a;
-#else
-c_liw(icilist *a)
-#endif
-{
-	f__reading = 0;
-	f__external = 0;
-	f__formatted = 1;
-	f__putn = z_putc;
-	L_len = a->icirlen;
-	f__donewrec = z_wSL;
-	f__svic = a;
-	f__icnum = f__recpos = 0;
-	f__cursor = 0;
-	f__cf = 0;
-	f__curunit = 0;
-	f__icptr = a->iciunit;
-	f__icend = f__icptr + a->icirlen*a->icirnum;
-	f__elist = (cilist *)a;
-	}
-
- integer
-#ifdef KR_headers
-s_wsni(a) icilist *a;
-#else
-s_wsni(icilist *a)
-#endif
-{
-	cilist ca;
-
-	if(f__init != 1) f_init();
-	f__init = 3;
-	c_liw(a);
-	ca.cifmt = a->icifmt;
-	x_wsne(&ca);
-	z_wSL();
-	return 0;
-	}
-
- integer
-#ifdef KR_headers
-s_wsli(a) icilist *a;
-#else
-s_wsli(icilist *a)
-#endif
-{
-	if(f__init != 1) f_init();
-	f__init = 3;
-	f__lioproc = l_write;
-	c_liw(a);
-	return(0);
-	}
-
-integer e_wsli(Void)
-{
-	f__init = 1;
-	z_wSL();
-	return(0);
-	}
diff --git a/gcc/f/runtime/libI77/inquire.c b/gcc/f/runtime/libI77/inquire.c
deleted file mode 100644
index 963d4c3..0000000
--- a/gcc/f/runtime/libI77/inquire.c
+++ /dev/null
@@ -1,108 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#include <string.h>
-#ifdef KR_headers
-integer f_inqu(a) inlist *a;
-#else
-#if defined (MSDOS) && !defined (GO32)
-#undef abs
-#undef min
-#undef max
-#include "io.h"
-#endif
-integer f_inqu(inlist *a)
-#endif
-{	flag byfile;
-	int i, n;
-	unit *p;
-	char buf[256];
-	long x;
-	if (f__init & 2)
-		f__fatal (131, "I/O recursion");
-	if(a->infile!=NULL)
-	{	byfile=1;
-		g_char(a->infile,a->infilen,buf);
-#ifdef NON_UNIX_STDIO
-		x = access(buf,0) ? -1 : 0;
-		for(i=0,p=NULL;i<MXUNIT;i++)
-			if(f__units[i].ufd != NULL
-			 && f__units[i].ufnm != NULL
-			 && !strcmp(f__units[i].ufnm,buf)) {
-				p = &f__units[i];
-				break;
-				}
-#else
-		x=f__inode(buf, &n);
-		for(i=0,p=NULL;i<MXUNIT;i++)
-			if(f__units[i].uinode==x
-			&& f__units[i].ufd!=NULL
-			&& f__units[i].udev == n) {
-				p = &f__units[i];
-				break;
-				}
-#endif
-	}
-	else
-	{
-		byfile=0;
-		if(a->inunit<MXUNIT && a->inunit>=0)
-		{
-			p= &f__units[a->inunit];
-		}
-		else
-		{
-			p=NULL;
-		}
-	}
-	if(a->inex!=NULL)
-		if(byfile && x != -1 || !byfile && p!=NULL)
-			*a->inex=1;
-		else *a->inex=0;
-	if(a->inopen!=NULL)
-		if(byfile) *a->inopen=(p!=NULL);
-		else *a->inopen=(p!=NULL && p->ufd!=NULL);
-	if(a->innum!=NULL) *a->innum= p-f__units;
-	if(a->innamed!=NULL)
-		if(byfile || p!=NULL && p->ufnm!=NULL)
-			*a->innamed=1;
-		else	*a->innamed=0;
-	if(a->inname!=NULL)
-		if(byfile)
-			b_char(buf,a->inname,a->innamlen);
-		else if(p!=NULL && p->ufnm!=NULL)
-			b_char(p->ufnm,a->inname,a->innamlen);
-	if(a->inacc!=NULL && p!=NULL && p->ufd!=NULL)
-		if(p->url)
-			b_char("DIRECT",a->inacc,a->inacclen);
-		else	b_char("SEQUENTIAL",a->inacc,a->inacclen);
-	if(a->inseq!=NULL)
-		if(p!=NULL && p->url)
-			b_char("NO",a->inseq,a->inseqlen);
-		else	b_char("YES",a->inseq,a->inseqlen);
-	if(a->indir!=NULL)
-		if(p==NULL || p->url)
-			b_char("YES",a->indir,a->indirlen);
-		else	b_char("NO",a->indir,a->indirlen);
-	if(a->infmt!=NULL)
-		if(p!=NULL && p->ufmt==0)
-			b_char("UNFORMATTED",a->infmt,a->infmtlen);
-		else	b_char("FORMATTED",a->infmt,a->infmtlen);
-	if(a->inform!=NULL)
-		if(p!=NULL && p->ufmt==0)
-		b_char("NO",a->inform,a->informlen);
-		else b_char("YES",a->inform,a->informlen);
-	if(a->inunf)
-		if(p!=NULL && p->ufmt==0)
-			b_char("YES",a->inunf,a->inunflen);
-		else if (p!=NULL) b_char("NO",a->inunf,a->inunflen);
-		else b_char("UNKNOWN",a->inunf,a->inunflen);
-	if(a->inrecl!=NULL && p!=NULL)
-		*a->inrecl=p->url;
-	if(a->innrec!=NULL && p!=NULL && p->url>0)
-		*a->innrec=ftell(p->ufd)/p->url+1;
-	if(a->inblank && p!=NULL && p->ufmt)
-		if(p->ublnk)
-			b_char("ZERO",a->inblank,a->inblanklen);
-		else	b_char("NULL",a->inblank,a->inblanklen);
-	return(0);
-}
diff --git a/gcc/f/runtime/libI77/lio.h b/gcc/f/runtime/libI77/lio.h
deleted file mode 100644
index 0123172..0000000
--- a/gcc/f/runtime/libI77/lio.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*	copy of ftypes from the compiler */
-/* variable types
- * numeric assumptions:
- *	int < reals < complexes
- *	TYDREAL-TYREAL = TYDCOMPLEX-TYCOMPLEX
- */
-
-/* 0-10 retain their old (pre LOGICAL*1, etc.) */
-/* values to allow mixing old and new objects. */
-
-#define TYUNKNOWN 0
-#define TYADDR 1
-#define TYSHORT 2
-#define TYLONG 3
-#define TYREAL 4
-#define TYDREAL 5
-#define TYCOMPLEX 6
-#define TYDCOMPLEX 7
-#define TYLOGICAL 8
-#define TYCHAR 9
-#define TYSUBR 10
-#define TYINT1 11
-#define TYLOGICAL1 12
-#define TYLOGICAL2 13
-#ifdef Allow_TYQUAD
-#undef TYQUAD
-#define TYQUAD 14
-#endif
-
-#define	LINTW	24
-#define	LINE	80
-#define	LLOGW	2
-#ifdef Old_list_output
-#define	LLOW	1.0
-#define	LHIGH	1.e9
-#define	LEFMT	" %# .8E"
-#define	LFFMT	" %# .9g"
-#else
-#define	LGFMT	"%.9G"
-#endif
-/* LEFBL 20 should suffice; 24 overcomes a NeXT bug. */
-#define	LEFBL	24
-
-typedef union
-{
-	char	flchar;
-	short	flshort;
-	ftnint	flint;
-#ifdef Allow_TYQUAD
-	longint fllongint;
-#endif
-	real	flreal;
-	doublereal	fldouble;
-} flex;
-extern int f__scale;
-#ifdef KR_headers
-extern int (*f__lioproc)(), (*l_getc)(), (*l_ungetc)();
-extern int l_read(), l_write();
-#else
-#ifdef __cplusplus
-extern "C" {
-#endif
-extern int (*f__lioproc)(ftnint*, char*, ftnlen, ftnint);
-extern int l_write(ftnint*, char*, ftnlen, ftnint);
-extern void x_wsne(cilist*);
-extern int c_le(cilist*), (*l_getc)(void), (*l_ungetc)(int,FILE*);
-extern int l_read(ftnint*,char*,ftnlen,ftnint);
-extern integer e_rsle(void), e_wsle(void), s_wsne(cilist*);
-extern int z_rnew(void);
-#ifdef __cplusplus
-	}
-#endif
-#endif
-extern ftnint L_len;
diff --git a/gcc/f/runtime/libI77/lread.c b/gcc/f/runtime/libI77/lread.c
deleted file mode 100644
index 3f0642c..0000000
--- a/gcc/f/runtime/libI77/lread.c
+++ /dev/null
@@ -1,684 +0,0 @@
-#include <ctype.h>
-#include "f2c.h"
-#include "fio.h"
-
-/* Compile with -DF8X_NML_ELIDE_QUOTES to permit eliding quotation */
-/* marks in namelist input a la the Fortran 8X Draft published in  */
-/* the May 1989 issue of Fortran Forum. */
-
-
-extern char *f__fmtbuf;
-
-#ifdef Allow_TYQUAD
-static longint f__llx;
-static int quad_read;
-#endif
-
-#ifdef KR_headers
-extern double atof();
-extern char *malloc(), *realloc();
-int (*f__lioproc)(), (*l_getc)(), (*l_ungetc)();
-#else
-#undef abs
-#undef min
-#undef max
-#include <stdlib.h>
-int (*f__lioproc)(ftnint*, char*, ftnlen, ftnint), (*l_getc)(void),
-	(*l_ungetc)(int,FILE*);
-#endif
-
-#include "fmt.h"
-#include "lio.h"
-#include "fp.h"
-
-int l_eof;
-
-#define isblnk(x) (f__ltab[x+1]&B)
-#define issep(x) (f__ltab[x+1]&SX)
-#define isapos(x) (f__ltab[x+1]&AX)
-#define isexp(x) (f__ltab[x+1]&EX)
-#define issign(x) (f__ltab[x+1]&SG)
-#define iswhit(x) (f__ltab[x+1]&WH)
-#define SX 1
-#define B 2
-#define AX 4
-#define EX 8
-#define SG 16
-#define WH 32
-char f__ltab[128+1] = {	/* offset one for EOF */
-	0,
-	0,0,AX,0,0,0,0,0,0,WH|B,SX|WH,0,0,0,0,0,
-	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-	SX|B|WH,0,AX,0,0,0,0,AX,0,0,0,SG,SX,SG,0,SX,
-	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-	0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
-	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-	AX,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
-	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-};
-
-#ifdef ungetc
- static int
-#ifdef KR_headers
-un_getc(x,f__cf) int x; FILE *f__cf;
-#else
-un_getc(int x, FILE *f__cf)
-#endif
-{ return ungetc(x,f__cf); }
-#else
-#define un_getc ungetc
-#ifdef KR_headers
- extern int ungetc();
-#else
-extern int ungetc(int, FILE*);	/* for systems with a buggy stdio.h */
-#endif
-#endif
-
-t_getc(Void)
-{	int ch;
-	if(f__curunit->uend) return(EOF);
-	if((ch=getc(f__cf))!=EOF) return(ch);
-	if(feof(f__cf))
-		f__curunit->uend = l_eof = 1;
-	return(EOF);
-}
-integer e_rsle(Void)
-{
-	int ch;
-	f__init = 1;
-	if(f__curunit->uend) return(0);
-	while((ch=t_getc())!='\n')
-		if (ch == EOF) {
-			if(feof(f__cf))
-				f__curunit->uend = l_eof = 1;
-			return EOF;
-			}
-	return(0);
-}
-
-flag f__lquit;
-int f__lcount,f__ltype,nml_read;
-char *f__lchar;
-double f__lx,f__ly;
-#define ERR(x) if(n=(x)) {f__init &= ~2; return(n);}
-#define GETC(x) (x=(*l_getc)())
-#define Ungetc(x,y) (*l_ungetc)(x,y)
-
-#ifdef KR_headers
-l_R(poststar) int poststar;
-#else
-l_R(int poststar)
-#endif
-{
-	char s[FMAX+EXPMAXDIGS+4];
-	register int ch;
-	register char *sp, *spe, *sp1;
-	long e, exp;
-	int havenum, havestar, se;
-
-	if (!poststar) {
-		if (f__lcount > 0)
-			return(0);
-		f__lcount = 1;
-		}
-#ifdef Allow_TYQUAD
-	f__llx = 0;
-#endif
-	f__ltype = 0;
-	exp = 0;
-	havestar = 0;
-retry:
-	sp1 = sp = s;
-	spe = sp + FMAX;
-	havenum = 0;
-
-	switch(GETC(ch)) {
-		case '-': *sp++ = ch; sp1++; spe++;
-		case '+':
-			GETC(ch);
-		}
-	while(ch == '0') {
-		++havenum;
-		GETC(ch);
-		}
-	while(isdigit(ch)) {
-		if (sp < spe) *sp++ = ch;
-		else ++exp;
-		GETC(ch);
-		}
-	if (ch == '*' && !poststar) {
-		if (sp == sp1 || exp || *s == '-') {
-			errfl(f__elist->cierr,112,"bad repetition count");
-			}
-		poststar = havestar = 1;
-		*sp = 0;
-		f__lcount = atoi(s);
-		goto retry;
-		}
-	if (ch == '.') {
-		GETC(ch);
-		if (sp == sp1)
-			while(ch == '0') {
-				++havenum;
-				--exp;
-				GETC(ch);
-				}
-		while(isdigit(ch)) {
-			if (sp < spe)
-				{ *sp++ = ch; --exp; }
-			GETC(ch);
-			}
-		}
-	havenum += sp - sp1;
-	se = 0;
-	if (issign(ch))
-		goto signonly;
-	if (havenum && isexp(ch)) {
-		GETC(ch);
-		if (issign(ch)) {
-signonly:
-			if (ch == '-') se = 1;
-			GETC(ch);
-			}
-		if (!isdigit(ch)) {
-bad:
-			errfl(f__elist->cierr,112,"exponent field");
-			}
-
-		e = ch - '0';
-		while(isdigit(GETC(ch))) {
-			e = 10*e + ch - '0';
-			if (e > EXPMAX)
-				goto bad;
-			}
-		if (se)
-			exp -= e;
-		else
-			exp += e;
-		}
-	(void) Ungetc(ch, f__cf);
-	if (sp > sp1) {
-		++havenum;
-		while(*--sp == '0')
-			++exp;
-		if (exp)
-			sprintf(sp+1, "e%ld", exp);
-		else
-			sp[1] = 0;
-		f__lx = atof(s);
-#ifdef Allow_TYQUAD
-		if (quad_read && (se = sp - sp1 + exp) > 14 && se < 20) {
-			/* Assuming 64-bit longint and 32-bit long. */
-			if (exp < 0)
-				sp += exp;
-			if (sp1 <= sp) {
-				f__llx = *sp1 - '0';
-				while(++sp1 <= sp)
-					f__llx = 10*f__llx + (*sp1 - '0');
-				}
-			while(--exp >= 0)
-				f__llx *= 10;
-			if (*s == '-')
-				f__llx = -f__llx;
-			}
-#endif
-		}
-	else
-		f__lx = 0.;
-	if (havenum)
-		f__ltype = TYLONG;
-	else
-		switch(ch) {
-			case ',':
-			case '/':
-				break;
-			default:
-				if (havestar && ( ch == ' '
-						||ch == '\t'
-						||ch == '\n'))
-					break;
-				if (nml_read > 1) {
-					f__lquit = 2;
-					return 0;
-					}
-				errfl(f__elist->cierr,112,"invalid number");
-			}
-	return 0;
-	}
-
- static int
-#ifdef KR_headers
-rd_count(ch) register int ch;
-#else
-rd_count(register int ch)
-#endif
-{
-	if (ch < '0' || ch > '9')
-		return 1;
-	f__lcount = ch - '0';
-	while(GETC(ch) >= '0' && ch <= '9')
-		f__lcount = 10*f__lcount + ch - '0';
-	Ungetc(ch,f__cf);
-	return f__lcount <= 0;
-	}
-
-l_C(Void)
-{	int ch, nml_save;
-	double lz;
-	if(f__lcount>0) return(0);
-	f__ltype=0;
-	GETC(ch);
-	if(ch!='(')
-	{
-		if (nml_read > 1 && (ch < '0' || ch > '9')) {
-			Ungetc(ch,f__cf);
-			f__lquit = 2;
-			return 0;
-			}
-		if (rd_count(ch))
-			if(!f__cf || !feof(f__cf))
-				errfl(f__elist->cierr,112,"complex format");
-			else
-				err(f__elist->cierr,(EOF),"lread");
-		if(GETC(ch)!='*')
-		{
-			if(!f__cf || !feof(f__cf))
-				errfl(f__elist->cierr,112,"no star");
-			else
-				err(f__elist->cierr,(EOF),"lread");
-		}
-		if(GETC(ch)!='(')
-		{	Ungetc(ch,f__cf);
-			return(0);
-		}
-	}
-	else
-		f__lcount = 1;
-	while(iswhit(GETC(ch)));
-	Ungetc(ch,f__cf);
-	nml_save = nml_read;
-	nml_read = 0;
-	if (ch = l_R(1))
-		return ch;
-	if (!f__ltype)
-		errfl(f__elist->cierr,112,"no real part");
-	lz = f__lx;
-	while(iswhit(GETC(ch)));
-	if(ch!=',')
-	{	(void) Ungetc(ch,f__cf);
-		errfl(f__elist->cierr,112,"no comma");
-	}
-	while(iswhit(GETC(ch)));
-	(void) Ungetc(ch,f__cf);
-	if (ch = l_R(1))
-		return ch;
-	if (!f__ltype)
-		errfl(f__elist->cierr,112,"no imaginary part");
-	while(iswhit(GETC(ch)));
-	if(ch!=')') errfl(f__elist->cierr,112,"no )");
-	f__ly = f__lx;
-	f__lx = lz;
-#ifdef Allow_TYQUAD
-	f__llx = 0;
-#endif
-	nml_read = nml_save;
-	return(0);
-}
-l_L(Void)
-{
-	int ch;
-	if(f__lcount>0) return(0);
-	f__lcount = 1;
-	f__ltype=0;
-	GETC(ch);
-	if(isdigit(ch))
-	{
-		rd_count(ch);
-		if(GETC(ch)!='*')
-			if(!f__cf || !feof(f__cf))
-				errfl(f__elist->cierr,112,"no star");
-			else
-				err(f__elist->cierr,(EOF),"lread");
-		GETC(ch);
-	}
-	if(ch == '.') GETC(ch);
-	switch(ch)
-	{
-	case 't':
-	case 'T':
-		f__lx=1;
-		break;
-	case 'f':
-	case 'F':
-		f__lx=0;
-		break;
-	default:
-		if(isblnk(ch) || issep(ch) || ch==EOF)
-		{	(void) Ungetc(ch,f__cf);
-			return(0);
-		}
-		if (nml_read > 1) {
-			Ungetc(ch,f__cf);
-			f__lquit = 2;
-			return 0;
-			}
-		errfl(f__elist->cierr,112,"logical");
-	}
-	f__ltype=TYLONG;
-	while(!issep(GETC(ch)) && ch!=EOF);
-	(void) Ungetc(ch, f__cf);
-	return(0);
-}
-#define BUFSIZE	128
-l_CHAR(Void)
-{	int ch,size,i;
-	static char rafail[] = "realloc failure";
-	char quote,*p;
-	if(f__lcount>0) return(0);
-	f__ltype=0;
-	if(f__lchar!=NULL) free(f__lchar);
-	size=BUFSIZE;
-	p=f__lchar = (char *)malloc((unsigned int)size);
-	if(f__lchar == NULL)
-		errfl(f__elist->cierr,113,"no space");
-
-	GETC(ch);
-	if(isdigit(ch)) {
-		/* allow Fortran 8x-style unquoted string...	*/
-		/* either find a repetition count or the string	*/
-		f__lcount = ch - '0';
-		*p++ = ch;
-		for(i = 1;;) {
-			switch(GETC(ch)) {
-				case '*':
-					if (f__lcount == 0) {
-						f__lcount = 1;
-#ifndef F8X_NML_ELIDE_QUOTES
-						if (nml_read)
-							goto no_quote;
-#endif
-						goto noquote;
-						}
-					p = f__lchar;
-					goto have_lcount;
-				case ',':
-				case ' ':
-				case '\t':
-				case '\n':
-				case '/':
-					Ungetc(ch,f__cf);
-					/* no break */
-				case EOF:
-					f__lcount = 1;
-					f__ltype = TYCHAR;
-					return *p = 0;
-				}
-			if (!isdigit(ch)) {
-				f__lcount = 1;
-#ifndef F8X_NML_ELIDE_QUOTES
-				if (nml_read) {
- no_quote:
-					errfl(f__elist->cierr,112,
-						"undelimited character string");
-					}
-#endif
-				goto noquote;
-				}
-			*p++ = ch;
-			f__lcount = 10*f__lcount + ch - '0';
-			if (++i == size) {
-				f__lchar = (char *)realloc(f__lchar,
-					(unsigned int)(size += BUFSIZE));
-				if(f__lchar == NULL)
-					errfl(f__elist->cierr,113,rafail);
-				p = f__lchar + i;
-				}
-			}
-		}
-	else	(void) Ungetc(ch,f__cf);
- have_lcount:
-	if(GETC(ch)=='\'' || ch=='"') quote=ch;
-	else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF) {
-		Ungetc(ch,f__cf);
-		return 0;
-		}
-#ifndef F8X_NML_ELIDE_QUOTES
-	else if (nml_read > 1) {
-		Ungetc(ch,f__cf);
-		f__lquit = 2;
-		return 0;
-		}
-#endif
-	else {
-		/* Fortran 8x-style unquoted string */
-		*p++ = ch;
-		for(i = 1;;) {
-			switch(GETC(ch)) {
-				case ',':
-				case ' ':
-				case '\t':
-				case '\n':
-				case '/':
-					Ungetc(ch,f__cf);
-					/* no break */
-				case EOF:
-					f__ltype = TYCHAR;
-					return *p = 0;
-				}
- noquote:
-			*p++ = ch;
-			if (++i == size) {
-				f__lchar = (char *)realloc(f__lchar,
-					(unsigned int)(size += BUFSIZE));
-				if(f__lchar == NULL)
-					errfl(f__elist->cierr,113,rafail);
-				p = f__lchar + i;
-				}
-			}
-		}
-	f__ltype=TYCHAR;
-	for(i=0;;)
-	{	while(GETC(ch)!=quote && ch!='\n'
-			&& ch!=EOF && ++i<size) *p++ = ch;
-		if(i==size)
-		{
-		newone:
-			f__lchar= (char *)realloc(f__lchar,
-					(unsigned int)(size += BUFSIZE));
-			if(f__lchar == NULL)
-				errfl(f__elist->cierr,113,rafail);
-			p=f__lchar+i-1;
-			*p++ = ch;
-		}
-		else if(ch==EOF) return(EOF);
-		else if(ch=='\n')
-		{	if(*(p-1) != '\\') continue;
-			i--;
-			p--;
-			if(++i<size) *p++ = ch;
-			else goto newone;
-		}
-		else if(GETC(ch)==quote)
-		{	if(++i<size) *p++ = ch;
-			else goto newone;
-		}
-		else
-		{	(void) Ungetc(ch,f__cf);
-			*p = 0;
-			return(0);
-		}
-	}
-}
-#ifdef KR_headers
-c_le(a) cilist *a;
-#else
-c_le(cilist *a)
-#endif
-{
-	if(f__init != 1) f_init();
-	f__init = 3;
-	f__fmtbuf="list io";
-	if(a->ciunit>=MXUNIT || a->ciunit<0)
-		err(a->cierr,101,"stler");
-	f__scale=f__recpos=0;
-	f__elist=a;
-	f__curunit = &f__units[a->ciunit];
-	if(f__curunit->ufd==NULL && fk_open(SEQ,FMT,a->ciunit))
-		err(a->cierr,102,"lio");
-	f__cf=f__curunit->ufd;
-	if(!f__curunit->ufmt) err(a->cierr,103,"lio");
-	return(0);
-}
-#ifdef KR_headers
-l_read(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len;
-#else
-l_read(ftnint *number, char *ptr, ftnlen len, ftnint type)
-#endif
-{
-#define Ptr ((flex *)ptr)
-	int i,n,ch;
-	doublereal *yy;
-	real *xx;
-	for(i=0;i<*number;i++)
-	{
-		if(f__lquit) return(0);
-		if(l_eof)
-			err(f__elist->ciend, EOF, "list in");
-		if(f__lcount == 0) {
-			f__ltype = 0;
-			for(;;)  {
-				GETC(ch);
-				switch(ch) {
-				case EOF:
-					err(f__elist->ciend,(EOF),"list in");
-				case ' ':
-				case '\t':
-				case '\n':
-					continue;
-				case '/':
-					f__lquit = 1;
-					goto loopend;
-				case ',':
-					f__lcount = 1;
-					goto loopend;
-				default:
-					(void) Ungetc(ch, f__cf);
-					goto rddata;
-				}
-			}
-		}
-	rddata:
-		switch((int)type)
-		{
-		case TYINT1:
-		case TYSHORT:
-		case TYLONG:
-		case TYREAL:
-		case TYDREAL:
-			ERR(l_R(0));
-			break;
-#ifdef TYQUAD
-		case TYQUAD:
-			quad_read = 1;
-			n = l_R(0);
-			quad_read = 0;
-			ERR(n);
-			break;
-#endif
-		case TYCOMPLEX:
-		case TYDCOMPLEX:
-			ERR(l_C());
-			break;
-		case TYLOGICAL1:
-		case TYLOGICAL2:
-		case TYLOGICAL:
-			ERR(l_L());
-			break;
-		case TYCHAR:
-			ERR(l_CHAR());
-			break;
-		}
-	while (GETC(ch) == ' ' || ch == '\t');
-	if (ch != ',' || f__lcount > 1)
-		Ungetc(ch,f__cf);
-	loopend:
-		if(f__lquit) return(0);
-		if(f__cf && ferror(f__cf)) {
-			clearerr(f__cf);
-			errfl(f__elist->cierr,errno,"list in");
-			}
-		if(f__ltype==0) goto bump;
-		switch((int)type)
-		{
-		case TYINT1:
-		case TYLOGICAL1:
-			Ptr->flchar = (char)f__lx;
-			break;
-		case TYLOGICAL2:
-		case TYSHORT:
-			Ptr->flshort = (short)f__lx;
-			break;
-		case TYLOGICAL:
-		case TYLONG:
-			Ptr->flint=f__lx;
-			break;
-#ifdef Allow_TYQUAD
-		case TYQUAD:
-			if (!(Ptr->fllongint = f__llx))
-				Ptr->fllongint = f__lx;
-			break;
-#endif
-		case TYREAL:
-			Ptr->flreal=f__lx;
-			break;
-		case TYDREAL:
-			Ptr->fldouble=f__lx;
-			break;
-		case TYCOMPLEX:
-			xx=(real *)ptr;
-			*xx++ = f__lx;
-			*xx = f__ly;
-			break;
-		case TYDCOMPLEX:
-			yy=(doublereal *)ptr;
-			*yy++ = f__lx;
-			*yy = f__ly;
-			break;
-		case TYCHAR:
-			b_char(f__lchar,ptr,len);
-			break;
-		}
-	bump:
-		if(f__lcount>0) f__lcount--;
-		ptr += len;
-		if (nml_read)
-			nml_read++;
-	}
-	return(0);
-#undef Ptr
-}
-#ifdef KR_headers
-integer s_rsle(a) cilist *a;
-#else
-integer s_rsle(cilist *a)
-#endif
-{
-	int n;
-
-	if(n=c_le(a)) return(n);
-	f__reading=1;
-	f__external=1;
-	f__formatted=1;
-	f__lioproc = l_read;
-	f__lquit = 0;
-	f__lcount = 0;
-	l_eof = 0;
-	if(f__curunit->uwrt && f__nowreading(f__curunit))
-		err(a->cierr,errno,"read start");
-	if(f__curunit->uend)
-		err(f__elist->ciend,(EOF),"read start");
-	l_getc = t_getc;
-	l_ungetc = un_getc;
-	f__doend = xrd_SL;
-	return(0);
-}
diff --git a/gcc/f/runtime/libI77/lwrite.c b/gcc/f/runtime/libI77/lwrite.c
deleted file mode 100644
index 5da7dfb..0000000
--- a/gcc/f/runtime/libI77/lwrite.c
+++ /dev/null
@@ -1,310 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#include "fmt.h"
-#include "lio.h"
-
-ftnint L_len;
-int f__Aquote;
-
- static VOID
-donewrec(Void)
-{
-	if (f__recpos)
-		(*f__donewrec)();
-	}
-
-#ifdef KR_headers
-t_putc(c)
-#else
-t_putc(int c)
-#endif
-{
-	f__recpos++;
-	putc(c,f__cf);
-	return(0);
-}
- static VOID
-#ifdef KR_headers
-lwrt_I(n) longint n;
-#else
-lwrt_I(longint n)
-#endif
-{
-	char *p;
-	int ndigit, sign;
-
-	p = f__icvt(n, &ndigit, &sign, 10);
-	if(f__recpos + ndigit >= L_len)
-		donewrec();
-	PUT(' ');
-	if (sign)
-		PUT('-');
-	while(*p)
-		PUT(*p++);
-}
- static VOID
-#ifdef KR_headers
-lwrt_L(n, len) ftnint n; ftnlen len;
-#else
-lwrt_L(ftnint n, ftnlen len)
-#endif
-{
-	if(f__recpos+LLOGW>=L_len)
-		donewrec();
-	wrt_L((Uint *)&n,LLOGW, len);
-}
- static VOID
-#ifdef KR_headers
-lwrt_A(p,len) char *p; ftnlen len;
-#else
-lwrt_A(char *p, ftnlen len)
-#endif
-{
-	int a;
-	char *p1, *pe;
-
-	a = 0;
-	pe = p + len;
-	if (f__Aquote) {
-		a = 3;
-		if (len > 1 && p[len-1] == ' ') {
-			while(--len > 1 && p[len-1] == ' ');
-			pe = p + len;
-			}
-		p1 = p;
-		while(p1 < pe)
-			if (*p1++ == '\'')
-				a++;
-		}
-	if(f__recpos+len+a >= L_len)
-		donewrec();
-	if (a
-#ifndef OMIT_BLANK_CC
-		|| !f__recpos
-#endif
-		)
-		PUT(' ');
-	if (a) {
-		PUT('\'');
-		while(p < pe) {
-			if (*p == '\'')
-				PUT('\'');
-			PUT(*p++);
-			}
-		PUT('\'');
-		}
-	else
-		while(p < pe)
-			PUT(*p++);
-}
-
- static int
-#ifdef KR_headers
-l_g(buf, n) char *buf; double n;
-#else
-l_g(char *buf, double n)
-#endif
-{
-#ifdef Old_list_output
-	doublereal absn;
-	char *fmt;
-
-	absn = n;
-	if (absn < 0)
-		absn = -absn;
-	fmt = LLOW <= absn && absn < LHIGH ? LFFMT : LEFMT;
-#ifdef USE_STRLEN
-	sprintf(buf, fmt, n);
-	return strlen(buf);
-#else
-	return sprintf(buf, fmt, n);
-#endif
-
-#else
-	register char *b, c, c1;
-
-	b = buf;
-	*b++ = ' ';
-	if (n < 0) {
-		*b++ = '-';
-		n = -n;
-		}
-	else
-		*b++ = ' ';
-	if (n == 0) {
-		*b++ = '0';
-		*b++ = '.';
-		*b = 0;
-		goto f__ret;
-		}
-	sprintf(b, LGFMT, n);
-	switch(*b) {
-#ifndef WANT_LEAD_0
-		case '0':
-			while(b[0] = b[1])
-				b++;
-			break;
-#endif
-		case 'i':
-		case 'I':
-			/* Infinity */
-		case 'n':
-		case 'N':
-			/* NaN */
-			while(*++b);
-			break;
-
-		default:
-	/* Fortran 77 insists on having a decimal point... */
-		    for(;; b++)
-			switch(*b) {
-			case 0:
-				*b++ = '.';
-				*b = 0;
-				goto f__ret;
-			case '.':
-				while(*++b);
-				goto f__ret;
-			case 'E':
-				for(c1 = '.', c = 'E';  *b = c1;
-					c1 = c, c = *++b);
-				goto f__ret;
-			}
-		}
- f__ret:
-	return b - buf;
-#endif
-	}
-
- static VOID
-#ifdef KR_headers
-l_put(s) register char *s;
-#else
-l_put(register char *s)
-#endif
-{
-#ifdef KR_headers
-	register int c, (*pn)() = f__putn;
-#else
-	register int c, (*pn)(int) = f__putn;
-#endif
-	while(c = *s++)
-		(*pn)(c);
-	}
-
- static VOID
-#ifdef KR_headers
-lwrt_F(n) double n;
-#else
-lwrt_F(double n)
-#endif
-{
-	char buf[LEFBL];
-
-	if(f__recpos + l_g(buf,n) >= L_len)
-		donewrec();
-	l_put(buf);
-}
- static VOID
-#ifdef KR_headers
-lwrt_C(a,b) double a,b;
-#else
-lwrt_C(double a, double b)
-#endif
-{
-	char *ba, *bb, bufa[LEFBL], bufb[LEFBL];
-	int al, bl;
-
-	al = l_g(bufa, a);
-	for(ba = bufa; *ba == ' '; ba++)
-		--al;
-	bl = l_g(bufb, b) + 1;	/* intentionally high by 1 */
-	for(bb = bufb; *bb == ' '; bb++)
-		--bl;
-	if(f__recpos + al + bl + 3 >= L_len)
-		donewrec();
-#ifdef OMIT_BLANK_CC
-	else
-#endif
-	PUT(' ');
-	PUT('(');
-	l_put(ba);
-	PUT(',');
-	if (f__recpos + bl >= L_len) {
-		(*f__donewrec)();
-#ifndef OMIT_BLANK_CC
-		PUT(' ');
-#endif
-		}
-	l_put(bb);
-	PUT(')');
-}
-#ifdef KR_headers
-l_write(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len;
-#else
-l_write(ftnint *number, char *ptr, ftnlen len, ftnint type)
-#endif
-{
-#define Ptr ((flex *)ptr)
-	int i;
-	longint x;
-	double y,z;
-	real *xx;
-	doublereal *yy;
-	for(i=0;i< *number; i++)
-	{
-		switch((int)type)
-		{
-		default: f__fatal(204,"unknown type in lio");
-		case TYINT1:
-			x = Ptr->flchar;
-			goto xint;
-		case TYSHORT:
-			x=Ptr->flshort;
-			goto xint;
-#ifdef Allow_TYQUAD
-		case TYQUAD:
-			x = Ptr->fllongint;
-			goto xint;
-#endif
-		case TYLONG:
-			x=Ptr->flint;
-		xint:	lwrt_I(x);
-			break;
-		case TYREAL:
-			y=Ptr->flreal;
-			goto xfloat;
-		case TYDREAL:
-			y=Ptr->fldouble;
-		xfloat: lwrt_F(y);
-			break;
-		case TYCOMPLEX:
-			xx= &Ptr->flreal;
-			y = *xx++;
-			z = *xx;
-			goto xcomplex;
-		case TYDCOMPLEX:
-			yy = &Ptr->fldouble;
-			y= *yy++;
-			z = *yy;
-		xcomplex:
-			lwrt_C(y,z);
-			break;
-		case TYLOGICAL1:
-			x = Ptr->flchar;
-			goto xlog;
-		case TYLOGICAL2:
-			x = Ptr->flshort;
-			goto xlog;
-		case TYLOGICAL:
-			x = Ptr->flint;
-		xlog:	lwrt_L(Ptr->flint, len);
-			break;
-		case TYCHAR:
-			lwrt_A(ptr,len);
-			break;
-		}
-		ptr += len;
-	}
-	return(0);
-}
diff --git a/gcc/f/runtime/libI77/makefile.netlib b/gcc/f/runtime/libI77/makefile.netlib
deleted file mode 100644
index edba1fe..0000000
--- a/gcc/f/runtime/libI77/makefile.netlib
+++ /dev/null
@@ -1,104 +0,0 @@
-.SUFFIXES: .c .o
-CC = cc
-CFLAGS = -O
-SHELL = /bin/sh
-
-# compile, then strip unnecessary symbols
-.c.o:
-	$(CC) -c -DSkip_f2c_Undefs $(CFLAGS) $*.c
-	ld -r -x -o $*.xxx $*.o
-	mv $*.xxx $*.o
-## Under Solaris (and other systems that do not understand ld -x),
-## omit -x in the ld line above.
-## If your system does not have the ld command, comment out
-## or remove both the ld and mv lines above.
-
-OBJ =	Version.o backspace.o close.o dfe.o dolio.o due.o endfile.o err.o \
-	fmt.o fmtlib.o ftell_.o iio.o ilnw.o inquire.o lread.o lwrite.o \
-	open.o rdfmt.o rewind.o rsfe.o rsli.o rsne.o sfe.o sue.o typesize.o \
-	uio.o util.o wref.o wrtfmt.o wsfe.o wsle.o wsne.o xwsne.o
-libI77.a:	$(OBJ)
-		ar r libI77.a $?
-		-ranlib libI77.a
-
-### If your system lacks ranlib, you don't need it; see README.
-
-install:	libI77.a
-	cp libI77.a /usr/lib/libI77.a
-	ranlib /usr/lib/libI77.a
-
-Version.o: Version.c
-	$(CC) -c Version.c
-
-# To compile with C++, first "make f2c.h"
-f2c.h: f2ch.add
-	cat /usr/include/f2c.h f2ch.add >f2c.h
-
-
-clean:
-	rm -f $(OBJ) libI77.a
-
-clobber:	clean
-	rm -f libI77.a
-
-backspace.o:	fio.h
-close.o:	fio.h
-dfe.o:		fio.h
-dfe.o:		fmt.h
-due.o:		fio.h
-endfile.o:	fio.h rawio.h
-err.o:		fio.h rawio.h
-fmt.o:		fio.h
-fmt.o:		fmt.h
-ftell_.o:	fio.h
-iio.o:		fio.h
-iio.o:		fmt.h
-ilnw.o:		fio.h
-ilnw.o:		lio.h
-inquire.o:	fio.h
-lread.o:	fio.h
-lread.o:	fmt.h
-lread.o:	lio.h
-lread.o:	fp.h
-lwrite.o:	fio.h
-lwrite.o:	fmt.h
-lwrite.o:	lio.h
-open.o:		fio.h rawio.h
-rdfmt.o:	fio.h
-rdfmt.o:	fmt.h
-rdfmt.o:	fp.h
-rewind.o:	fio.h
-rsfe.o:		fio.h
-rsfe.o:		fmt.h
-rsli.o:		fio.h
-rsli.o:		lio.h
-rsne.o:		fio.h
-rsne.o:		lio.h
-sfe.o:		fio.h
-sue.o:		fio.h
-uio.o:		fio.h
-util.o:		fio.h
-wref.o:		fio.h
-wref.o:		fmt.h
-wref.o:		fp.h
-wrtfmt.o:	fio.h
-wrtfmt.o:	fmt.h
-wsfe.o:		fio.h
-wsfe.o:		fmt.h
-wsle.o:		fio.h
-wsle.o:		fmt.h
-wsle.o:		lio.h
-wsne.o:		fio.h
-wsne.o:		lio.h
-xwsne.o:	fio.h
-xwsne.o:	lio.h
-xwsne.o:	fmt.h
-
-check:
-	xsum Notice README Version.c backspace.c close.c dfe.c dolio.c \
-	due.c endfile.c err.c f2ch.add fio.h fmt.c fmt.h fmtlib.c fp.h \
-	ftell_.c iio.c ilnw.c inquire.c lio.h lread.c lwrite.c makefile \
-	open.c rawio.h rdfmt.c rewind.c rsfe.c rsli.c rsne.c sfe.c sue.c \
-	typesize.c uio.c util.c wref.c wrtfmt.c wsfe.c wsle.c wsne.c \
-	xwsne.c >zap
-	cmp zap libI77.xsum && rm zap || diff libI77.xsum zap
diff --git a/gcc/f/runtime/libI77/open.c b/gcc/f/runtime/libI77/open.c
deleted file mode 100644
index b08302b..0000000
--- a/gcc/f/runtime/libI77/open.c
+++ /dev/null
@@ -1,245 +0,0 @@
-#ifndef NON_UNIX_STDIO
-#include <sys/types.h>
-#include <sys/stat.h>
-#endif
-#include "f2c.h"
-#include "fio.h"
-#include <string.h>
-#include "rawio.h"
-
-#ifdef KR_headers
-extern char *malloc(), *mktemp();
-extern integer f_clos();
-#else
-#undef abs
-#undef min
-#undef max
-#include <stdlib.h>
-extern int f__canseek(FILE*);
-extern integer f_clos(cllist*);
-#endif
-
-#ifdef NON_ANSI_RW_MODES
-char *f__r_mode[2] = {"r", "r"};
-char *f__w_mode[4] = {"w", "w", "r+w", "r+w"};
-#else
-char *f__r_mode[2] = {"rb", "r"};
-char *f__w_mode[4] = {"wb", "w", "r+b", "r+"};
-#endif
-
-#ifdef KR_headers
-f__isdev(s) char *s;
-#else
-f__isdev(char *s)
-#endif
-{
-#ifdef NON_UNIX_STDIO
-	int i, j;
-
-	i = open(s,O_RDONLY);
-	if (i == -1)
-		return 0;
-	j = isatty(i);
-	close(i);
-	return j;
-#else
-	struct stat x;
-
-	if(stat(s, &x) == -1) return(0);
-#ifdef S_IFMT
-	switch(x.st_mode&S_IFMT) {
-		case S_IFREG:
-		case S_IFDIR:
-			return(0);
-		}
-#else
-#ifdef S_ISREG
-	/* POSIX version */
-	if(S_ISREG(x.st_mode) || S_ISDIR(x.st_mode))
-		return(0);
-	else
-#else
-	Help! How does stat work on this system?
-#endif
-#endif
-		return(1);
-#endif
-}
-#ifdef KR_headers
-integer f_open(a) olist *a;
-#else
-integer f_open(olist *a)
-#endif
-{	unit *b;
-	integer rv;
-	char buf[256], *s;
-	cllist x;
-	int ufmt;
-#ifdef NON_UNIX_STDIO
-	FILE *tf;
-#else
-	int n;
-	struct stat stb;
-#endif
-	if(f__init != 1) f_init();
-	if(a->ounit>=MXUNIT || a->ounit<0)
-		err(a->oerr,101,"open");
-	f__curunit = b = &f__units[a->ounit];
-	if(b->ufd) {
-		if(a->ofnm==0)
-		{
-		same:	if (a->oblnk)
-				b->ublnk = *a->oblnk == 'z' || *a->oblnk == 'Z';
-			return(0);
-		}
-#ifdef NON_UNIX_STDIO
-		if (b->ufnm
-		 && strlen(b->ufnm) == a->ofnmlen
-		 && !strncmp(b->ufnm, b->ufnm, (unsigned)a->ofnmlen))
-			goto same;
-#else
-		g_char(a->ofnm,a->ofnmlen,buf);
-		if (f__inode(buf,&n) == b->uinode && n == b->udev)
-			goto same;
-#endif
-		x.cunit=a->ounit;
-		x.csta=0;
-		x.cerr=a->oerr;
-		if ((rv = f_clos(&x)) != 0)
-			return rv;
-		}
-	b->url = (int)a->orl;
-	b->ublnk = a->oblnk && (*a->oblnk == 'z' || *a->oblnk == 'Z');
-	if(a->ofm==0)
-	{	if(b->url>0) b->ufmt=0;
-		else b->ufmt=1;
-	}
-	else if(*a->ofm=='f' || *a->ofm == 'F') b->ufmt=1;
-	else b->ufmt=0;
-	ufmt = b->ufmt;
-#ifdef url_Adjust
-	if (b->url && !ufmt)
-		url_Adjust(b->url);
-#endif
-	if (a->ofnm) {
-		g_char(a->ofnm,a->ofnmlen,buf);
-		if (!buf[0])
-			err(a->oerr,107,"open");
-		}
-	else
-		sprintf(buf, "fort.%ld", a->ounit);
-	b->uscrtch = 0;
-	switch(a->osta ? *a->osta : 'u')
-	{
-	case 'o':
-	case 'O':
-#ifdef NON_UNIX_STDIO
-		if(access(buf,0))
-#else
-		if(stat(buf,&stb))
-#endif
-			err(a->oerr,errno,"open");
-		break;
-	 case 's':
-	 case 'S':
-		b->uscrtch=1;
-#ifdef _POSIX_SOURCE
-		tmpnam(buf);
-#else
-		(void) strcpy(buf,"tmp.FXXXXXX");
-		(void) mktemp(buf);
-#endif
-		goto replace;
-	case 'n':
-	case 'N':
-#ifdef NON_UNIX_STDIO
-		if(!access(buf,0))
-#else
-		if(!stat(buf,&stb))
-#endif
-			err(a->oerr,128,"open");
-		/* no break */
-	case 'r':	/* Fortran 90 replace option */
-	case 'R':
- replace:
-#ifdef NON_UNIX_STDIO
-		if (tf = fopen(buf,f__w_mode[0]))
-			fclose(tf);
-#else
-		(void) close(creat(buf, 0666));
-#endif
-	}
-
-	b->ufnm=(char *) malloc((unsigned int)(strlen(buf)+1));
-	if(b->ufnm==NULL) err(a->oerr,113,"no space");
-	(void) strcpy(b->ufnm,buf);
-	b->uend=0;
-	b->uwrt = 0;
-#ifdef NON_UNIX_STDIO
-	if ((s = a->oacc) && (*s == 'd' || *s == 'D'))
-		ufmt = 0;
-#endif
-	if(f__isdev(buf))
-	{	b->ufd = fopen(buf,f__r_mode[ufmt]);
-		if(b->ufd==NULL) err(a->oerr,errno,buf);
-	}
-	else {
-		if(!(b->ufd = fopen(buf, f__r_mode[ufmt]))) {
-#ifdef NON_UNIX_STDIO
-			if (b->ufd = fopen(buf, f__w_mode[ufmt|2]))
-				b->uwrt = 2;
-			else if (b->ufd = fopen(buf, f__w_mode[ufmt]))
-				b->uwrt = 1;
-			else
-#else
-			if ((n = open(buf,O_WRONLY)) >= 0)
-				b->uwrt = 2;
-			else {
-				n = creat(buf, 0666);
-				b->uwrt = 1;
-				}
-			if (n < 0
-			|| (b->ufd = fdopen(n, f__w_mode[ufmt])) == NULL)
-#endif
-				err(a->oerr, errno, "open");
-			}
-	}
-	b->useek=f__canseek(b->ufd);
-#ifndef NON_UNIX_STDIO
-	if((b->uinode=f__inode(buf,&b->udev))==-1)
-		err(a->oerr,108,"open");
-#endif
-	if(b->useek)
-		if (a->orl)
-			rewind(b->ufd);
-		else if ((s = a->oacc) && (*s == 'a' || *s == 'A')
-			&& fseek(b->ufd, 0L, SEEK_END))
-				err(a->oerr,129,"open");
-	return(0);
-}
-#ifdef KR_headers
-fk_open(seq,fmt,n) ftnint n;
-#else
-fk_open(int seq, int fmt, ftnint n)
-#endif
-{	char nbuf[10];
-	olist a;
-	int rtn;
-	int save_init;
-
-	(void) sprintf(nbuf,"fort.%ld",n);
-	a.oerr=1;
-	a.ounit=n;
-	a.ofnm=nbuf;
-	a.ofnmlen=strlen(nbuf);
-	a.osta=NULL;
-	a.oacc= seq==SEQ?"s":"d";
-	a.ofm = fmt==FMT?"f":"u";
-	a.orl = seq==DIR?1:0;
-	a.oblnk=NULL;
-	save_init = f__init;
-	f__init &= ~2;
-	rtn = f_open(&a);
-	f__init = save_init | 1;
-	return rtn;
-}
diff --git a/gcc/f/runtime/libI77/rawio.h b/gcc/f/runtime/libI77/rawio.h
deleted file mode 100644
index cc5cab8..0000000
--- a/gcc/f/runtime/libI77/rawio.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifdef KR_headers
-extern FILE *fdopen();
-#else
-#if defined (MSDOS) && !defined (GO32)
-#include "io.h"
-#ifndef WATCOM
-#define close _close
-#define creat _creat
-#define open _open
-#define read _read
-#define write _write
-#endif /*WATCOM*/
-#endif /*MSDOS*/
-#ifdef __cplusplus
-extern "C" {
-#endif
-#if !(defined (MSDOS) && !defined (GO32))
-#ifdef OPEN_DECL
-extern int creat(const char*,int), open(const char*,int);
-#endif
-extern int close(int);
-extern int read(int,void*,size_t), write(int,void*,size_t);
-extern int unlink(const char*);
-#ifndef _POSIX_SOURCE
-#ifndef NON_UNIX_STDIO
-extern FILE *fdopen(int, const char*);
-#endif
-#endif
-#endif /*KR_HEADERS*/
-
-extern char *mktemp(char*);
-
-#ifdef __cplusplus
-	}
-#endif
-#endif
-
-#ifndef NO_FCNTL
-#include <fcntl.h>
-#endif
-
-#ifndef O_WRONLY
-#define O_RDONLY 0
-#define O_WRONLY 1
-#endif
diff --git a/gcc/f/runtime/libI77/rdfmt.c b/gcc/f/runtime/libI77/rdfmt.c
deleted file mode 100644
index 0d8c2b4..0000000
--- a/gcc/f/runtime/libI77/rdfmt.c
+++ /dev/null
@@ -1,476 +0,0 @@
-#include <ctype.h>
-#include "f2c.h"
-#include "fio.h"
-
-extern int f__cursor;
-#ifdef KR_headers
-extern double atof();
-#else
-#undef abs
-#undef min
-#undef max
-#include <stdlib.h>
-#endif
-
-#include "fmt.h"
-#include "fp.h"
-
- static int
-#ifdef KR_headers
-rd_Z(n,w,len) Uint *n; ftnlen len;
-#else
-rd_Z(Uint *n, int w, ftnlen len)
-#endif
-{
-	long x[9];
-	char *s, *s0, *s1, *se, *t;
-	int ch, i, w1, w2;
-	static char hex[256];
-	static int one = 1;
-	int bad = 0;
-
-	if (!hex['0']) {
-		s = "0123456789";
-		while(ch = *s++)
-			hex[ch] = ch - '0' + 1;
-		s = "ABCDEF";
-		while(ch = *s++)
-			hex[ch] = hex[ch + 'a' - 'A'] = ch - 'A' + 11;
-		}
-	s = s0 = (char *)x;
-	s1 = (char *)&x[4];
-	se = (char *)&x[8];
-	if (len > 4*sizeof(long))
-		return errno = 117;
-	while (w) {
-		GET(ch);
-		if (ch==',' || ch=='\n')
-			break;
-		w--;
-		if (ch > ' ') {
-			if (!hex[ch & 0xff])
-				bad++;
-			*s++ = ch;
-			if (s == se) {
-				/* discard excess characters */
-				for(t = s0, s = s1; t < s1;)
-					*t++ = *s++;
-				s = s1;
-				}
-			}
-		}
-	if (bad)
-		return errno = 115;
-	w = (int)len;
-	w1 = s - s0;
-	w2 = w1+1 >> 1;
-	t = (char *)n;
-	if (*(char *)&one) {
-		/* little endian */
-		t += w - 1;
-		i = -1;
-		}
-	else
-		i = 1;
-	for(; w > w2; t += i, --w)
-		*t = 0;
-	if (!w)
-		return 0;
-	if (w < w2)
-		s0 = s - (w << 1);
-	else if (w1 & 1) {
-		*t = hex[*s0++ & 0xff] - 1;
-		if (!--w)
-			return 0;
-		t += i;
-		}
-	do {
-		*t = hex[*s0 & 0xff]-1 << 4 | hex[s0[1] & 0xff]-1;
-		t += i;
-		s0 += 2;
-		}
-		while(--w);
-	return 0;
-	}
-
- static int
-#ifdef KR_headers
-rd_I(n,w,len, base) Uint *n; int w; ftnlen len; register int base;
-#else
-rd_I(Uint *n, int w, ftnlen len, register int base)
-#endif
-{	longint x;
-	int sign,ch;
-	char s[84], *ps;
-	ps=s; x=0;
-	while (w)
-	{
-		GET(ch);
-		if (ch==',' || ch=='\n') break;
-		*ps=ch; ps++; w--;
-	}
-	*ps='\0';
-	ps=s;
-	while (*ps==' ') ps++;
-	if (*ps=='-') { sign=1; ps++; }
-	else { sign=0; if (*ps=='+') ps++; }
-loop:	while (*ps>='0' && *ps<='9') { x=x*base+(*ps-'0'); ps++; }
-	if (*ps==' ') {if (f__cblank) x *= base; ps++; goto loop;}
-	if(sign) x = -x;
-	if(len==sizeof(integer)) n->il=x;
-	else if(len == sizeof(char)) n->ic = (char)x;
-#ifdef Allow_TYQUAD
-	else if (len == sizeof(longint)) n->ili = x;
-#endif
-	else n->is = (short)x;
-	if (*ps) return(errno=115); else return(0);
-}
- static int
-#ifdef KR_headers
-rd_L(n,w,len) ftnint *n; ftnlen len;
-#else
-rd_L(ftnint *n, int w, ftnlen len)
-#endif
-{	int ch, lv;
-	char s[84], *ps;
-	ps=s;
-	while (w) {
-		GET(ch);
-		if (ch==','||ch=='\n') break;
-		*ps=ch;
-		ps++; w--;
-		}
-	*ps='\0';
-	ps=s; while (*ps==' ') ps++;
-	if (*ps=='.') ps++;
-	if (*ps=='t' || *ps == 'T')
-		lv = 1;
-	else if (*ps == 'f' || *ps == 'F')
-		lv = 0;
-	else return(errno=116);
-	switch(len) {
-		case sizeof(char):	*(char *)n = (char)lv;	 break;
-		case sizeof(short):	*(short *)n = (short)lv; break;
-		default:		*n = lv;
-		}
-	return 0;
-}
-
- static int
-#ifdef KR_headers
-rd_F(p, w, d, len) ufloat *p; ftnlen len;
-#else
-rd_F(ufloat *p, int w, int d, ftnlen len)
-#endif
-{
-	char s[FMAX+EXPMAXDIGS+4];
-	register int ch;
-	register char *sp, *spe, *sp1;
-	double x;
-	int scale1, se;
-	long e, exp;
-
-	sp1 = sp = s;
-	spe = sp + FMAX;
-	exp = -d;
-	x = 0.;
-
-	do {
-		GET(ch);
-		w--;
-		} while (ch == ' ' && w);
-	switch(ch) {
-		case '-': *sp++ = ch; sp1++; spe++;
-		case '+':
-			if (!w) goto zero;
-			--w;
-			GET(ch);
-		}
-	while(ch == ' ') {
-blankdrop:
-		if (!w--) goto zero; GET(ch); }
-	while(ch == '0')
-		{ if (!w--) goto zero; GET(ch); }
-	if (ch == ' ' && f__cblank)
-		goto blankdrop;
-	scale1 = f__scale;
-	while(isdigit(ch)) {
-digloop1:
-		if (sp < spe) *sp++ = ch;
-		else ++exp;
-digloop1e:
-		if (!w--) goto done;
-		GET(ch);
-		}
-	if (ch == ' ') {
-		if (f__cblank)
-			{ ch = '0'; goto digloop1; }
-		goto digloop1e;
-		}
-	if (ch == '.') {
-		exp += d;
-		if (!w--) goto done;
-		GET(ch);
-		if (sp == sp1) { /* no digits yet */
-			while(ch == '0') {
-skip01:
-				--exp;
-skip0:
-				if (!w--) goto done;
-				GET(ch);
-				}
-			if (ch == ' ') {
-				if (f__cblank) goto skip01;
-				goto skip0;
-				}
-			}
-		while(isdigit(ch)) {
-digloop2:
-			if (sp < spe)
-				{ *sp++ = ch; --exp; }
-digloop2e:
-			if (!w--) goto done;
-			GET(ch);
-			}
-		if (ch == ' ') {
-			if (f__cblank)
-				{ ch = '0'; goto digloop2; }
-			goto digloop2e;
-			}
-		}
-	switch(ch) {
-	  default:
-		break;
-	  case '-': se = 1; goto signonly;
-	  case '+': se = 0; goto signonly;
-	  case 'e':
-	  case 'E':
-	  case 'd':
-	  case 'D':
-		if (!w--)
-			goto bad;
-		GET(ch);
-		while(ch == ' ') {
-			if (!w--)
-				goto bad;
-			GET(ch);
-			}
-		se = 0;
-	  	switch(ch) {
-		  case '-': se = 1;
-		  case '+':
-signonly:
-			if (!w--)
-				goto bad;
-			GET(ch);
-			}
-		while(ch == ' ') {
-			if (!w--)
-				goto bad;
-			GET(ch);
-			}
-		if (!isdigit(ch))
-			goto bad;
-
-		e = ch - '0';
-		for(;;) {
-			if (!w--)
-				{ ch = '\n'; break; }
-			GET(ch);
-			if (!isdigit(ch)) {
-				if (ch == ' ') {
-					if (f__cblank)
-						ch = '0';
-					else continue;
-					}
-				else
-					break;
-				}
-			e = 10*e + ch - '0';
-			if (e > EXPMAX && sp > sp1)
-				goto bad;
-			}
-		if (se)
-			exp -= e;
-		else
-			exp += e;
-		scale1 = 0;
-		}
-	switch(ch) {
-	  case '\n':
-	  case ',':
-		break;
-	  default:
-bad:
-		return (errno = 115);
-		}
-done:
-	if (sp > sp1) {
-		while(*--sp == '0')
-			++exp;
-		if (exp -= scale1)
-			sprintf(sp+1, "e%ld", exp);
-		else
-			sp[1] = 0;
-		x = atof(s);
-		}
-zero:
-	if (len == sizeof(real))
-		p->pf = x;
-	else
-		p->pd = x;
-	return(0);
-	}
-
-
- static int
-#ifdef KR_headers
-rd_A(p,len) char *p; ftnlen len;
-#else
-rd_A(char *p, ftnlen len)
-#endif
-{	int i,ch;
-	for(i=0;i<len;i++)
-	{	GET(ch);
-		*p++=VAL(ch);
-	}
-	return(0);
-}
- static int
-#ifdef KR_headers
-rd_AW(p,w,len) char *p; ftnlen len;
-#else
-rd_AW(char *p, int w, ftnlen len)
-#endif
-{	int i,ch;
-	if(w>=len)
-	{	for(i=0;i<w-len;i++)
-			GET(ch);
-		for(i=0;i<len;i++)
-		{	GET(ch);
-			*p++=VAL(ch);
-		}
-		return(0);
-	}
-	for(i=0;i<w;i++)
-	{	GET(ch);
-		*p++=VAL(ch);
-	}
-	for(i=0;i<len-w;i++) *p++=' ';
-	return(0);
-}
- static int
-#ifdef KR_headers
-rd_H(n,s) char *s;
-#else
-rd_H(int n, char *s)
-#endif
-{	int i,ch;
-	for(i=0;i<n;i++)
-		if((ch=(*f__getn)())<0) return(ch);
-		else *s++ = ch=='\n'?' ':ch;
-	return(1);
-}
- static int
-#ifdef KR_headers
-rd_POS(s) char *s;
-#else
-rd_POS(char *s)
-#endif
-{	char quote;
-	int ch;
-	quote= *s++;
-	for(;*s;s++)
-		if(*s==quote && *(s+1)!=quote) break;
-		else if((ch=(*f__getn)())<0) return(ch);
-		else *s = ch=='\n'?' ':ch;
-	return(1);
-}
-#ifdef KR_headers
-rd_ed(p,ptr,len) struct syl *p; char *ptr; ftnlen len;
-#else
-rd_ed(struct syl *p, char *ptr, ftnlen len)
-#endif
-{	int ch;
-	for(;f__cursor>0;f__cursor--) if((ch=(*f__getn)())<0) return(ch);
-	if(f__cursor<0)
-	{	if(f__recpos+f__cursor < 0) /*err(elist->cierr,110,"fmt")*/
-			f__cursor = -f__recpos;	/* is this in the standard? */
-		if(f__external == 0) {
-			extern char *f__icptr;
-			f__icptr += f__cursor;
-		}
-		else if(f__curunit && f__curunit->useek)
-			(void) fseek(f__cf,(long) f__cursor,SEEK_CUR);
-		else
-			err(f__elist->cierr,106,"fmt");
-		f__recpos += f__cursor;
-		f__cursor=0;
-	}
-	switch(p->op)
-	{
-	default: fprintf(stderr,"rd_ed, unexpected code: %d\n", p->op);
-		sig_die(f__fmtbuf, 1);
-	case IM:
-	case I: ch = rd_I((Uint *)ptr,p->p1,len, 10);
-		break;
-
-		/* O and OM don't work right for character, double, complex, */
-		/* or doublecomplex, and they differ from Fortran 90 in */
-		/* showing a minus sign for negative values. */
-
-	case OM:
-	case O: ch = rd_I((Uint *)ptr, p->p1, len, 8);
-		break;
-	case L: ch = rd_L((ftnint *)ptr,p->p1,len);
-		break;
-	case A:	ch = rd_A(ptr,len);
-		break;
-	case AW:
-		ch = rd_AW(ptr,p->p1,len);
-		break;
-	case E: case EE:
-	case D:
-	case G:
-	case GE:
-	case F:	ch = rd_F((ufloat *)ptr,p->p1,p->p2,len);
-		break;
-
-		/* Z and ZM assume 8-bit bytes. */
-
-	case ZM:
-	case Z:
-		ch = rd_Z((Uint *)ptr, p->p1, len);
-		break;
-	}
-	if(ch == 0) return(ch);
-	else if(ch == EOF) return(EOF);
-	if (f__cf)
-		clearerr(f__cf);
-	return(errno);
-}
-#ifdef KR_headers
-rd_ned(p) struct syl *p;
-#else
-rd_ned(struct syl *p)
-#endif
-{
-	switch(p->op)
-	{
-	default: fprintf(stderr,"rd_ned, unexpected code: %d\n", p->op);
-		sig_die(f__fmtbuf, 1);
-	case APOS:
-		return(rd_POS(*(char **)&p->p2));
-	case H:	return(rd_H(p->p1,*(char **)&p->p2));
-	case SLASH: return((*f__donewrec)());
-	case TR:
-	case X:	f__cursor += p->p1;
-		return(1);
-	case T: f__cursor=p->p1-f__recpos - 1;
-		return(1);
-	case TL: f__cursor -= p->p1;
-		if(f__cursor < -f__recpos)	/* TL1000, 1X */
-			f__cursor = -f__recpos;
-		return(1);
-	}
-}
diff --git a/gcc/f/runtime/libI77/rewind.c b/gcc/f/runtime/libI77/rewind.c
deleted file mode 100644
index 9ba4b23..0000000
--- a/gcc/f/runtime/libI77/rewind.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#ifdef KR_headers
-integer f_rew(a) alist *a;
-#else
-integer f_rew(alist *a)
-#endif
-{
-	unit *b;
-	if (f__init & 2)
-		f__fatal (131, "I/O recursion");
-	if(a->aunit>=MXUNIT || a->aunit<0)
-		err(a->aerr,101,"rewind");
-	b = &f__units[a->aunit];
-	if(b->ufd == NULL || b->uwrt == 3)
-		return(0);
-	if(!b->useek)
-		err(a->aerr,106,"rewind");
-	if(b->uwrt) {
-		(void) t_runc(a);
-		b->uwrt = 3;
-		}
-	rewind(b->ufd);
-	b->uend=0;
-	return(0);
-}
diff --git a/gcc/f/runtime/libI77/rsfe.c b/gcc/f/runtime/libI77/rsfe.c
deleted file mode 100644
index 02a9e6d..0000000
--- a/gcc/f/runtime/libI77/rsfe.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/* read sequential formatted external */
-#include "f2c.h"
-#include "fio.h"
-#include "fmt.h"
-
-xrd_SL(Void)
-{	int ch;
-	if(!f__curunit->uend)
-		while((ch=getc(f__cf))!='\n')
-			if (ch == EOF) {
-				f__curunit->uend = 1;
-				break;
-				}
-	f__cursor=f__recpos=0;
-	return(1);
-}
-x_getc(Void)
-{	int ch;
-	if(f__curunit->uend) return(EOF);
-	ch = getc(f__cf);
-	if(ch!=EOF && ch!='\n')
-	{	f__recpos++;
-		return(ch);
-	}
-	if(ch=='\n')
-	{	(void) ungetc(ch,f__cf);
-		return(ch);
-	}
-	if(f__curunit->uend || feof(f__cf))
-	{	errno=0;
-		f__curunit->uend=1;
-		return(-1);
-	}
-	return(-1);
-}
-x_endp(Void)
-{
-	xrd_SL();
-	return f__curunit->uend == 1 ? EOF : 0;
-}
-x_rev(Void)
-{
-	(void) xrd_SL();
-	return(0);
-}
-#ifdef KR_headers
-integer s_rsfe(a) cilist *a; /* start */
-#else
-integer s_rsfe(cilist *a) /* start */
-#endif
-{	int n;
-	if(f__init != 1) f_init();
-	f__init = 3;
-	if(n=c_sfe(a)) return(n);
-	f__reading=1;
-	f__sequential=1;
-	f__formatted=1;
-	f__external=1;
-	f__elist=a;
-	f__cursor=f__recpos=0;
-	f__scale=0;
-	f__fmtbuf=a->cifmt;
-	f__curunit= &f__units[a->ciunit];
-	f__cf=f__curunit->ufd;
-	if(pars_f(f__fmtbuf)<0) err(a->cierr,100,"startio");
-	f__getn= x_getc;
-	f__doed= rd_ed;
-	f__doned= rd_ned;
-	fmt_bg();
-	f__doend=x_endp;
-	f__donewrec=xrd_SL;
-	f__dorevert=x_rev;
-	f__cblank=f__curunit->ublnk;
-	f__cplus=0;
-	if(f__curunit->uwrt && f__nowreading(f__curunit))
-		err(a->cierr,errno,"read start");
-	if(f__curunit->uend)
-		err(f__elist->ciend,(EOF),"read start");
-	return(0);
-}
diff --git a/gcc/f/runtime/libI77/rsli.c b/gcc/f/runtime/libI77/rsli.c
deleted file mode 100644
index baf2ba5..0000000
--- a/gcc/f/runtime/libI77/rsli.c
+++ /dev/null
@@ -1,105 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#include "lio.h"
-#include "fmt.h" /* for f__doend */
-
-extern flag f__lquit;
-extern int f__lcount;
-extern char *f__icptr;
-extern char *f__icend;
-extern icilist *f__svic;
-extern int f__icnum, f__recpos;
-
-static int i_getc(Void)
-{
-	if(f__recpos >= f__svic->icirlen) {
-		if (f__recpos++ == f__svic->icirlen)
-			return '\n';
-		z_rnew();
-		}
-	f__recpos++;
-	if(f__icptr >= f__icend)
-		return EOF;
-	return(*f__icptr++);
-	}
-
- static
-#ifdef KR_headers
-int i_ungetc(ch, f) int ch; FILE *f;
-#else
-int i_ungetc(int ch, FILE *f)
-#endif
-{
-	if (--f__recpos == f__svic->icirlen)
-		return '\n';
-	if (f__recpos < -1)
-		err(f__svic->icierr,110,"recend");
-	/* *--icptr == ch, and icptr may point to read-only memory */
-	return *--f__icptr /* = ch */;
-	}
-
- static void
-#ifdef KR_headers
-c_lir(a) icilist *a;
-#else
-c_lir(icilist *a)
-#endif
-{
-	extern int l_eof;
-	if(f__init != 1) f_init();
-	f__init = 3;
-	f__reading = 1;
-	f__external = 0;
-	f__formatted = 1;
-	f__svic = a;
-	L_len = a->icirlen;
-	f__recpos = -1;
-	f__icnum = f__recpos = 0;
-	f__cursor = 0;
-	l_getc = i_getc;
-	l_ungetc = i_ungetc;
-	l_eof = 0;
-	f__icptr = a->iciunit;
-	f__icend = f__icptr + a->icirlen*a->icirnum;
-	f__cf = 0;
-	f__curunit = 0;
-	f__elist = (cilist *)a;
-	}
-
-
-#ifdef KR_headers
-integer s_rsli(a) icilist *a;
-#else
-integer s_rsli(icilist *a)
-#endif
-{
-	f__lioproc = l_read;
-	f__lquit = 0;
-	f__lcount = 0;
-	c_lir(a);
-	f__doend = 0;
-	return(0);
-	}
-
-integer e_rsli(Void)
-{ f__init = 1; return 0; }
-
-#ifdef KR_headers
-integer s_rsni(a) icilist *a;
-#else
-extern int x_rsne(cilist*);
-
-integer s_rsni(icilist *a)
-#endif
-{
-	extern int nml_read;
-	integer rv;
-	cilist ca;
-	ca.ciend = a->iciend;
-	ca.cierr = a->icierr;
-	ca.cifmt = a->icifmt;
-	c_lir(a);
-	rv = x_rsne(&ca);
-	nml_read = 0;
-	return rv;
-	}
diff --git a/gcc/f/runtime/libI77/rsne.c b/gcc/f/runtime/libI77/rsne.c
deleted file mode 100644
index 86bb216..0000000
--- a/gcc/f/runtime/libI77/rsne.c
+++ /dev/null
@@ -1,607 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#include "lio.h"
-
-#define MAX_NL_CACHE 3	/* maximum number of namelist hash tables to cache */
-#define MAXDIM 20	/* maximum number of subscripts */
-
- struct dimen {
-	ftnlen extent;
-	ftnlen curval;
-	ftnlen delta;
-	ftnlen stride;
-	};
- typedef struct dimen dimen;
-
- struct hashentry {
-	struct hashentry *next;
-	char *name;
-	Vardesc *vd;
-	};
- typedef struct hashentry hashentry;
-
- struct hashtab {
-	struct hashtab *next;
-	Namelist *nl;
-	int htsize;
-	hashentry *tab[1];
-	};
- typedef struct hashtab hashtab;
-
- static hashtab *nl_cache;
- static int n_nlcache;
- static hashentry **zot;
- static int colonseen;
- extern ftnlen f__typesize[];
-
- extern flag f__lquit;
- extern int f__lcount, nml_read;
- extern t_getc(Void);
-
-#ifdef KR_headers
- extern char *malloc(), *memset();
-
-#ifdef ungetc
- static int
-un_getc(x,f__cf) int x; FILE *f__cf;
-{ return ungetc(x,f__cf); }
-#else
-#define un_getc ungetc
- extern int ungetc();
-#endif
-
-#else
-#undef abs
-#undef min
-#undef max
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef ungetc
- static int
-un_getc(int x, FILE *f__cf)
-{ return ungetc(x,f__cf); }
-#else
-#define un_getc ungetc
-extern int ungetc(int, FILE*);	/* for systems with a buggy stdio.h */
-#endif
-#endif
-
- static Vardesc *
-#ifdef KR_headers
-hash(ht, s) hashtab *ht; register char *s;
-#else
-hash(hashtab *ht, register char *s)
-#endif
-{
-	register int c, x;
-	register hashentry *h;
-	char *s0 = s;
-
-	for(x = 0; c = *s++; x = x & 0x4000 ? ((x << 1) & 0x7fff) + 1 : x << 1)
-		x += c;
-	for(h = *(zot = ht->tab + x % ht->htsize); h; h = h->next)
-		if (!strcmp(s0, h->name))
-			return h->vd;
-	return 0;
-	}
-
- hashtab *
-#ifdef KR_headers
-mk_hashtab(nl) Namelist *nl;
-#else
-mk_hashtab(Namelist *nl)
-#endif
-{
-	int nht, nv;
-	hashtab *ht;
-	Vardesc *v, **vd, **vde;
-	hashentry *he;
-
-	hashtab **x, **x0, *y;
-	for(x = &nl_cache; y = *x; x0 = x, x = &y->next)
-		if (nl == y->nl)
-			return y;
-	if (n_nlcache >= MAX_NL_CACHE) {
-		/* discard least recently used namelist hash table */
-		y = *x0;
-		free((char *)y->next);
-		y->next = 0;
-		}
-	else
-		n_nlcache++;
-	nv = nl->nvars;
-	if (nv >= 0x4000)
-		nht = 0x7fff;
-	else {
-		for(nht = 1; nht < nv; nht <<= 1);
-		nht += nht - 1;
-		}
-	ht = (hashtab *)malloc(sizeof(hashtab) + (nht-1)*sizeof(hashentry *)
-				+ nv*sizeof(hashentry));
-	if (!ht)
-		return 0;
-	he = (hashentry *)&ht->tab[nht];
-	ht->nl = nl;
-	ht->htsize = nht;
-	ht->next = nl_cache;
-	nl_cache = ht;
-	memset((char *)ht->tab, 0, nht*sizeof(hashentry *));
-	vd = nl->vars;
-	vde = vd + nv;
-	while(vd < vde) {
-		v = *vd++;
-		if (!hash(ht, v->name)) {
-			he->next = *zot;
-			*zot = he;
-			he->name = v->name;
-			he->vd = v;
-			he++;
-			}
-		}
-	return ht;
-	}
-
-static char Alpha[256], Alphanum[256];
-
- static VOID
-nl_init(Void) {
-	register char *s;
-	register int c;
-
-	for(s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; c = *s++; )
-		Alpha[c]
-		= Alphanum[c]
-		= Alpha[c + 'a' - 'A']
-		= Alphanum[c + 'a' - 'A']
-		= c;
-	for(s = "0123456789_"; c = *s++; )
-		Alphanum[c] = c;
-	}
-
-#define GETC(x) (x=(*l_getc)())
-#define Ungetc(x,y) (*l_ungetc)(x,y)
-
- static int
-#ifdef KR_headers
-getname(s, slen) register char *s; int slen;
-#else
-getname(register char *s, int slen)
-#endif
-{
-	register char *se = s + slen - 1;
-	register int ch;
-
-	GETC(ch);
-	if (!(*s++ = Alpha[ch & 0xff])) {
-		if (ch != EOF)
-			ch = 115;
-		errfl(f__elist->cierr, ch, "namelist read");
-		}
-	while(*s = Alphanum[GETC(ch) & 0xff])
-		if (s < se)
-			s++;
-	if (ch == EOF)
-		err(f__elist->cierr, EOF, "namelist read");
-	if (ch > ' ')
-		Ungetc(ch,f__cf);
-	return *s = 0;
-	}
-
- static int
-#ifdef KR_headers
-getnum(chp, val) int *chp; ftnlen *val;
-#else
-getnum(int *chp, ftnlen *val)
-#endif
-{
-	register int ch, sign;
-	register ftnlen x;
-
-	while(GETC(ch) <= ' ' && ch >= 0);
-	if (ch == '-') {
-		sign = 1;
-		GETC(ch);
-		}
-	else {
-		sign = 0;
-		if (ch == '+')
-			GETC(ch);
-		}
-	x = ch - '0';
-	if (x < 0 || x > 9)
-		return 115;
-	while(GETC(ch) >= '0' && ch <= '9')
-		x = 10*x + ch - '0';
-	while(ch <= ' ' && ch >= 0)
-		GETC(ch);
-	if (ch == EOF)
-		return EOF;
-	*val = sign ? -x : x;
-	*chp = ch;
-	return 0;
-	}
-
- static int
-#ifdef KR_headers
-getdimen(chp, d, delta, extent, x1)
- int *chp; dimen *d; ftnlen delta, extent, *x1;
-#else
-getdimen(int *chp, dimen *d, ftnlen delta, ftnlen extent, ftnlen *x1)
-#endif
-{
-	register int k;
-	ftnlen x2, x3;
-
-	if (k = getnum(chp, x1))
-		return k;
-	x3 = 1;
-	if (*chp == ':') {
-		if (k = getnum(chp, &x2))
-			return k;
-		x2 -= *x1;
-		if (*chp == ':') {
-			if (k = getnum(chp, &x3))
-				return k;
-			if (!x3)
-				return 123;
-			x2 /= x3;
-			colonseen = 1;
-			}
-		if (x2 < 0 || x2 >= extent)
-			return 123;
-		d->extent = x2 + 1;
-		}
-	else
-		d->extent = 1;
-	d->curval = 0;
-	d->delta = delta;
-	d->stride = x3;
-	return 0;
-	}
-
-#ifndef No_Namelist_Questions
- static Void
-#ifdef KR_headers
-print_ne(a) cilist *a;
-#else
-print_ne(cilist *a)
-#endif
-{
-	flag intext = f__external;
-	int rpsave = f__recpos;
-	FILE *cfsave = f__cf;
-	unit *usave = f__curunit;
-	cilist t;
-	t = *a;
-	t.ciunit = 6;
-	s_wsne(&t);
-	fflush(f__cf);
-	f__external = intext;
-	f__reading = 1;
-	f__recpos = rpsave;
-	f__cf = cfsave;
-	f__curunit = usave;
-	f__elist = a;
-	}
-#endif
-
- static char where0[] = "namelist read start ";
-
-#ifdef KR_headers
-x_rsne(a) cilist *a;
-#else
-x_rsne(cilist *a)
-#endif
-{
-	int ch, got1, k, n, nd, quote, readall;
-	Namelist *nl;
-	static char where[] = "namelist read";
-	char buf[64];
-	hashtab *ht;
-	Vardesc *v;
-	dimen *dn, *dn0, *dn1;
-	ftnlen *dims, *dims1;
-	ftnlen b, b0, b1, ex, no, no1, nomax, size, span;
-	ftnint type;
-	char *vaddr;
-	long iva, ivae;
-	dimen dimens[MAXDIM], substr;
-
-	if (!Alpha['a'])
-		nl_init();
-	f__reading=1;
-	f__formatted=1;
-	got1 = 0;
- top:
-	for(;;) switch(GETC(ch)) {
-		case EOF:
- eof:
-			err(a->ciend,(EOF),where0);
-		case '&':
-		case '$':
-			goto have_amp;
-#ifndef No_Namelist_Questions
-		case '?':
-			print_ne(a);
-			continue;
-#endif
-		default:
-			if (ch <= ' ' && ch >= 0)
-				continue;
-#ifndef No_Namelist_Comments
-			while(GETC(ch) != '\n')
-				if (ch == EOF)
-					goto eof;
-#else
-			errfl(a->cierr, 115, where0);
-#endif
-		}
- have_amp:
-	if (ch = getname(buf,(int) sizeof(buf)))
-		return ch;
-	nl = (Namelist *)a->cifmt;
-	if (strcmp(buf, nl->name))
-#ifdef No_Bad_Namelist_Skip
-		errfl(a->cierr, 118, where0);
-#else
-	{
-		fprintf(stderr,
-			"Skipping namelist \"%s\": seeking namelist \"%s\".\n",
-			buf, nl->name);
-		fflush(stderr);
-		for(;;) switch(GETC(ch)) {
-			case EOF:
-				err(a->ciend, EOF, where0);
-			case '/':
-			case '&':
-			case '$':
-				if (f__external)
-					e_rsle();
-				else
-					z_rnew();
-				goto top;
-			case '"':
-			case '\'':
-				quote = ch;
- more_quoted:
-				while(GETC(ch) != quote)
-					if (ch == EOF)
-						err(a->ciend, EOF, where0);
-				if (GETC(ch) == quote)
-					goto more_quoted;
-				Ungetc(ch,f__cf);
-			default:
-				continue;
-			}
-		}
-#endif
-	ht = mk_hashtab(nl);
-	if (!ht)
-		errfl(f__elist->cierr, 113, where0);
-	for(;;) {
-		for(;;) switch(GETC(ch)) {
-			case EOF:
-				if (got1)
-					return 0;
-				err(a->ciend, EOF, where0);
-			case '/':
-			case '$':
-			case '&':
-				return 0;
-			default:
-				if (ch <= ' ' && ch >= 0 || ch == ',')
-					continue;
-				Ungetc(ch,f__cf);
-				if (ch = getname(buf,(int) sizeof(buf)))
-					return ch;
-				goto havename;
-			}
- havename:
-		v = hash(ht,buf);
-		if (!v)
-			errfl(a->cierr, 119, where);
-		while(GETC(ch) <= ' ' && ch >= 0);
-		vaddr = v->addr;
-		type = v->type;
-		if (type < 0) {
-			size = -type;
-			type = TYCHAR;
-			}
-		else
-			size = f__typesize[type];
-		ivae = size;
-		iva = readall = 0;
-		if (ch == '(' /*)*/ ) {
-			dn = dimens;
-			if (!(dims = v->dims)) {
-				if (type != TYCHAR)
-					errfl(a->cierr, 122, where);
-				if (k = getdimen(&ch, dn, (ftnlen)size,
-						(ftnlen)size, &b))
-					errfl(a->cierr, k, where);
-				if (ch != ')')
-					errfl(a->cierr, 115, where);
-				b1 = dn->extent;
-				if (--b < 0 || b + b1 > size)
-					return 124;
-				iva += b;
-				size = b1;
-				while(GETC(ch) <= ' ' && ch >= 0);
-				goto scalar;
-				}
-			nd = (int)dims[0];
-			nomax = span = dims[1];
-			ivae = iva + size*nomax;
-			colonseen = 0;
-			if (k = getdimen(&ch, dn, size, nomax, &b))
-				errfl(a->cierr, k, where);
-			no = dn->extent;
-			b0 = dims[2];
-			dims1 = dims += 3;
-			ex = 1;
-			for(n = 1; n++ < nd; dims++) {
-				if (ch != ',')
-					errfl(a->cierr, 115, where);
-				dn1 = dn + 1;
-				span /= *dims;
-				if (k = getdimen(&ch, dn1, dn->delta**dims,
-						span, &b1))
-					errfl(a->cierr, k, where);
-				ex *= *dims;
-				b += b1*ex;
-				no *= dn1->extent;
-				dn = dn1;
-				}
-			if (ch != ')')
-				errfl(a->cierr, 115, where);
-			readall = 1 - colonseen;
-			b -= b0;
-			if (b < 0 || b >= nomax)
-				errfl(a->cierr, 125, where);
-			iva += size * b;
-			dims = dims1;
-			while(GETC(ch) <= ' ' && ch >= 0);
-			no1 = 1;
-			dn0 = dimens;
-			if (type == TYCHAR && ch == '(' /*)*/) {
-				if (k = getdimen(&ch, &substr, size, size, &b))
-					errfl(a->cierr, k, where);
-				if (ch != ')')
-					errfl(a->cierr, 115, where);
-				b1 = substr.extent;
-				if (--b < 0 || b + b1 > size)
-					return 124;
-				iva += b;
-				b0 = size;
-				size = b1;
-				while(GETC(ch) <= ' ' && ch >= 0);
-				if (b1 < b0)
-					goto delta_adj;
-				}
-			if (readall)
-				goto delta_adj;
-			for(; dn0 < dn; dn0++) {
-				if (dn0->extent != *dims++ || dn0->stride != 1)
-					break;
-				no1 *= dn0->extent;
-				}
-			if (dn0 == dimens && dimens[0].stride == 1) {
-				no1 = dimens[0].extent;
-				dn0++;
-				}
- delta_adj:
-			ex = 0;
-			for(dn1 = dn0; dn1 <= dn; dn1++)
-				ex += (dn1->extent-1)
-					* (dn1->delta *= dn1->stride);
-			for(dn1 = dn; dn1 > dn0; dn1--) {
-				ex -= (dn1->extent - 1) * dn1->delta;
-				dn1->delta -= ex;
-				}
-			}
-		else if (dims = v->dims) {
-			no = no1 = dims[1];
-			ivae = iva + no*size;
-			}
-		else
- scalar:
-			no = no1 = 1;
-		if (ch != '=')
-			errfl(a->cierr, 115, where);
-		got1 = nml_read = 1;
-		f__lcount = 0;
-	 readloop:
-		for(;;) {
-			if (iva >= ivae || iva < 0) {
-				f__lquit = 1;
-				goto mustend;
-				}
-			else if (iva + no1*size > ivae)
-				no1 = (ivae - iva)/size;
-			f__lquit = 0;
-			if (k = l_read(&no1, vaddr + iva, size, type))
-				return k;
-			if (f__lquit == 1)
-				return 0;
-			if (readall) {
-				iva += dn0->delta;
-				if (f__lcount > 0) {
-					no1 = (ivae - iva)/size;
-					if (no1 > f__lcount)
-						no1 = f__lcount;
-					iva += no1 * dn0->delta;
-					if (k = l_read(&no1, vaddr + iva,
-							size, type))
-						return k;
-					}
-				}
- mustend:
-			GETC(ch);
-			if (readall)
-				if (iva >= ivae)
-					readall = 0;
-				else for(;;) {
-					switch(ch) {
-						case ' ':
-						case '\t':
-						case '\n':
-							GETC(ch);
-							continue;
-						}
-					break;
-					}
-			if (ch == '/' || ch == '$' || ch == '&') {
-				f__lquit = 1;
-				return 0;
-				}
-			else if (f__lquit) {
-				while(ch <= ' ' && ch >= 0)
-					GETC(ch);
-				Ungetc(ch,f__cf);
-				if (!Alpha[ch & 0xff] && ch >= 0)
-					errfl(a->cierr, 125, where);
-				break;
-				}
-			Ungetc(ch,f__cf);
-			if (readall && !Alpha[ch & 0xff])
-				goto readloop;
-			if ((no -= no1) <= 0)
-				break;
-			for(dn1 = dn0; dn1 <= dn; dn1++) {
-				if (++dn1->curval < dn1->extent) {
-					iva += dn1->delta;
-					goto readloop;
-					}
-				dn1->curval = 0;
-				}
-			break;
-			}
-		}
-	}
-
- integer
-#ifdef KR_headers
-s_rsne(a) cilist *a;
-#else
-s_rsne(cilist *a)
-#endif
-{
-	extern int l_eof;
-	int n;
-
-	f__external=1;
-	l_eof = 0;
-	if(n = c_le(a))
-		return n;
-	if(f__curunit->uwrt && f__nowreading(f__curunit))
-		err(a->cierr,errno,where0);
-	l_getc = t_getc;
-	l_ungetc = un_getc;
-	f__doend = xrd_SL;
-	n = x_rsne(a);
-	nml_read = 0;
-	if (n)
-		return n;
-	return e_rsle();
-	}
diff --git a/gcc/f/runtime/libI77/sfe.c b/gcc/f/runtime/libI77/sfe.c
deleted file mode 100644
index 1bb10d9..0000000
--- a/gcc/f/runtime/libI77/sfe.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* sequential formatted external common routines*/
-#include "f2c.h"
-#include "fio.h"
-
-extern char *f__fmtbuf;
-
-integer e_rsfe(Void)
-{	int n;
-	f__init = 1;
-	n=en_fio();
-	if (f__cf == stdout)
-		fflush(stdout);
-	else if (f__cf == stderr)
-		fflush(stderr);
-	f__fmtbuf=NULL;
-	return(n);
-}
-#ifdef KR_headers
-c_sfe(a) cilist *a; /* check */
-#else
-c_sfe(cilist *a) /* check */
-#endif
-{	unit *p;
-	if(a->ciunit >= MXUNIT || a->ciunit<0)
-		err(a->cierr,101,"startio");
-	p = &f__units[a->ciunit];
-	if(p->ufd==NULL && fk_open(SEQ,FMT,a->ciunit)) err(a->cierr,114,"sfe");
-	if(!p->ufmt) err(a->cierr,102,"sfe");
-	return(0);
-}
-integer e_wsfe(Void)
-{
-#ifdef ALWAYS_FLUSH
-	int n;
-	f__init = 1;
-	n = en_fio();
-	f__fmtbuf=NULL;
-	if (!n && fflush(f__cf))
-		err(f__elist->cierr, errno, "write end");
-	return n;
-#else
-	return(e_rsfe());
-#endif
-}
diff --git a/gcc/f/runtime/libI77/sue.c b/gcc/f/runtime/libI77/sue.c
deleted file mode 100644
index 8f2ea31..0000000
--- a/gcc/f/runtime/libI77/sue.c
+++ /dev/null
@@ -1,87 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-extern uiolen f__reclen;
-long f__recloc;
-
-#ifdef KR_headers
-c_sue(a) cilist *a;
-#else
-c_sue(cilist *a)
-#endif
-{
-	if(a->ciunit >= MXUNIT || a->ciunit < 0)
-		err(a->cierr,101,"startio");
-	f__external=f__sequential=1;
-	f__formatted=0;
-	f__curunit = &f__units[a->ciunit];
-	f__elist=a;
-	if(f__curunit->ufd==NULL && fk_open(SEQ,UNF,a->ciunit))
-		err(a->cierr,114,"sue");
-	f__cf=f__curunit->ufd;
-	if(f__curunit->ufmt) err(a->cierr,103,"sue");
-	if(!f__curunit->useek) err(a->cierr,103,"sue");
-	return(0);
-}
-#ifdef KR_headers
-integer s_rsue(a) cilist *a;
-#else
-integer s_rsue(cilist *a)
-#endif
-{
-	int n;
-	if(f__init != 1) f_init();
-	f__init = 3;
-	f__reading=1;
-	if(n=c_sue(a)) return(n);
-	f__recpos=0;
-	if(f__curunit->uwrt && f__nowreading(f__curunit))
-		err(a->cierr, errno, "read start");
-	if(fread((char *)&f__reclen,sizeof(uiolen),1,f__cf)
-		!= 1)
-	{	if(feof(f__cf))
-		{	f__curunit->uend = 1;
-			err(a->ciend, EOF, "start");
-		}
-		clearerr(f__cf);
-		err(a->cierr, errno, "start");
-	}
-	return(0);
-}
-#ifdef KR_headers
-integer s_wsue(a) cilist *a;
-#else
-integer s_wsue(cilist *a)
-#endif
-{
-	int n;
-	if(f__init != 1) f_init();
-	f__init = 3;
-	if(n=c_sue(a)) return(n);
-	f__reading=0;
-	f__reclen=0;
-	if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit))
-		err(a->cierr, errno, "write start");
-	f__recloc=ftell(f__cf);
-	(void) fseek(f__cf,(long)sizeof(uiolen),SEEK_CUR);
-	return(0);
-}
-integer e_wsue(Void)
-{	long loc;
-	f__init = 1;
-	fwrite((char *)&f__reclen,sizeof(uiolen),1,f__cf);
-#ifdef ALWAYS_FLUSH
-	if (fflush(f__cf))
-		err(f__elist->cierr, errno, "write end");
-#endif
-	loc=ftell(f__cf);
-	fseek(f__cf,f__recloc,SEEK_SET);
-	fwrite((char *)&f__reclen,sizeof(uiolen),1,f__cf);
-	fseek(f__cf,loc,SEEK_SET);
-	return(0);
-}
-integer e_rsue(Void)
-{
-	f__init = 1;
-	(void) fseek(f__cf,(long)(f__reclen-f__recpos+sizeof(uiolen)),SEEK_CUR);
-	return(0);
-}
diff --git a/gcc/f/runtime/libI77/typesize.c b/gcc/f/runtime/libI77/typesize.c
deleted file mode 100644
index 1cb20ff..0000000
--- a/gcc/f/runtime/libI77/typesize.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "f2c.h"
-
-ftnlen f__typesize[] = { 0, 0, sizeof(shortint), sizeof(integer),
-			sizeof(real), sizeof(doublereal),
-			sizeof(complex), sizeof(doublecomplex),
-			sizeof(logical), sizeof(char),
-			0, sizeof(integer1),
-			sizeof(logical1), sizeof(shortlogical),
-#ifdef Allow_TYQUAD
-			sizeof(longint),
-#endif
-			0};
diff --git a/gcc/f/runtime/libI77/uio.c b/gcc/f/runtime/libI77/uio.c
deleted file mode 100644
index ea733ce..0000000
--- a/gcc/f/runtime/libI77/uio.c
+++ /dev/null
@@ -1,69 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#include <sys/types.h>
-uiolen f__reclen;
-
-#ifdef KR_headers
-do_us(number,ptr,len) ftnint *number; char *ptr; ftnlen len;
-#else
-do_us(ftnint *number, char *ptr, ftnlen len)
-#endif
-{
-	if(f__reading)
-	{
-		f__recpos += (int)(*number * len);
-		if(f__recpos>f__reclen)
-			err(f__elist->cierr, 110, "do_us");
-		if (fread(ptr,(size_t)len,(size_t)(*number),f__cf) != *number)
-			err(f__elist->ciend, EOF, "do_us");
-		return(0);
-	}
-	else
-	{
-		f__reclen += *number * len;
-		(void) fwrite(ptr,(size_t)len,(size_t)(*number),f__cf);
-		return(0);
-	}
-}
-#ifdef KR_headers
-integer do_ud(number,ptr,len) ftnint *number; char *ptr; ftnlen len;
-#else
-integer do_ud(ftnint *number, char *ptr, ftnlen len)
-#endif
-{
-	f__recpos += (int)(*number * len);
-	if(f__recpos > f__curunit->url && f__curunit->url!=1)
-		err(f__elist->cierr,110,"do_ud");
-	if(f__reading)
-	{
-#ifdef Pad_UDread
-#ifdef KR_headers
-	int i;
-#else
-	size_t i;
-#endif
-		if (!(i = fread(ptr,(size_t)len,(size_t)(*number),f__cf))
-		 && !(f__recpos - *number*len))
-			err(f__elist->cierr,EOF,"do_ud");
-		if (i < *number)
-			memset(ptr + i*len, 0, (*number - i)*len);
-		return 0;
-#else
-		if(fread(ptr,(size_t)len,(size_t)(*number),f__cf) != *number)
-			err(f__elist->cierr,EOF,"do_ud");
-		else return(0);
-#endif
-	}
-	(void) fwrite(ptr,(size_t)len,(size_t)(*number),f__cf);
-	return(0);
-}
-#ifdef KR_headers
-integer do_uio(number,ptr,len) ftnint *number; char *ptr; ftnlen len;
-#else
-integer do_uio(ftnint *number, char *ptr, ftnlen len)
-#endif
-{
-	if(f__sequential)
-		return(do_us(number,ptr,len));
-	else	return(do_ud(number,ptr,len));
-}
diff --git a/gcc/f/runtime/libI77/util.c b/gcc/f/runtime/libI77/util.c
deleted file mode 100644
index a249325..0000000
--- a/gcc/f/runtime/libI77/util.c
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef NON_UNIX_STDIO
-#include <sys/types.h>
-#include <sys/stat.h>
-#endif
-#include "f2c.h"
-#include "fio.h"
-
- VOID
-#ifdef KR_headers
-g_char(a,alen,b) char *a,*b; ftnlen alen;
-#else
-g_char(char *a, ftnlen alen, char *b)
-#endif
-{
-	char *x = a + alen, *y = b + alen;
-
-	for(;; y--) {
-		if (x <= a) {
-			*b = 0;
-			return;
-			}
-		if (*--x != ' ')
-			break;
-		}
-	*y-- = 0;
-	do *y-- = *x;
-		while(x-- > a);
-	}
-
- VOID
-#ifdef KR_headers
-b_char(a,b,blen) char *a,*b; ftnlen blen;
-#else
-b_char(char *a, char *b, ftnlen blen)
-#endif
-{	int i;
-	for(i=0;i<blen && *a!=0;i++) *b++= *a++;
-	for(;i<blen;i++) *b++=' ';
-}
-#ifndef NON_UNIX_STDIO
-#ifdef KR_headers
-long f__inode(a, dev) char *a; int *dev;
-#else
-long f__inode(char *a, int *dev)
-#endif
-{	struct stat x;
-	if(stat(a,&x)<0) return(-1);
-	*dev = x.st_dev;
-	return(x.st_ino);
-}
-#endif
diff --git a/gcc/f/runtime/libI77/wref.c b/gcc/f/runtime/libI77/wref.c
deleted file mode 100644
index a10bcaa..0000000
--- a/gcc/f/runtime/libI77/wref.c
+++ /dev/null
@@ -1,276 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#ifndef VAX
-#include <ctype.h>
-#endif
-
-#ifndef KR_headers
-#undef abs
-#undef min
-#undef max
-#include <stdlib.h>
-#include <string.h>
-#endif
-
-#include "fmt.h"
-#include "fp.h"
-
-#ifdef KR_headers
-wrt_E(p,w,d,e,len) ufloat *p; ftnlen len;
-#else
-wrt_E(ufloat *p, int w, int d, int e, ftnlen len)
-#endif
-{
-	char buf[FMAX+EXPMAXDIGS+4], *s, *se;
-	int d1, delta, e1, i, sign, signspace;
-	double dd;
-#ifdef WANT_LEAD_0
-	int insert0 = 0;
-#endif
-#ifndef VAX
-	int e0 = e;
-#endif
-
-	if(e <= 0)
-		e = 2;
-	if(f__scale) {
-		if(f__scale >= d + 2 || f__scale <= -d)
-			goto nogood;
-		}
-	if(f__scale <= 0)
-		--d;
-	if (len == sizeof(real))
-		dd = p->pf;
-	else
-		dd = p->pd;
-	if (dd < 0.) {
-		signspace = sign = 1;
-		dd = -dd;
-		}
-	else {
-		sign = 0;
-		signspace = (int)f__cplus;
-#ifndef VAX
-		if (!dd)
-			dd = 0.;	/* avoid -0 */
-#endif
-		}
-	delta = w - (2 /* for the . and the d adjustment above */
-			+ 2 /* for the E+ */ + signspace + d + e);
-#ifdef WANT_LEAD_0
-	if (f__scale <= 0 && delta > 0) {
-		delta--;
-		insert0 = 1;
-		}
-	else
-#endif
-	if (delta < 0) {
-nogood:
-		while(--w >= 0)
-			PUT('*');
-		return(0);
-		}
-	if (f__scale < 0)
-		d += f__scale;
-	if (d > FMAX) {
-		d1 = d - FMAX;
-		d = FMAX;
-		}
-	else
-		d1 = 0;
-	sprintf(buf,"%#.*E", d, dd);
-#ifndef VAX
-	/* check for NaN, Infinity */
-	if (!isdigit(buf[0])) {
-		switch(buf[0]) {
-			case 'n':
-			case 'N':
-				signspace = 0;	/* no sign for NaNs */
-			}
-		delta = w - strlen(buf) - signspace;
-		if (delta < 0)
-			goto nogood;
-		while(--delta >= 0)
-			PUT(' ');
-		if (signspace)
-			PUT(sign ? '-' : '+');
-		for(s = buf; *s; s++)
-			PUT(*s);
-		return 0;
-		}
-#endif
-	se = buf + d + 3;
-#ifdef GOOD_SPRINTF_EXPONENT /* When possible, exponent has 2 digits. */
-	if (f__scale != 1 && dd)
-		sprintf(se, "%+.2d", atoi(se) + 1 - f__scale);
-#else
-	if (dd)
-		sprintf(se, "%+.2d", atoi(se) + 1 - f__scale);
-	else
-		strcpy(se, "+00");
-#endif
-	s = ++se;
-	if (e < 2) {
-		if (*s != '0')
-			goto nogood;
-		}
-#ifndef VAX
-	/* accommodate 3 significant digits in exponent */
-	if (s[2]) {
-#ifdef Pedantic
-		if (!e0 && !s[3])
-			for(s -= 2, e1 = 2; s[0] = s[1]; s++);
-
-	/* Pedantic gives the behavior that Fortran 77 specifies,	*/
-	/* i.e., requires that E be specified for exponent fields	*/
-	/* of more than 3 digits.  With Pedantic undefined, we get	*/
-	/* the behavior that Cray displays -- you get a bigger		*/
-	/* exponent field if it fits.	*/
-#else
-		if (!e0) {
-			for(s -= 2, e1 = 2; s[0] = s[1]; s++)
-#ifdef CRAY
-				delta--;
-			if ((delta += 4) < 0)
-				goto nogood
-#endif
-				;
-			}
-#endif
-		else if (e0 >= 0)
-			goto shift;
-		else
-			e1 = e;
-		}
-	else
- shift:
-#endif
-		for(s += 2, e1 = 2; *s; ++e1, ++s)
-			if (e1 >= e)
-				goto nogood;
-	while(--delta >= 0)
-		PUT(' ');
-	if (signspace)
-		PUT(sign ? '-' : '+');
-	s = buf;
-	i = f__scale;
-	if (f__scale <= 0) {
-#ifdef WANT_LEAD_0
-		if (insert0)
-			PUT('0');
-#endif
-		PUT('.');
-		for(; i < 0; ++i)
-			PUT('0');
-		PUT(*s);
-		s += 2;
-		}
-	else if (f__scale > 1) {
-		PUT(*s);
-		s += 2;
-		while(--i > 0)
-			PUT(*s++);
-		PUT('.');
-		}
-	if (d1) {
-		se -= 2;
-		while(s < se) PUT(*s++);
-		se += 2;
-		do PUT('0'); while(--d1 > 0);
-		}
-	while(s < se)
-		PUT(*s++);
-	if (e < 2)
-		PUT(s[1]);
-	else {
-		while(++e1 <= e)
-			PUT('0');
-		while(*s)
-			PUT(*s++);
-		}
-	return 0;
-	}
-
-#ifdef KR_headers
-wrt_F(p,w,d,len) ufloat *p; ftnlen len;
-#else
-wrt_F(ufloat *p, int w, int d, ftnlen len)
-#endif
-{
-	int d1, sign, n;
-	double x;
-	char *b, buf[MAXINTDIGS+MAXFRACDIGS+4], *s;
-
-	x= (len==sizeof(real)?p->pf:p->pd);
-	if (d < MAXFRACDIGS)
-		d1 = 0;
-	else {
-		d1 = d - MAXFRACDIGS;
-		d = MAXFRACDIGS;
-		}
-	if (x < 0.)
-		{ x = -x; sign = 1; }
-	else {
-		sign = 0;
-#ifndef VAX
-		if (!x)
-			x = 0.;
-#endif
-		}
-
-	if (n = f__scale)
-		if (n > 0)
-			do x *= 10.; while(--n > 0);
-		else
-			do x *= 0.1; while(++n < 0);
-
-#ifdef USE_STRLEN
-	sprintf(b = buf, "%#.*f", d, x);
-	n = strlen(b) + d1;
-#else
-	n = sprintf(b = buf, "%#.*f", d, x) + d1;
-#endif
-
-#ifndef WANT_LEAD_0
-	if (buf[0] == '0' && d)
-		{ ++b; --n; }
-#endif
-	if (sign) {
-		/* check for all zeros */
-		for(s = b;;) {
-			while(*s == '0') s++;
-			switch(*s) {
-				case '.':
-					s++; continue;
-				case 0:
-					sign = 0;
-				}
-			break;
-			}
-		}
-	if (sign || f__cplus)
-		++n;
-	if (n > w) {
-#ifdef WANT_LEAD_0
-		if (buf[0] == '0' && --n == w)
-			++b;
-		else
-#endif
-		{
-			while(--w >= 0)
-				PUT('*');
-			return 0;
-			}
-		}
-	for(w -= n; --w >= 0; )
-		PUT(' ');
-	if (sign)
-		PUT('-');
-	else if (f__cplus)
-		PUT('+');
-	while(n = *b++)
-		PUT(n);
-	while(--d1 >= 0)
-		PUT('0');
-	return 0;
-	}
diff --git a/gcc/f/runtime/libI77/wrtfmt.c b/gcc/f/runtime/libI77/wrtfmt.c
deleted file mode 100644
index e14efa8..0000000
--- a/gcc/f/runtime/libI77/wrtfmt.c
+++ /dev/null
@@ -1,385 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#include "fmt.h"
-
-extern icilist *f__svic;
-extern char *f__icptr;
-
- static int
-mv_cur(Void)	/* shouldn't use fseek because it insists on calling fflush */
-		/* instead we know too much about stdio */
-{
-	int cursor = f__cursor;
-	f__cursor = 0;
-	if(f__external == 0) {
-		if(cursor < 0) {
-			if(f__hiwater < f__recpos)
-				f__hiwater = f__recpos;
-			f__recpos += cursor;
-			f__icptr += cursor;
-			if(f__recpos < 0)
-				err(f__elist->cierr, 110, "left off");
-		}
-		else if(cursor > 0) {
-			if(f__recpos + cursor >= f__svic->icirlen)
-				err(f__elist->cierr, 110, "recend");
-			if(f__hiwater <= f__recpos)
-				for(; cursor > 0; cursor--)
-					(*f__putn)(' ');
-			else if(f__hiwater <= f__recpos + cursor) {
-				cursor -= f__hiwater - f__recpos;
-				f__icptr += f__hiwater - f__recpos;
-				f__recpos = f__hiwater;
-				for(; cursor > 0; cursor--)
-					(*f__putn)(' ');
-			}
-			else {
-				f__icptr += cursor;
-				f__recpos += cursor;
-			}
-		}
-		return(0);
-	}
-	if(cursor > 0) {
-		if(f__hiwater <= f__recpos)
-			for(;cursor>0;cursor--) (*f__putn)(' ');
-		else if(f__hiwater <= f__recpos + cursor) {
-#if ! defined (NON_UNIX_STDIO) && ! defined (MISSING_FILE_ELEMS)
-			if(f__cf->_ptr + f__hiwater - f__recpos < buf_end(f__cf))
-				f__cf->_ptr += f__hiwater - f__recpos;
-			else
-#endif
-				(void) fseek(f__cf, (long) (f__hiwater - f__recpos), SEEK_CUR);
-			cursor -= f__hiwater - f__recpos;
-			f__recpos = f__hiwater;
-			for(; cursor > 0; cursor--)
-				(*f__putn)(' ');
-		}
-		else {
-#if ! defined (NON_UNIX_STDIO) && ! defined (MISSING_FILE_ELEMS)
-			if(f__cf->_ptr + cursor < buf_end(f__cf))
-				f__cf->_ptr += cursor;
-			else
-#endif
-				(void) fseek(f__cf, (long)cursor, SEEK_CUR);
-			f__recpos += cursor;
-		}
-	}
-	if(cursor<0)
-	{
-		if(cursor+f__recpos<0) err(f__elist->cierr,110,"left off");
-#if ! defined (NON_UNIX_STDIO) && ! defined (MISSING_FILE_ELEMS)
-		if(f__cf->_ptr + cursor >= f__cf->_base)
-			f__cf->_ptr += cursor;
-		else
-#endif
-		if(f__curunit && f__curunit->useek)
-			(void) fseek(f__cf,(long)cursor,SEEK_CUR);
-		else
-			err(f__elist->cierr,106,"fmt");
-		if(f__hiwater < f__recpos)
-			f__hiwater = f__recpos;
-		f__recpos += cursor;
-	}
-	return(0);
-}
-
- static int
-#ifdef KR_headers
-wrt_Z(n,w,minlen,len) Uint *n; int w, minlen; ftnlen len;
-#else
-wrt_Z(Uint *n, int w, int minlen, ftnlen len)
-#endif
-{
-	register char *s, *se;
-	register int i, w1;
-	static int one = 1;
-	static char hex[] = "0123456789ABCDEF";
-	s = (char *)n;
-	--len;
-	if (*(char *)&one) {
-		/* little endian */
-		se = s;
-		s += len;
-		i = -1;
-		}
-	else {
-		se = s + len;
-		i = 1;
-		}
-	for(;; s += i)
-		if (s == se || *s)
-			break;
-	w1 = (i*(se-s) << 1) + 1;
-	if (*s & 0xf0)
-		w1++;
-	if (w1 > w)
-		for(i = 0; i < w; i++)
-			(*f__putn)('*');
-	else {
-		if ((minlen -= w1) > 0)
-			w1 += minlen;
-		while(--w >= w1)
-			(*f__putn)(' ');
-		while(--minlen >= 0)
-			(*f__putn)('0');
-		if (!(*s & 0xf0)) {
-			(*f__putn)(hex[*s & 0xf]);
-			if (s == se)
-				return 0;
-			s += i;
-			}
-		for(;; s += i) {
-			(*f__putn)(hex[*s >> 4 & 0xf]);
-			(*f__putn)(hex[*s & 0xf]);
-			if (s == se)
-				break;
-			}
-		}
-	return 0;
-	}
-
- static int
-#ifdef KR_headers
-wrt_I(n,w,len, base) Uint *n; ftnlen len; register int base;
-#else
-wrt_I(Uint *n, int w, ftnlen len, register int base)
-#endif
-{	int ndigit,sign,spare,i;
-	longint x;
-	char *ans;
-	if(len==sizeof(integer)) x=n->il;
-	else if(len == sizeof(char)) x = n->ic;
-#ifdef Allow_TYQUAD
-	else if (len == sizeof(longint)) x = n->ili;
-#endif
-	else x=n->is;
-	ans=f__icvt(x,&ndigit,&sign, base);
-	spare=w-ndigit;
-	if(sign || f__cplus) spare--;
-	if(spare<0)
-		for(i=0;i<w;i++) (*f__putn)('*');
-	else
-	{	for(i=0;i<spare;i++) (*f__putn)(' ');
-		if(sign) (*f__putn)('-');
-		else if(f__cplus) (*f__putn)('+');
-		for(i=0;i<ndigit;i++) (*f__putn)(*ans++);
-	}
-	return(0);
-}
- static int
-#ifdef KR_headers
-wrt_IM(n,w,m,len,base) Uint *n; ftnlen len; int base;
-#else
-wrt_IM(Uint *n, int w, int m, ftnlen len, int base)
-#endif
-{	int ndigit,sign,spare,i,xsign;
-	longint x;
-	char *ans;
-	if(sizeof(integer)==len) x=n->il;
-	else if(len == sizeof(char)) x = n->ic;
-#ifdef Allow_TYQUAD
-	else if (len == sizeof(longint)) x = n->ili;
-#endif
-	else x=n->is;
-	ans=f__icvt(x,&ndigit,&sign, base);
-	if(sign || f__cplus) xsign=1;
-	else xsign=0;
-	if(ndigit+xsign>w || m+xsign>w)
-	{	for(i=0;i<w;i++) (*f__putn)('*');
-		return(0);
-	}
-	if(x==0 && m==0)
-	{	for(i=0;i<w;i++) (*f__putn)(' ');
-		return(0);
-	}
-	if(ndigit>=m)
-		spare=w-ndigit-xsign;
-	else
-		spare=w-m-xsign;
-	for(i=0;i<spare;i++) (*f__putn)(' ');
-	if(sign) (*f__putn)('-');
-	else if(f__cplus) (*f__putn)('+');
-	for(i=0;i<m-ndigit;i++) (*f__putn)('0');
-	for(i=0;i<ndigit;i++) (*f__putn)(*ans++);
-	return(0);
-}
- static int
-#ifdef KR_headers
-wrt_AP(s) char *s;
-#else
-wrt_AP(char *s)
-#endif
-{	char quote;
-	int i;
-
-	if(f__cursor && (i = mv_cur()))
-		return i;
-	quote = *s++;
-	for(;*s;s++)
-	{	if(*s!=quote) (*f__putn)(*s);
-		else if(*++s==quote) (*f__putn)(*s);
-		else return(1);
-	}
-	return(1);
-}
- static int
-#ifdef KR_headers
-wrt_H(a,s) char *s;
-#else
-wrt_H(int a, char *s)
-#endif
-{
-	int i;
-
-	if(f__cursor && (i = mv_cur()))
-		return i;
-	while(a--) (*f__putn)(*s++);
-	return(1);
-}
-#ifdef KR_headers
-wrt_L(n,len, sz) Uint *n; ftnlen sz;
-#else
-wrt_L(Uint *n, int len, ftnlen sz)
-#endif
-{	int i;
-	long x;
-	if(sizeof(long)==sz) x=n->il;
-	else if(sz == sizeof(char)) x = n->ic;
-	else x=n->is;
-	for(i=0;i<len-1;i++)
-		(*f__putn)(' ');
-	if(x) (*f__putn)('T');
-	else (*f__putn)('F');
-	return(0);
-}
- static int
-#ifdef KR_headers
-wrt_A(p,len) char *p; ftnlen len;
-#else
-wrt_A(char *p, ftnlen len)
-#endif
-{
-	while(len-- > 0) (*f__putn)(*p++);
-	return(0);
-}
- static int
-#ifdef KR_headers
-wrt_AW(p,w,len) char * p; ftnlen len;
-#else
-wrt_AW(char * p, int w, ftnlen len)
-#endif
-{
-	while(w>len)
-	{	w--;
-		(*f__putn)(' ');
-	}
-	while(w-- > 0)
-		(*f__putn)(*p++);
-	return(0);
-}
-
- static int
-#ifdef KR_headers
-wrt_G(p,w,d,e,len) ufloat *p; ftnlen len;
-#else
-wrt_G(ufloat *p, int w, int d, int e, ftnlen len)
-#endif
-{	double up = 1,x;
-	int i=0,oldscale,n,j;
-	x = len==sizeof(real)?p->pf:p->pd;
-	if(x < 0 ) x = -x;
-	if(x<.1) {
-		if (x != 0.)
-			return(wrt_E(p,w,d,e,len));
-		i = 1;
-		goto have_i;
-		}
-	for(;i<=d;i++,up*=10)
-	{	if(x>=up) continue;
- have_i:
-		oldscale = f__scale;
-		f__scale = 0;
-		if(e==0) n=4;
-		else	n=e+2;
-		i=wrt_F(p,w-n,d-i,len);
-		for(j=0;j<n;j++) (*f__putn)(' ');
-		f__scale=oldscale;
-		return(i);
-	}
-	return(wrt_E(p,w,d,e,len));
-}
-#ifdef KR_headers
-w_ed(p,ptr,len) struct syl *p; char *ptr; ftnlen len;
-#else
-w_ed(struct syl *p, char *ptr, ftnlen len)
-#endif
-{
-	int i;
-
-	if(f__cursor && (i = mv_cur()))
-		return i;
-	switch(p->op)
-	{
-	default:
-		fprintf(stderr,"w_ed, unexpected code: %d\n", p->op);
-		sig_die(f__fmtbuf, 1);
-	case I:	return(wrt_I((Uint *)ptr,p->p1,len, 10));
-	case IM:
-		return(wrt_IM((Uint *)ptr,p->p1,p->p2,len,10));
-
-		/* O and OM don't work right for character, double, complex, */
-		/* or doublecomplex, and they differ from Fortran 90 in */
-		/* showing a minus sign for negative values. */
-
-	case O:	return(wrt_I((Uint *)ptr, p->p1, len, 8));
-	case OM:
-		return(wrt_IM((Uint *)ptr,p->p1,p->p2,len,8));
-	case L:	return(wrt_L((Uint *)ptr,p->p1, len));
-	case A: return(wrt_A(ptr,len));
-	case AW:
-		return(wrt_AW(ptr,p->p1,len));
-	case D:
-	case E:
-	case EE:
-		return(wrt_E((ufloat *)ptr,p->p1,p->p2,p->p3,len));
-	case G:
-	case GE:
-		return(wrt_G((ufloat *)ptr,p->p1,p->p2,p->p3,len));
-	case F:	return(wrt_F((ufloat *)ptr,p->p1,p->p2,len));
-
-		/* Z and ZM assume 8-bit bytes. */
-
-	case Z: return(wrt_Z((Uint *)ptr,p->p1,0,len));
-	case ZM:
-		return(wrt_Z((Uint *)ptr,p->p1,p->p2,len));
-	}
-}
-#ifdef KR_headers
-w_ned(p) struct syl *p;
-#else
-w_ned(struct syl *p)
-#endif
-{
-	switch(p->op)
-	{
-	default: fprintf(stderr,"w_ned, unexpected code: %d\n", p->op);
-		sig_die(f__fmtbuf, 1);
-	case SLASH:
-		return((*f__donewrec)());
-	case T: f__cursor = p->p1-f__recpos - 1;
-		return(1);
-	case TL: f__cursor -= p->p1;
-		if(f__cursor < -f__recpos)	/* TL1000, 1X */
-			f__cursor = -f__recpos;
-		return(1);
-	case TR:
-	case X:
-		f__cursor += p->p1;
-		return(1);
-	case APOS:
-		return(wrt_AP(*(char **)&p->p2));
-	case H:
-		return(wrt_H(p->p1,*(char **)&p->p2));
-	}
-}
diff --git a/gcc/f/runtime/libI77/wsfe.c b/gcc/f/runtime/libI77/wsfe.c
deleted file mode 100644
index 5adb1a4..0000000
--- a/gcc/f/runtime/libI77/wsfe.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/*write sequential formatted external*/
-#include "f2c.h"
-#include "fio.h"
-#include "fmt.h"
-extern int f__hiwater;
-
-#ifdef KR_headers
-x_putc(c)
-#else
-x_putc(int c)
-#endif
-{
-	/* this uses \n as an indicator of record-end */
-	if(c == '\n' && f__recpos < f__hiwater) {	/* fseek calls fflush, a loss */
-#if ! defined (NON_UNIX_STDIO) && ! defined (MISSING_FILE_ELEMS)
-		if(f__cf->_ptr + f__hiwater - f__recpos < buf_end(f__cf))
-			f__cf->_ptr += f__hiwater - f__recpos;
-		else
-#endif
-			(void) fseek(f__cf, (long)(f__hiwater - f__recpos), SEEK_CUR);
-	}
-#ifdef OMIT_BLANK_CC
-	if (!f__recpos++ && c == ' ')
-		return c;
-#else
-	f__recpos++;
-#endif
-	return putc(c,f__cf);
-}
-x_wSL(Void)
-{
-	(*f__putn)('\n');
-	f__recpos=0;
-	f__cursor = 0;
-	f__hiwater = 0;
-	return(1);
-}
-xw_end(Void)
-{
-	if(f__nonl == 0)
-		(*f__putn)('\n');
-	f__hiwater = f__recpos = f__cursor = 0;
-	return(0);
-}
-xw_rev(Void)
-{
-	if(f__workdone) (*f__putn)('\n');
-	f__hiwater = f__recpos = f__cursor = 0;
-	return(f__workdone=0);
-}
-
-#ifdef KR_headers
-integer s_wsfe(a) cilist *a;	/*start*/
-#else
-integer s_wsfe(cilist *a)	/*start*/
-#endif
-{	int n;
-	if(f__init != 1) f_init();
-	f__init = 3;
-	if(n=c_sfe(a)) return(n);
-	f__reading=0;
-	f__sequential=1;
-	f__formatted=1;
-	f__external=1;
-	f__elist=a;
-	f__hiwater = f__cursor=f__recpos=0;
-	f__nonl = 0;
-	f__scale=0;
-	f__fmtbuf=a->cifmt;
-	f__curunit = &f__units[a->ciunit];
-	f__cf=f__curunit->ufd;
-	if(pars_f(f__fmtbuf)<0) err(a->cierr,100,"startio");
-	f__putn= x_putc;
-	f__doed= w_ed;
-	f__doned= w_ned;
-	f__doend=xw_end;
-	f__dorevert=xw_rev;
-	f__donewrec=x_wSL;
-	fmt_bg();
-	f__cplus=0;
-	f__cblank=f__curunit->ublnk;
-	if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit))
-		err(a->cierr,errno,"write start");
-	return(0);
-}
diff --git a/gcc/f/runtime/libI77/wsle.c b/gcc/f/runtime/libI77/wsle.c
deleted file mode 100644
index d13f78f..0000000
--- a/gcc/f/runtime/libI77/wsle.c
+++ /dev/null
@@ -1,41 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#include "fmt.h"
-#include "lio.h"
-
-#ifdef KR_headers
-integer s_wsle(a) cilist *a;
-#else
-integer s_wsle(cilist *a)
-#endif
-{
-	int n;
-	if(n=c_le(a)) return(n);
-	f__reading=0;
-	f__external=1;
-	f__formatted=1;
-	f__putn = t_putc;
-	f__lioproc = l_write;
-	L_len = LINE;
-	f__donewrec = x_wSL;
-	if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit))
-		err(a->cierr, errno, "list output start");
-	return(0);
-	}
-
-integer e_wsle(Void)
-{
-	f__init = 1;
-	t_putc('\n');
-	f__recpos=0;
-#ifdef ALWAYS_FLUSH
-	if (fflush(f__cf))
-		err(f__elist->cierr, errno, "write end");
-#else
-	if (f__cf == stdout)
-		fflush(stdout);
-	else if (f__cf == stderr)
-		fflush(stderr);
-#endif
-	return(0);
-	}
diff --git a/gcc/f/runtime/libI77/wsne.c b/gcc/f/runtime/libI77/wsne.c
deleted file mode 100644
index 0febd52..0000000
--- a/gcc/f/runtime/libI77/wsne.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#include "lio.h"
-
- integer
-#ifdef KR_headers
-s_wsne(a) cilist *a;
-#else
-s_wsne(cilist *a)
-#endif
-{
-	int n;
-
-	if(n=c_le(a))
-		return(n);
-	f__reading=0;
-	f__external=1;
-	f__formatted=1;
-	f__putn = t_putc;
-	L_len = LINE;
-	f__donewrec = x_wSL;
-	if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit))
-		err(a->cierr, errno, "namelist output start");
-	x_wsne(a);
-	return e_wsle();
-	}
diff --git a/gcc/f/runtime/libI77/xwsne.c b/gcc/f/runtime/libI77/xwsne.c
deleted file mode 100644
index 71f6f1d..0000000
--- a/gcc/f/runtime/libI77/xwsne.c
+++ /dev/null
@@ -1,72 +0,0 @@
-#include "f2c.h"
-#include "fio.h"
-#include "lio.h"
-#include "fmt.h"
-
-extern int f__Aquote;
-
- static VOID
-nl_donewrec(Void)
-{
-	(*f__donewrec)();
-	PUT(' ');
-	}
-
-#ifdef KR_headers
-x_wsne(a) cilist *a;
-#else
-#include <string.h>
-
- VOID
-x_wsne(cilist *a)
-#endif
-{
-	Namelist *nl;
-	char *s;
-	Vardesc *v, **vd, **vde;
-	ftnint *number, type;
-	ftnlen *dims;
-	ftnlen size;
-	static ftnint one = 1;
-	extern ftnlen f__typesize[];
-
-	nl = (Namelist *)a->cifmt;
-	PUT('&');
-	for(s = nl->name; *s; s++)
-		PUT(*s);
-	PUT(' ');
-	f__Aquote = 1;
-	vd = nl->vars;
-	vde = vd + nl->nvars;
-	while(vd < vde) {
-		v = *vd++;
-		s = v->name;
-#ifdef No_Extra_Namelist_Newlines
-		if (f__recpos+strlen(s)+2 >= L_len)
-#endif
-			nl_donewrec();
-		while(*s)
-			PUT(*s++);
-		PUT(' ');
-		PUT('=');
-		number = (dims = v->dims) ? dims + 1 : &one;
-		type = v->type;
-		if (type < 0) {
-			size = -type;
-			type = TYCHAR;
-			}
-		else
-			size = f__typesize[type];
-		l_write(number, v->addr, size, type);
-		if (vd < vde) {
-			if (f__recpos+2 >= L_len)
-				nl_donewrec();
-			PUT(',');
-			PUT(' ');
-			}
-		else if (f__recpos+1 >= L_len)
-			nl_donewrec();
-		}
-	f__Aquote = 0;
-	PUT('/');
-	}
diff --git a/gcc/f/runtime/libU77/COPYING.LIB b/gcc/f/runtime/libU77/COPYING.LIB
deleted file mode 100644
index eb685a5..0000000
--- a/gcc/f/runtime/libU77/COPYING.LIB
+++ /dev/null
@@ -1,481 +0,0 @@
-		  GNU LIBRARY GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1991 Free Software Foundation, Inc.
-                    675 Mass Ave, Cambridge, MA 02139, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the library GPL.  It is
- numbered 2 because it goes with version 2 of the ordinary GPL.]
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Library General Public License, applies to some
-specially designated Free Software Foundation software, and to any
-other libraries whose authors decide to use it.  You can use it for
-your libraries, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if
-you distribute copies of the library, or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link a program with the library, you must provide
-complete object files to the recipients so that they can relink them
-with the library, after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  Our method of protecting your rights has two steps: (1) copyright
-the library, and (2) offer you this license which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  Also, for each distributor's protection, we want to make certain
-that everyone understands that there is no warranty for this free
-library.  If the library is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original
-version, so that any problems introduced by others will not reflect on
-the original authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that companies distributing free
-software will individually obtain patent licenses, thus in effect
-transforming the program into proprietary software.  To prevent this,
-we have made it clear that any patent must be licensed for everyone's
-free use or not licensed at all.
-
-  Most GNU software, including some libraries, is covered by the ordinary
-GNU General Public License, which was designed for utility programs.  This
-license, the GNU Library General Public License, applies to certain
-designated libraries.  This license is quite different from the ordinary
-one; be sure to read it in full, and don't assume that anything in it is
-the same as in the ordinary license.
-
-  The reason we have a separate public license for some libraries is that
-they blur the distinction we usually make between modifying or adding to a
-program and simply using it.  Linking a program with a library, without
-changing the library, is in some sense simply using the library, and is
-analogous to running a utility program or application program.  However, in
-a textual and legal sense, the linked executable is a combined work, a
-derivative of the original library, and the ordinary General Public License
-treats it as such.
-
-  Because of this blurred distinction, using the ordinary General
-Public License for libraries did not effectively promote software
-sharing, because most developers did not use the libraries.  We
-concluded that weaker conditions might promote sharing better.
-
-  However, unrestricted linking of non-free programs would deprive the
-users of those programs of all benefit from the free status of the
-libraries themselves.  This Library General Public License is intended to
-permit developers of non-free programs to use free libraries, while
-preserving your freedom as a user of such programs to change the free
-libraries that are incorporated in them.  (We have not seen how to achieve
-this as regards changes in header files, but we have achieved it as regards
-changes in the actual functions of the Library.)  The hope is that this
-will lead to faster development of free libraries.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, while the latter only
-works together with the library.
-
-  Note that it is possible for a library to be covered by the ordinary
-General Public License rather than by this special one.
-
-		  GNU LIBRARY GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library which
-contains a notice placed by the copyright holder or other authorized
-party saying it may be distributed under the terms of this Library
-General Public License (also called "this License").  Each licensee is
-addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-  6. As an exception to the Sections above, you may also compile or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    c) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    d) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the source code distributed need not include anything that is normally
-distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Library General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-			    NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-     Appendix: How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Library General Public
-    License as published by the Free Software Foundation; either
-    version 2 of the License, or (at your option) any later version.
-
-    This library 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
-    Library General Public License for more details.
-
-    You should have received a copy of the GNU Library General Public
-    License along with this library; if not, write to the Free
-    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
diff --git a/gcc/f/runtime/libU77/Makefile.in b/gcc/f/runtime/libU77/Makefile.in
deleted file mode 100644
index 2e6846b..0000000
--- a/gcc/f/runtime/libU77/Makefile.in
+++ /dev/null
@@ -1,155 +0,0 @@
-# Makefile for GNU F77 compiler runtime, libc interface.
-# Copyright (C) 1995-1997 Free Software Foundation, Inc.
-#   Contributed by Dave Love (d.love@dl.ac.uk).
-#
-#This file is part of GNU Fortran libU77 library.
-#
-#This library is free software; you can redistribute it and/or modify
-#it under the 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.
-#
-#GNU Fortran 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
-#Library General Public License for more details.
-#
-#You should have received a copy of the GNU General Public License
-#along with GNU Fortran; see the file COPYING.  If not, write to
-#Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-
-SHELL = /bin/sh
-
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-#### Start of system configuration section. ####
-
-# The _FOR_TARGET things are appropriate for a cross-make, passed by the
-# superior makefile
-GCC_FOR_TARGET = @CC@
-CC = $(GCC_FOR_TARGET)
-CFLAGS = @CFLAGS@ $(GCC_FLAGS)
-CPPFLAGS = @CPPFLAGS@
-DEFS = @DEFS@
-CGFLAGS = -g0
-# f2c.h should already be installed in xgcc's include directory but add that
-# to -I anyhow in case not using xgcc.  fio.h is in libI77.  We need config.h
-# from `.'.
-ALL_CFLAGS = -I. -I$(srcdir) -I$(srcdir)/../libI77 -I../../../include $(CPPFLAGS) $(DEFS) $(CFLAGS)
-AR = @AR@
-AR_FLAGS = rc
-RANLIB = @RANLIB@
-RANLIB_TEST = @RANLIB_TEST@
-CROSS = @CROSS@
-G77DIR = ../../../
-
-.SUFFIXES:
-.SUFFIXES: .c .o
-
-.c.o:
-	$(CC) -c -DSkip_f2c_Undefs $(ALL_CFLAGS) $(CGFLAGS) $<
-
-OBJS =  VersionU.o gerror_.o perror_.o ierrno_.o itime_.o time_.o \
-	unlink_.o fnum_.o getpid_.o getuid_.o getgid_.o kill_.o rand_.o \
-	srand_.o irand_.o sleep_.o idate_.o ctime_.o etime_.o \
-	dtime_.o  isatty_.o ltime_.o fstat_.o stat_.o \
-	lstat_.o access_.o link_.o getlog_.o ttynam_.o getcwd_.o symlnk_.o \
-        vxttime_.o vxtidate_.o gmtime_.o fdate_.o secnds_.o \
-	bes.o dbes.o \
-	chdir_.o chmod_.o lnblnk_.o hostnm_.o rename_.o fgetc_.o fputc_.o \
-        umask_.o system_clock_.o date_.o second_.o flush1_.o mclock_.o \
-	alarm_.o
-SRCS =  Version.c gerror_.c perror_.c ierrno_.c itime_.c time_.c \
-	unlink_.c fnum_.c getpid_.c getuid_.c getgid_.c kill_.c rand_.c \
-	srand_.c irand_.c sleep_.c idate_.c ctime_.c etime_.c \
-	dtime_.c isatty_.c ltime_.c fstat_.c stat_.c \
-	lstat_.c access_.c link_.c getlog_.c ttynam_.c getcwd_.c symlnk_.c \
-        vxttime_.c vxtidate_.c gmtime_.c fdate_.c secnds_.c \
-	bes.c dbes.c \
-	chdir_.c chmod_.c lnblnk_.c hostnm_.c rename_.c fgetc_.c fputc_.c \
-	umask_.c system_clock_.c date_.c second_.c flush1_.c mclock_.c \
-	alarm_.c
-
-F2C_H = ../../../include/f2c.h
-
-all: $(OBJS)
-
-VersionU.o: Version.c
-	$(CC) -c $(CGFLAGS) -o $@ $(srcdir)/Version.c
-
-lint:
-	lint $(CFLAGS) $(SRCS)
-
-mostlyclean:
-	-rm -f $(OBJS)
-
-clean: mostlyclean
-	-rm -f config.log a.out
-
-distclean realclean maintainer-clean: clean
-	-rm -f config.h Makefile config.status config.cache stage? include
-
-$(OBJS): $(F2C_H) config.h
-
-check:
-	-$(G77DIR)g77 --driver=$(G77DIR)/xgcc -B$(G77DIR) -g $(srcdir)/u77-test.f $(lib) && ./a.out
-	rm -f a.out
-
-access_.o: access_.c
-ctime_.o: ctime_.c
-dtime_.o: dtime_.c
-etime_.o: etime_.c
-fnum_.o: fnum_.c $(srcdir)/../libI77/fio.h
-fstat_.o: fstat_.c
-gerror_.o: gerror_.c
-getcwd_.o: getcwd_.c
-getgid_.o: getgid_.c
-getlog_.o: getlog_.c
-getpid_.o: getpid_.c
-getuid_.o: getuid_.c
-idate_.o: idate_.c
-ierrno_.o: ierrno_.c
-irand_.o: irand_.c
-isatty_.o: isatty_.c $(srcdir)/../libI77/fio.h
-itime_.o: itime_.c
-kill_.o: kill_.c
-link_.o: link_.c
-loc_.o: loc_.c
-lstat_.o: lstat_.c
-ltime_.o: ltime_.c
-perror_.o: perror_.c
-qsort.o: qsort.c
-qsort_.o: qsort_.c
-rand_.o: rand_.c
-rename_.o: rename_.c
-second_.o: second_.c
-sleep_.o: sleep_.c
-srand_.o: srand_.c
-stat_.o: stat_.c
-symlnk_.o: symlnk_.c
-time_.o: time_.c
-ttynam_.o: ttynam_.c
-unlink_.o: unlink_.c
-wait_.o: wait_.c
-vxttime_.o: vxttime_.c
-vtxidate_.o: vxtidate_.c
-fdate_.o: fdate_.c
-gmtime_.o: gmtime_.c
-secnds_.o: secnds_.c
-bes.o: bes.c
-dbes.o: dbes.c
-lnblnk_.o: lnblnk_.c
-chmod_.o: chmod_.c
-chdir_.o: chdir_.c
-hostnm_.o: hostnm_.c
-rename_.o: rename_.c
-fputc_.o: fputc_.c
-fgetc_.o: fgetc_.c
-system_clock_.o: system_clock_.c
-umask_.o: umask_.c
-flush1_.o: flush1_.c
-mclock_.o: mclock_.c
-alarm_.o: alarm_.c
-
-.PHONY: mostlyclean clean distclean maintainer-clean lint check all
diff --git a/gcc/f/runtime/libU77/PROJECTS b/gcc/f/runtime/libU77/PROJECTS
deleted file mode 100644
index 0cf1383..0000000
--- a/gcc/f/runtime/libU77/PROJECTS
+++ /dev/null
@@ -1,10 +0,0 @@
-                                                    -*- indented-text-*-
-
-* Interface to strget
-
-* Non-blocking (`asynchronous') i/o (per c.l.f. discussion)
-
-* `ioinit'-type routine for various i/o options
-
-* IEEE/VAX/... number format conversion (or XDR interface).  This
-  might be made optionally transparent per logical unit a la DECtran.
diff --git a/gcc/f/runtime/libU77/README b/gcc/f/runtime/libU77/README
deleted file mode 100644
index 9033a49..0000000
--- a/gcc/f/runtime/libU77/README
+++ /dev/null
@@ -1,40 +0,0 @@
-19970811						    -*-text-*-
-
-g77 libU77
-----------
-
-This directory contains an implementation of most of the `traditional'
-Unix libU77 routines, mostly an interface to libc and libm routines
-and some extra ones for time and date etc.  It's intended for use with
-g77, to whose configuration procedure it's currently tied, but should
-be compatible with f2c otherwise, if using the same f2c.h.
-
-The contents of libU77 and its interfaces aren't consistent across
-implementations.  This one is mostly taken from documentation for (an
-old version of) the Convex implementation and the v2 SunPro one.
-As of g77 version 0.5.20, most of these routines have been made
-into g77 intrinsics.  Some routines have a version with a name prefixed
-by `vxt', corresponding to the VMS Fortran versions, and these should
-be integrated with g77's intrinsics visibility control.
-
-A few routines are currently missing; in the case of `fork', for
-instance, because they're probably not useful, and in the case of
-`qsort' and those for stream-based i/o handling, because they need
-more effort/research.  The configuration should weed out those few
-which correspond to facilities which may not be present on some Unix
-systems, such as symbolic links.  It's unclear whether the interfaces
-to the native library random number routines should be retained, since
-their implementation is likely to be something one should avoid
-assiduously.
-
-This library has been tested it under SunOS4.1.3 and Irix5.2 and there
-has been some feedback from Linux; presumably potential problems lie
-mainly with systems with impoverished native C library support which
-haven't been properly taken care of with autoconf.
-
-There's another GPL'd implementation of this stuff which I only found
-out about recently (despite having looked) and I haven't yet checked
-how they should be amalgamated.
-
-Dave Love <d.love@dl.ac.uk>  Aug '95
-(minor changes by Craig Burley <burley@gnu.ai.mit.edu> Aug '97)
diff --git a/gcc/f/runtime/libU77/Version.c b/gcc/f/runtime/libU77/Version.c
deleted file mode 100644
index 88a2907..0000000
--- a/gcc/f/runtime/libU77/Version.c
+++ /dev/null
@@ -1,12 +0,0 @@
-static char junk[] = "\n@(#) LIBU77 VERSION 19970609\n";
-
-char __G77_LIBU77_VERSION__[] = "0.5.21";
-
-#include <stdio.h>
-
-void
-g77__uvers__ ()
-{
-  fprintf (stderr, "__G77_LIBU77_VERSION__: %s", __G77_LIBU77_VERSION__);
-  fputs (junk, stderr);
-}
diff --git a/gcc/f/runtime/libU77/access_.c b/gcc/f/runtime/libU77/access_.c
deleted file mode 100644
index 1699ef0..0000000
--- a/gcc/f/runtime/libU77/access_.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/* Copyright (C) 1995, 1997 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-#if HAVE_STDLIB_H
-#  include <stdlib.h>
-#else
-#  include <stdio.h>		/* for NULL */
-#endif
-
-#include <errno.h>
-#include <limits.h>
-#include "f2c.h"
-
-#ifndef R_OK			/* for SVR1-2 */
-#  define R_OK 4
-#endif
-#ifndef W_OK
-#  define W_OK 2
-#endif
-#ifndef X_OK
-#  define X_OK 1
-#endif
-#ifndef F_OK
-#  define F_OK 0
-#endif
-
-#ifdef KR_headers
-void g_char ();
-
-integer G77_access_0 (name, mode, Lname, Lmode)
-     char *name, *mode;
-     ftnlen Lname, Lmode;
-#else
-void g_char(const char *a, ftnlen alen, char *b);
-
-integer G77_access_0 (const char *name, const char *mode, ftnlen Lname, ftnlen Lmode)
-#endif
-{
-  char *buff;
-  char *bp, *blast;
-  int amode, i;
-
-  buff = malloc (Lname+1);
-  if (buff == NULL) return -1;
-  g_char (name, Lname, buff);
-  amode = 0;
-  for (i=0;i<Lmode;i++) {
-    switch (mode[i]) {
-    case 'r': amode |= R_OK; break;
-    case 'w': amode |= W_OK; break;
-    case 'x': amode |= X_OK; break;
-    case ' ': amode |= F_OK; break; /* as per Sun, at least */
-    default: return EINVAL;
-    }
-  }
-  i = access (buff, amode);
-  free (buff);
-  return i;
-}
diff --git a/gcc/f/runtime/libU77/acconfig.h b/gcc/f/runtime/libU77/acconfig.h
deleted file mode 100644
index 12bba85..0000000
--- a/gcc/f/runtime/libU77/acconfig.h
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Define as the path of the `chmod' program. */
-#undef CHMOD_PATH
diff --git a/gcc/f/runtime/libU77/alarm_.c b/gcc/f/runtime/libU77/alarm_.c
deleted file mode 100644
index b1c347d..0000000
--- a/gcc/f/runtime/libU77/alarm_.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#if HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-
-#include "f2c.h"
-
-#ifndef RETSIGTYPE
-/* we shouldn't rely on this... */
-#ifdef KR_headers
-#define RETSIGTYPE int
-#else
-#define RETSIGTYPE void
-#endif
-#endif
-typedef RETSIGTYPE (*sig_type)();
-
-#ifdef KR_headers
-extern sig_type signal();
-
-integer G77_alarm_0 (seconds, proc)
-     integer *seconds;
-     sig_type proc;
-#else
-#include <signal.h>
-typedef int (*sig_proc)(int);
-
-integer G77_alarm_0 (integer *seconds, sig_proc proc)
-#endif
-{
-  int status;
-
-  if (signal(SIGALRM, (sig_type)proc) == SIG_ERR)
-    status = -1;
-  else
-    status = alarm (*seconds);
-  return status;
-}
diff --git a/gcc/f/runtime/libU77/bes.c b/gcc/f/runtime/libU77/bes.c
deleted file mode 100644
index 442337f..0000000
--- a/gcc/f/runtime/libU77/bes.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#if 0 	/* Don't include these unless necessary -- jcb. */
-#include "f2c.h"
-#include <math.h>
-
-double G77_besj0_0 (const real *x) {
-    return j0 (*x);
-}
-
-double G77_besj1_0 (const real *x) {
-    return j1 (*x);
-}
-
-double G77_besjn_0 (const integer *n, real *x) {
-     return jn (*n, *x);
- }
-
-double G77_besy0_0 (const real *x) {
-    return y0 (*x);
-}
-
-double G77_besy1_0 (const real *x) {
-    return y1 (*x);
-}
-
-double G77_besyn_0 (const integer *n, real *x) {
-    return yn (*n, *x);
-}
-#endif
diff --git a/gcc/f/runtime/libU77/chdir_.c b/gcc/f/runtime/libU77/chdir_.c
deleted file mode 100644
index 500be54..0000000
--- a/gcc/f/runtime/libU77/chdir_.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Copyright (C) 1995, 1997 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-#if HAVE_STDLIB_H
-#  include <stdlib.h>
-#else
-#  include <stdio.h>
-#endif
-
-#include <errno.h>
-#include "f2c.h"
-
-
-#ifdef KR_headers
-void g_char ();
-
-integer G77_chdir_0 (name, Lname)
-     char *name;
-     ftnlen Lname;
-#else
-void g_char(const char *a, ftnlen alen, char *b);
-
-integer G77_chdir_0 (const char *name, const ftnlen Lname)
-#endif
-{
-  char *buff;
-  char *bp, *blast;
-  int i;
-
-  buff = malloc (Lname+1);
-  if (buff == NULL) return -1;
-  g_char (name, Lname, buff);
-  i = chdir (buff);
-  free (buff);
-  return i ? errno : 0;
-}
diff --git a/gcc/f/runtime/libU77/chmod_.c b/gcc/f/runtime/libU77/chmod_.c
deleted file mode 100644
index 9797b80..0000000
--- a/gcc/f/runtime/libU77/chmod_.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Copyright (C) 1995, 1997 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-
-/* This definitely shouldn't be done this way -- should canibalise
-   chmod(1) from GNU or BSD. */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-#if HAVE_STDLIB_H
-#  include <stdlib.h>
-#else
-#  include <stdio.h>		/* for NULL */
-#endif
-
-#include "f2c.h"
-
-#ifndef CHMOD_PATH
-#define CHMOD_PATH "/bin/chmod"
-#endif
-
-#ifdef KR_headers
-extern void s_cat ();
-void g_char ();
-
-integer G77_chmod_0 (name, mode, Lname, Lmode)
-     char *name, *mode;
-     ftnlen Lname, Lmode;
-#else
-extern void s_cat(char *lp, char *rpp[], ftnlen rnp[], ftnlen *np, ftnlen ll);
-void g_char(const char *a, ftnlen alen, char *b);
-
-integer G77_chmod_0 (/* const */ char *name, /* const */ char *mode, const ftnlen Lname, const ftnlen Lmode)
-#endif
-{
-  char *buff;
-  char *bp, *blast;
-  int i;
-  ftnlen l, l2;
-  ftnlen six = 6;
-  address a[6];
-  ftnlen ii[6];
-  char chmod_path [] = CHMOD_PATH;
-  l = strlen (chmod_path);
-  buff = malloc (Lname+Lmode+l+3+13+1);
-  if (buff == NULL) return -1;
-  ii[0] = l; a[0] = chmod_path;
-  ii[1] = 1; a[1] = " ";
-  ii[2] = Lmode; a[2] = mode;
-  ii[3] = 2; a[3] = " '";
-  for (l2=Lname; (l2 > 1) && (name[l2-1] == ' '); )
-    l2--;
-  ii[4] = l2; a[4] = name;
-  ii[5] = 13; a[5] = "' 2>/dev/null";
-  s_cat (buff, a, ii, &six, Lname+Lmode+l+3+13);
-  buff[Lname+Lmode+l+3+13] = '\0';
-  i = system (buff);
-  free (buff);
-  return i;
-}
diff --git a/gcc/f/runtime/libU77/config.h.in b/gcc/f/runtime/libU77/config.h.in
deleted file mode 100644
index 45ada20..0000000
--- a/gcc/f/runtime/libU77/config.h.in
+++ /dev/null
@@ -1,73 +0,0 @@
-/* config.h.in.  Generated automatically from configure.in by autoheader.  */
-
-/* Define to empty if the keyword does not work.  */
-#undef const
-
-/* Define if your struct stat has st_blksize.  */
-#undef HAVE_ST_BLKSIZE
-
-/* Define if your struct stat has st_blocks.  */
-#undef HAVE_ST_BLOCKS
-
-/* Define if your struct stat has st_rdev.  */
-#undef HAVE_ST_RDEV
-
-/* Define to `int' if <sys/types.h> doesn't define.  */
-#undef mode_t
-
-/* Define to `int' if <sys/types.h> doesn't define.  */
-#undef pid_t
-
-/* Define to `unsigned' if <sys/types.h> doesn't define.  */
-#undef size_t
-
-/* Define if you have the ANSI C header files.  */
-#undef STDC_HEADERS
-
-/* Define if you can safely include both <sys/time.h> and <time.h>.  */
-#undef TIME_WITH_SYS_TIME
-
-/* Define if your <sys/time.h> declares struct tm.  */
-#undef TM_IN_SYS_TIME
-
-/* Define as the path of the `chmod' program. */
-#undef CHMOD_PATH
-
-/* Define if you have the clock function.  */
-#undef HAVE_CLOCK
-
-/* Define if you have the getcwd function.  */
-#undef HAVE_GETCWD
-
-/* Define if you have the gethostname function.  */
-#undef HAVE_GETHOSTNAME
-
-/* Define if you have the getrusage function.  */
-#undef HAVE_GETRUSAGE
-
-/* Define if you have the getwd function.  */
-#undef HAVE_GETWD
-
-/* Define if you have the lstat function.  */
-#undef HAVE_LSTAT
-
-/* Define if you have the strerror function.  */
-#undef HAVE_STRERROR
-
-/* Define if you have the symlink function.  */
-#undef HAVE_SYMLINK
-
-/* Define if you have the <limits.h> header file.  */
-#undef HAVE_LIMITS_H
-
-/* Define if you have the <stdlib.h> header file.  */
-#undef HAVE_STDLIB_H
-
-/* Define if you have the <string.h> header file.  */
-#undef HAVE_STRING_H
-
-/* Define if you have the <sys/time.h> header file.  */
-#undef HAVE_SYS_TIME_H
-
-/* Define if you have the <unistd.h> header file.  */
-#undef HAVE_UNISTD_H
diff --git a/gcc/f/runtime/libU77/configure b/gcc/f/runtime/libU77/configure
deleted file mode 100755
index 63fb0e7..0000000
--- a/gcc/f/runtime/libU77/configure
+++ /dev/null
@@ -1,1758 +0,0 @@
-#! /bin/sh
-
-# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.12 
-# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-
-# Defaults:
-ac_help=
-ac_default_prefix=/usr/local
-# Any additions from configure.in:
-
-# Initialize some variables set by options.
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-build=NONE
-cache_file=./config.cache
-exec_prefix=NONE
-host=NONE
-no_create=
-nonopt=NONE
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-target=NONE
-verbose=
-x_includes=NONE
-x_libraries=NONE
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
-
-# Initialize some other variables.
-subdirs=
-MFLAGS= MAKEFLAGS=
-# Maximum number of lines to put in a shell here document.
-ac_max_here_lines=12
-
-ac_prev=
-for ac_option
-do
-
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval "$ac_prev=\$ac_option"
-    ac_prev=
-    continue
-  fi
-
-  case "$ac_option" in
-  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
-  *) ac_optarg= ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case "$ac_option" in
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir="$ac_optarg" ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build="$ac_optarg" ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file="$ac_optarg" ;;
-
-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
-  | --da=*)
-    datadir="$ac_optarg" ;;
-
-  -disable-* | --disable-*)
-    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
-      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
-    fi
-    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
-    eval "enable_${ac_feature}=no" ;;
-
-  -enable-* | --enable-*)
-    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
-      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
-    fi
-    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
-    case "$ac_option" in
-      *=*) ;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "enable_${ac_feature}='$ac_optarg'" ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix="$ac_optarg" ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he)
-    # Omit some internal or obsolete options to make the list less imposing.
-    # This message is too long to be a string in the A/UX 3.1 sh.
-    cat << EOF
-Usage: configure [options] [host]
-Options: [defaults in brackets after descriptions]
-Configuration:
-  --cache-file=FILE       cache test results in FILE
-  --help                  print this message
-  --no-create             do not create output files
-  --quiet, --silent       do not print \`checking...' messages
-  --version               print the version of autoconf that created configure
-Directory and file names:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [same as prefix]
-  --bindir=DIR            user executables in DIR [EPREFIX/bin]
-  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
-  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
-  --datadir=DIR           read-only architecture-independent data in DIR
-                          [PREFIX/share]
-  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
-                          [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
-  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
-  --includedir=DIR        C header files in DIR [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
-  --infodir=DIR           info documentation in DIR [PREFIX/info]
-  --mandir=DIR            man documentation in DIR [PREFIX/man]
-  --srcdir=DIR            find the sources in DIR [configure dir or ..]
-  --program-prefix=PREFIX prepend PREFIX to installed program names
-  --program-suffix=SUFFIX append SUFFIX to installed program names
-  --program-transform-name=PROGRAM
-                          run sed PROGRAM on installed program names
-EOF
-    cat << EOF
-Host type:
-  --build=BUILD           configure for building on BUILD [BUILD=HOST]
-  --host=HOST             configure for HOST [guessed]
-  --target=TARGET         configure for TARGET [TARGET=HOST]
-Features and packages:
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --x-includes=DIR        X include files are in DIR
-  --x-libraries=DIR       X library files are in DIR
-EOF
-    if test -n "$ac_help"; then
-      echo "--enable and --with options recognized:$ac_help"
-    fi
-    exit 0 ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host="$ac_optarg" ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir="$ac_optarg" ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir="$ac_optarg" ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir="$ac_optarg" ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir="$ac_optarg" ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst \
-  | --locals | --local | --loca | --loc | --lo)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
-    localstatedir="$ac_optarg" ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir="$ac_optarg" ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir="$ac_optarg" ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix="$ac_optarg" ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix="$ac_optarg" ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix="$ac_optarg" ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name="$ac_optarg" ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir="$ac_optarg" ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir="$ac_optarg" ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site="$ac_optarg" ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir="$ac_optarg" ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir="$ac_optarg" ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target="$ac_optarg" ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers)
-    echo "configure generated by autoconf version 2.12"
-    exit 0 ;;
-
-  -with-* | --with-*)
-    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
-      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
-    fi
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case "$ac_option" in
-      *=*) ;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "with_${ac_package}='$ac_optarg'" ;;
-
-  -without-* | --without-*)
-    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
-      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
-    fi
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    eval "with_${ac_package}=no" ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes="$ac_optarg" ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries="$ac_optarg" ;;
-
-  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
-    ;;
-
-  *)
-    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
-      echo "configure: warning: $ac_option: invalid host type" 1>&2
-    fi
-    if test "x$nonopt" != xNONE; then
-      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
-    fi
-    nonopt="$ac_option"
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
-fi
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-# File descriptor usage:
-# 0 standard input
-# 1 file creation
-# 2 errors and warnings
-# 3 some systems may open it to /dev/tty
-# 4 used on the Kubota Titan
-# 6 checking for... messages and results
-# 5 compiler messages saved in config.log
-if test "$silent" = yes; then
-  exec 6>/dev/null
-else
-  exec 6>&1
-fi
-exec 5>./config.log
-
-echo "\
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-" 1>&5
-
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Also quote any args containing shell metacharacters.
-ac_configure_args=
-for ac_arg
-do
-  case "$ac_arg" in
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c) ;;
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
-  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
-  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
-  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
-  esac
-done
-
-# NLS nuisances.
-# Only set these to C if already set.  These must not be set unconditionally
-# because not all systems understand e.g. LANG=C (notably SCO).
-# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
-# Non-C LC_CTYPE values break the ctype check.
-if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
-if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
-if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
-if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo > confdefs.h
-
-# A filename unique to this package, relative to the directory that
-# configure is in, which we can look for to find out if srcdir is correct.
-ac_unique_file=access_.c
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then its parent.
-  ac_prog=$0
-  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
-  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
-  srcdir=$ac_confdir
-  if test ! -r $srcdir/$ac_unique_file; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r $srcdir/$ac_unique_file; then
-  if test "$ac_srcdir_defaulted" = yes; then
-    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
-  else
-    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
-  fi
-fi
-srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
-
-# Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
-  fi
-fi
-for ac_site_file in $CONFIG_SITE; do
-  if test -r "$ac_site_file"; then
-    echo "loading site script $ac_site_file"
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  echo "loading cache $cache_file"
-  . $cache_file
-else
-  echo "creating cache $cache_file"
-  > $cache_file
-fi
-
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
-  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
-  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
-    ac_n= ac_c='
-' ac_t='	'
-  else
-    ac_n=-n ac_c= ac_t=
-  fi
-else
-  ac_n= ac_c='\c' ac_t=
-fi
-
-
-
-
-# For g77 we'll set CC to point at the built gcc, but this will get it into
-# the makefiles
-# Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:529: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_CC="gcc"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-fi
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
-  echo "$ac_t""$CC" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:558: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  ac_prog_rejected=no
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
-        ac_prog_rejected=yes
-	continue
-      fi
-      ac_cv_prog_CC="cc"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# -gt 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    set dummy "$ac_dir/$ac_word" "$@"
-    shift
-    ac_cv_prog_CC="$@"
-  fi
-fi
-fi
-fi
-CC="$ac_cv_prog_CC"
-if test -n "$CC"; then
-  echo "$ac_t""$CC" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
-fi
-
-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:606: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
-
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-cat > conftest.$ac_ext <<EOF
-#line 616 "configure"
-#include "confdefs.h"
-main(){return(0);}
-EOF
-if { (eval echo configure:620: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-  ac_cv_prog_cc_works=yes
-  # If we can't run a trivial program, we are probably using a cross compiler.
-  if (./conftest; exit) 2>/dev/null; then
-    ac_cv_prog_cc_cross=no
-  else
-    ac_cv_prog_cc_cross=yes
-  fi
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  ac_cv_prog_cc_works=no
-fi
-rm -fr conftest*
-
-echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
-if test $ac_cv_prog_cc_works = no; then
-  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
-fi
-echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:640: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
-echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
-cross_compiling=$ac_cv_prog_cc_cross
-
-echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:645: checking whether we are using GNU C" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.c <<EOF
-#ifdef __GNUC__
-  yes;
-#endif
-EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:654: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
-  ac_cv_prog_gcc=yes
-else
-  ac_cv_prog_gcc=no
-fi
-fi
-
-echo "$ac_t""$ac_cv_prog_gcc" 1>&6
-
-if test $ac_cv_prog_gcc = yes; then
-  GCC=yes
-  ac_test_CFLAGS="${CFLAGS+set}"
-  ac_save_CFLAGS="$CFLAGS"
-  CFLAGS=
-  echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:669: checking whether ${CC-cc} accepts -g" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  echo 'void f(){}' > conftest.c
-if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
-  ac_cv_prog_cc_g=yes
-else
-  ac_cv_prog_cc_g=no
-fi
-rm -f conftest*
-
-fi
-
-echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
-  if test "$ac_test_CFLAGS" = set; then
-    CFLAGS="$ac_save_CFLAGS"
-  elif test $ac_cv_prog_cc_g = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-O2"
-  fi
-else
-  GCC=
-  test "${CFLAGS+set}" = set || CFLAGS="-g"
-fi
-
-if test "$CROSS";then
-  ac_cv_c_cross=yes
-else
-  ac_cv_c_cross=no
-fi
-
-# Extract the first word of "chmod", so it can be a program name with args.
-set dummy chmod; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:705: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_ac_cv_prog_chmod'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  case "$ac_cv_prog_chmod" in
-  /*)
-  ac_cv_path_ac_cv_prog_chmod="$ac_cv_prog_chmod" # Let the user override the test with a path.
-  ;;
-  *)
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_path_ac_cv_prog_chmod="$ac_dir/$ac_word"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_ac_cv_prog_chmod" && ac_cv_path_ac_cv_prog_chmod="no"
-  ;;
-esac
-fi
-ac_cv_prog_chmod="$ac_cv_path_ac_cv_prog_chmod"
-if test -n "$ac_cv_prog_chmod"; then
-  echo "$ac_t""$ac_cv_prog_chmod" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-if test "$ac_cv_prog_chmod" != no || test "$CROSS"; then
-  MAYBES=chmod_.o
-  cat >> confdefs.h <<EOF
-#define CHMOD_PATH "$ac_cv_prog_chmod"
-EOF
-
-else
-  MAYBES=""
-fi
-
-if test "$ac_cv_c_cross" = yes; then
-  RANLIB=$RANLIB_FOR_TARGET
-  AR=$AR_FOR_TARGET
-  
-else
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:752: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_RANLIB="ranlib"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
-fi
-fi
-RANLIB="$ac_cv_prog_RANLIB"
-if test -n "$RANLIB"; then
-  echo "$ac_t""$RANLIB" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-  AR=ar
-  RANLIB_TEST=true
-fi
-
-
-
-echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:785: checking how to run the C preprocessor" >&5
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-    # This must be in double quotes, not single quotes, because CPP may get
-  # substituted into the Makefile and "${CC-cc}" will confuse make.
-  CPP="${CC-cc} -E"
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp.
-  cat > conftest.$ac_ext <<EOF
-#line 800 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:806: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out`
-if test -z "$ac_err"; then
-  :
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  CPP="${CC-cc} -E -traditional-cpp"
-  cat > conftest.$ac_ext <<EOF
-#line 817 "configure"
-#include "confdefs.h"
-#include <assert.h>
-Syntax Error
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:823: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out`
-if test -z "$ac_err"; then
-  :
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  CPP=/lib/cpp
-fi
-rm -f conftest*
-fi
-rm -f conftest*
-  ac_cv_prog_CPP="$CPP"
-fi
-  CPP="$ac_cv_prog_CPP"
-else
-  ac_cv_prog_CPP="$CPP"
-fi
-echo "$ac_t""$CPP" 1>&6
-
-echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:846: checking for ANSI C header files" >&5
-if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 851 "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:859: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out`
-if test -z "$ac_err"; then
-  rm -rf conftest*
-  ac_cv_header_stdc=yes
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-cat > conftest.$ac_ext <<EOF
-#line 876 "configure"
-#include "confdefs.h"
-#include <string.h>
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "memchr" >/dev/null 2>&1; then
-  :
-else
-  rm -rf conftest*
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-cat > conftest.$ac_ext <<EOF
-#line 894 "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "free" >/dev/null 2>&1; then
-  :
-else
-  rm -rf conftest*
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-if test "$cross_compiling" = yes; then
-  :
-else
-  cat > conftest.$ac_ext <<EOF
-#line 915 "configure"
-#include "confdefs.h"
-#include <ctype.h>
-#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int main () { int i; for (i = 0; i < 256; i++)
-if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
-exit (0); }
-
-EOF
-if { (eval echo configure:926: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
-then
-  :
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  ac_cv_header_stdc=no
-fi
-rm -fr conftest*
-fi
-
-fi
-fi
-
-echo "$ac_t""$ac_cv_header_stdc" 1>&6
-if test $ac_cv_header_stdc = yes; then
-  cat >> confdefs.h <<\EOF
-#define STDC_HEADERS 1
-EOF
-
-fi
-
-
-echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:951: checking whether time.h and sys/time.h may both be included" >&5
-if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 956 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <sys/time.h>
-#include <time.h>
-int main() {
-struct tm *tp;
-; return 0; }
-EOF
-if { (eval echo configure:965: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  ac_cv_header_time=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_header_time=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_header_time" 1>&6
-if test $ac_cv_header_time = yes; then
-  cat >> confdefs.h <<\EOF
-#define TIME_WITH_SYS_TIME 1
-EOF
-
-fi
-
-for ac_hdr in limits.h unistd.h sys/time.h string.h stdlib.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:989: checking for $ac_hdr" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 994 "configure"
-#include "confdefs.h"
-#include <$ac_hdr>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:999: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out`
-if test -z "$ac_err"; then
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=yes"
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-
-echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:1027: checking for working const" >&5
-if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1032 "configure"
-#include "confdefs.h"
-
-int main() {
-
-/* Ultrix mips cc rejects this.  */
-typedef int charset[2]; const charset x;
-/* SunOS 4.1.1 cc rejects this.  */
-char const *const *ccp;
-char **p;
-/* NEC SVR4.0.2 mips cc rejects this.  */
-struct point {int x, y;};
-static struct point const zero = {0,0};
-/* AIX XL C 1.02.0.0 rejects this.
-   It does not let you subtract one const X* pointer from another in an arm
-   of an if-expression whose if-part is not a constant expression */
-const char *g = "string";
-ccp = &g + (g ? g-g : 0);
-/* HPUX 7.0 cc rejects these. */
-++ccp;
-p = (char**) ccp;
-ccp = (char const *const *) p;
-{ /* SCO 3.2v4 cc rejects this.  */
-  char *t;
-  char const *s = 0 ? (char *) 0 : (char const *) 0;
-
-  *t++ = 0;
-}
-{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
-  int x[] = {25, 17};
-  const int *foo = &x[0];
-  ++foo;
-}
-{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
-  typedef const int *iptr;
-  iptr p = 0;
-  ++p;
-}
-{ /* AIX XL C 1.02.0.0 rejects this saying
-     "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
-  struct s { int j; const int *ap[3]; };
-  struct s *b; b->j = 5;
-}
-{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
-  const int foo = 10;
-}
-
-; return 0; }
-EOF
-if { (eval echo configure:1081: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  ac_cv_c_const=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_c_const=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_c_const" 1>&6
-if test $ac_cv_c_const = no; then
-  cat >> confdefs.h <<\EOF
-#define const 
-EOF
-
-fi
-
-echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:1102: checking for size_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1107 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
-  rm -rf conftest*
-  ac_cv_type_size_t=yes
-else
-  rm -rf conftest*
-  ac_cv_type_size_t=no
-fi
-rm -f conftest*
-
-fi
-echo "$ac_t""$ac_cv_type_size_t" 1>&6
-if test $ac_cv_type_size_t = no; then
-  cat >> confdefs.h <<\EOF
-#define size_t unsigned
-EOF
-
-fi
-
-echo $ac_n "checking for mode_t""... $ac_c" 1>&6
-echo "configure:1135: checking for mode_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1140 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
-  rm -rf conftest*
-  ac_cv_type_mode_t=yes
-else
-  rm -rf conftest*
-  ac_cv_type_mode_t=no
-fi
-rm -f conftest*
-
-fi
-echo "$ac_t""$ac_cv_type_mode_t" 1>&6
-if test $ac_cv_type_mode_t = no; then
-  cat >> confdefs.h <<\EOF
-#define mode_t int
-EOF
-
-fi
-
-
-echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:1169: checking for pid_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1174 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
-EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "pid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
-  rm -rf conftest*
-  ac_cv_type_pid_t=yes
-else
-  rm -rf conftest*
-  ac_cv_type_pid_t=no
-fi
-rm -f conftest*
-
-fi
-echo "$ac_t""$ac_cv_type_pid_t" 1>&6
-if test $ac_cv_type_pid_t = no; then
-  cat >> confdefs.h <<\EOF
-#define pid_t int
-EOF
-
-fi
-
-echo $ac_n "checking for st_blksize in struct stat""... $ac_c" 1>&6
-echo "configure:1202: checking for st_blksize in struct stat" >&5
-if eval "test \"`echo '$''{'ac_cv_struct_st_blksize'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1207 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-int main() {
-struct stat s; s.st_blksize;
-; return 0; }
-EOF
-if { (eval echo configure:1215: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  ac_cv_struct_st_blksize=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_struct_st_blksize=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_struct_st_blksize" 1>&6
-if test $ac_cv_struct_st_blksize = yes; then
-  cat >> confdefs.h <<\EOF
-#define HAVE_ST_BLKSIZE 1
-EOF
-
-fi
-
-echo $ac_n "checking for st_blocks in struct stat""... $ac_c" 1>&6
-echo "configure:1236: checking for st_blocks in struct stat" >&5
-if eval "test \"`echo '$''{'ac_cv_struct_st_blocks'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1241 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-int main() {
-struct stat s; s.st_blocks;
-; return 0; }
-EOF
-if { (eval echo configure:1249: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  ac_cv_struct_st_blocks=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_struct_st_blocks=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_struct_st_blocks" 1>&6
-if test $ac_cv_struct_st_blocks = yes; then
-  cat >> confdefs.h <<\EOF
-#define HAVE_ST_BLOCKS 1
-EOF
-
-else
-  LIBOBJS="$LIBOBJS fileblocks.o"
-fi
-
-echo $ac_n "checking for st_rdev in struct stat""... $ac_c" 1>&6
-echo "configure:1272: checking for st_rdev in struct stat" >&5
-if eval "test \"`echo '$''{'ac_cv_struct_st_rdev'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1277 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-int main() {
-struct stat s; s.st_rdev;
-; return 0; }
-EOF
-if { (eval echo configure:1285: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  ac_cv_struct_st_rdev=yes
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_struct_st_rdev=no
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_struct_st_rdev" 1>&6
-if test $ac_cv_struct_st_rdev = yes; then
-  cat >> confdefs.h <<\EOF
-#define HAVE_ST_RDEV 1
-EOF
-
-fi
-
-echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
-echo "configure:1306: checking whether struct tm is in sys/time.h or time.h" >&5
-if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1311 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <time.h>
-int main() {
-struct tm *tp; tp->tm_sec;
-; return 0; }
-EOF
-if { (eval echo configure:1319: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  ac_cv_struct_tm=time.h
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  ac_cv_struct_tm=sys/time.h
-fi
-rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_struct_tm" 1>&6
-if test $ac_cv_struct_tm = sys/time.h; then
-  cat >> confdefs.h <<\EOF
-#define TM_IN_SYS_TIME 1
-EOF
-
-fi
-
-
-
-for ac_func in symlink getcwd getwd lstat gethostname strerror clock getrusage
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1344: checking for $ac_func" >&5
-if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1349 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func(); below.  */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char $ac_func();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:1372: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-  rm -rf conftest*
-  eval "ac_cv_func_$ac_func=yes"
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_func_$ac_func=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_func 1
-EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-test $ac_cv_func_symlink = yes && MAYBES="$MAYBES symlnk_.o"
-test $ac_cv_func_lstat = yes && MAYBES="$MAYBES lstat_.o"
-test $ac_cv_func_gethostname = yes && MAYBES="$MAYBES hostnm_.o"
-test $ac_cv_func_clock = yes && MAYBES="$MAYBES mclock_.o"
-
-
-
-
-
-
-
-trap '' 1 2 15
-cat > confcache <<\EOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs.  It is not useful on other systems.
-# If it contains results you don't want to keep, you may remove or edit it.
-#
-# By default, configure uses ./config.cache as the cache file,
-# creating it if it does not exist already.  You can give configure
-# the --cache-file=FILE option to use a different cache file; that is
-# what configure does when it calls configure scripts in
-# subdirectories, so they share the cache.
-# Giving --cache-file=/dev/null disables caching, for debugging configure.
-# config.status only pays attention to the cache file if you give it the
-# --recheck option to rerun configure.
-#
-EOF
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(set) 2>&1 |
-  case `(ac_space=' '; set) 2>&1` in
-  *ac_space=\ *)
-    # `set' does not quote correctly, so add quotes (double-quote substitution
-    # turns \\\\ into \\, and sed turns \\ into \).
-    sed -n \
-      -e "s/'/'\\\\''/g" \
-      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
-    ;;
-  *)
-    # `set' quotes correctly as required by POSIX, so do not add quotes.
-    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
-    ;;
-  esac >> confcache
-if cmp -s $cache_file confcache; then
-  :
-else
-  if test -w $cache_file; then
-    echo "updating cache $cache_file"
-    cat confcache > $cache_file
-  else
-    echo "not updating unwritable cache $cache_file"
-  fi
-fi
-rm -f confcache
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# Any assignment to VPATH causes Sun make to only execute
-# the first set of double-colon rules, so remove it if not needed.
-# If there is a colon in the path, we need to keep it.
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
-fi
-
-trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
-
-DEFS=-DHAVE_CONFIG_H
-
-# Without the "./", some shells look in PATH for config.status.
-: ${CONFIG_STATUS=./config.status}
-
-echo creating $CONFIG_STATUS
-rm -f $CONFIG_STATUS
-cat > $CONFIG_STATUS <<EOF
-#! /bin/sh
-# Generated automatically by configure.
-# Run this file to recreate the current configuration.
-# This directory was configured as follows,
-# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-#
-# $0 $ac_configure_args
-#
-# Compiler output produced by configure, useful for debugging
-# configure, is in ./config.log if it exists.
-
-ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
-for ac_option
-do
-  case "\$ac_option" in
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
-    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
-  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
-    echo "$CONFIG_STATUS generated by autoconf version 2.12"
-    exit 0 ;;
-  -help | --help | --hel | --he | --h)
-    echo "\$ac_cs_usage"; exit 0 ;;
-  *) echo "\$ac_cs_usage"; exit 1 ;;
-  esac
-done
-
-ac_given_srcdir=$srcdir
-
-trap 'rm -fr `echo "Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-# Protect against being on the right side of a sed subst in config.status.
-sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
- s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
-$ac_vpsub
-$extrasub
-s%@CFLAGS@%$CFLAGS%g
-s%@CPPFLAGS@%$CPPFLAGS%g
-s%@CXXFLAGS@%$CXXFLAGS%g
-s%@DEFS@%$DEFS%g
-s%@LDFLAGS@%$LDFLAGS%g
-s%@LIBS@%$LIBS%g
-s%@exec_prefix@%$exec_prefix%g
-s%@prefix@%$prefix%g
-s%@program_transform_name@%$program_transform_name%g
-s%@bindir@%$bindir%g
-s%@sbindir@%$sbindir%g
-s%@libexecdir@%$libexecdir%g
-s%@datadir@%$datadir%g
-s%@sysconfdir@%$sysconfdir%g
-s%@sharedstatedir@%$sharedstatedir%g
-s%@localstatedir@%$localstatedir%g
-s%@libdir@%$libdir%g
-s%@includedir@%$includedir%g
-s%@oldincludedir@%$oldincludedir%g
-s%@infodir@%$infodir%g
-s%@mandir@%$mandir%g
-s%@CC@%$CC%g
-s%@ac_cv_prog_chmod@%$ac_cv_prog_chmod%g
-s%@RANLIB@%$RANLIB%g
-s%@AR@%$AR%g
-s%@CPP@%$CPP%g
-s%@LIBOBJS@%$LIBOBJS%g
-s%@MAYBES@%$MAYBES%g
-s%@CROSS@%$CROSS%g
-s%@RANLIB_TEST@%$RANLIB_TEST%g
-
-CEOF
-EOF
-
-cat >> $CONFIG_STATUS <<\EOF
-
-# Split the substitutions into bite-sized pieces for seds with
-# small command number limits, like on Digital OSF/1 and HP-UX.
-ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
-ac_file=1 # Number of current file.
-ac_beg=1 # First line for current file.
-ac_end=$ac_max_sed_cmds # Line after last line for current file.
-ac_more_lines=:
-ac_sed_cmds=""
-while $ac_more_lines; do
-  if test $ac_beg -gt 1; then
-    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
-  else
-    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
-  fi
-  if test ! -s conftest.s$ac_file; then
-    ac_more_lines=false
-    rm -f conftest.s$ac_file
-  else
-    if test -z "$ac_sed_cmds"; then
-      ac_sed_cmds="sed -f conftest.s$ac_file"
-    else
-      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
-    fi
-    ac_file=`expr $ac_file + 1`
-    ac_beg=$ac_end
-    ac_end=`expr $ac_end + $ac_max_sed_cmds`
-  fi
-done
-if test -z "$ac_sed_cmds"; then
-  ac_sed_cmds=cat
-fi
-EOF
-
-cat >> $CONFIG_STATUS <<EOF
-
-CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case "$ac_file" in
-  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
-       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
-  *) ac_file_in="${ac_file}.in" ;;
-  esac
-
-  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
-
-  # Remove last slash and all that follows it.  Not all systems have dirname.
-  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
-  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
-    # The file is in a subdirectory.
-    test ! -d "$ac_dir" && mkdir "$ac_dir"
-    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
-    # A "../" for each directory in $ac_dir_suffix.
-    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
-  else
-    ac_dir_suffix= ac_dots=
-  fi
-
-  case "$ac_given_srcdir" in
-  .)  srcdir=.
-      if test -z "$ac_dots"; then top_srcdir=.
-      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
-  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
-  *) # Relative path.
-    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
-    top_srcdir="$ac_dots$ac_given_srcdir" ;;
-  esac
-
-
-  echo creating "$ac_file"
-  rm -f "$ac_file"
-  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
-  case "$ac_file" in
-  *Makefile*) ac_comsub="1i\\
-# $configure_input" ;;
-  *) ac_comsub= ;;
-  esac
-
-  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
-  sed -e "$ac_comsub
-s%@configure_input@%$configure_input%g
-s%@srcdir@%$srcdir%g
-s%@top_srcdir@%$top_srcdir%g
-" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
-fi; done
-rm -f conftest.s*
-
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s%^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
-ac_dB='\([ 	][ 	]*\)[^ 	]*%\1#\2'
-ac_dC='\3'
-ac_dD='%g'
-# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
-ac_uA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
-ac_uB='\([ 	]\)%\1#\2define\3'
-ac_uC=' '
-ac_uD='\4%g'
-# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_eA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
-ac_eB='$%\1#\2define\3'
-ac_eC=' '
-ac_eD='%g'
-
-if test "${CONFIG_HEADERS+set}" != set; then
-EOF
-cat >> $CONFIG_STATUS <<EOF
-  CONFIG_HEADERS="config.h"
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-fi
-for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case "$ac_file" in
-  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
-       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
-  *) ac_file_in="${ac_file}.in" ;;
-  esac
-
-  echo creating $ac_file
-
-  rm -f conftest.frag conftest.in conftest.out
-  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
-  cat $ac_file_inputs > conftest.in
-
-EOF
-
-# Transform confdefs.h into a sed script conftest.vals that substitutes
-# the proper values into config.h.in to produce config.h.  And first:
-# Protect against being on the right side of a sed subst in config.status.
-# Protect against being in an unquoted here document in config.status.
-rm -f conftest.vals
-cat > conftest.hdr <<\EOF
-s/[\\&%]/\\&/g
-s%[\\$`]%\\&%g
-s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
-s%ac_d%ac_u%gp
-s%ac_u%ac_e%gp
-EOF
-sed -n -f conftest.hdr confdefs.h > conftest.vals
-rm -f conftest.hdr
-
-# This sed command replaces #undef with comments.  This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-cat >> conftest.vals <<\EOF
-s%^[ 	]*#[ 	]*undef[ 	][ 	]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
-EOF
-
-# Break up conftest.vals because some shells have a limit on
-# the size of here documents, and old seds have small limits too.
-
-rm -f conftest.tail
-while :
-do
-  ac_lines=`grep -c . conftest.vals`
-  # grep -c gives empty output for an empty file on some AIX systems.
-  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
-  # Write a limited-size here document to conftest.frag.
-  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
-  echo 'CEOF
-  sed -f conftest.frag conftest.in > conftest.out
-  rm -f conftest.in
-  mv conftest.out conftest.in
-' >> $CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
-  rm -f conftest.vals
-  mv conftest.tail conftest.vals
-done
-rm -f conftest.vals
-
-cat >> $CONFIG_STATUS <<\EOF
-  rm -f conftest.frag conftest.h
-  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
-  cat conftest.in >> conftest.h
-  rm -f conftest.in
-  if cmp -s $ac_file conftest.h 2>/dev/null; then
-    echo "$ac_file is unchanged"
-    rm -f conftest.h
-  else
-    # Remove last slash and all that follows it.  Not all systems have dirname.
-      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
-      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
-      # The file is in a subdirectory.
-      test ! -d "$ac_dir" && mkdir "$ac_dir"
-    fi
-    rm -f $ac_file
-    mv conftest.h $ac_file
-  fi
-fi; done
-
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-
-exit 0
-EOF
-chmod +x $CONFIG_STATUS
-rm -fr confdefs* $ac_clean_files
-test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
-
diff --git a/gcc/f/runtime/libU77/configure.in b/gcc/f/runtime/libU77/configure.in
deleted file mode 100644
index d50fa11..0000000
--- a/gcc/f/runtime/libU77/configure.in
+++ /dev/null
@@ -1,111 +0,0 @@
-# Process this file with autoconf to produce a configure script.
-#   Copyright (C) 1995 Free Software Foundation, Inc.
-#   Contributed by Dave Love (d.love@dl.ac.uk).
-#
-#This file is part of the GNU Fortran libU77 library.
-#
-#This library 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 Fortran 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 Library General Public License for more details.
-#
-#You should have received a copy of the GNU Library General Public
-#License along with GNU Fortran; see the file COPYING.  If not, write
-#to Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307,
-#USA.
-
-AC_INIT(access_.c)
-AC_CONFIG_HEADER(config.h)
-
-dnl Checks for programs.
-# For g77 we'll set CC to point at the built gcc, but this will get it into
-# the makefiles
-AC_PROG_CC
-dnl AC_C_CROSS
-dnl Gives misleading `(cached)' message from the check.
-if test "$CROSS";then
-  ac_cv_c_cross=yes
-else
-  ac_cv_c_cross=no
-fi
-
-dnl This is only because we (horribly) punt the chmod job to the program at
-dnl present.  Note that the result of this test could be wrong in the cross
-dnl case.
-AC_PATH_PROG(ac_cv_prog_chmod, chmod, no)
-if test "$ac_cv_prog_chmod" != no || test "$CROSS"; then
-  MAYBES=chmod_.o
-  AC_DEFINE_UNQUOTED(CHMOD_PATH,"$ac_cv_prog_chmod")
-else
-  MAYBES=""
-fi
-
-dnl for g77 build maybe use $(RANLIB_FOR_TARGET) always (like wise AR)
-if test "$ac_cv_c_cross" = yes; then
-  RANLIB=$RANLIB_FOR_TARGET
-  AR=$AR_FOR_TARGET
-  AC_SUBST(RANLIB)
-else
-  AC_PROG_RANLIB
-  AR=ar
-  RANLIB_TEST=true
-fi
-AC_SUBST(AR)
-dnl not needed for g77
-dnl AC_SUBST(AR_FOR_TARGET)
-dnl AC_SUBST(RANLIB_FOR_TARGET)
-dnl AC_SUBST(RANLIB_TEST_FOR_TARGET)
-dnl not needed for g77?
-dnl AC_PROG_MAKE_SET
-
-dnl Checks for libraries.
-
-dnl Checks for header files.
-AC_HEADER_STDC
-dnl We could do this if we didn't know we were using gcc
-dnl AC_MSG_CHECKING(for prototype-savvy compiler)
-dnl AC_CACHE_VAL(ac_cv_sys_proto,                
-dnl   [AC_TRY_LINK(,                             
-dnl dnl looks screwy because TRY_LINK expects a function body
-dnl    [return 0;} int foo (int * bar) {],       
-dnl    ac_cv_sys_proto=yes,                      
-dnl    [ac_cv_sys_proto=no                       
-dnl     AC_DEFINE(KR_headers)])])                
-dnl AC_MSG_RESULT($ac_cv_sys_proto)              
-
-AC_HEADER_TIME
-AC_CHECK_HEADERS(limits.h unistd.h sys/time.h string.h stdlib.h)
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-AC_C_CONST
-AC_TYPE_SIZE_T
-AC_TYPE_MODE_T
-
-AC_TYPE_PID_T
-dnl The next 3 demand a dummy fileblocks.o (added to LIBOJS).  We don't use
-dnl LIBOJS, though.
-AC_STRUCT_ST_BLKSIZE
-AC_STRUCT_ST_BLOCKS
-AC_STRUCT_ST_RDEV
-AC_STRUCT_TM
-
-dnl Checks for library functions.
-
-AC_CHECK_FUNCS(symlink getcwd getwd lstat gethostname strerror clock getrusage)
-test $ac_cv_func_symlink = yes && MAYBES="$MAYBES symlnk_.o"
-test $ac_cv_func_lstat = yes && MAYBES="$MAYBES lstat_.o"
-test $ac_cv_func_gethostname = yes && MAYBES="$MAYBES hostnm_.o"
-test $ac_cv_func_clock = yes && MAYBES="$MAYBES mclock_.o"
-AC_SUBST(MAYBES)
-
-
-AC_SUBST(CROSS)
-AC_SUBST(RANLIB)
-AC_SUBST(RANLIB_TEST)
-
-AC_OUTPUT(Makefile)
diff --git a/gcc/f/runtime/libU77/ctime_.c b/gcc/f/runtime/libU77/ctime_.c
deleted file mode 100644
index af58137..0000000
--- a/gcc/f/runtime/libU77/ctime_.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#if HAVE_STRING_H
-#  include <string.h>
-#else
-#  include <strings.h>
-#endif
-#include "f2c.h"
-
-/* may need sys/time.h & long arg for stime (bsd, svr1-3) */
-
-#ifdef KR_headers
-/* Character */ void G77_ctime_0 (chtime, Lchtime, xstime)
-     char *chtime;
-     longint * xstime;
-     ftnlen Lchtime;
-#else
-/* Character */ void G77_ctime_0 (char *chtime, const ftnlen Lchtime, longint * xstime)
-#endif
-{
-  int i, l;
-  int s_copy ();
-  time_t stime = *xstime;
-
-  /* Allow a length other than 24 for compatibility with what other
-     systems do, despite it being documented as 24. */
-  s_copy (chtime, ctime (&stime), Lchtime, 24);
-}
diff --git a/gcc/f/runtime/libU77/date_.c b/gcc/f/runtime/libU77/date_.c
deleted file mode 100644
index 8426edc..0000000
--- a/gcc/f/runtime/libU77/date_.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* date_.f -- translated by f2c (version 19961001).
-   You must link the resulting object file with the libraries:
-	-lf2c -lm   (in that order)
-*/
-
-#include "f2c.h"
-
-/* Table of constant values */
-
-static integer c__5 = 5;
-
-/* Subroutine */ int G77_date_0 (char *buf, ftnlen buf_len)
-{
-    /* System generated locals */
-    address a__1[5];
-    integer i__1, i__2[5];
-    char ch__1[24];
-
-    /* Builtin functions */
-    /* Subroutine */ int s_copy(), s_cat();
-
-    /* Local variables */
-    static char cbuf[24];
-    extern integer G77_time_0 ();
-    extern /* Character */ VOID G77_ctime_0 ();
-
-    i__1 = G77_time_0 ();
-    G77_ctime_0 (ch__1, 24L, &i__1);
-    s_copy(cbuf, ch__1, 24L, 24L);
-/* Writing concatenation */
-    i__2[0] = 2, a__1[0] = cbuf + 8;
-    i__2[1] = 1, a__1[1] = "-";
-    i__2[2] = 3, a__1[2] = cbuf + 4;
-    i__2[3] = 1, a__1[3] = "-";
-    i__2[4] = 2, a__1[4] = cbuf + 22;
-    s_cat(buf, a__1, i__2, &c__5, buf_len);
-    return 0;
-} /* date_ */
-
diff --git a/gcc/f/runtime/libU77/dbes.c b/gcc/f/runtime/libU77/dbes.c
deleted file mode 100644
index 8c245cf..0000000
--- a/gcc/f/runtime/libU77/dbes.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#include "f2c.h"
-#include <math.h>
-
-#if 0 	/* Don't include these unless necessary -- dnp. */
-double G77_dbesj0_0 (const double *x) {
-    return j0 (*x);
-}
-
-double G77_dbesj1_0 (const double *x) {
-    return j1 (*x);
-}
-
-double G77_dbesjn_0 (const integer *n, double *x) {
-     return jn (*n, *x);
- }
-
-double G77_dbesy0_0 (const double *x) {
-    return y0 (*x);
-}
-
-double G77_dbesy1_0 (const double *x) {
-    return y1 (*x);
-}
-
-double G77_dbesyn_0 (const integer *n, double *x) {
-    return yn (*n, *x);
-}
-#endif
diff --git a/gcc/f/runtime/libU77/dtime_.c b/gcc/f/runtime/libU77/dtime_.c
deleted file mode 100644
index dc0accb..0000000
--- a/gcc/f/runtime/libU77/dtime_.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-#include <sys/times.h>
-#if HAVE_GETRUSAGE
-#  include <sys/time.h>
-#  include <sys/resource.h>
-#endif
-#include "f2c.h"
-
-/* For dtime, etime we store the clock tick parameter (clk_tck) the
-   first time either of them is invoked rather than each time.  This
-   approach probably speeds up each invocation by avoiding a system
-   call each time, but means that the overhead of the first call is
-   different to all others. */
-static long clk_tck = 0;
-
-#ifdef KR_headers
-double G77_dtime_0 (tarray)
-     real tarray[2];
-#else
-double G77_dtime_0 (real tarray[2])
-#endif
-{
-  time_t utime, stime;
-  static time_t old_utime = 0, old_stime = 0;
-  /* The getrusage version is only the default for convenience. */
-#ifdef HAVE_GETRUSAGE
-  struct rusage rbuff;
-
-   if (getrusage (RUSAGE_SELF, &rbuff) != 0)
-     abort ();
-   utime = ((float) (rbuff.ru_utime).tv_sec +
-	   (float) (rbuff.ru_utime).tv_usec/1000000.0);
-   tarray[0] = utime - (float) old_utime;
-   stime = ((float) (rbuff.ru_stime).tv_sec +
-	   (float) (rbuff.ru_stime).tv_usec/1000000.0);
-  tarray[1] = stime - old_stime;
-#else  /* HAVE_GETRUSAGE */
-  struct tms buffer;
-
-/* NeXTStep seems to define _SC_CLK_TCK but not to have sysconf;
-   fixme: does using _POSIX_VERSION help? */
-#  if defined _SC_CLK_TCK && defined _POSIX_VERSION
-  if (! clk_tck) clk_tck = sysconf(_SC_CLK_TCK);
-#  elif defined CLOCKS_PER_SECOND
-  if (! clk_tck) clk_tck = CLOCKS_PER_SECOND;
-#  elif defined CLK_TCK
-  if (! clk_tck) clk_tck = CLK_TCK;
-#  elif defined HAVE_GETRUSAGE
-#  else
-  #error Dont know clock tick length
-#  endif
-  if (times(&buffer) < 0) return -1.0;
-  utime = buffer.tms_utime; stime = buffer.tms_stime;
-  tarray[0] = ((float)(utime - old_utime)) / (float)clk_tck;
-  tarray[1] = ((float)(stime - old_stime)) / (float)clk_tck;
-#endif /* HAVE_GETRUSAGE */
-  old_utime = utime; old_stime = stime;
-  return (tarray[0]+tarray[1]);
-}
diff --git a/gcc/f/runtime/libU77/etime_.c b/gcc/f/runtime/libU77/etime_.c
deleted file mode 100644
index fa6ccfb..0000000
--- a/gcc/f/runtime/libU77/etime_.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-#include <sys/types.h>
-#include <sys/times.h>
-#include <sys/param.h>
-#if HAVE_GETRUSAGE
-#  include <sys/time.h>
-#  include <sys/resource.h>
-#endif
-#include "f2c.h"
-
-/* For dtime, etime we store the clock tick parameter (clk_tck) the
-   first time either of them is invoked rather than each time.  This
-   approach probably speeds up each invocation by avoiding a system
-   call each time, but means that the overhead of the first call is
-   different to all others. */
-static long clk_tck = 0;
-
-#ifdef KR_headers
-double G77_etime_0 (tarray)
-     real tarray[2];
-#else
-double G77_etime_0 (real tarray[2])
-#endif
-{
-  /* The getrusage version is only the default for convenience. */
-#ifdef HAVE_GETRUSAGE
-  struct rusage rbuff;
-
-   if (getrusage (RUSAGE_SELF, &rbuff) != 0)
-     abort ();
-   tarray[0] = ((float) (rbuff.ru_utime).tv_sec +
-	       (float) (rbuff.ru_utime).tv_usec/1000000.0);
-   tarray[1] = ((float) (rbuff.ru_stime).tv_sec +
-	       (float) (rbuff.ru_stime).tv_usec/1000000.0);
-#else  /* HAVE_GETRUSAGE */
-  struct tms buffer;
-
-/* NeXTStep seems to define _SC_CLK_TCK but not to have sysconf;
-   fixme: does using _POSIX_VERSION help? */
-#  if defined _SC_CLK_TCK && defined _POSIX_VERSION
-  if (! clk_tck) clk_tck = sysconf(_SC_CLK_TCK);
-#  elif defined CLOCKS_PER_SECOND
-  if (! clk_tck) clk_tck = CLOCKS_PER_SECOND;
-#  elif defined CLK_TCK
-  if (! clk_tck) clk_tck = CLK_TCK;
-#  elif defined HAVE_GETRUSAGE
-#  else
-  #error Dont know clock tick length
-#  endif
-  if (times(&buffer) < 0) return -1.0;
-  tarray[0] = (float) buffer.tms_utime / (float)clk_tck;
-  tarray[1] = (float) buffer.tms_stime / (float)clk_tck;
-#endif /* HAVE_GETRUSAGE */
-  return (tarray[0]+tarray[1]);
-}
diff --git a/gcc/f/runtime/libU77/fdate_.c b/gcc/f/runtime/libU77/fdate_.c
deleted file mode 100644
index afe8b24..0000000
--- a/gcc/f/runtime/libU77/fdate_.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdio.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#if HAVE_STRING_H
-#  include <string.h>
-#else
-#  include <strings.h>
-#endif
-
-#include "f2c.h"
-
-/* NB. this implementation is for a character*24 function.  There's
-   also a subroutine version.  Of course, the calling convention is
-   essentially the same for both. */
-
-/* Character *24 */ void G77_fdate_0 (char *ret_val, ftnlen ret_val_len)
-{
-    int s_copy ();
-    time_t tloc;
-    tloc = time (NULL);
-    /* Allow a length other than 24 for compatibility with what other
-       systems do, despite it being documented as 24. */
-    s_copy (ret_val, ctime ((time_t *) &tloc), ret_val_len, 24);
-}
diff --git a/gcc/f/runtime/libU77/fgetc_.c b/gcc/f/runtime/libU77/fgetc_.c
deleted file mode 100644
index 49f3983..0000000
--- a/gcc/f/runtime/libU77/fgetc_.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdio.h>
-#include "f2c.h"
-#include "fio.h"
-
-#ifdef KR_headers
-integer G77_fgetc_0 (lunit, c, Lc)
-     integer *lunit;
-     ftnlen Lc;			/* should be 1 */
-     char *c;
-#else
-integer G77_fgetc_0 (const integer *lunit, char *c, ftnlen Lc)
-#endif
-{
-  int err;
-  FILE *f = f__units[*lunit].ufd;
-
-  if (*lunit>=MXUNIT || *lunit<0)
-    return 101;			/* bad unit error */
-  err = getc (f);
-  if (err == EOF) {
-    if (feof (f))
-      return -1;
-    else
-      return ferror (f); }
-  else {
-    if (Lc == 0)
-      return 0;
-
-    c[0] = err;
-    while (--Lc)
-      *++c = ' ';
-    return 0; }
-}
-
-#ifdef KR_headers
-integer G77_fget_0 (c, Lc)
-     ftnlen Lc;			/* should be 1 */
-     char *c;
-#else
-integer G77_fget_0 (char *c, const ftnlen Lc)
-#endif
-{
-  integer five = 5;
-
-  return G77_fgetc_0 (&five, c, Lc);
-}
diff --git a/gcc/f/runtime/libU77/flush1_.c b/gcc/f/runtime/libU77/flush1_.c
deleted file mode 100644
index 451915d..0000000
--- a/gcc/f/runtime/libU77/flush1_.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdio.h>
-#include "f2c.h"
-#include "fio.h"
-
-/* This flushes a single unit, c.f. libI77 version. */
-
-#ifdef KR_headers
-extern integer G77_fnum_0 ();
-
-/* Subroutine */ int G77_flush1_0 (lunit)
-     integer *lunit;
-#else
-extern integer G77_fnum_0 (integer *);
-
-/* Subroutine */ int G77_flush1_0 (const integer *lunit)
-#endif
-{
-  if (*lunit>=MXUNIT || *lunit<0)
-    err(1,101,"flush");
-  /* f__units is a table of descriptions for the unit numbers (defined
-     in io.h) with file descriptors rather than streams */
-  if (f__units[*lunit].ufd != NULL && f__units[*lunit].uwrt)
-    fflush(f__units[*lunit].ufd);
-  return 0;
-}
diff --git a/gcc/f/runtime/libU77/fnum_.c b/gcc/f/runtime/libU77/fnum_.c
deleted file mode 100644
index 0a3ba01..0000000
--- a/gcc/f/runtime/libU77/fnum_.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "f2c.h"
-#include "fio.h"
-
-#ifdef KR_headers
-integer G77_fnum_0 (lunit)
-     integer *lunit;
-#else
-integer G77_fnum_0 (integer *lunit)
-#endif
-{
-  if (*lunit>=MXUNIT || *lunit<0)
-    err(1,101,"fnum");
-  /* f__units is a table of descriptions for the unit numbers (defined
-     in io.h).  Use file descriptor (ufd) and fileno rather than udev
-     field since udev is unix specific */
-  return fileno(f__units[*lunit].ufd);
-}
diff --git a/gcc/f/runtime/libU77/fputc_.c b/gcc/f/runtime/libU77/fputc_.c
deleted file mode 100644
index 5a1109e..0000000
--- a/gcc/f/runtime/libU77/fputc_.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdio.h>
-#include "f2c.h"
-#include "fio.h"
-
-#ifdef KR_headers
-integer G77_fputc_0 (lunit, c, Lc)
-     integer *lunit;
-     ftnlen Lc;			/* should be 1 */
-     char *c;
-#else
-integer G77_fputc_0 (const integer *lunit, const char *c, const ftnlen Lc)
-#endif
-{
-  int err;
-  FILE *f = f__units[*lunit].ufd;
-
-  if (*lunit>=MXUNIT || *lunit<0)
-    return 101;			/* bad unit error */
-  err = putc (c[0], f);
-  if (err == EOF) {
-    if (feof (f))
-      return -1;
-    else
-      return ferror (f);
-  }
-  else
-    return 0;
-}
-
-#ifdef KR_headers
-integer G77_fput_0 (c, Lc)
-     ftnlen Lc;			/* should be 1 */
-     char *c;
-#else
-integer G77_fput_0 (const char *c, const ftnlen Lc)
-#endif
-{
-  integer six = 6;
-
-  return G77_fputc_0 (&six, c, Lc);
-}
diff --git a/gcc/f/runtime/libU77/fstat_.c b/gcc/f/runtime/libU77/fstat_.c
deleted file mode 100644
index da5434a..0000000
--- a/gcc/f/runtime/libU77/fstat_.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include "f2c.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#ifdef KR_headers
-extern integer G77_fnum_0 ();
-
-integer G77_fstat_0 (lunit, statb)
-     integer *lunit;
-     integer statb[13];
-#else
-extern integer G77_fnum_0 (const integer *);
-
-integer G77_fstat_0 (const integer *lunit, integer statb[13])
-#endif
-{
-  int err;
-  struct stat buf;
-
-  err = fstat (G77_fnum_0 (lunit), &buf);
-  statb[0] = buf.st_dev;
-  statb[1] = buf.st_ino;
-  statb[2] = buf.st_mode;
-  statb[3] = buf.st_nlink;
-  statb[4] = buf.st_uid;
-  statb[5] = buf.st_gid;
-#if HAVE_ST_RDEV
-  statb[6] = buf.st_rdev;	/* not posix */
-#else
-  statb[6] = 0;
-#endif
-  statb[7] = buf.st_size;
-  statb[8] = buf.st_atime;
-  statb[9] = buf.st_mtime;
-  statb[10] = buf.st_ctime;
-#if HAVE_ST_BLKSIZE
-  statb[11] = buf.st_blksize;	/* not posix */
-#else
-  statb[11] = -1;
-#endif
-#if HAVE_ST_BLOCKS
-  statb[12] = buf.st_blocks;	/* not posix */
-#else
-  statb[12] = -1;
-#endif
-  return err;
-}
diff --git a/gcc/f/runtime/libU77/gerror_.c b/gcc/f/runtime/libU77/gerror_.c
deleted file mode 100644
index 6f5943c..0000000
--- a/gcc/f/runtime/libU77/gerror_.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <errno.h>
-#include <stddef.h>
-#if HAVE_STRING_H
-#  include <string.h>
-#else
-#  include <strings.h>
-#endif
-#include "f2c.h"
-
-#ifndef HAVE_STRERROR
-     extern char *sys_errlist [];
-#    define strerror(i) (sys_errlist[i])
-#endif
-#ifdef KR_headers
-extern void s_copy ();
-/* Subroutine */ int G77_gerror_0 (str, Lstr)
-     char *str; ftnlen Lstr;
-#else
-extern void s_copy(register char *a, register char *b, ftnlen la, ftnlen lb);
-/* Subroutine */ int G77_gerror_0 (char *str, ftnlen Lstr)
-#endif
-{
-  char * s;
-
-  s = strerror(errno);
-  s_copy (str, s, Lstr, strlen (s));
-  return 0;
-}
diff --git a/gcc/f/runtime/libU77/getcwd_.c b/gcc/f/runtime/libU77/getcwd_.c
deleted file mode 100644
index e757803..0000000
--- a/gcc/f/runtime/libU77/getcwd_.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <errno.h>
-#if HAVE_STRING_H
-#  include <string.h>
-#else
-#  include <strings.h>
-#endif
-#include <stdio.h>		/* for NULL */
-#include <errno.h>		/* for ENOSYS */
-#include "f2c.h"
-
-#if HAVE_GETCWD
-
-#ifdef HAVE_UNISTD_H
-#  include <unistd.h>
-#else
-  extern char *getcwd ();
-#endif
-
-#ifdef KR_headers
-extern void s_copy ();
-integer G77_getcwd_0 (str, Lstr)
-     char *str; ftnlen Lstr;
-#else
-extern void s_copy(register char *a, register char *b, ftnlen la, ftnlen lb);
-integer G77_getcwd_0 (char *str, const ftnlen Lstr)
-#endif
-{
-    int i;
-    char *ret;
-
-    ret = getcwd (str, Lstr);
-    if (ret == NULL) return errno;
-    for (i=strlen(str); i<Lstr; i++)
-	str[i] = ' ';
-    return 0;
-}
-
-#elif HAVE_GETWD		/* HAVE_GETCWD */
-
-/* getwd usage taken from SunOS4 man */
-
-#  include <sys/param.h>
-  extern char *getwd ();
-#ifdef KR_headers
-extern VOID s_copy ();
-integer G77_getcwd_0 (str, Lstr)
-     char *str; ftnlen Lstr;
-#else
-extern void s_copy(register char *a, register char *b, ftnlen la, ftnlen lb);
-integer G77_getcwd_0 (char *str, const ftnlen Lstr)
-#endif
-{
-  char pathname[MAXPATHLEN];
-  size_t l;
-
-  if (getwd (pathname) == NULL) {
-    return errno;
-  } else {
-    s_copy (str, pathname, Lstr, strlen (str));
-    return 0;
-  }
-}
-
-#else  /* !HAVE_GETWD && !HAVE_GETCWD */
-
-#ifdef KR_headers
-extern VOID s_copy ();
-integer G77_getcwd_0 (str, Lstr)
-     char *str; ftnlen Lstr;
-#else
-extern void s_copy(register char *a, register char *b, ftnlen la, ftnlen lb);
-integer G77_getcwd_0 (char *str, const ftnlen Lstr)
-#endif
-{
-  return errno = ENOSYS;
-}
-
-#endif
diff --git a/gcc/f/runtime/libU77/getgid_.c b/gcc/f/runtime/libU77/getgid_.c
deleted file mode 100644
index 02e8a4e..0000000
--- a/gcc/f/runtime/libU77/getgid_.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <sys/types.h>
-#include "f2c.h"
-
-#ifdef KR_headers
-integer G77_getgid_0 ()
-#else
-integer G77_getgid_0 (void)
-#endif
-{
-  return getgid ();
-}
diff --git a/gcc/f/runtime/libU77/getlog_.c b/gcc/f/runtime/libU77/getlog_.c
deleted file mode 100644
index a2c5f20..0000000
--- a/gcc/f/runtime/libU77/getlog_.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_STDLIB_H
-#  include <stdlib.h>
-#else
-#  include <stdio.h>
-#endif
-#include <stdio.h>
-#if HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-#if HAVE_STRING_H
-#  include <string.h>
-#else
-#  include <strings.h>
-#endif
-#include "f2c.h"
-
-/* getlogin not in svr1-3 */
-
-/* SGI also has character*(*) function getlog() */
-
-#ifdef KR_headers
-extern VOID s_copy ();
-/* Subroutine */ int G77_getlog_0 (str, Lstr)
-     char *str; ftnlen Lstr;
-#else
-extern void s_copy(register char *a, register char *b, ftnlen la, ftnlen lb);
-/* Subroutine */ int G77_getlog_0 (char *str, const ftnlen Lstr)
-#endif
-{
-  size_t i;
-  char *p;
-
-  p = getlogin ();
-  if (p != NULL) {
-    i = strlen (p);
-    s_copy (str, p, Lstr, i);
-  } else {
-    s_copy (str, " ", Lstr, 1);
-  }
-  return 0;
-}
diff --git a/gcc/f/runtime/libU77/getpid_.c b/gcc/f/runtime/libU77/getpid_.c
deleted file mode 100644
index fa48478..0000000
--- a/gcc/f/runtime/libU77/getpid_.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <sys/types.h>
-#include "f2c.h"
-
-#ifdef KR_headers
-integer G77_getpid_0 ()
-#else
-integer G77_getpid_0 (void)
-#endif
-{
-  return getpid ();
-}
diff --git a/gcc/f/runtime/libU77/getuid_.c b/gcc/f/runtime/libU77/getuid_.c
deleted file mode 100644
index 421bb4c..0000000
--- a/gcc/f/runtime/libU77/getuid_.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <sys/types.h>
-#include "f2c.h"
-
-#ifdef KR_headers
-integer G77_getuid_0 ()
-#else
-integer G77_getuid_0 (void)
-#endif
-{
-  return getuid ();
-}
diff --git a/gcc/f/runtime/libU77/gmtime_.c b/gcc/f/runtime/libU77/gmtime_.c
deleted file mode 100644
index 5f6f8ec..0000000
--- a/gcc/f/runtime/libU77/gmtime_.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-/* fixme: do we need to use TM_IN_SYS_TIME? */
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include "f2c.h"
-
-#ifdef KR_headers
-/* Subroutine */ int G77_gmtime_0 (stime, tarray)
-     integer *stime, tarray[9];
-#else
-/* Subroutine */ int G77_gmtime_0 (const integer * stime, integer tarray[9])
-#endif
-{
-  struct tm *lt;
-  lt = gmtime ((time_t *) stime);
-  tarray[0] = lt->tm_sec;
-  tarray[1] = lt->tm_min;
-  tarray[2] = lt->tm_hour;
-  tarray[3] = lt->tm_mday;
-  tarray[4] = lt->tm_mon;
-  tarray[5] = lt->tm_year;
-  tarray[6] = lt->tm_wday;
-  tarray[7] = lt->tm_yday;
-  tarray[8] = lt->tm_isdst;
-  return 0;
-}
diff --git a/gcc/f/runtime/libU77/hostnm_.c b/gcc/f/runtime/libU77/hostnm_.c
deleted file mode 100644
index 8229e09..0000000
--- a/gcc/f/runtime/libU77/hostnm_.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_STRING_H
-#  include <string.h>
-#else
-#  include <strings.h>
-#endif
-#if HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-#include <errno.h>		/* for ENOSYS */
-#include "f2c.h"
-
-integer G77_hostnm_0 (char *name, ftnlen Lname)
-{
-    int ret, i;
-
-#if HAVE_GETHOSTNAME
-    ret = gethostname (name, Lname);
-    if (ret==0) {
-	/* Pad with blanks (assuming gethostname will make an error
-           return if it can't fit in the null). */
-	for (i=strlen(name); i<=Lname; i++)
-	    name[i] = ' ';
-    }
-    return ret;
-#else
-    return errno = ENOSYS;
-#endif
-}
diff --git a/gcc/f/runtime/libU77/idate_.c b/gcc/f/runtime/libU77/idate_.c
deleted file mode 100644
index c407576..0000000
--- a/gcc/f/runtime/libU77/idate_.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdio.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include "f2c.h"
-
-/* VMS and Irix versions (at least) differ from libU77 elsewhere */
-
-/* libU77 one: */
-
-#ifdef KR_headers
-/* Subroutine */ int G77_idate_0 (iarray)
-     int iarray[3];
-#else
-/* Subroutine */ int G77_idate_0 (int iarray[3])
-#endif
-{
-  struct tm *lt;
-  time_t tim;
-  tim = time(NULL);
-  lt = localtime(&tim);
-  iarray[0] = lt->tm_mday;
-  iarray[1] = lt->tm_mon + 1;	/* in range 1-12 in SunOS (experimentally) */
-  /* The `+1900' is consistent with SunOS and Irix, but they don't say
-     it's added.  I think I've seen a system where tm_year was since
-     1970, but can't now verify that, so assume the ANSI definition. */
-  iarray[2] = lt->tm_year + 1900;
-  return 0;
-}
diff --git a/gcc/f/runtime/libU77/ierrno_.c b/gcc/f/runtime/libU77/ierrno_.c
deleted file mode 100644
index 557b53a..0000000
--- a/gcc/f/runtime/libU77/ierrno_.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <errno.h>
-#include "f2c.h"
-
-#ifdef KR_headers
-integer G77_ierrno_0 ()
-#else
-integer G77_ierrno_0 (void)
-#endif
-{
-  return errno;
-}
diff --git a/gcc/f/runtime/libU77/irand_.c b/gcc/f/runtime/libU77/irand_.c
deleted file mode 100644
index 2bf14cc..0000000
--- a/gcc/f/runtime/libU77/irand_.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_STDLIB_H
-#  include <stdlib.h>
-#endif
-#include "f2c.h"
-
-/* We could presumably do much better than the traditional libc
-   version, though at least the glibc one is reasonable, it seems.
-   For the sake of the innocent, I'm not sure we should really do
-   this... */
-
-/* Note this is per SunOS -- other s may have no arg. */
-
-#ifdef KR_headers
-integer G77_irand_0 (flag)
-  integer *flag;
-#else
-integer G77_irand_0 (integer *flag)
-#endif
-{
-  switch (*flag) {
-  case 0:
-    break;
-  case 1:
-    srand (0);			/* Arbitrary choice of initialiser. */
-    break;
-  default:
-    srand (*flag);
-  }
-  return rand ();
-}
-
-
-
-
-
-
diff --git a/gcc/f/runtime/libU77/isatty_.c b/gcc/f/runtime/libU77/isatty_.c
deleted file mode 100644
index 92c3346..0000000
--- a/gcc/f/runtime/libU77/isatty_.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-#include "f2c.h"
-#include "fio.h"
-
-#ifdef KR_headers
-extern integer G77_fnum_0 ();
-
-logical G77_isatty_0 (lunit)
-     integer *lunit;
-#else
-extern integer G77_fnum_0 (integer *);
-
-logical G77_isatty_0 (integer *lunit)
-#endif
-{
-  if (*lunit>=MXUNIT || *lunit<0)
-    err(1,101,"isatty");
-  /* f__units is a table of descriptions for the unit numbers (defined
-     in io.h) with file descriptors rather than streams */
-  return (isatty(G77_fnum_0 (lunit)) ? TRUE_ : FALSE_);
-}
diff --git a/gcc/f/runtime/libU77/itime_.c b/gcc/f/runtime/libU77/itime_.c
deleted file mode 100644
index 50378d5..0000000
--- a/gcc/f/runtime/libU77/itime_.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdio.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include "f2c.h"
-
-#ifdef KR_headers
-/* Subroutine */ int G77_itime_0 (tarray)
-     integer tarray[3];
-#else
-/* Subroutine */ int G77_itime_0 (integer tarray[3])
-#endif
-{
-  struct tm *lt;
-  time_t tim;
-
-  tim = time(NULL);
-  lt = localtime(&tim);
-  tarray[0] = lt->tm_hour;
-  tarray[1] = lt->tm_min;
-  tarray[2] = lt->tm_sec;
-  return 0;
-}
diff --git a/gcc/f/runtime/libU77/kill_.c b/gcc/f/runtime/libU77/kill_.c
deleted file mode 100644
index 32afddf..0000000
--- a/gcc/f/runtime/libU77/kill_.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <sys/types.h>
-#include <signal.h>
-#include <errno.h>
-#include "f2c.h"
-
-/* fixme: bsd, svr1-3 use int, not pid_t */
-
-#ifdef KR_headers
-integer G77_kill_0 (pid, signum)
-     integer *pid, *signum;
-#else
-integer G77_kill_0 (const integer *pid, const integer *signum)
-#endif
-{
-  return kill ((pid_t) *pid, *signum) ? errno : 0;
-}
diff --git a/gcc/f/runtime/libU77/link_.c b/gcc/f/runtime/libU77/link_.c
deleted file mode 100644
index 6892dcb..0000000
--- a/gcc/f/runtime/libU77/link_.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Copyright (C) 1995, 1997 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_STDLIB_H
-#  include <stdlib.h>
-#else
-#  include <stdio.h>
-#endif
-#if HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-#include <errno.h>
-#include <sys/param.h>
-#include "f2c.h"
-
-#ifdef KR_headers
-void g_char ();
-
-integer G77_link_0 (path1, path2, Lpath1, Lpath2)
-     char *path1, *path2; ftnlen Lpath1, Lpath2;
-#else
-void g_char(const char *a, ftnlen alen, char *b);
-
-integer G77_link_0 (const char *path1, const char *path2, const ftnlen Lpath1, const ftnlen Lpath2)
-#endif
-{
-  char *buff1, *buff2;
-  char *bp, *blast;
-  int i;
-
-  buff1 = malloc (Lpath1+1);
-  if (buff1 == NULL) return -1;
-  g_char (path1, Lpath1, buff1);
-  buff2 = malloc (Lpath2+1);
-  if (buff2 == NULL) return -1;
-  g_char (path2, Lpath2, buff2);
-  i = link (buff1, buff2);
-  free (buff1); free (buff2);
-  return i ? errno : 0;
-}
diff --git a/gcc/f/runtime/libU77/lnblnk_.c b/gcc/f/runtime/libU77/lnblnk_.c
deleted file mode 100644
index 806eca2..0000000
--- a/gcc/f/runtime/libU77/lnblnk_.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Copyright (C) 1995, 1997 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-
-/* via f2c from Fortran */
-
-#include "f2c.h"
-
-integer G77_lnblnk_0 (char *str, ftnlen str_len)
-{
-    integer ret_val;
-    integer i_len();
-
-    for (ret_val = str_len; ret_val >= 1; --ret_val) {
-	if (*(unsigned char *)&str[ret_val - 1] != ' ') {
-	    return ret_val;
-	}
-    }
-    return ret_val;
-}
diff --git a/gcc/f/runtime/libU77/lstat_.c b/gcc/f/runtime/libU77/lstat_.c
deleted file mode 100644
index e3efce7..0000000
--- a/gcc/f/runtime/libU77/lstat_.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Copyright (C) 1995, 1997 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdio.h>
-#if HAVE_STDLIB_H
-#  include <stdlib.h>
-#endif
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <errno.h>		/* for ENOSYS */
-#include "f2c.h"
-
-/* lstat isn't posix */
-
-#ifdef KR_headers
-void g_char();
-
-integer G77_lstat_0 (name, statb, Lname)
-     char *name;
-     integer statb[13];
-     ftnlen Lname;
-#else
-void g_char(const char *a, ftnlen alen, char *b);
-
-integer G77_lstat_0 (const char *name, integer statb[13], const ftnlen Lname)
-#endif
-{
-#if HAVE_LSTAT
-  char *buff;
-  char *bp, *blast;
-  int err;
-  struct stat buf;
-
-  buff = malloc (Lname+1);
-  if (buff == NULL) return -1;
-  g_char (name, Lname, buff);
-  err = lstat (buff, &buf);
-  free (buff);
-  statb[0] = buf.st_dev;
-  statb[1] = buf.st_ino;
-  statb[2] = buf.st_mode;
-  statb[3] = buf.st_nlink;
-  statb[4] = buf.st_uid;
-  statb[5] = buf.st_gid;
-#if HAVE_ST_RDEV
-  statb[6] = buf.st_rdev;
-#else
-  statb[6] = 0;
-#endif
-  statb[7] = buf.st_size;
-  statb[8] = buf.st_atime;
-  statb[9] = buf.st_mtime;
-  statb[10] = buf.st_ctime;
-  statb[6] = 0;
-#if HAVE_ST_BLKSIZE
-  statb[11] = buf.st_blksize;
-#else
-  statb[11] = -1;
-#endif
-#if HAVE_ST_BLOCKS
-  statb[12] = buf.st_blocks;
-#else
-  statb[12] = -1;
-#endif
-  return err;
-#else	/* !HAVE_LSTAT */
-  return errno = ENOSYS;
-#endif	/* !HAVE_LSTAT */
-}
diff --git a/gcc/f/runtime/libU77/ltime_.c b/gcc/f/runtime/libU77/ltime_.c
deleted file mode 100644
index 151ac6c..0000000
--- a/gcc/f/runtime/libU77/ltime_.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-/* fixme: do we need to use TM_IN_SYS_TIME? */
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include "f2c.h"
-
-#ifdef KR_headers
-/* Subroutine */ int G77_ltime_0 (stime, tarray)
-     integer *stime, tarray[9];
-#else
-/* Subroutine */ int G77_ltime_0 (const integer * stime, integer tarray[9])
-#endif
-{
-  struct tm *lt;
-  lt = localtime ((time_t *) stime);
-  tarray[0] = lt->tm_sec;
-  tarray[1] = lt->tm_min;
-  tarray[2] = lt->tm_hour;
-  tarray[3] = lt->tm_mday;
-  tarray[4] = lt->tm_mon;
-  tarray[5] = lt->tm_year;
-  tarray[6] = lt->tm_wday;
-  tarray[7] = lt->tm_yday;
-  tarray[8] = lt->tm_isdst;
-  return 0;
-}
diff --git a/gcc/f/runtime/libU77/mclock_.c b/gcc/f/runtime/libU77/mclock_.c
deleted file mode 100644
index 6b7e81b1..0000000
--- a/gcc/f/runtime/libU77/mclock_.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include "f2c.h"
-
-/* Reported by wd42ej@sgi83.wwb.noaa.gov (Russ Jones AUTO-Sun3) on AIX. */
-
-#ifdef KR_headers
-longint G77_mclock_0 ()
-#else
-longint G77_mclock_0 (void)
-#endif
-{
-#if HAVE_CLOCK
-  return clock ();
-#else
-  return -1;
-#endif
-}
diff --git a/gcc/f/runtime/libU77/perror_.c b/gcc/f/runtime/libU77/perror_.c
deleted file mode 100644
index 26d8582..0000000
--- a/gcc/f/runtime/libU77/perror_.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdio.h>
-#include <errno.h>
-#if HAVE_STRING_H
-#  include <string.h>
-#else
-#  include <strings.h>
-#endif
-#include "f2c.h"
-
-#ifdef KR_headers
-/* Subroutine */ int G77_perror_0 (str, Lstr)
-     char *str; ftnlen Lstr;
-#else
-/* Subroutine */ int G77_perror_0 (const char *str, const ftnlen Lstr)
-#endif
-{
-  char buff[1000];
-  char *bp, *blast;
-
-  /* same technique as `system' -- what's wrong with malloc? */
-  blast = buff + (Lstr < 1000 ? Lstr : 1000);
-  for (bp = buff ; bp<blast && *str!='\0' ; )
-    *bp++ = *str++;
-  *bp = '\0';
-  perror (buff);
-  return 0;
-}
diff --git a/gcc/f/runtime/libU77/rand_.c b/gcc/f/runtime/libU77/rand_.c
deleted file mode 100644
index 165aee1..0000000
--- a/gcc/f/runtime/libU77/rand_.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_STDLIB_H
-#  include <stdlib.h>
-#endif
-#include "f2c.h"
-#ifndef RAND_MAX
-#  define RAND_MAX 2147483647	/* from SunOS */
-#endif
-
-/* We could presumably do much better than the traditional libc
-   version, though at least the glibc one is reasonable, it seems.
-   For the sake of the innocent, I'm not sure we should really do
-   this... */
-
-/* Note this is per SunOS -- other s may have no arg. */
-
-#ifdef KR_headers
-double G77_rand_0 (flag)
-  integer *flag;
-#else
-double G77_rand_0 (integer *flag)
-#endif
-{
-  switch (*flag) {
-  case 0:
-    break;
-  case 1:
-    srand (0);			/* Arbitrary choice of initialiser. */
-    break;
-  default:
-    srand (*flag);
-  }
-  return (float) rand () / RAND_MAX;
-}
diff --git a/gcc/f/runtime/libU77/rename_.c b/gcc/f/runtime/libU77/rename_.c
deleted file mode 100644
index e8a4bf6..0000000
--- a/gcc/f/runtime/libU77/rename_.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Copyright (C) 1995, 1997 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_STDLIB_H
-#  include <stdlib.h>
-#endif
-#include <stdio.h>
-#include <errno.h>
-#include "f2c.h"
-
-#ifdef KR_headers
-void g_char ();
-
-integer G77_rename_0 (path1, path2, Lpath1, Lpath2)
-     char *path1, *path2; ftnlen Lpath1, Lpath2;
-#else
-void g_char(const char *a, ftnlen alen, char *b);
-
-integer G77_rename_0 (const char *path1, const char *path2, const ftnlen Lpath1, const ftnlen Lpath2)
-#endif
-{
-  char *buff1, *buff2;
-  char *bp, *blast;
-  int i;
-
-  buff1 = malloc (Lpath1+1);
-  if (buff1 == NULL) return -1;
-  g_char (path1, Lpath1, buff1);
-  buff2 = malloc (Lpath2+1);
-  if (buff2 == NULL) return -1;
-  g_char (path2, Lpath2, buff2);
-  i = rename (buff1, buff2);
-  free (buff1); free (buff2);
-  return i ? errno : 0;
-}
diff --git a/gcc/f/runtime/libU77/secnds_.c b/gcc/f/runtime/libU77/secnds_.c
deleted file mode 100644
index 1942528..0000000
--- a/gcc/f/runtime/libU77/secnds_.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdio.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include <sys/types.h>
-
-#include "f2c.h"
-
-/* This is a VMS intrinsic. */
-
-double G77_secnds_0 (real *r)
-{
-    struct tm *lt;
-    time_t clock;
-    float f;
-
-    clock = time (NULL);
-    lt = localtime (&clock);
-    f= (3600.0*((real)lt->tm_hour) + 60.0*((real)lt->tm_min) +
-	    (real)lt->tm_sec - *r);
-    return f;
-}
-
diff --git a/gcc/f/runtime/libU77/second_.c b/gcc/f/runtime/libU77/second_.c
deleted file mode 100644
index 41bb5a9..0000000
--- a/gcc/f/runtime/libU77/second_.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#include "f2c.h"
-
-double G77_second_0 () {
-  extern double G77_etime_0 ();
-  real tarray[2];
-
-  return G77_etime_0 (tarray);
-}
diff --git a/gcc/f/runtime/libU77/sleep_.c b/gcc/f/runtime/libU77/sleep_.c
deleted file mode 100644
index 36e1b8d..0000000
--- a/gcc/f/runtime/libU77/sleep_.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-#include "f2c.h"
-
-/* Subroutine */
-#ifdef KR_headers
-int G77_sleep_0 (seconds)
-     integer *seconds;
-#else
-int G77_sleep_0 (const integer *seconds)
-#endif
-{
-  (void) sleep ((unsigned int) *seconds);
-  return 0;
-}
diff --git a/gcc/f/runtime/libU77/srand_.c b/gcc/f/runtime/libU77/srand_.c
deleted file mode 100644
index 8edc62e..0000000
--- a/gcc/f/runtime/libU77/srand_.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if STDC_HEADERS
-#  include <stdlib.h>
-#endif
-#include "f2c.h"
-
-/* Subroutine */ 
-#ifdef KR_headers
-int G77_srand_0 (seed)
-     integer *seed;
-#else
-int G77_srand_0 (const integer *seed)
-#endif
-{
-  srand ((unsigned int) *seed);
-  return 0;
-}
diff --git a/gcc/f/runtime/libU77/stat_.c b/gcc/f/runtime/libU77/stat_.c
deleted file mode 100644
index b24f389..0000000
--- a/gcc/f/runtime/libU77/stat_.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Copyright (C) 1995, 1997 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdio.h>
-#if HAVE_STDLIB_H
-#  include <stdlib.h>
-#endif
-#include <sys/types.h>
-#include <sys/stat.h>
-#include "f2c.h"
-
-#ifdef KR_headers
-void g_char ();
-
-integer G77_stat_0 (name, statb, Lname)
-     char *name;
-     integer statb[13];
-     ftnlen Lname;
-#else
-void g_char(const char *a, ftnlen alen, char *b);
-
-integer G77_stat_0 (const char *name, integer statb[13], const ftnlen Lname)
-#endif
-{
-  char *buff;
-  char *bp, *blast;
-  int err;
-  struct stat buf;
-
-  buff = malloc (Lname+1);
-  if (buff == NULL) return -1;
-  g_char (name, Lname, buff);
-  err = stat (buff, &buf);
-  free (buff);
-  statb[0] = buf.st_dev;
-  statb[1] = buf.st_ino;
-  statb[2] = buf.st_mode;
-  statb[3] = buf.st_nlink;
-  statb[4] = buf.st_uid;
-  statb[5] = buf.st_gid;
-#if HAVE_ST_RDEV
-  statb[6] = buf.st_rdev;	/* not posix */
-#else
-  statb[6] = 0;
-#endif
-  statb[7] = buf.st_size;
-  statb[8] = buf.st_atime;
-  statb[9] = buf.st_mtime;
-  statb[10] = buf.st_ctime;
-#if HAVE_ST_BLKSIZE
-  statb[11] = buf.st_blksize;	/* not posix */
-#else
-  statb[11] = -1;
-#endif
-#if HAVE_ST_BLOCKS
-  statb[12] = buf.st_blocks;	/* not posix */
-#else
-  statb[12] = -1;
-#endif
-  return err;
-}
diff --git a/gcc/f/runtime/libU77/symlnk_.c b/gcc/f/runtime/libU77/symlnk_.c
deleted file mode 100644
index d15e452..0000000
--- a/gcc/f/runtime/libU77/symlnk_.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Copyright (C) 1995, 1997 Free Software Foundation, Inc.
-This file is part of GNU Fortran.
-
-GNU Fortran is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_STDLIB_H
-#  include <stdlib.h>
-#else
-#  include <stdio.h>
-#endif
-#if HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-#include <errno.h>
-#include <sys/param.h>
-#include "f2c.h"
-
-#ifdef KR_headers
-void g_char ();
-
-integer G77_symlnk_0 (path1, path2, Lpath1, Lpath2)
-     char *path1, *path2; ftnlen Lpath1, Lpath2;
-#else
-void g_char(const char *a, ftnlen alen, char *b);
-
-integer G77_symlnk_0 (const char *path1, const char *path2, const ftnlen Lpath1, const ftnlen Lpath2)
-#endif
-{
-#if HAVE_SYMLINK
-  char *buff1, *buff2;
-  char *bp, *blast;
-  int i;
-
-  buff1 = (char *) malloc (Lpath1+1);
-  if (buff1 == NULL) return -1;
-  g_char (path1, Lpath1, buff1);
-  buff2 = (char *) malloc (Lpath2+1);
-  if (buff2 == NULL) return -1;
-  g_char (path2, Lpath2, buff2);
-  i = symlink (buff1, buff2);
-  free (buff1); free (buff2);
-  return i ? errno : 0;
-#else	/* !HAVE_SYMLINK */
-  return errno = ENOSYS;
-#endif	/* !HAVE_SYMLINK */
-}
diff --git a/gcc/f/runtime/libU77/system_clock_.c b/gcc/f/runtime/libU77/system_clock_.c
deleted file mode 100644
index d5cbaac..0000000
--- a/gcc/f/runtime/libU77/system_clock_.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include <sys/times.h>
-#include <limits.h>
-#if HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-#include "f2c.h"
-
-#ifdef KR_headers
-int G77_system_clock_0 (count, count_rate, count_max)
-     integer *count, *count_rate, *count_max;
-#else
-int G77_system_clock_0 (integer *count, integer *count_rate, integer *count_max)
-#endif
-{
-  struct tms buffer;
-  unsigned long cnt;
-#ifdef _SC_CLK_TCK
-  *count_rate = sysconf(_SC_CLK_TCK);
-#elif defined CLOCKS_PER_SECOND
-  *count_rate = CLOCKS_PER_SECOND;
-#elif defined CLK_TCK
-  *count_rate = CLK_TCK;
-#else
-  #error Dont know clock tick length
-#endif
-  *count_max = INT_MAX;		/* dubious */
-  cnt = times (&buffer);
-  if (cnt > (unsigned long) (*count_max))
-    *count = *count_max;	/* also dubious */
-  else
-    *count = cnt;
-  return 0;
-}
diff --git a/gcc/f/runtime/libU77/time_.c b/gcc/f/runtime/libU77/time_.c
deleted file mode 100644
index 73894b0..0000000
--- a/gcc/f/runtime/libU77/time_.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdio.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include "f2c.h"
-
-/* As well as this external function some compilers have an intrinsic
-   subroutine which fills a character argument (which is the VMS way)
-   -- caveat emptor. */
-#ifdef KR_headers
-longint G77_time_0 ()
-#else
-longint G77_time_0 (void)
-#endif
-{
-  /* There are potential problems with the cast of the time_t here. */
-  return time (NULL);
-}
diff --git a/gcc/f/runtime/libU77/ttynam_.c b/gcc/f/runtime/libU77/ttynam_.c
deleted file mode 100644
index f69aa43..0000000
--- a/gcc/f/runtime/libU77/ttynam_.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if STDC_HEADERS
-#  include <stdlib.h>
-#endif
-#if HAVE_UNISTD_H
-#  include <unistd.h>		/* POSIX for ttyname */
-#endif
-#include <stdio.h>
-#if HAVE_STRING_H
-#  include <string.h>
-#else
-#  include <strings.h>
-#endif
-#include "f2c.h"
-
-#ifdef KR_headers
-extern void s_copy ();
-extern integer G77_fnum_0 ();
-/* Character */ void G77_ttynam_0 (ret_val, ret_val_len, lunit)
-     char *ret_val; ftnlen ret_val_len; integer *lunit
-#else
-extern integer G77_fnum_0 (integer *lunit);
-extern void s_copy(register char *a, register char *b, ftnlen la, ftnlen lb);
-/* Character */ void G77_ttynam_0 (char *ret_val, ftnlen ret_val_len, integer *lunit)
-#endif
-{
-  size_t i;
-  char *p;
-
-  p = ttyname (G77_fnum_0 (lunit));
-  if (p != NULL) {
-    i = strlen (p);
-    s_copy (ret_val, p, ret_val_len, i);
-  } else {
-    s_copy (ret_val, " ", ret_val_len, 1);
-  }
-}
diff --git a/gcc/f/runtime/libU77/u77-test.f b/gcc/f/runtime/libU77/u77-test.f
deleted file mode 100644
index 11c5eca..0000000
--- a/gcc/f/runtime/libU77/u77-test.f
+++ /dev/null
@@ -1,178 +0,0 @@
-***   Some random stuff for testing libU77.  Should be done better.  It's
-*     hard to test things where you can't guarantee the result.  Have a
-*     good squint at what it prints, though detected errors will cause 
-*     starred messages.
-
-      integer i, j, k, ltarray (9), idat (3), count, rate, count_max,
-     +     pid
-      real tarray1(2), tarray2(2), r1, r2, etime
-      intrinsic getpid, getuid, getgid, ierrno, gerror,
-     +     fnum, isatty, getarg, access, unlink, fstat,
-     +     stat, lstat, getcwd, gmtime, hostnm, etime, chmod,
-     +     chdir, fgetc, fputc, system_clock, second, idate, secnds,
-     +     time, ctime, fdate, ttynam
-      external lenstr
-      logical l
-      character gerr*80, c*1
-      character ctim*25, line*80, lognam*20, wd*100, line2*80
-      integer fstatb (13), statb (13)
-      integer *2 i2zero
-
-      ctim = ctime(time())
-      WRITE (6,'(A/)') '1 GNU libU77 test at: ' // ctim
-      write (6,'(A,I3,'', '',I3)')
-     +     ' Logical units 5 and 6 correspond (FNUM) to'
-     +     // ' Unix i/o units ', fnum(5), fnum(6)
-      if (lnblnk('foo ').ne.3 .or. len_trim('foo ').ne.3) then
-        print *, 'LNBLNK or LEN_TRIM failed'
-        call exit(1)
-      end if
-      l= isatty(6)
-      line2 = ttynam(6)
-      if (l) then
-        line = 'and 6 is a tty device (ISATTY) named '//line2
-      else
-        line = 'and 6 isn''t a tty device (ISATTY)'
-      end if
-      write (6,'(1X,A)') line(:lenstr(line))
-      pid = getpid()
-      WRITE (6,'(A,I10)') ' Process id (GETPID): ', pid
-      WRITE (6,'(A,I10)') ' User id (GETUID): ', GETUID ()
-      WRITE (6,'(A,I10)') ' Group id (GETGID): ', GETGID ()
-      WRITE (6,*) 'If you have the `id'' program, the following call of'
-     +     // ' SYSTEM should agree with the above'
-      call flush(6)
-      CALL SYSTEM ('echo " " `id`')
-      call flush
-      call getlog (lognam)
-      write (6,*) 'Login name (GETLOG): ', lognam
-      call umask(0, mask)
-      write(6,*) 'UMASK returns', mask
-      call umask(mask)
-      ctim = fdate()
-      write (6,*) 'FDATE returns: ', ctim
-      j=time()
-      call ltime (j, ltarray)
-      write (6,'(1x,a,9i4)') 'LTIME returns:', ltarray
-      call gmtime (j, ltarray)
-      write (6,'(1x,a,9i4)') 'GMTIME returns:', ltarray
-      call system_clock(count, rate, count_max)
-      write(6,*) 'SYSTEM_CLOCK returns: ', count, rate, count_max
-      write (6,*) 'Sleeping for 1 second (SLEEP) ...'
-      call sleep (1)
-      write (6,*) 'Looping 10,000,000 times ...'
-      do i=1,10*1000*1000
-      end do
-      r1= etime (tarray1)
-      if (r1.ne.tarray1(1)+tarray1(2))
-     +     write (6,*) '*** ETIME didn''t return sum of the array: ',
-     +     r1, ' /= ', tarray1
-      r2= dtime (tarray2)
-      if (abs (r1-r2).gt.1.0) write (6,*)
-     +     'Results of ETIME and DTIME differ by more than a second:',
-     +     i, j
-      write (6,'(A,3F10.3)')
-     +     ' Elapsed total, user, system time (ETIME): ',
-     +     r1, tarray1
-      call idate(i,j,k)
-      call idate (idat)
-      write (6,*) 'IDATE d,m,y: ',idat
-      print *,  '... and the VXT version: ', i,j,k
-      call time(line(:8))
-      print *, line(:8)
-      write (6,*) 'SECNDS(0.0) returns: ',secnds(0.0)
-      write (6,*) 'SECOND returns: ', second()
-      call dumdum(r1)
-      call second(r1)
-      write (6,*) 'CALL SECOND returns: ', r1
-      i = getcwd(wd)
-      if (i.ne.0) then
-        call perror ('*** getcwd')
-      else
-        write (6,*) 'Current directory is "'//wd(:lenstr(wd))//'"'
-      end if
-      call chdir ('.',i)
-      if (i.ne.0) write (6,*) '***CHDIR to ".": ', i
-      i=hostnm(wd)
-      if(i.ne.0) then
-        call perror ('*** hostnm')
-      else
-        write (6,*) 'Host name is ', wd(:lenstr(wd))
-      end if
-      i = access('/dev/null ', 'rw')
-      if (i.ne.0) write (6,*) '***Read/write ACCESS to /dev/null: ', i
-      write (6,*) 'Creating file "foo" for testing...'
-      open (3,file='foo',status='UNKNOWN')
-      rewind 3
-      call fputc(3, 'c',i)
-      call fputc(3, 'd',j)      
-      if (i+j.ne.0) write(6,*) '***FPUTC: ', i
-C     why is it necessary to reopen?
-      close(3)
-      open(3,file='foo',status='old')
-      call fseek(3,0,0,*10)
-      go to 20
- 10   write(6,*) '***FSEEK failed'
- 20   call fgetc(3, c,i)
-      if (i.ne.0) write(6,*) '***FGETC: ', i
-      if (c.ne.'c') write(6,*) '***FGETC read the wrong thing: ',
-     +     ichar(c)
-      i= ftell(3)
-      if (i.ne.1) write(6,*) '***FTELL offset: ', i
-      call chmod ('foo', 'a+w',i)
-      if (i.ne.0) write (6,*) '***CHMOD of "foo": ', i
-      i = fstat (3, fstatb)
-      if (i.ne.0) write (6,*) '***FSTAT of "foo": ', i
-      i = stat ('foo', statb)
-      if (i.ne.0) write (6,*) '***STAT of "foo": ', i
-      write (6,*) '  with stat array ', statb
-      if (statb(5).ne.getuid () .or. statb(6).ne.getgid() .or. statb(4)
-     +     .ne. 1) write (6,*) '*** FSTAT uid, gid or nlink is wrong'
-      do i=1,13
-        if (fstatb (i) .ne. statb (i))
-     +       write (6,*) '*** FSTAT and STAT don''t agree on '// '
-     +       array element ', i, ' value ', fstatb (i), statb (i)
-      end do
-      i = lstat ('foo', fstatb)
-      do i=1,13
-        if (fstatb (i) .ne. statb (i))
-     +       write (6,*) '*** LSTAT and STAT don''t agree on '// '
-     +       array element ', i, ' value ', fstatb (i), statb (i)
-      end do
-
-C     in case it exists already:
-      call unlink ('bar',i)
-      call link ('foo ', 'bar ',i)
-      if (i.ne.0)
-     +     write (6,*) '***LINK "foo" to "bar" failed: ', i
-      call unlink ('foo',i)
-      if (i.ne.0) write (6,*) '***UNLINK "foo" failed: ', i
-      call unlink ('foo',i)
-      if (i.eq.0) write (6,*) '***UNLINK "foo" again: ', i
-      call gerror (gerr)
-      i = ierrno()
-      write (6,'(A,I3,A/1X,A)') ' The current error number is: ',
-     +     i,
-     +     ' and the corresponding message is:', gerr(:lenstr(gerr))
-      write (6,*) 'This is sent to stderr prefixed by the program name'
-      call getarg (0, line)
-      call perror (line (:lenstr (line)))
-      call unlink ('bar')
-      WRITE (6,*) 'You should see exit status 1'
-      CALL EXIT(1)
- 99   END
-
-      integer function lenstr (str)
-C     return length of STR not including trailing blanks, but always
-C     return >0
-      character *(*) str
-      if (str.eq.' ') then
-        lenstr=1
-      else
-        lenstr = lnblnk (str)
-      end if
-      end
-* just make sure SECOND() doesn't "magically" work the second time.
-      subroutine dumdum(r)
-      r = 3.14159
-      end
diff --git a/gcc/f/runtime/libU77/umask_.c b/gcc/f/runtime/libU77/umask_.c
deleted file mode 100644
index 203acfa..0000000
--- a/gcc/f/runtime/libU77/umask_.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <sys/types.h>
-#include <sys/stat.h>
-#include "f2c.h"
-
-#ifdef KR_headers
-integer G77_umask_0 (mask)
-     integer *mask;
-#else
-integer G77_umask_0 (integer *mask)
-#endif
-{
-  return umask ((mode_t) *mask);
-}
diff --git a/gcc/f/runtime/libU77/unlink_.c b/gcc/f/runtime/libU77/unlink_.c
deleted file mode 100644
index 5e7edf2..0000000
--- a/gcc/f/runtime/libU77/unlink_.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Copyright (C) 1995, 1997 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#if HAVE_STDLIB_H
-#  include <stdlib.h>
-#else
-#  include <stdio.h>
-#endif
-#if HAVE_UNISTD_H
-#  include <unistd.h>
-#endif
-#include <errno.h>
-#include <sys/param.h>
-#include "f2c.h"
-
-#ifdef KR_headers
-void g_char ();
-
-integer G77_unlink_0 (str, Lstr)
-     char *str; ftnlen  Lstr;
-#else
-void g_char(const char *a, ftnlen alen, char *b);
-
-integer G77_unlink_0 (const char *str, const ftnlen Lstr)
-#endif
-{
-  char *buff;
-  char *bp, *blast;
-  int i;
-
-  buff = malloc (Lstr+1);
-  if (buff == NULL) return -1;
-  g_char (str, Lstr, buff);
-  i = unlink (buff);
-  free (buff);
-  return i ? errno : 0;		/* SGI version returns -1 on failure. */
-}
diff --git a/gcc/f/runtime/libU77/vxtidate_.c b/gcc/f/runtime/libU77/vxtidate_.c
deleted file mode 100644
index c517f29..0000000
--- a/gcc/f/runtime/libU77/vxtidate_.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdio.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include "f2c.h"
-
-/* VMS and Irix versions (at least) differ from libU77 elsewhere */
-
-/* VMS style: */
-
-/* Subroutine */
-#ifdef KR_headers
-int G77_vxtidate_0 (m, d, y)
-     integer *y, *m, *d;
-#else
-int G77_vxtidate_0 (integer *m, integer *d, integer *y)
-#endif
-{
-  struct tm *lt;
-  time_t tim;
-  tim = time(NULL);
-  lt = localtime(&tim);
-  *y = lt->tm_year;
-  *m = lt->tm_mon+1;
-  *d = lt->tm_mday;
-  return 0;
-}
diff --git a/gcc/f/runtime/libU77/vxttime_.c b/gcc/f/runtime/libU77/vxttime_.c
deleted file mode 100644
index 054bb45..0000000
--- a/gcc/f/runtime/libU77/vxttime_.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of GNU Fortran libU77 library.
-
-This library is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GNU Fortran 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GNU Fortran; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <stdio.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#if HAVE_STRING_H
-#  include <string.h>
-#else
-#  include <strings.h>
-#endif
-#include "f2c.h"
-
-/* Subroutine */
-#ifdef KR_headers
-void G77_vxttime_0 (chtime, Lchtime)
-     char chtime[8];
-     ftnlen Lchtime;
-#else
-void G77_vxttime_0 (char chtime[8], const ftnlen Lchtime)
-#endif
-{
-  time_t tim;
-  char *ctim;
-  tim = time(NULL);
-  ctim = ctime (&tim);
-  strncpy (chtime, ctim+11, 8);
-}
diff --git a/gcc/f/runtime/permission.netlib b/gcc/f/runtime/permission.netlib
deleted file mode 100644
index 261b719..0000000
--- a/gcc/f/runtime/permission.netlib
+++ /dev/null
@@ -1,23 +0,0 @@
-/****************************************************************
-Copyright 1990 - 1997 by AT&T, Lucent Technologies and Bellcore.
-
-Permission to use, copy, modify, and distribute this software
-and its documentation for any purpose and without fee is hereby
-granted, provided that the above copyright notice appear in all
-copies and that both that the copyright notice and this
-permission notice and warranty disclaimer appear in supporting
-documentation, and that the names of AT&T, Bell Laboratories,
-Lucent or Bellcore or any of their entities not be used in
-advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-AT&T, Lucent and Bellcore disclaim all warranties with regard to
-this software, including all implied warranties of
-merchantability and fitness.  In no event shall AT&T, Lucent or
-Bellcore be liable for any special, indirect or consequential
-damages or any damages whatsoever resulting from loss of use,
-data or profits, whether in an action of contract, negligence or
-other tortious action, arising out of or in connection with the
-use or performance of this software.
-****************************************************************/
-
diff --git a/gcc/f/runtime/readme.netlib b/gcc/f/runtime/readme.netlib
deleted file mode 100644
index 5d2ac98..0000000
--- a/gcc/f/runtime/readme.netlib
+++ /dev/null
@@ -1,590 +0,0 @@
-
-====== old index for f2c, now "readme from f2c" ============
-
-FILES:
-
-f2c.h	Include file necessary for compiling output of the converter.
-	See the second NOTE below.
-
-f2c.1	Man page for f2c.
-
-f2c.1t	Source for f2c.1 (to be processed by troff -man or nroff -man).
-
-libf77	Library of non I/O support routines the generated C may need.
-	Fortran main programs result in a C function named MAIN__ that
-	is meant to be invoked by the main() in libf77.
-
-libi77	Library of Fortran I/O routines the generated C may need.
-	Note that some vendors (e.g., BSD, Sun and MIPS) provide a
-	libF77 and libI77 that are incompatible with f2c -- they
-	provide some differently named routines or routines with the
-	names that f2c expects, but with different calling sequences.
-	On such systems, the recommended procedure is to merge
-	libf77 and libi77 into a single library, say libf2c, and to
-        install it where you can access it by specifying -lf2c .  The
-        definition of link_msg in sysdep.c assumes this arrangement.
-
-	Both libf77 and libi77 are bundles, meant to be unpacked by the
-	Bourne (or Korn) shell.  MS-DOS users can use the MKS Toolkit
-	to unpack libf77 and libi77.
-
-libf2c.zip
-	Only available by ftp: combination of libf77 and libi77, with
-	Unix and PC makefiles.
-
-f2c.ps	Postscript for a technical report on f2c.  After you strip the
-	mail header, the first line should be "%!PS".
-
-fixes	The complete change log, reporting bug fixes and other changes.
-	(Some recent change-log entries are given below).
-
-fc	A shell script that uses f2c and imitates much of the behavior
-	of commonly found f77 commands.  You will almost certainly
-	need to adjust some of the shell-variable assignments to make
-	this script work on your system.
-
-
-SUBDIRECTORY:
-
-f2c/src	Source for the converter itself, including a file of checksums
-	and source for a program to compute the checksums (to verify
-	correct transmission of the source), is available: ask netlib
-	(e.g., netlib@netlib.bell-labs.com) to
-		send all from f2c/src
-	If the checksums show damage to just a few source files, or if
-	the change log file (see "fixes" below) reports corrections to
-	some source files, you can request those files individually
-	"from f2c/src".  For example, to get defs.h and xsum0.out, you
-	would ask netlib to
-		send defs.h xsum0.out from f2c/src
-	"all from f2c/src" is about 640 kilobytes long; for convenience
-	(and checksums), it includes copies of f2c.h, f2c.1, and f2c.1t.
-
-	Tip: if asked to send over 99,000 bytes in one request, netlib
-	breaks the shipment into 1000 line pieces and sends each piece
-	separately (since otherwise some mailers might gag).  To avoid
-	the hassle of reassembling the pieces, try to keep each request
-	under 99,000 bytes long.  The final number in each line of
-	xsum0.out gives the length of each file in f2c/src.  For
-	example,
-		send exec.c expr.c from f2c/src
-		send format.c format_data.c from f2c/src
-	will give you slightly less hassle than
-		send exec.c expr.c format.c format_data.c from f2c/src
-	Alternatively, if all the mailers in your return path allow
-	long messages, you can supply an appropriate mailsize line in
-	your netlib request, e.g.
-		mailsize 200k
-		send exec.c expr.c format.c format_data.c from f2c/src
-
-	If you have trouble generating gram.c, you can ask netlib to
-		send gram.c from f2c/src
-	Then `xsum gram.c` should report
-		gram.c	5529f4f	58745
-	Alternatively, if you have bison, you might get a working
-	gram.c by saying
-		make gram.c YACC=bison YFLAGS=-y
-	(but please do not complain if this gives a bad gram.c).
-
-NOTE:	For now, you may exercise f2c by sending netlib a message whose
-	first line is "execute f2c" and whose remaining lines are
-	the Fortran 77 source that you wish to have converted.
-	Return mail brings you the resulting C, with f2c's error
-	messages between #ifdef uNdEfInEd and #endif at the end.
-	(To understand line numbers in the error messages, regard
-	the "execute f2c" line as line 0.  It is stripped away by
-	the netlib software before f2c sees your Fortran input.)
-	Options described in the man page may be transmitted to
-	netlib by having the first line of input be a comment
-	whose first 6 characters are "c$f2c " and whose remaining
-	characters are the desired options, e.g., "c$f2c -R -u".
-
-	You may say "execute f2c" in the Subject line instead of (but
-	*not* in addition to) in the first line of the message body.
-
-	The incoming Fortran is saved, at least for a while.  Don't
-	send any secrets!
-
-
-BUGS:	Please send bug reports (including the shortest example
-	you can find that illustrates the bug) to research!dmg
-	or dmg@bell-labs.com .  You might first check whether
-	the bug goes away when you turn optimization off.
-
-
-NOTE:	f2c.h defines several types, e.g., real, integer, doublereal.
-	The definitions in f2c.h are suitable for most machines, but if
-	your machine has sizeof(double) > 2*sizeof(long), you may need
-	to adjust f2c.h appropriately.  f2c assumes
-		sizeof(doublecomplex) = 2*sizeof(doublereal)
-		sizeof(doublereal) = sizeof(complex)
-		sizeof(doublereal) = 2*sizeof(real)
-		sizeof(real) = sizeof(integer)
-		sizeof(real) = sizeof(logical)
-		sizeof(real) = 2*sizeof(shortint)
-	EQUIVALENCEs may not be translated correctly if these
-	assumptions are violated.
-
-	On machines, such as those using a DEC Alpha processor, on
-	which sizeof(short) == 2, sizeof(int) == sizeof(float) == 4,
-	and sizeof(long) == sizeof(double) == 8, it suffices to
-	modify f2c.h by removing the first occurrence of "long "
-	on each line containing "long ", e.g., by issuing the
-	commands
-		mv f2c.h f2c.h0
-		sed 's/long //' f2c.h0 >f2c.h
-	On such machines, one can enable INTEGER*8 by uncommenting
-	the typedef of longint in f2c.h, so it reads
-		typedef long longint;
-	by compiling libI77 with -DAllow_TYQUAD, and by adjusting
-	libF77/makefile as described in libF77/README.
-
-	Some machines may have sizeof(int) == 4 and
-	sizeof(long long) == 8.  On such machines, adjust f2c.h
-	by changing "long int " to "long long ", e.g., by saying
-		mv f2c.h f2c.h0
-		sed 's/long int /long long /' f2c.h0 >f2c.h
-	One can enable INTEGER*8 on such machines as described
-	above, but with
-		typedef long long longint;
-
-	There exists a C compiler that objects to the lines
-		typedef VOID C_f;	/* complex function */
-		typedef VOID H_f;	/* character function */
-		typedef VOID Z_f;	/* double complex function */
-	in f2c.h .  If yours is such a compiler, do two things:
-	1. Complain to your vendor about this compiler bug.
-	2. Find the line
-		#define VOID void
-	   in f2c.h and change it to
-		#define VOID int
-	(For readability, the f2c.h lines shown above have had two
-	tabs inserted before their first character.)
-
-FTP:	All the material described above is now available by anonymous
-	ftp from netlib.bell-labs.com (login: anonymous; Password: your
-	E-mail address; cd netlib/f2c).  Note that you can say, e.g.,
-
-		cd /netlib/f2c/src
-		binary
-		prompt
-		mget *.Z
-
-	to get all the .Z files in src.  You must uncompress the .Z
-	files once you have a copy of them, e.g., by
-
-		uncompress *.Z
-
-	Subdirectory msdos contains two PC versions of f2c,
-	f2c.exe.Z and f2cx.exe.Z; the latter uses extended memory.
-	The README in that directory provides more details.
-
-	Changes appear first in the f2c files available by E-mail
-	from netlib@netlib.bell-labs.com.  If the deamons work right,
-	changed files are available the next day by ftp from
-	netlib.bell-labs.com.  In due course, they reach other netlib servers.
-
-CHANGE NOTIFICATION:
-	Send the E-mail message
-		subscribe f2c
-	to netlib@netlib.bell-labs.com to request notification of new and
-	changed f2c files.  (Beware that automatically sent change
-	notifications may reach you before changes have reached
-	ftp://netlib.bell-labs.com/netlib/f2c or to other netlib servers.)
-	Send the E-mail message
-		unsubscribe f2c
-	to recant your notification request.
-
------------------
-Recent change log (partial)
------------------
-
-Mon May 13 23:35:26 EDT 1996
-  Recognize Fortran 90's /= as a synonym for .NE..  (<> remains a
-synonym for .NE..)
-  Emit an empty int function of no arguments to supply an external
-name to named block data subprograms (so they can be called somewhere
-to force them to be loaded from a library).
-  Fix bug (memory fault) in handling the following illegal Fortran:
-	parameter(i=1)
-	equivalence(i,j)
-	end
-  Treat cdabs, cdcos, cdexp, cdlog, cdsin, and cdsqrt as synonyms for
-the double complex intrinsics zabs, zcos, zexp, zlog, zsin, and zsqrt,
-respectively, unless -cd is specified.
-  Recognize the Fortran 90 bit-manipulation intrinsics btest, iand,
-ibclr, ibits, ibset, ieor, ior, ishft, and ishftc, unless -i90 is
-specified.  Note that iand, ieor, and ior are thus now synonyms for
-"and", "xor", and "or", respectively.
-  Add three macros (bit_test, bit_clear, bit_set) to f2c.h for use
-with btest, ibclr, and ibset, respectively.  Add new functions
-[lq]bit_bits, [lq]bit_shift, and [lq]_bit_cshift to libF77 for
-use with ibits, ishft, and ishftc, respectively.
-  Add integer function ftell(unit) (returning -1 on error) and
-subroutine fseek(unit, offset, whence, *) to libI77 (with branch to
-label * on error).
-
-Tue May 14 23:21:12 EDT 1996
-  Fix glitch (possible memory fault, or worse) in handling multiple
-entry points with names over 28 characters long.
-
-Mon Jun 10 01:20:16 EDT 1996
-  Update netlib E-mail and ftp addresses in f2c/readme and
-f2c/src/readme (which are different files) -- to reflect the upcoming
-breakup of AT&T.
-  libf77: trivial tweaks to F77_aloc.c and system_.c; Version.c not
-changed.
-  libi77: Adjust rsli.c and lread.c so internal list input with too
-few items in the input string will honor end= .
-
-Mon Jun 10 22:59:57 EDT 1996
-  Add Bits_per_Byte to sysdep.h and adjust definition of Table_size
-to depend on Bits_per_Byte (forcing Table_size to be a power of 2); in
-lex.c, change "comstart[c & 0xfff]" to "comstart[c & (Table_size-1)]"
-to avoid an out-of-range subscript on end-of-file.
-
-Wed Jun 12 00:24:28 EDT 1996
-  Fix bug in output.c (dereferencing a freed pointer) revealed in
-	print *		!np in out_call in output.c clobbered by free
-	end		!during out_expr.
-
-Wed Jun 19 08:12:47 EDT 1996
-  f2c.h: add types uinteger, ulongint (for libF77); add qbit_clear
-and qbit_set macros (in a commented-out section) for integer*8.
-  For integer*8, use qbit_clear and qbit_set for ibclr and ibset.
-  libf77: add casts to unsigned in [lq]bitshft.c.
-
-Thu Jun 20 13:30:43 EDT 1996
-  Complain at character*(*) in common (rather than faulting).
-  Fix bug in recognizing hex constants that start with "16#" (e.g.,
-16#1234abcd, which is a synonym for z'1234abcd').
-  Fix bugs in constant folding of expressions involving btest, ibclr,
-and ibset.
-  Fix bug in constant folding of rshift(16#80000000, -31) (on a 32-bit
-machine; more generally, the bug was in constant folding of
-rshift(ibset(0,NBITS-1), 1-NBITS) when f2c runs on a machine with
-long ints having NBITS bits.
-
-Mon Jun 24 07:58:53 EDT 1996
-  Adjust struct Literal and newlabel() function to accommodate huge
-source files (with more than 32767 newlabel() invocations).
-  Omit .c file when the .f file has a missing final end statement.
-
-Wed Jun 26 14:00:02 EDT 1996
-  libi77: Add discussion of MXUNIT (highest allowed Fortran unit number)
-to libI77/README.
-
-Fri Jun 28 14:16:11 EDT 1996
-  Fix glitch with -onetrip: the temporary variable used for nonconstant
-initial loop variable values was recycled too soon.  Example:
-	do i = j+1, k
-		call foo(i+1)	! temp for j+1 was reused here
-		enddo
-	end
-
-Tue Jul  2 16:11:27 EDT 1996
-  formatdata.c: add a 0 to the end of the basetype array (for TYBLANK)
-(an omission that was harmless on most machines).
-  expr.c: fix a dereference of NULL that was only possible with buggy
-input, such as
-	subroutine $sub(s)	! the '$' is erroneous
-	character s*(*)
-	s(1:) = ' '
-	end
-
-Sat Jul  6 00:44:56 EDT 1996
-  Fix glitch in the intrinsic "real" function when applied to a
-complex (or double complex) variable and passed as an argument to
-some intrinsic functions.  Example:
-	complex a
-	b = sqrt(real(a))
-	end
-  Fix glitch (only visible if you do not use f2c's malloc and the
-malloc you do use is defective in the sense that malloc(0) returns 0)
-in handling include files that end with another include (perhaps
-followed by comments).
-  Fix glitch with character*(*) arguments named "h" and "i" when
-the body of the subroutine invokes the intrinsic LEN function.
-  Arrange that after a previous "f2c -P foo.f" has produced foo.P,
-running "f2c foo.P foo.f" will produce valid C when foo.f contains
-	call sub('1234')
-	end
-	subroutine sub(msg)
-	end
-Specifically, the length argument in "call sub" is now suppressed.
-With or without foo.P, it is also now suppressed when the order of
-subprograms in file foo.f is reversed:
-	subroutine sub(msg)
-	end
-	call sub('1234')
-	end
-  Adjust copyright notices to reflect AT&T breakup.
-
-Wed Jul 10 09:25:49 EDT 1996
-  Fix bug (possible memory fault) in handling erroneously placed
-and inconsistent declarations.  Example that faulted:
-	character*1 w(8)
-	call foo(w)
-	end
-	subroutine foo(m)
-	data h /0.5/
-	integer m(2)	! should be before data
-	end
-  Fix bug (possible fault) in handling illegal "if" constructions.
-Example (that faulted):
-	subroutine foo(i,j)
-	if (i) then		! bug: i is integer, not logical
-	else if (j) then	! bug: j is integer, not logical
-	endif
-	end
-  Fix glitch with character*(*) argument named "ret_len" to a
-character*(*) function.
-
-Wed Jul 10 23:04:16 EDT 1996
-  Fix more glitches in the intrinsic "real" function when applied to a
-complex (or double complex) variable and passed as an argument to
-some intrinsic functions.  Example:
-	complex a, b
-	r = sqrt(real(conjg(a))) + sqrt(real(a*b))
-	end
-
-Thu Jul 11 17:27:16 EDT 1996
-  Fix a memory fault associated with complicated, illegal input.
-Example:
-	subroutine goo
-	character a
-	call foo(a)	! inconsistent with subsequent def and call
-	end
-	subroutine foo(a)
-	end
-	call foo(a)
-	end
-
-Wed Jul 17 19:18:28 EDT 1996
-  Fix yet another case of intrinsic "real" applied to a complex
-argument.  Example:
-	complex a(3)
-	x = sqrt(real(a(2)))	! gave error message about bad tag
-	end
-
-Mon Aug 26 11:28:57 EDT 1996
-  Tweak sysdep.c for non-Unix systems in which process ID's can be
-over 5 digits long.
-
-Tue Aug 27 08:31:32 EDT 1996
-  Adjust the ishft intrinsic to use unsigned right shifts.  (Previously,
-a negative constant second operand resulted in a possibly signed shift.)
-
-Thu Sep 12 14:04:07 EDT 1996
-  equiv.c: fix glitch with -DKR_headers.
-  libi77: fmtlib.c: fix bug in printing the most negative integer.
-
-Fri Sep 13 08:54:40 EDT 1996
-  Diagnose some illegal appearances of substring notation.
-
-Tue Sep 17 17:48:09 EDT 1996
-  Fix fault in handling some complex parameters.  Example:
-	subroutine foo(a)
-	double complex a, b
-	parameter(b = (0,1))
-	a = b	! f2c faulted here
-	end
-
-Thu Sep 26 07:47:10 EDT 1996
-  libi77:  fmt.h:  for formatted writes of negative integer*1 values,
-make ic signed on ANSI systems.  If formatted writes of integer*1
-values trouble you when using a K&R C compiler, switch to an ANSI
-compiler or use a compiler flag that makes characters signed.
-
-Tue Oct  1 14:41:36 EDT 1996
-  Give a better error message when dummy arguments appear in data
-statements.
-
-Thu Oct 17 13:37:22 EDT 1996
-  Fix bug in typechecking arguments to character and complex (or
-double complex) functions; the bug could cause length arguments
-for character arguments to be omitted on invocations appearing
-textually after the first invocation.  For example, in
-	subroutine foo
-	character c
-	complex zot
-	call goo(zot(c), zot(c))
-	end
-the length was omitted from the second invocation of zot, and
-there was an erroneous error message about inconsistent calling
-sequences.
-
-Wed Dec  4 13:59:14 EST 1996
-  Fix bug revealed by
-	subroutine test(cdum,rdum)
-	complex cdum
-	rdum=cos(real(cdum))	! "Unexpected tag 3 in opconv_fudge"
-	end
-  Fix glitch in parsing "DO 10 D0 = 1, 10".
-  Fix glitch in parsing
-	real*8 x
-	real*8 x	! erroneous "incompatible type" message
-	call foo(x)
-	end
-  lib[FI]77/makefile: add comment about omitting -x under Solaris.
-
-Mon Dec  9 23:15:02 EST 1996
-  Fix glitch in parameter adjustments for arrays whose lower
-bound depends on a scalar argument.  Example:
-	subroutine bug(p,z,m,n)
-	integer z(*),m,n
-	double precision p(z(m):z(m) + n)	! p_offset botched
-	call foo(p(0), p(n))
-	end
-  libi77: complain about non-positive rec= in direct read and write
-statements.
-  libf77: trivial adjustments; Version.c not changed.
-
-Wed Feb 12 00:18:03 EST 1997
-  output.c: fix (seldom problematic) glitch in out_call: put parens
-around the ... in a test of the form "if (q->tag == TADDR && ...)".
-  vax.c: fix bug revealed in the "psi_offset =" assignment in the
-following example:
-	subroutine foo(psi,m)
-	integer z(100),m
-	common /a/ z
-	double precision psi(z(m):z(m) + 10)
-	call foo(m+1, psi(0),psi(10))
-	end
-
-Mon Feb 24 23:44:54 EST 1997
-  For consistency with f2c's current treatment of adjacent character
-strings in FORMAT statements, recognize a Hollerith string following
-a string (and merge adjacent strings in FORMAT statements).
-
-Wed Feb 26 13:41:11 EST 1997
-  New libf2c.zip, a combination of the libf77 and libi77 bundles (and
-available only by ftp).
-  libf77: adjust functions with a complex output argument to permit
-aliasing it with input arguments.  (For now, at least, this is just
-for possible benefit of g77.)
-  libi77: tweak to ftell_.c for systems with strange definitions of
-SEEK_SET, etc.
-
-Tue Apr  8 20:57:08 EDT 1997
-  libf77: [cz]_div.c: tweaks invisible on most systems (that may
-improve things slightly with optimized compilation on systems that use
-gratuitous extra precision).
-  libi77: fmt.c: adjust to complain at missing numbers in formats
-(but still treat missing ".nnn" as ".0").
-
-Fri Apr 11 14:05:57 EDT 1997
-  libi77: err.c: attempt to make stderr line buffered rather than
-fully buffered.  (Buffering is needed for format items T and TR.)
-
-Thu Apr 17 22:42:43 EDT 1997
- libf77: add F77_aloc.o to makefile (and makefile.u in libf2c.zip).
-
-Fri Apr 25 19:32:09 EDT 1997
- libf77: add [de]time_.c (which may give trouble on some systems).
-
-Tue May 27 09:18:52 EDT 1997
- libi77: ftell_.c: fix typo that caused the third argument to be
-treated as 2 on some systems.
-
-Mon Jun  9 00:04:37 EDT 1997
- libi77 (and libf2c.zip): adjust include order in err.c lread.c wref.c
-rdfmt.c to include fmt.h (etc.) after system includes.  Version.c not
-changed.
-
-Mon Jun  9 14:29:13 EDT 1997
- src/gram.c updated; somehow it did not reflect the change of
-19961001 to gram.dcl.
-
-Mon Jul 21 16:04:54 EDT 1997
-  proc.c: fix glitch in logic for "nonpositive dimension" message.
-  libi77: inquire.c: always include string.h (for possible use with
--DNON_UNIX_STDIO); Version.c not changed.
-
-Thu Jul 24 17:11:23 EDT 1997
-  Tweak "Notice" to reflect the AT&T breakup -- we missed it when
-updating the copyright notices in the source files last summer.
-  Adjust src/makefile so malloc.o is not used by default, but can
-be specified with "make MALLOC=malloc.o".
-  Add comments to src/README about the "CRAY" T3E.
-
-Tue Aug  5 14:53:25 EDT 1997
-  Add definition of calloc to malloc.c; this makes f2c's malloc
-work on some systems where trouble hitherto arose because references
-to calloc brought in the system's malloc.  (On sensible systems,
-calloc is defined separately from malloc.  To avoid confusion on
-other systems, f2c/malloc.c now defines calloc.)
-  libi77: lread.c: adjust to accord with a change to the Fortran 8X
-draft (in 1990 or 1991) that rescinded permission to elide quote marks
-in namelist input of character data; to get the old behavior, compile
-with F8X_NML_ELIDE_QUOTES #defined.  wrtfmt.o: wrt_G: tweak to print
-the right number of 0's for zero under G format.
-
-Sat Aug 16 05:45:32 EDT 1997
-  libI77: iio.c: fix bug in internal writes to an array of character
-strings that sometimes caused one more array element than required by
-the format to be blank-filled.  Example: format(1x).
-
-Current timestamps of files in "all from f2c/src", sorted by time,
-appear below (mm/dd/year hh:mm:ss).  To bring your source up to date,
-obtain source files with a timestamp later than the time shown in your
-version.c.  Note that the time shown in the current version.c is the
-timestamp of the source module that immediately follows version.c below:
-
- 8/05/1997  14:51:56  xsum0.out
- 8/05/1997  14:42:48  version.c
- 8/05/1997  10:31:26  malloc.c
- 7/24/1997  17:10:55  README
- 7/24/1997  17:00:57  makefile
- 7/24/1997  16:06:19  Notice
- 7/21/1997  12:58:44  proc.c
- 2/19/1997  13:34:09  lex.c
- 2/11/1997  23:39:14  vax.c
-12/22/1996  11:51:22  output.c
-12/04/1996  13:07:53  gram.exec
-10/17/1996  13:10:40  putpcc.c
-10/01/1996  14:36:18  gram.dcl
-10/01/1996  14:36:18  init.c
-10/01/1996  14:36:18  defs.h
-10/01/1996  14:36:17  data.c
- 9/17/1996  17:29:44  expr.c
- 9/12/1996  12:12:46  equiv.c
- 8/27/1996   8:30:32  intr.c
- 8/26/1996   9:41:13  sysdep.c
- 7/09/1996  10:41:13  format.c
- 7/09/1996  10:40:45  names.c
- 7/04/1996   9:58:31  formatdata.c
- 7/04/1996   9:55:45  sysdep.h
- 7/04/1996   9:55:43  put.c
- 7/04/1996   9:55:41  pread.c
- 7/04/1996   9:55:40  parse_args.c
- 7/04/1996   9:55:40  p1output.c
- 7/04/1996   9:55:38  niceprintf.c
- 7/04/1996   9:55:37  misc.c
- 7/04/1996   9:55:36  memset.c
- 7/04/1996   9:55:36  mem.c
- 7/04/1996   9:55:35  main.c
- 7/04/1996   9:55:33  io.c
- 7/04/1996   9:55:30  exec.c
- 7/04/1996   9:55:29  error.c
- 7/04/1996   9:55:27  cds.c
- 7/03/1996  15:47:49  xsum.c
- 6/19/1996   7:04:27  f2c.h
- 6/19/1996   2:52:05  defines.h
- 5/13/1996   0:40:32  gram.head
- 5/12/1996  23:37:11  f2c.1
- 5/12/1996  23:37:02  f2c.1t
- 2/25/1994   2:07:19  parse.h
- 2/22/1994  19:07:20  iob.h
- 2/22/1994  18:56:53  p1defs.h
- 2/22/1994  18:53:46  output.h
- 2/22/1994  18:51:14  names.h
- 2/22/1994  18:30:41  format.h
- 1/18/1994  18:12:52  tokens
- 3/06/1993  14:13:58  gram.expr
- 1/28/1993   9:03:16  ftypes.h
- 4/06/1990   0:00:57  gram.io
- 2/03/1990   0:58:26  niceprintf.h
- 1/07/1990   1:20:01  usignal.h
-11/27/1989   8:27:37  machdefs.h
- 7/01/1989  11:59:44  pccdefs.h
