Jelajahi Sumber

Update toolchain with some cvs additions from the debian package

Eric Andersen 20 tahun lalu
induk
melakukan
b8d48d66b3
1 mengubah file dengan 4522 tambahan dan 0 penghapusan
  1. 4522 0
      toolchain/gcc/3.3.5/999-cvs-updates.patch

+ 4522 - 0
toolchain/gcc/3.3.5/999-cvs-updates.patch

@@ -0,0 +1,4522 @@
+Index: ChangeLog
+===================================================================
+RCS file: /cvs/gcc/gcc/ChangeLog,v
+retrieving revision 1.621.2.52
+retrieving revision 1.621.2.53
+diff -u -r1.621.2.52 -r1.621.2.53
+--- gcc/ChangeLog	30 Sep 2004 16:47:59 -0000	1.621.2.52
++++ gcc/ChangeLog	6 Oct 2004 12:00:52 -0000	1.621.2.53
+@@ -1,3 +1,7 @@
++2004-10-06  Josef Zlomek  <josef.zlomek@email.cz>
++
++	* MAINTAINERS: Update my e-mail address.
++
+ 2004-09-30  Release Manager
+ 
+ 	* GCC 3.3.5 Released.
+Index: MAINTAINERS
+===================================================================
+RCS file: /cvs/gcc/gcc/MAINTAINERS,v
+retrieving revision 1.253.2.18
+retrieving revision 1.253.2.19
+diff -u -r1.253.2.18 -r1.253.2.19
+--- gcc/MAINTAINERS	16 Jan 2004 23:33:12 -0000	1.253.2.18
++++ gcc/MAINTAINERS	6 Oct 2004 12:00:53 -0000	1.253.2.19
+@@ -258,7 +258,7 @@
+ John Wehle					john@feith.com
+ Florian Weimer					fw@deneb.enyo.de
+ Mark Wielaard					mark@gcc.gnu.org
+-Josef Zlomek					zlomekj@suse.cz
++Josef Zlomek					josef.zlomek@email.cz
+ 
+ GNATS only accounts
+ 
+Index: gcc/ChangeLog
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/ChangeLog,v
+retrieving revision 1.16114.2.1019
+retrieving revision 1.16114.2.1059
+diff -u -r1.16114.2.1019 -r1.16114.2.1059
+--- gcc/gcc/ChangeLog	30 Sep 2004 16:45:01 -0000	1.16114.2.1019
++++ gcc/gcc/ChangeLog	29 Jan 2005 11:53:57 -0000	1.16114.2.1059
+@@ -1,3 +1,314 @@
++2005-01-29  Alan Modra  <amodra@bigpond.net.au>
++
++	* unwind-dw2.c (execute_stack_op): Add missing cases for
++	DW_OP_shl, DW_OP_shr, DW_OP_shra, DW_OP_xor.
++
++2005-01-28  Stephane Carrez  <stcarrez@nerim.fr>
++
++	PR target/15384
++	* config/m68hc11/t-m68hc11-gas (dp-bit.c): Fix typo causing a
++	configuration part of dp-bit.c to be lost.
++
++2005-01-27  Ulrich Weigand  <uweigand@de.ibm.com>
++
++	PR target/17771
++	Backport from mainline:
++	* config/s390/s390.md ("reload_outti"): Remove predicate for
++	output operand.  Abort if operand is not a MEM.
++	("reload_outdi", "reload_outdf"): Likewise.
++
++2005-01-22  Roger Sayle  <roger@eyesopen.com>
++
++	PR target/18402
++	Backport from mainline
++	2003-02-05  Jakub Jelinek  <jakub@redhat.com>
++ 
++ 	PR optimization/8555
++ 	* config/i386/i386.md (sse_mov?fcc split): Handle op2 == op3 case
++ 	instead of aborting.
++
++2005-01-21  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
++
++	* gccbug.in: Update optimization -> tree-optimization/rtl-optimization.
++
++2005-01-21  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
++
++	PR c++/17115
++	* tree-inline.c (expand_call_inline): Do not warn for functions
++	marked with attribute noinline.
++
++2005-01-18  Eric Botcazou  <ebotcazou@libertysurf.fr>
++
++	PR rtl-optimization/19296
++	* combine.c (simplify_comparison): Rewrite the condition under
++	which a non-paradoxical SUBREG of a PLUS can be lifted when
++	compared against a constant.
++
++2004-01-14  David Mosberger  <davidm@hpl.hp.com>
++	    James E Wilson  <wilson@specifixinc.com>
++
++	PR target/18987
++	* config/ia64/ia64.c (process_set): For alloc insn, only call
++	process_epilogue is !frame_pointer_needed.
++
++	PR target/13158
++	* config/ia64/ia64.c (ia64_expand_epilogue): Set RTX_FRAME_RELATED_P on
++	sibcall alloc instruction.
++	(process_set): Handle sibcall alloc instruction.
++
++2005-01-13  David O'Brien  <obrien@FreeBSD.org>
++
++	Backport from mainline:
++	* config/freebsd-spec.h:  Use KSE pthread lib for -pthread.
++
++2005-01-08  Sergey M. Samoylov  <ssamoylov@dev.rtsoft.ru>
++
++	Backport:
++	2004-02-12  Richard Sandiford  <rsandifo@redhat.com>
++	PR bootstrap/13617
++	* config/mips/mips-protos.h (mips_output_aligned_decl_common): Declare.
++	(mips_declare_object): Make variadic.
++	* config/mips/mips.h (ASM_OUTPUT_ALIGNED_DECL_COMMON): Use
++	mips_output_aligned_decl_common.
++	* config/mips/mips.c (mips_output_aligned_decl_common): New function.
++	(mips_declare_object): Make variadic.
++
++2005-01-08  Richard Sandiford  <rsandifo@redhat.com>
++
++	PR target/17565
++	* config/mips/mips.md (define_asm_attributes): Set can_delay to no.
++
++2004-12-27 John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++	* vax.c (vax_address_cost, vax_rtx_cost): Correct casts.
++	(vax_rtx_cost): Handle small offsets for both PLUS and MINUS.
++
++2004-12-27  Steven Bosscher  <stevenb@suse.de>
++	    John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++	rtl-optimization/12863
++        * config/vax/vax.h (CASE_DROPS_THROUGH): Don't define.
++        * config/vax/vax.md (casesi): Emit a test-and-branch to make sure
++        that the case is in range, to make sure the casesi insn is always
++        in range and never falls through.
++        (casesi1): Add comment to explain why casesi never falls through.
++        Remove the unnamed special case casesi pattern.
++
++2004-12-26  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++	PR target/17643
++	* config/pa/pa32-linux.h (FUNCTION_OK_FOR_SIBCALL): Return false when
++	TARGET_PORTABLE_RUNTIME is true.
++
++2004-12-25  Alan Modra  <amodra@bigpond.net.au>
++
++	PR target/19147
++	* config/rs6000/rs6000.md (andsi3_internal7, andsi3_internal8): Delete.
++
++2004-12-21  Joseph S. Myers  <jsm@polyomino.org.uk>
++
++	PR c/14765
++	* c-parse.in (compstmt_primary_start): Set last_expr_type to
++	NULL_TREE.
++
++2004-12-19  Roger Sayle  <roger@eyesopen.com>
++
++	PR middle-end/19068
++	* expr.c (expand_expr_real_1) <MAX_EXPR>: Ensure that target, op0
++	and op1 are all registers (or constants) before expanding the RTL
++	comparison sequence [to avoid reg_overlap_mentioned (target, op1)].
++
++2004-12-16  Eric Botcazou  <ebotcazou@adacore.com>
++
++	PR middle-end/18882
++	* function.c (assign_stack_local_1): Use BITS_PER_UNIT alignment
++	when passed -2 as 'align'.
++	(put_var_into_stack): Adjust calls to put_reg_into_stack.
++	When passed a CONCAT, instruct put_reg_into_stack to use
++	a consecutive stack slot for the second part.
++	(put_reg_into_stack): Remove 'promoted_mode' parameter, add
++	'consecutive_p' parameter.  Retrieve the register mode from 'reg'.
++	When consecutive_p is true, instruct assign_stack_local_1 to use
++	BITS_PER_UNIT alignment.
++	(put_addressof_into_stack): Adjust call to put_reg_into_stack.
++
++2004-12-16  Eric Botcazou  <ebotcazou@libertysurf.fr>
++
++	PR middle-end/18590
++	* function.c (fixup_var_refs_insns_with_hash): Do not invoke
++	fixup_var_refs_insn on insns marked as deleted.
++
++2004-12-15  Richard Henderson  <rth@redhat.com>
++
++        PR target/19005
++        * config/i386/i386.md (swaphi_1): Swap with swaphi_2, allow with
++        optimize_size.
++        (swapqi_1): Rename from swapqi.  Enable only for no partial reg
++        stall and optimize_size.
++        (swapqi_2): New.
++        (swaphi_1, swaphi_2, swapqi_1): Add athlon_decode.
++        (swapsi, swaphi_1, swaphi_2, swapqi_1, swapdi): Remove modrm override.
++
++2004-12-13  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++	PR middle-end/18730
++	* emit-rtl.c (get_first_nonnote_insn, get_last_nonnote_insn): When
++	the first/last insn is a sequence, return the first/last insn of the
++	sequence.
++
++2004-12-12  Richard Henderson  <rth@redhat.com>
++
++        PR target/18932
++        * config/i386/i386.md (all splits and peepholes): Use flags_reg_operand
++        and compare_operator to propagate the input CC mode to the output.
++        * config/i386/i386.c (flags_reg_operand, compare_operator): New.
++        * config/i386/i386.h (PREDICATE_CODES): Add them.
++        * config/i386/i386-protos.h: Update.
++
++2004-12-10  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
++
++	PR rtl-optimization/16536
++	Backport from mainline:
++	2004-06-25  Mark Mitchell  <mark@codesourcery.com>
++	* alias.c (get_alias_set): Adjust setting of
++	DECL_POINTER_ALIAS_SET for pointers to aggregates.
++
++2004-12-09  Richard Henderson  <rth@redhat.com>
++
++	PR target/17025
++	* config/i386/i386.md (testqi_1_maybe_si, andqi_2_maybe_si): New.
++	(test_qi_1, andqi_2): Do not promote to simode.
++
++2004-12-07  David Mosberger  <davidm@hpl.hp.com>
++
++	PR target/18443
++	* config/ia64/ia64.c (ia64_assemble_integer): Add support for
++	emitting unaligned pointer-sized integers.
++
++2004-12-05  Richard Henderson  <rth@redhat.com>
++
++	PR target/18841
++	* config/alpha/alpha.md (UNSPECV_SETJMPR_ER): New.
++	(builtin_setjmp_receiver_er_sl_1): Use it.
++	(builtin_setjmp_receiver_er_1): Likewise.
++	(builtin_setjmp_receiver_er, exception_receiver_er): Remove.
++	(builtin_setjmp_receiver): Don't split for explicit relocs until
++	after reload.
++	(exception_receiver): Likewise.
++
++2004-12-03  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++	2003-10-31  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++	Backport from mainline
++	* aclocal.m4 (gcc_AC_FUNC_MMAP_BLACKLIST): Blacklist ultrix*.
++	* configure: Rebuilt.
++
++2004-12-03  Richard Henderson  <rth@redhat.com>
++
++	2004-09-24  Richard Henderson  <rth@redhat.com>
++	PR rtl-opt/17503
++	* regclass.c (subregs_of_mode): Turn into an htab.  Make static.
++	(som_hash, som_eq): New.
++	(init_subregs_of_mode, record_subregs_of_mode): New.
++	(cannot_change_mode_set_regs): Rewrite for htab implementation.
++	(invalid_mode_change_p): Likewise.
++	* combine.c (gen_lowpart_for_combine): Use record_subregs_of_mode.
++	* flow.c (mark_used_regs): Likewise.
++	(life_analysis): Use init_subregs_of_mode.
++	* regs.h (subregs_of_mode): Remove.
++	* rtl.h (init_subregs_of_mode, record_subregs_of_mode): Declare.
++
++2004-12-03  Roger Sayle  <roger@eyesopen.com>
++
++	PR target/9908
++	* config/i386/i386.md (*call_value_1): Correct Intel assembler
++	syntax by using %A1 instead of %*%1.
++
++2004-12-01  Alan Modra  <amodra@bigpond.net.au>
++
++	PR target/12817
++	* config/rs6000/rs6000.c (rs6000_emit_prologue): Use r0 for vrsave.
++
++2004-11-29  Roger Sayle  <roger@eyesopen.com>
++
++	PR rtl-optimization/9771
++	* regclass.c (CALL_REALLY_USED_REGNO_P): New macro to eliminate
++	conditional compilation in init_reg_sets_1.
++	(init_reg_sets_1): Let global_regs[i] take priority over the frame
++	(but not stack) pointer exceptions to regs_invalidated_by_call.
++	(globalize_reg): Globalizing a fixed register may need to update
++	regs_invalidated_by_call.
++
++2004-11-27  Falk Hueffner  <falk@debian.org>
++	    Eric Botcazou  <ebotcazou@libertysurf.fr>
++
++	PR optimization/18577
++	* unroll.c (unroll_loop): Test both REGNO_LAST_UID and
++	REGNO_LAST_NOTE_UID to decide whether a pseudo is local
++	to the loop.
++
++2004-11-27  Alan Modra  <amodra@bigpond.net.au>
++
++	PR target/12769
++	* config/rs6000/rs6000.c (init_cumulative_args): Set call_cookie
++	from rs6000_default_long_calls for libcalls.
++
++2004-11-25  Richard Henderson  <rth@redhat.com>
++
++	PR c++/6764
++	* reload1.c (set_initial_eh_label_offset): New.
++	(set_initial_label_offsets): Use it.
++
++2004-11-22  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
++
++	PR rtl-optimization/14838
++	* emit-rtl.c (get_first_nonnote_insn): Don't assume first insn is a
++	note.
++	(get_last_nonnote_insn): Don't assume last insn is a note.
++
++2004-10-14  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
++
++	* doc/install.texi (*-*-solaris2*): Update with info about kernel
++	patches to solve spurious testsuite failures.
++
++2004-10-13  Eric Botcazou  <ebotcazou@libertysurf.fr>
++
++	PR target/14454
++	* config/sparc/sparc.c (TARGET_ASM_CAN_OUTPUT_MI_THUNK): Set to
++	sparc_can_output_mi_thunk.
++	(sparc_output_mi_thunk): Simplify handling of delta offset.  Add
++	handling of vcall offset.
++	(sparc_can_output_mi_thunk): New predicate.
++	* doc/tm.texi (TARGET_ASM_OUTPUT_MI_THUNK): Document VCALL_OFFSET.
++	(TARGET_ASM_OUTPUT_MI_VCALL_THUNK): Delete.
++	(TARGET_ASM_CAN_OUTPUT_MI_THUNK): New target hook.
++
++	* config/sparc/sparc.md (movdi): Remove redundant test.
++
++2004-10-07  Eric Botcazou  <ebotcazou@libertysurf.fr>
++
++	* doc/install.texi (*-*-solaris2*): Fix marker for URL.
++
++2004-10-06  Eric Botcazou  <ebotcazou@libertysurf.fr>
++
++	PR target/16007
++	* doc/install.texi (*-*-solaris2*): Mention potential problem
++	with Sun assembler + GNU linker and C++ programs.
++	Document status of binutils 2.15 release.
++
++2004-09-30  Richard Henderson  <rth@redhat.com>
++ 
++	* config/alpha/qrnnd.asm: Mark for noexecstack.
++ 
++2004-09-30  Richard Henderson  <rth@redhat.com>
++  
++	* unwind-dw2.c (_Unwind_GetGR): Honor DWARF_ZERO_REG.
++	* doc/tm.texi (DWARF_ZERO_REG): New.
++  
++	* config/alpha/alpha.c (alpha_sa_mask, alpha_expand_prologue,
++	alpha_expand_epilogue): Revert 2003-09-30 change to store zero.
++	* config/alpha/alpha.h (DWARF_ZERO_REG): New.
++
+ 2004-09-30  Release Manager
+ 
+ 	* GCC 3.3.5 Released.
+@@ -19,12 +330,12 @@
+ 
+ 2004-09-13  Richard Henderson  <rth@redhat.com>
+ 
+-        PR inline-asm/6806
+-        * cselib.c (cselib_invalidate_rtx): Export.  Remove unused args.
+-        (cselib_invalidate_rtx_note_stores): New.
+-        (cselib_record_sets, cselib_process_insn): Update to match.
+-        * cselib.h (cselib_invalidate_rtx): Declare.
+-        * reload1.c (reload_cse_simplify): Invalidate asm clobbers.
++	PR inline-asm/6806
++	* cselib.c (cselib_invalidate_rtx): Export.  Remove unused args.
++	(cselib_invalidate_rtx_note_stores): New.
++	(cselib_record_sets, cselib_process_insn): Update to match.
++	* cselib.h (cselib_invalidate_rtx): Declare.
++	* reload1.c (reload_cse_simplify): Invalidate asm clobbers.
+ 
+ 2004-08-29  Jonathan Wakely  <redi@gcc.gnu.org>
+ 
+@@ -83,7 +394,7 @@
+ 2004-07-25  Andreas Jaeger  <aj@suse.de>
+ 
+ 	Backport from mainline:
+-        * libgcc-std.ver: Add __unorddf2 and __unordsf2 with version 3.3.4.
++	* libgcc-std.ver: Add __unorddf2 and __unordsf2 with version 3.3.4.
+ 
+ 2004-07-25  Kaz Kojima  <kkojima@gcc.gnu.org>
+ 
+@@ -155,14 +466,14 @@
+ 	side-effect of having a length greater or equal to 3.
+ 
+ 2004-07-13  Eric Botcazou  <ebotcazou@libertysurf.fr>
+-            Lloyd Parkes  <lloyd@must-have-coffee.gen.nz>
++	    Lloyd Parkes  <lloyd@must-have-coffee.gen.nz>
+ 
+ 	PR target/15186
+ 	* config/sparc/sol2-bi.h (LINK_ARCH64_SPEC_BASE): Pass
+ 	/usr/ucblib/sparcv9 as -R path when -compat-bsd is specified.
+ 
+ 2004-07-13  Eric Botcazou  <ebotcazou@libertysurf.fr>
+-            Martin Sebor  <sebor@roguewave.com>
++	    Martin Sebor  <sebor@roguewave.com>
+ 
+ 	PR target/12602
+ 	* doc/invoke.texi (SPARC options): Document -threads
+@@ -252,18 +563,18 @@
+ 
+ 	Backport from mainline:
+ 	2004-01-19  Richard Henderson  <rth@redhat.com>
+-        * alpha.md (UNSPEC_NT_LDA): Renumber.
+-        (UNSPEC_CVTLQ, cvtlq): New.
+-        (extendsidi2_1): Rename from extendsidi2_nofix; remove f/f.
+-        (extendsidi2_fix): Remove.
+-        (extendsidi2 splitter): Use cvtlq.
+-        (extendsidi2 fp peepholes): Remove.
+-        (cvtql): Use SFmode instead of SImode.
+-        (fix_trunc?fsi): Update to match.
+-        (floatsisf2_ieee, floatsisf2, floatsidf2_ieee, floatsidf2): New.
+-        (movsi): Rename from movsi_nofix, remove f alternatives.
+-        (movsi_nt_vms): Similarly.
+-        (movsi_fix, movsi_nt_vms_fix): Remove.
++	* alpha.md (UNSPEC_NT_LDA): Renumber.
++	(UNSPEC_CVTLQ, cvtlq): New.
++	(extendsidi2_1): Rename from extendsidi2_nofix; remove f/f.
++	(extendsidi2_fix): Remove.
++	(extendsidi2 splitter): Use cvtlq.
++	(extendsidi2 fp peepholes): Remove.
++	(cvtql): Use SFmode instead of SImode.
++	(fix_trunc?fsi): Update to match.
++	(floatsisf2_ieee, floatsisf2, floatsidf2_ieee, floatsidf2): New.
++	(movsi): Rename from movsi_nofix, remove f alternatives.
++	(movsi_nt_vms): Similarly.
++	(movsi_fix, movsi_nt_vms_fix): Remove.
+ 
+ 2004-05-26  Hans-Peter Nilsson  <hp@axis.com>
+ 
+Index: gcc/aclocal.m4
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/aclocal.m4,v
+retrieving revision 1.61.2.4
+retrieving revision 1.61.2.5
+diff -u -r1.61.2.4 -r1.61.2.5
+--- gcc/gcc/aclocal.m4	1 Oct 2003 21:56:34 -0000	1.61.2.4
++++ gcc/gcc/aclocal.m4	4 Dec 2004 01:51:47 -0000	1.61.2.5
+@@ -413,7 +413,7 @@
+    # read() to the same fd.  The only system known to have a problem here
+    # is VMS, where text files have record structure.
+    case "$host_os" in
+-     vms*) 
++     vms* | ultrix*) 
+         gcc_cv_func_mmap_file=no ;;
+      *)
+         gcc_cv_func_mmap_file=yes;;
+Index: gcc/alias.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/alias.c,v
+retrieving revision 1.181.2.6
+retrieving revision 1.181.2.7
+diff -u -r1.181.2.6 -r1.181.2.7
+--- gcc/gcc/alias.c	28 May 2004 17:27:27 -0000	1.181.2.6
++++ gcc/gcc/alias.c	10 Dec 2004 17:25:00 -0000	1.181.2.7
+@@ -508,6 +508,8 @@
+ 	      /* If we haven't computed the actual alias set, do it now.  */
+ 	      if (DECL_POINTER_ALIAS_SET (decl) == -2)
+ 		{
++		  tree pointed_to_type = TREE_TYPE (TREE_TYPE (decl));
++
+ 		  /* No two restricted pointers can point at the same thing.
+ 		     However, a restricted pointer can point at the same thing
+ 		     as an unrestricted pointer, if that unrestricted pointer
+@@ -516,11 +518,22 @@
+ 		     alias set for the type pointed to by the type of the
+ 		     decl.  */
+ 		  HOST_WIDE_INT pointed_to_alias_set
+-		    = get_alias_set (TREE_TYPE (TREE_TYPE (decl)));
++		    = get_alias_set (pointed_to_type);
+ 
+ 		  if (pointed_to_alias_set == 0)
+ 		    /* It's not legal to make a subset of alias set zero.  */
+-		    ;
++		    DECL_POINTER_ALIAS_SET (decl) = 0;
++		  else if (AGGREGATE_TYPE_P (pointed_to_type))
++		    /* For an aggregate, we must treat the restricted
++		       pointer the same as an ordinary pointer.  If we
++		       were to make the type pointed to by the
++		       restricted pointer a subset of the pointed-to
++		       type, then we would believe that other subsets
++		       of the pointed-to type (such as fields of that
++		       type) do not conflict with the type pointed to
++		       by the restricted pointer.   */
++		    DECL_POINTER_ALIAS_SET (decl)
++		      = pointed_to_alias_set;
+ 		  else
+ 		    {
+ 		      DECL_POINTER_ALIAS_SET (decl) = new_alias_set ();
+Index: gcc/c-parse.in
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/c-parse.in,v
+retrieving revision 1.152.14.1
+retrieving revision 1.152.14.2
+diff -u -r1.152.14.1 -r1.152.14.2
+--- gcc/gcc/c-parse.in	28 Jan 2003 01:54:03 -0000	1.152.14.1
++++ gcc/gcc/c-parse.in	21 Dec 2004 21:51:26 -0000	1.152.14.2
+@@ -2177,6 +2177,7 @@
+ 		  push_label_level ();
+ 		  compstmt_count++;
+ 		  $$ = add_stmt (build_stmt (COMPOUND_STMT, last_tree));
++		  last_expr_type = NULL_TREE;
+ 		}
+         ;
+ 
+Index: gcc/combine.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/combine.c,v
+retrieving revision 1.325.2.17
+retrieving revision 1.325.2.19
+diff -u -r1.325.2.17 -r1.325.2.19
+--- gcc/gcc/combine.c	25 Jul 2004 18:49:54 -0000	1.325.2.17
++++ gcc/gcc/combine.c	18 Jan 2005 08:39:05 -0000	1.325.2.19
+@@ -10138,13 +10138,8 @@
+ 
+   result = gen_lowpart_common (mode, x);
+ #ifdef CANNOT_CHANGE_MODE_CLASS
+-  if (result != 0
+-      && GET_CODE (result) == SUBREG
+-      && GET_CODE (SUBREG_REG (result)) == REG
+-      && REGNO (SUBREG_REG (result)) >= FIRST_PSEUDO_REGISTER)
+-    bitmap_set_bit (&subregs_of_mode, REGNO (SUBREG_REG (result))
+-				      * MAX_MACHINE_MODE
+-				      + GET_MODE (result));
++  if (result != 0 && GET_CODE (result) == SUBREG)
++    record_subregs_of_mode (result);
+ #endif
+ 
+   if (result)
+@@ -10818,34 +10813,61 @@
+ 	  break;
+ 
+ 	case SUBREG:
+-	  /* Check for the case where we are comparing A - C1 with C2,
+-	     both constants are smaller than 1/2 the maximum positive
+-	     value in MODE, and the comparison is equality or unsigned.
+-	     In that case, if A is either zero-extended to MODE or has
+-	     sufficient sign bits so that the high-order bit in MODE
+-	     is a copy of the sign in the inner mode, we can prove that it is
+-	     safe to do the operation in the wider mode.  This simplifies
+-	     many range checks.  */
++	  /* Check for the case where we are comparing A - C1 with C2, that is
++
++	       (subreg:MODE (plus (A) (-C1))) op (C2)
++
++	     with C1 a constant, and try to lift the SUBREG, i.e. to do the
++	     comparison in the wider mode.  One of the following two conditions
++	     must be true in order for this to be valid:
++
++	       1. The mode extension results in the same bit pattern being added
++		  on both sides and the comparison is equality or unsigned.  As
++		  C2 has been truncated to fit in MODE, the pattern can only be
++		  all 0s or all 1s.
++
++	       2. The mode extension results in the sign bit being copied on
++		  each side.
++
++	     The difficulty here is that we have predicates for A but not for
++	     (A - C1) so we need to check that C1 is within proper bounds so
++	     as to perturbate A as little as possible.  */
+ 
+ 	  if (mode_width <= HOST_BITS_PER_WIDE_INT
+ 	      && subreg_lowpart_p (op0)
++	      && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) > mode_width
+ 	      && GET_CODE (SUBREG_REG (op0)) == PLUS
+-	      && GET_CODE (XEXP (SUBREG_REG (op0), 1)) == CONST_INT
+-	      && INTVAL (XEXP (SUBREG_REG (op0), 1)) < 0
+-	      && (-INTVAL (XEXP (SUBREG_REG (op0), 1))
+-		  < (HOST_WIDE_INT) (GET_MODE_MASK (mode) / 2))
+-	      && (unsigned HOST_WIDE_INT) const_op < GET_MODE_MASK (mode) / 2
+-	      && (0 == (nonzero_bits (XEXP (SUBREG_REG (op0), 0),
+-				      GET_MODE (SUBREG_REG (op0)))
+-			& ~GET_MODE_MASK (mode))
+-		  || (num_sign_bit_copies (XEXP (SUBREG_REG (op0), 0),
+-					   GET_MODE (SUBREG_REG (op0)))
+-		      > (unsigned int)
+-			(GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
+-			 - GET_MODE_BITSIZE (mode)))))
++	      && GET_CODE (XEXP (SUBREG_REG (op0), 1)) == CONST_INT)
+ 	    {
+-	      op0 = SUBREG_REG (op0);
+-	      continue;
++	      enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
++	      rtx a = XEXP (SUBREG_REG (op0), 0);
++	      HOST_WIDE_INT c1 = -INTVAL (XEXP (SUBREG_REG (op0), 1));
++
++	      if ((c1 > 0
++	           && (unsigned HOST_WIDE_INT) c1
++		       < (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)
++		   && (equality_comparison_p || unsigned_comparison_p)
++		   /* (A - C1) zero-extends if it is positive and sign-extends
++		      if it is negative, C2 both zero- and sign-extends.  */
++		   && ((0 == (nonzero_bits (a, inner_mode)
++			      & ~GET_MODE_MASK (mode))
++			&& const_op >= 0)
++		       /* (A - C1) sign-extends if it is positive and 1-extends
++			  if it is negative, C2 both sign- and 1-extends.  */
++		       || (num_sign_bit_copies (a, inner_mode)
++			   > (unsigned int) (GET_MODE_BITSIZE (inner_mode)
++					     - mode_width)
++			   && const_op < 0)))
++		  || ((unsigned HOST_WIDE_INT) c1
++		       < (unsigned HOST_WIDE_INT) 1 << (mode_width - 2)
++		      /* (A - C1) always sign-extends, like C2.  */
++		      && num_sign_bit_copies (a, inner_mode)
++			 > (unsigned int) (GET_MODE_BITSIZE (inner_mode)
++					   - mode_width - 1)))
++		{
++		  op0 = SUBREG_REG (op0);
++		  continue;
++	        }
+ 	    }
+ 
+ 	  /* If the inner mode is narrower and we are extracting the low part,
+Index: gcc/configure
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/configure,v
+retrieving revision 1.641.2.23
+retrieving revision 1.641.2.24
+diff -u -r1.641.2.23 -r1.641.2.24
+--- gcc/gcc/configure	1 Apr 2004 16:55:23 -0000	1.641.2.23
++++ gcc/gcc/configure	4 Dec 2004 01:51:43 -0000	1.641.2.24
+@@ -2399,7 +2399,7 @@
+ fi
+ 
+ # Find some useful tools
+-for ac_prog in gawk mawk nawk awk
++for ac_prog in mawk gawk nawk awk
+ do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+ set dummy $ac_prog; ac_word=$2
+@@ -3947,7 +3947,7 @@
+    # read() to the same fd.  The only system known to have a problem here
+    # is VMS, where text files have record structure.
+    case "$host_os" in
+-     vms*) 
++     vms* | ultrix*) 
+         gcc_cv_func_mmap_file=no ;;
+      *)
+         gcc_cv_func_mmap_file=yes;;
+@@ -8120,7 +8120,7 @@
+ echo "$ac_t""$gcc_cv_ld_eh_frame_hdr" 1>&6
+ 
+ echo $ac_n "checking linker --as-needed support""... $ac_c" 1>&6
+-echo "configure:8250: checking linker --as-needed support" >&5
++echo "configure:8124: checking linker --as-needed support" >&5
+ gcc_cv_ld_as_needed=no
+ if test x$gcc_cv_gld_major_version != x -a x$gcc_cv_gld_minor_version != x; then
+   if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 16 -o "$gcc_cv_gld_major_version" -gt 2 && grep 'EMUL = elf' ../ld/Makefile > /dev/null; then
+@@ -8144,7 +8144,7 @@
+ case "$target" in
+   mips*-*-*)
+     echo $ac_n "checking whether libgloss uses STARTUP directives consistently""... $ac_c" 1>&6
+-echo "configure:8127: checking whether libgloss uses STARTUP directives consistently" >&5
++echo "configure:8148: checking whether libgloss uses STARTUP directives consistently" >&5
+     gcc_cv_mips_libgloss_startup=no
+     gcc_cv_libgloss_srcdir=`echo $srcdir | sed -e 's,/gcc$,,'`/libgloss
+     if test "x$exec_prefix" = xNONE; then
+@@ -8349,7 +8349,7 @@
+ 
+ 
+ echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
+-echo "configure:8332: checking whether to enable maintainer-specific portions of Makefiles" >&5
++echo "configure:8353: checking whether to enable maintainer-specific portions of Makefiles" >&5
+     # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+ if test "${enable_maintainer_mode+set}" = set; then
+   enableval="$enable_maintainer_mode"
+Index: gcc/emit-rtl.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/emit-rtl.c,v
+retrieving revision 1.303.2.5
+retrieving revision 1.303.2.7
+diff -u -r1.303.2.5 -r1.303.2.7
+--- gcc/gcc/emit-rtl.c	18 Jun 2004 17:08:48 -0000	1.303.2.5
++++ gcc/gcc/emit-rtl.c	14 Dec 2004 04:06:08 -0000	1.303.2.7
+@@ -2890,11 +2890,19 @@
+ {
+   rtx insn = first_insn;
+ 
+-  while (insn)
++  if (insn)
+     {
+-      insn = next_insn (insn);
+-      if (insn == 0 || GET_CODE (insn) != NOTE)
+-	break;
++      if (NOTE_P (insn))
++	for (insn = next_insn (insn);
++	     insn && NOTE_P (insn);
++	     insn = next_insn (insn))
++	  continue;
++      else
++	{
++	  if (GET_CODE (insn) == INSN
++	      && GET_CODE (PATTERN (insn)) == SEQUENCE)
++	    insn = XVECEXP (PATTERN (insn), 0, 0);
++	}
+     }
+ 
+   return insn;
+@@ -2908,11 +2916,20 @@
+ {
+   rtx insn = last_insn;
+ 
+-  while (insn)
++  if (insn)
+     {
+-      insn = previous_insn (insn);
+-      if (insn == 0 || GET_CODE (insn) != NOTE)
+-	break;
++      if (NOTE_P (insn))
++	for (insn = previous_insn (insn);
++	     insn && NOTE_P (insn);
++	     insn = previous_insn (insn))
++	  continue;
++      else
++	{
++	  if (GET_CODE (insn) == INSN
++	      && GET_CODE (PATTERN (insn)) == SEQUENCE)
++	    insn = XVECEXP (PATTERN (insn), 0,
++			    XVECLEN (PATTERN (insn), 0) - 1);
++	}
+     }
+ 
+   return insn;
+Index: gcc/expr.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/expr.c,v
+retrieving revision 1.498.2.31
+retrieving revision 1.498.2.32
+diff -u -r1.498.2.31 -r1.498.2.32
+--- gcc/gcc/expr.c	16 May 2004 20:27:15 -0000	1.498.2.31
++++ gcc/gcc/expr.c	20 Dec 2004 02:43:00 -0000	1.498.2.32
+@@ -8462,9 +8462,14 @@
+       /* At this point, a MEM target is no longer useful; we will get better
+ 	 code without it.  */
+ 
+-      if (GET_CODE (target) == MEM)
++      if (! REG_P (target))
+ 	target = gen_reg_rtx (mode);
+ 
++      /* We generate better code and avoid problems with op1 mentioning
++	 target by forcing op1 into a pseudo if it isn't a constant.  */
++      if (! CONSTANT_P (op1))
++	op1 = force_reg (mode, op1);
++
+       if (target != op0)
+ 	emit_move_insn (target, op0);
+ 
+Index: gcc/flow.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/flow.c,v
+retrieving revision 1.541.2.6
+retrieving revision 1.541.2.7
+diff -u -r1.541.2.6 -r1.541.2.7
+--- gcc/gcc/flow.c	5 Mar 2004 17:55:50 -0000	1.541.2.6
++++ gcc/gcc/flow.c	4 Dec 2004 00:36:35 -0000	1.541.2.7
+@@ -431,9 +431,8 @@
+   SET_HARD_REG_BIT (elim_reg_set, FRAME_POINTER_REGNUM);
+ #endif
+ 
+-
+ #ifdef CANNOT_CHANGE_MODE_CLASS
+-  bitmap_initialize (&subregs_of_mode, 1);
++  init_subregs_of_mode ();
+ #endif
+ 
+   if (! optimize)
+@@ -3851,11 +3850,7 @@
+ 
+     case SUBREG:
+ #ifdef CANNOT_CHANGE_MODE_CLASS
+-      if (GET_CODE (SUBREG_REG (x)) == REG
+-	  && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER)
+-	bitmap_set_bit (&subregs_of_mode, REGNO (SUBREG_REG (x))
+-					  * MAX_MACHINE_MODE
+-					  + GET_MODE (x));
++      record_subregs_of_mode (x);
+ #endif
+ 
+       /* While we're here, optimize this case.  */
+@@ -3900,12 +3895,8 @@
+ 	       || GET_CODE (testreg) == SUBREG)
+ 	  {
+ #ifdef CANNOT_CHANGE_MODE_CLASS
+-	    if (GET_CODE (testreg) == SUBREG
+-		&& GET_CODE (SUBREG_REG (testreg)) == REG
+-		&& REGNO (SUBREG_REG (testreg)) >= FIRST_PSEUDO_REGISTER)
+-	      bitmap_set_bit (&subregs_of_mode, REGNO (SUBREG_REG (testreg))
+-						* MAX_MACHINE_MODE
+-						+ GET_MODE (testreg));
++	    if (GET_CODE (testreg) == SUBREG)
++	      record_subregs_of_mode (testreg);
+ #endif
+ 
+ 	    /* Modifying a single register in an alternate mode
+Index: gcc/function.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/function.c,v
+retrieving revision 1.389.2.16
+retrieving revision 1.389.2.18
+diff -u -r1.389.2.16 -r1.389.2.18
+--- gcc/gcc/function.c	16 May 2004 20:27:16 -0000	1.389.2.16
++++ gcc/gcc/function.c	16 Dec 2004 14:04:34 -0000	1.389.2.18
+@@ -226,9 +226,8 @@
+ 					 int, struct function *));
+ static struct temp_slot *find_temp_slot_from_address  PARAMS ((rtx));
+ static void put_reg_into_stack	PARAMS ((struct function *, rtx, tree,
+-					 enum machine_mode, enum machine_mode,
+-					 int, unsigned int, int,
+-					 htab_t));
++					 enum machine_mode, unsigned int,
++					 int, int, int, htab_t));
+ static void schedule_fixup_var_refs PARAMS ((struct function *, rtx, tree,
+ 					     enum machine_mode,
+ 					     htab_t));
+@@ -508,6 +507,7 @@
+    ALIGN controls the amount of alignment for the address of the slot:
+    0 means according to MODE,
+    -1 means use BIGGEST_ALIGNMENT and round size to multiple of that,
++   -2 means use BITS_PER_UNIT,
+    positive specifies alignment boundary in bits.
+ 
+    We do not round to stack_boundary here.
+@@ -548,6 +548,8 @@
+       alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
+       size = CEIL_ROUND (size, alignment);
+     }
++  else if (align == -2)
++    alignment = 1; /* BITS_PER_UNIT / BITS_PER_UNIT */
+   else
+     alignment = align / BITS_PER_UNIT;
+ 
+@@ -1342,9 +1344,9 @@
+   enum machine_mode promoted_mode, decl_mode;
+   struct function *function = 0;
+   tree context;
+-  int can_use_addressof;
+-  int volatilep = TREE_CODE (decl) != SAVE_EXPR && TREE_THIS_VOLATILE (decl);
+-  int usedp = (TREE_USED (decl)
++  int can_use_addressof_p;
++  int volatile_p = TREE_CODE (decl) != SAVE_EXPR && TREE_THIS_VOLATILE (decl);
++  int used_p = (TREE_USED (decl)
+ 	       || (TREE_CODE (decl) != SAVE_EXPR && DECL_INITIAL (decl) != 0));
+ 
+   context = decl_function_context (decl);
+@@ -1391,7 +1393,7 @@
+   /* If this variable lives in the current function and we don't need to put it
+      in the stack for the sake of setjmp or the non-locality, try to keep it in
+      a register until we know we actually need the address.  */
+-  can_use_addressof
++  can_use_addressof_p
+     = (function == 0
+        && ! (TREE_CODE (decl) != SAVE_EXPR && DECL_NONLOCAL (decl))
+        && optimize > 0
+@@ -1404,7 +1406,8 @@
+ 
+   /* If we can't use ADDRESSOF, make sure we see through one we already
+      generated.  */
+-  if (! can_use_addressof && GET_CODE (reg) == MEM
++  if (! can_use_addressof_p
++      && GET_CODE (reg) == MEM
+       && GET_CODE (XEXP (reg, 0)) == ADDRESSOF)
+     reg = XEXP (XEXP (reg, 0), 0);
+ 
+@@ -1412,11 +1415,11 @@
+ 
+   if (GET_CODE (reg) == REG)
+     {
+-      if (can_use_addressof)
++      if (can_use_addressof_p)
+ 	gen_mem_addressof (reg, decl, rescan);
+       else
+-	put_reg_into_stack (function, reg, TREE_TYPE (decl), promoted_mode,
+-			    decl_mode, volatilep, 0, usedp, 0);
++	put_reg_into_stack (function, reg, TREE_TYPE (decl), decl_mode,
++			    0, volatile_p, used_p, 0, 0);
+     }
+   else if (GET_CODE (reg) == CONCAT)
+     {
+@@ -1432,14 +1435,14 @@
+ #ifdef FRAME_GROWS_DOWNWARD
+       /* Since part 0 should have a lower address, do it second.  */
+       put_reg_into_stack (function, hipart, part_type, part_mode,
+-			  part_mode, volatilep, 0, 0, 0);
++			  0, volatile_p, 0, 0, 0);
+       put_reg_into_stack (function, lopart, part_type, part_mode,
+-			  part_mode, volatilep, 0, 0, 0);
++			  0, volatile_p, 0, 1, 0);
+ #else
+       put_reg_into_stack (function, lopart, part_type, part_mode,
+-			  part_mode, volatilep, 0, 0, 0);
++			  0, volatile_p, 0, 0, 0);
+       put_reg_into_stack (function, hipart, part_type, part_mode,
+-			  part_mode, volatilep, 0, 0, 0);
++			  0, volatile_p, 0, 1, 0);
+ #endif
+ 
+       /* Change the CONCAT into a combined MEM for both parts.  */
+@@ -1460,7 +1463,7 @@
+       /* Prevent sharing of rtl that might lose.  */
+       if (GET_CODE (XEXP (reg, 0)) == PLUS)
+ 	XEXP (reg, 0) = copy_rtx (XEXP (reg, 0));
+-      if (usedp && rescan)
++      if (used_p && rescan)
+ 	{
+ 	  schedule_fixup_var_refs (function, reg, TREE_TYPE (decl),
+ 				   promoted_mode, 0);
+@@ -1474,26 +1477,29 @@
+ 
+ /* Subroutine of put_var_into_stack.  This puts a single pseudo reg REG
+    into the stack frame of FUNCTION (0 means the current function).
++   TYPE is the user-level data type of the value hold in the register.
+    DECL_MODE is the machine mode of the user-level data type.
+-   PROMOTED_MODE is the machine mode of the register.
+-   VOLATILE_P is nonzero if this is for a "volatile" decl.
+-   USED_P is nonzero if this reg might have already been used in an insn.  */
++   ORIGINAL_REGNO must be set if the real regno is not visible in REG.
++   VOLATILE_P is true if this is for a "volatile" decl.
++   USED_P is true if this reg might have already been used in an insn.
++   CONSECUTIVE_P is true if the stack slot assigned to reg must be
++   consecutive with the previous stack slot.  */
+ 
+ static void
+-put_reg_into_stack (function, reg, type, promoted_mode, decl_mode, volatile_p,
+-		    original_regno, used_p, ht)
++put_reg_into_stack (function, reg, type, decl_mode, original_regno,
++		    volatile_p, used_p, consecutive_p, ht)
+      struct function *function;
+      rtx reg;
+      tree type;
+-     enum machine_mode promoted_mode, decl_mode;
+-     int volatile_p;
++     enum machine_mode decl_mode;
+      unsigned int original_regno;
+-     int used_p;
++     int volatile_p, used_p, consecutive_p;
+      htab_t ht;
+ {
+   struct function *func = function ? function : cfun;
+-  rtx new = 0;
++  enum machine_mode mode = GET_MODE (reg);
+   unsigned int regno = original_regno;
++  rtx new = 0;
+ 
+   if (regno == 0)
+     regno = REGNO (reg);
+@@ -1506,7 +1512,8 @@
+     }
+ 
+   if (new == 0)
+-    new = assign_stack_local_1 (decl_mode, GET_MODE_SIZE (decl_mode), 0, func);
++    new = assign_stack_local_1 (decl_mode, GET_MODE_SIZE (decl_mode),
++				consecutive_p ? -2 : 0, func);
+ 
+   PUT_CODE (reg, MEM);
+   PUT_MODE (reg, decl_mode);
+@@ -1528,7 +1535,7 @@
+     }
+ 
+   if (used_p)
+-    schedule_fixup_var_refs (function, reg, type, promoted_mode, ht);
++    schedule_fixup_var_refs (function, reg, type, mode, ht);
+ }
+ 
+ /* Make sure that all refs to the variable, previously made
+@@ -1716,7 +1723,7 @@
+   tmp.key = var;
+   ime = (struct insns_for_mem_entry *) htab_find (ht, &tmp);
+   for (insn_list = ime->insns; insn_list != 0; insn_list = XEXP (insn_list, 1))
+-    if (INSN_P (XEXP (insn_list, 0)))
++    if (INSN_P (XEXP (insn_list, 0)) && !INSN_DELETED_P (XEXP (insn_list, 0)))
+       fixup_var_refs_insn (XEXP (insn_list, 0), var, promoted_mode,
+ 			   unsignedp, 1, may_share);
+ }
+@@ -3025,8 +3032,8 @@
+       used_p = 1;
+     }
+ 
+-  put_reg_into_stack (0, reg, type, GET_MODE (reg), GET_MODE (reg),
+-		      volatile_p, ADDRESSOF_REGNO (r), used_p, ht);
++  put_reg_into_stack (0, reg, type, GET_MODE (reg), ADDRESSOF_REGNO (r),
++		      volatile_p, used_p, 0, ht);
+ }
+ 
+ /* List of replacements made below in purge_addressof_1 when creating
+Index: gcc/gccbug.in
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/gccbug.in,v
+retrieving revision 1.15.34.1
+retrieving revision 1.15.34.2
+diff -u -r1.15.34.1 -r1.15.34.2
+--- gcc/gcc/gccbug.in	2 Jan 2003 05:22:37 -0000	1.15.34.1
++++ gcc/gcc/gccbug.in	21 Jan 2005 10:08:47 -0000	1.15.34.2
+@@ -198,7 +198,7 @@
+ done
+ 
+ # spam does not need to be listed here
+-CATEGORIES="ada bootstrap c++ c debug driver fortran inline-asm java libf2c libgcj libobjc libstdc++ middle-end objc optimization other preprocessor target web"
++CATEGORIES="ada bootstrap c++ c debug driver fortran inline-asm java libf2c libgcj libobjc libstdc++ middle-end objc other preprocessor rtl-optimization target tree-optimization web"
+ 
+ case "$FORMAT" in
+   lisp) echo "$CATEGORIES" | \
+Index: gcc/regclass.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/regclass.c,v
+retrieving revision 1.160.4.5
+retrieving revision 1.160.4.8
+diff -u -r1.160.4.5 -r1.160.4.8
+--- gcc/gcc/regclass.c	3 Mar 2003 11:00:15 -0000	1.160.4.5
++++ gcc/gcc/regclass.c	4 Dec 2004 00:36:37 -0000	1.160.4.8
+@@ -41,6 +41,7 @@
+ #include "toplev.h"
+ #include "output.h"
+ #include "ggc.h"
++#include "hashtab.h"
+ 
+ #ifndef REGISTER_MOVE_COST
+ #define REGISTER_MOVE_COST(m, x, y) 2
+@@ -105,6 +106,13 @@
+ char call_really_used_regs[] = CALL_REALLY_USED_REGISTERS;
+ #endif
+ 
++#ifdef CALL_REALLY_USED_REGISTERS
++#define CALL_REALLY_USED_REGNO_P(X)  call_really_used_regs[X]
++#else
++#define CALL_REALLY_USED_REGNO_P(X)  call_used_regs[X]
++#endif
++
++
+ /* Indexed by hard register number, contains 1 for registers that are
+    fixed use or call used registers that cannot hold quantities across
+    calls even if we are willing to save and restore them.  call fixed
+@@ -228,12 +236,6 @@
+ 
+ #endif /* FORBIDDEN_INC_DEC_CLASSES */
+ 
+-#ifdef CANNOT_CHANGE_MODE_CLASS
+-/* All registers that have been subreged.  Indexed by regno * MAX_MACHINE_MODE
+-   + mode.  */
+-bitmap_head subregs_of_mode;
+-#endif
+-
+ /* Sample MEM values for use by memory_move_secondary_cost.  */
+ 
+ static GTY(()) rtx top_of_stack[MAX_MACHINE_MODE];
+@@ -447,7 +449,11 @@
+ 	 If we are generating PIC code, the PIC offset table register is
+ 	 preserved across calls, though the target can override that.  */
+ 
+-      if (i == STACK_POINTER_REGNUM || i == FRAME_POINTER_REGNUM)
++      if (i == STACK_POINTER_REGNUM)
++	;
++      else if (global_regs[i])
++	SET_HARD_REG_BIT (regs_invalidated_by_call, i);
++      else if (i == FRAME_POINTER_REGNUM)
+ 	;
+ #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
+       else if (i == HARD_FRAME_POINTER_REGNUM)
+@@ -461,13 +467,7 @@
+       else if (i == PIC_OFFSET_TABLE_REGNUM && fixed_regs[i])
+ 	;
+ #endif
+-      else if (0
+-#ifdef CALL_REALLY_USED_REGISTERS
+-	       || call_really_used_regs[i]
+-#else
+-	       || call_used_regs[i]
+-#endif
+-	       || global_regs[i])
++      else if (CALL_REALLY_USED_REGNO_P (i))
+ 	SET_HARD_REG_BIT (regs_invalidated_by_call, i);
+     }
+ 
+@@ -792,6 +792,12 @@
+ 
+   global_regs[i] = 1;
+ 
++  /* If we're globalizing the frame pointer, we need to set the
++     appropriate regs_invalidated_by_call bit, even if it's already
++     set in fixed_regs.  */
++  if (i != STACK_POINTER_REGNUM)
++    SET_HARD_REG_BIT (regs_invalidated_by_call, i);
++
+   /* If already fixed, nothing else to do.  */
+   if (fixed_regs[i])
+     return;
+@@ -802,7 +808,6 @@
+   SET_HARD_REG_BIT (fixed_reg_set, i);
+   SET_HARD_REG_BIT (call_used_reg_set, i);
+   SET_HARD_REG_BIT (call_fixed_reg_set, i);
+-  SET_HARD_REG_BIT (regs_invalidated_by_call, i);
+ }
+ 
+ /* Now the data and code for the `regclass' pass, which happens
+@@ -2415,9 +2420,15 @@
+ 
+ 	if (regno >= min_regno)
+ 	  {
++	    /* While the following 3 lines means that the inequality
++	         REGNO_LAST_UID (regno) <= REGNO_LAST_NOTE_UID (regno)
++	       is true at the end of the scanning, it may be subsequently
++	       invalidated (e.g. in load_mems) so it should not be relied
++	       upon.  */
+ 	    REGNO_LAST_NOTE_UID (regno) = INSN_UID (insn);
+ 	    if (!note_flag)
+ 	      REGNO_LAST_UID (regno) = INSN_UID (insn);
++
+ 	    if (REGNO_FIRST_UID (regno) == 0)
+ 	      REGNO_FIRST_UID (regno) = INSN_UID (insn);
+ 	    /* If we are called by reg_scan_update() (indicated by min_regno
+@@ -2614,6 +2625,77 @@
+ }
+ 
+ #ifdef CANNOT_CHANGE_MODE_CLASS
++
++struct subregs_of_mode_node
++{
++  unsigned int block;
++  unsigned char modes[MAX_MACHINE_MODE];
++};
++
++static htab_t subregs_of_mode;
++
++static hashval_t som_hash PARAMS ((const void *));
++static int som_eq PARAMS ((const void *, const void *));
++
++static hashval_t
++som_hash (x)
++     const void *x;
++{
++  const struct subregs_of_mode_node *a = x;
++  return a->block;
++}
++
++static int
++som_eq (x, y)
++     const void *x;
++     const void *y;
++{
++  const struct subregs_of_mode_node *a = x;
++  const struct subregs_of_mode_node *b = y;
++  return a->block == b->block;
++}
++
++void
++init_subregs_of_mode ()
++{
++  if (subregs_of_mode)
++    htab_empty (subregs_of_mode);
++  else
++    subregs_of_mode = htab_create (100, som_hash, som_eq, free);
++}
++
++void
++record_subregs_of_mode (subreg)
++     rtx subreg;
++{
++  struct subregs_of_mode_node dummy, *node;
++  enum machine_mode mode;
++  unsigned int regno;
++  void **slot;
++
++  if (!REG_P (SUBREG_REG (subreg)))
++    return;
++
++  regno = REGNO (SUBREG_REG (subreg));
++  mode = GET_MODE (subreg);
++
++  if (regno < FIRST_PSEUDO_REGISTER)
++    return;
++
++  dummy.block = regno & -8;
++  slot = htab_find_slot_with_hash (subregs_of_mode, &dummy,
++				   dummy.block, INSERT);
++  node = *slot;
++  if (node == NULL)
++    {
++      node = xcalloc (1, sizeof (*node));
++      node->block = regno & -8;
++      *slot = node;
++    }
++
++  node->modes[mode] |= 1 << (regno & 7);
++}
++
+ /* Set bits in *USED which correspond to registers which can't change
+    their mode from FROM to any mode in which REGNO was encountered.  */
+ 
+@@ -2623,42 +2705,50 @@
+      enum machine_mode from;
+      unsigned int regno;
+ {
++  struct subregs_of_mode_node dummy, *node;
+   enum machine_mode to;
+-  int n, i;
+-  int start = regno * MAX_MACHINE_MODE;
++  unsigned char mask;
++  unsigned int i;
+ 
+-  EXECUTE_IF_SET_IN_BITMAP (&subregs_of_mode, start, n,
+-    if (n >= MAX_MACHINE_MODE + start)
+-      return;
+-    to = n - start;
+-    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+-      if (! TEST_HARD_REG_BIT (*used, i)
+-	  && REG_CANNOT_CHANGE_MODE_P (i, from, to))
+-	SET_HARD_REG_BIT (*used, i);
+-  );
++  dummy.block = regno & -8;
++  node = htab_find_with_hash (subregs_of_mode, &dummy, dummy.block);
++  if (node == NULL)
++    return;
++
++  mask = 1 << (regno & 7);
++  for (to = VOIDmode; to < NUM_MACHINE_MODES; to++)
++    if (node->modes[to] & mask)
++      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
++	if (!TEST_HARD_REG_BIT (*used, i)
++	    && REG_CANNOT_CHANGE_MODE_P (i, from, to))
++	  SET_HARD_REG_BIT (*used, i);
+ }
+ 
+ /* Return 1 if REGNO has had an invalid mode change in CLASS from FROM
+    mode.  */
+ 
+ bool
+-invalid_mode_change_p (regno, class, from_mode)
++invalid_mode_change_p (regno, class, from)
+      unsigned int regno;
+-      enum reg_class class;
+-     enum machine_mode from_mode;
++     enum reg_class class;
++     enum machine_mode from;
+ {
+-  enum machine_mode to_mode;
+-  int n;
+-  int start = regno * MAX_MACHINE_MODE;
+-
+-  EXECUTE_IF_SET_IN_BITMAP (&subregs_of_mode, start, n,
+-    if (n >= MAX_MACHINE_MODE + start)
+-      return 0;
+-    to_mode = n - start;
+-    if (CANNOT_CHANGE_MODE_CLASS (from_mode, to_mode, class))
+-      return 1;
+-  );
+-  return 0;
++  struct subregs_of_mode_node dummy, *node;
++  enum machine_mode to;
++  unsigned char mask;
++
++  dummy.block = regno & -8;
++  node = htab_find_with_hash (subregs_of_mode, &dummy, dummy.block);
++  if (node == NULL)
++    return false;
++
++  mask = 1 << (regno & 7);
++  for (to = VOIDmode; to < NUM_MACHINE_MODES; to++)
++    if (node->modes[to] & mask)
++      if (CANNOT_CHANGE_MODE_CLASS (from, to, class))
++	return true;
++
++  return false;
+ }
+ #endif /* CANNOT_CHANGE_MODE_CLASS */
+ 
+Index: gcc/regs.h
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/regs.h,v
+retrieving revision 1.26.4.1
+retrieving revision 1.26.4.3
+diff -u -r1.26.4.1 -r1.26.4.3
+--- gcc/gcc/regs.h	3 Mar 2003 11:00:15 -0000	1.26.4.1
++++ gcc/gcc/regs.h	4 Dec 2004 00:36:38 -0000	1.26.4.3
+@@ -49,6 +49,9 @@
+   int first_uid;		/* UID of first insn to use (REG n) */
+   int last_uid;			/* UID of last insn to use (REG n) */
+   int last_note_uid;		/* UID of last note to use (REG n) */
++				/* See the comment in reg_scan_mark_refs on
++				   the relationship between last_uid and
++				   last_note_uid.  */
+ 
+ 				/* fields set by reg_scan & flow_analysis */
+   int sets;			/* # of times (REG n) is set */
+@@ -66,8 +69,6 @@
+ 
+ extern varray_type reg_n_info;
+ 
+-extern bitmap_head subregs_of_mode;
+-
+ /* Indexed by n, gives number of times (REG n) is used or set.  */
+ 
+ #define REG_N_REFS(N) (VARRAY_REG (reg_n_info, N)->refs)
+Index: gcc/reload1.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/reload1.c,v
+retrieving revision 1.366.2.11
+retrieving revision 1.366.2.12
+diff -u -r1.366.2.11 -r1.366.2.12
+--- gcc/gcc/reload1.c	13 Sep 2004 08:54:35 -0000	1.366.2.11
++++ gcc/gcc/reload1.c	26 Nov 2004 05:08:45 -0000	1.366.2.12
+@@ -3389,6 +3389,16 @@
+   num_not_at_initial_offset = 0;
+ }
+ 
++/* Subroutine of set_initial_label_offsets called via for_each_eh_label.  */
++
++static void set_initial_eh_label_offset PARAMS ((rtx));
++static void
++set_initial_eh_label_offset (label)
++     rtx label;
++{
++  set_label_offsets (label, NULL_RTX, 1);
++}
++
+ /* Initialize the known label offsets.
+    Set a known offset for each forced label to be at the initial offset
+    of each elimination.  We do this because we assume that all
+@@ -3405,6 +3415,8 @@
+   for (x = forced_labels; x; x = XEXP (x, 1))
+     if (XEXP (x, 0))
+       set_label_offsets (XEXP (x, 0), NULL_RTX, 1);
++
++  for_each_eh_label (set_initial_eh_label_offset);
+ }
+ 
+ /* Set all elimination offsets to the known values for the code label given
+Index: gcc/rtl.h
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/rtl.h,v
+retrieving revision 1.375.2.8
+retrieving revision 1.375.2.9
+diff -u -r1.375.2.8 -r1.375.2.9
+--- gcc/gcc/rtl.h	24 Apr 2004 19:40:45 -0000	1.375.2.8
++++ gcc/gcc/rtl.h	4 Dec 2004 00:36:38 -0000	1.375.2.9
+@@ -2120,6 +2120,8 @@
+ extern void reg_scan			PARAMS ((rtx, unsigned int, int));
+ extern void reg_scan_update		PARAMS ((rtx, rtx, unsigned int));
+ extern void fix_register		PARAMS ((const char *, int, int));
++extern void init_subregs_of_mode	PARAMS ((void));
++extern void record_subregs_of_mode	PARAMS ((rtx));
+ #ifdef HARD_CONST
+ extern void cannot_change_mode_set_regs PARAMS ((HARD_REG_SET *,
+ 						 enum machine_mode,
+Index: gcc/tree-inline.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/tree-inline.c,v
+retrieving revision 1.38.2.12
+retrieving revision 1.38.2.13
+diff -u -r1.38.2.12 -r1.38.2.13
+--- gcc/gcc/tree-inline.c	12 Mar 2004 22:43:29 -0000	1.38.2.12
++++ gcc/gcc/tree-inline.c	21 Jan 2005 10:02:12 -0000	1.38.2.13
+@@ -1173,7 +1173,8 @@
+   if (!inlinable_function_p (fn, id))
+     {
+       if (warn_inline && DECL_INLINE (fn) && !DID_INLINE_FUNC (fn)
+-	  && !DECL_IN_SYSTEM_HEADER (fn))
++	  && !DECL_IN_SYSTEM_HEADER (fn)
++	  && !lookup_attribute ("noinline", DECL_ATTRIBUTES (fn)))
+ 	{
+ 	  warning_with_decl (fn, "inlining failed in call to `%s'");
+ 	  warning ("called from here");
+Index: gcc/unroll.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/Attic/unroll.c,v
+retrieving revision 1.184.2.9
+retrieving revision 1.184.2.10
+diff -u -r1.184.2.9 -r1.184.2.10
+--- gcc/gcc/unroll.c	17 May 2004 21:05:48 -0000	1.184.2.9
++++ gcc/gcc/unroll.c	27 Nov 2004 16:59:15 -0000	1.184.2.10
+@@ -794,6 +794,10 @@
+       for (r = FIRST_PSEUDO_REGISTER; r < max_reg_before_loop; ++r)
+ 	if (REGNO_FIRST_UID (r) > 0 && REGNO_FIRST_UID (r) < max_uid_for_loop
+ 	    && REGNO_FIRST_LUID (r) >= copy_start_luid
++	    /* See the comment in reg_scan_mark_refs on the relationship between
++	       last_uid and last_note_uid.  */
++	    && REGNO_LAST_UID (r) > 0 && REGNO_LAST_UID (r) < max_uid_for_loop
++	    && REGNO_LAST_LUID (r) <= copy_end_luid
+ 	    && REGNO_LAST_NOTE_UID (r) > 0 && REGNO_LAST_NOTE_UID (r) < max_uid_for_loop
+ 	    && REGNO_LAST_NOTE_LUID (r) <= copy_end_luid)
+ 	  {
+Index: gcc/unwind-dw2.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/unwind-dw2.c,v
+retrieving revision 1.22.2.9
+retrieving revision 1.22.2.11
+diff -u -r1.22.2.9 -r1.22.2.11
+--- gcc/gcc/unwind-dw2.c	8 May 2004 21:52:42 -0000	1.22.2.9
++++ gcc/gcc/unwind-dw2.c	29 Jan 2005 11:54:24 -0000	1.22.2.11
+@@ -1,5 +1,5 @@
+ /* DWARF2 exception handling and frame unwind runtime interface routines.
+-   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
++   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+    Free Software Foundation, Inc.
+ 
+    This file is part of GCC.
+@@ -165,6 +165,11 @@
+ inline _Unwind_Word
+ _Unwind_GetGR (struct _Unwind_Context *context, int index)
+ {
++#ifdef DWARF_ZERO_REG
++  if (index == DWARF_ZERO_REG)
++    return 0;
++#endif
++
+   /* This will segfault if the register hasn't been saved.  */
+   return * (_Unwind_Word *) context->reg[index];
+ }
+@@ -604,6 +609,10 @@
+ 	case DW_OP_mul:
+ 	case DW_OP_or:
+ 	case DW_OP_plus:
++	case DW_OP_shl:
++	case DW_OP_shr:
++	case DW_OP_shra:
++	case DW_OP_xor:
+ 	case DW_OP_le:
+ 	case DW_OP_ge:
+ 	case DW_OP_eq:
+Index: gcc/config/freebsd-spec.h
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/freebsd-spec.h,v
+retrieving revision 1.2.4.1
+retrieving revision 1.2.4.2
+diff -u -r1.2.4.1 -r1.2.4.2
+--- gcc/gcc/config/freebsd-spec.h	12 Mar 2003 02:38:01 -0000	1.2.4.1
++++ gcc/gcc/config/freebsd-spec.h	14 Jan 2005 02:06:26 -0000	1.2.4.2
+@@ -130,13 +130,7 @@
+     %{pg:  -lc_p}							\
+   }"
+ #else
+-#if FBSD_MAJOR >= 5
+-#define FBSD_LIB_SPEC "							\
+-  %{!shared:								\
+-    %{!pg: %{pthread:-lc_r} -lc}					\
+-    %{pg:  %{pthread:-lc_r_p} -lc_p}					\
+-  }"
+-#else
++#if FBSD_MAJOR < 5
+ #define FBSD_LIB_SPEC "							\
+   %{!shared:								\
+     %{!pg:								\
+@@ -146,5 +140,11 @@
+       %{!pthread:-lc_p}							\
+       %{pthread:-lc_r_p}}						\
+   }"
++#else
++#define FBSD_LIB_SPEC "							\
++  %{!shared:								\
++    %{!pg: %{pthread:-lpthread} -lc}					\
++    %{pg:  %{pthread:-lpthread_p} -lc_p}				\
++  }"
+ #endif
+ #endif
+Index: gcc/config/alpha/alpha.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/alpha/alpha.c,v
+retrieving revision 1.282.4.11
+retrieving revision 1.282.4.12
+diff -u -r1.282.4.11 -r1.282.4.12
+--- gcc/gcc/config/alpha/alpha.c	8 Mar 2004 03:21:46 -0000	1.282.4.11
++++ gcc/gcc/config/alpha/alpha.c	30 Sep 2004 19:36:26 -0000	1.282.4.12
+@@ -6766,11 +6766,6 @@
+ 	    break;
+ 	  imask |= 1L << regno;
+ 	}
+-
+-      /* Glibc likes to use $31 as an unwind stopper for crt0.  To
+-	 avoid hackery in unwind-dw2.c, we need to actively store a
+-	 zero in the prologue of _Unwind_RaiseException et al.  */
+-      imask |= 1UL << 31;
+     }
+ 
+   /* If any register spilled, then spill the return address also.  */
+@@ -7236,24 +7231,6 @@
+ 	    reg_offset += 8;
+ 	  }
+ 
+-      /* Store a zero if requested for unwinding.  */
+-      if (imask & (1UL << 31))
+- 	{
+- 	  rtx insn, t;
+- 
+- 	  mem = gen_rtx_MEM (DImode, plus_constant (sa_reg, reg_offset));
+- 	  set_mem_alias_set (mem, alpha_sr_alias_set);
+- 	  insn = emit_move_insn (mem, const0_rtx);
+- 
+- 	  RTX_FRAME_RELATED_P (insn) = 1;
+- 	  t = gen_rtx_REG (Pmode, 31);
+- 	  t = gen_rtx_SET (VOIDmode, mem, t);
+- 	  t = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR, t, REG_NOTES (insn));
+- 	  REG_NOTES (insn) = t;
+- 
+- 	  reg_offset += 8;
+- 	}
+- 
+       for (i = 0; i < 31; i++)
+ 	if (fmask & (1L << i))
+ 	  {
+@@ -7674,9 +7651,6 @@
+ 	    reg_offset += 8;
+ 	  }
+ 
+-      if (imask & (1UL << 31))
+-	reg_offset += 8;
+-
+       for (i = 0; i < 31; ++i)
+ 	if (fmask & (1L << i))
+ 	  {
+Index: gcc/config/alpha/alpha.h
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/alpha/alpha.h,v
+retrieving revision 1.185.4.6
+retrieving revision 1.185.4.7
+diff -u -r1.185.4.6 -r1.185.4.7
+--- gcc/gcc/config/alpha/alpha.h	27 Aug 2004 00:01:15 -0000	1.185.4.6
++++ gcc/gcc/config/alpha/alpha.h	30 Sep 2004 19:36:28 -0000	1.185.4.7
+@@ -1299,6 +1299,7 @@
+ #define INCOMING_RETURN_ADDR_RTX  gen_rtx_REG (Pmode, 26)
+ #define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (26)
+ #define DWARF_ALT_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (64)
++#define DWARF_ZERO_REG 31
+ 
+ /* Describe how we implement __builtin_eh_return.  */
+ #define EH_RETURN_DATA_REGNO(N)	((N) < 4 ? (N) + 16 : INVALID_REGNUM)
+Index: gcc/config/alpha/alpha.md
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/alpha/alpha.md,v
+retrieving revision 1.199.4.6
+retrieving revision 1.199.4.7
+diff -u -r1.199.4.6 -r1.199.4.7
+--- gcc/gcc/config/alpha/alpha.md	28 May 2004 00:02:03 -0000	1.199.4.6
++++ gcc/gcc/config/alpha/alpha.md	5 Dec 2004 19:58:42 -0000	1.199.4.7
+@@ -80,6 +80,7 @@
+    (UNSPECV_PLDGP2	11)	; prologue ldgp
+    (UNSPECV_SET_TP	12)
+    (UNSPECV_RPCC	13)
++   (UNSPECV_SETJMPR_ER	14)	; builtin_setjmp_receiver fragment
+   ])
+ 
+ ;; Where necessary, the suffixes _le and _be are used to distinguish between
+@@ -6764,70 +6765,44 @@
+   "jmp $31,(%0),0"
+   [(set_attr "type" "ibr")])
+ 
+-(define_insn "*builtin_setjmp_receiver_er_sl_1"
+-  [(unspec_volatile [(label_ref (match_operand 0 "" ""))] UNSPECV_SETJMPR)]
+-  "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF && TARGET_AS_CAN_SUBTRACT_LABELS"
+-  "lda $27,$LSJ%=-%l0($27)\n$LSJ%=:")
+-  
+-(define_insn "*builtin_setjmp_receiver_er_1"
+-  [(unspec_volatile [(label_ref (match_operand 0 "" ""))] UNSPECV_SETJMPR)]
+-  "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF"
+-  "br $27,$LSJ%=\n$LSJ%=:"
+-  [(set_attr "type" "ibr")])
+-
+-(define_split
+-  [(unspec_volatile [(label_ref (match_operand 0 "" ""))] UNSPECV_SETJMPR)]
+-  "TARGET_EXPLICIT_RELOCS && TARGET_ABI_OSF
+-   && prev_nonnote_insn (insn) == operands[0]"
+-  [(const_int 0)]
+-  "
+-{
+-  emit_note (NULL, NOTE_INSN_DELETED);
+-  DONE;
+-}")
+-
+-(define_insn "*builtin_setjmp_receiver_1"
++(define_expand "builtin_setjmp_receiver"
+   [(unspec_volatile [(label_ref (match_operand 0 "" ""))] UNSPECV_SETJMPR)]
+   "TARGET_ABI_OSF"
+-  "br $27,$LSJ%=\n$LSJ%=:\;ldgp $29,0($27)"
+-  [(set_attr "length" "12")
+-   (set_attr "type" "multi")])
++  "")
+ 
+-(define_expand "builtin_setjmp_receiver_er"
+-  [(unspec_volatile [(label_ref (match_operand 0 "" ""))] UNSPECV_SETJMPR)
++(define_insn_and_split "*builtin_setjmp_receiver_1"
++  [(unspec_volatile [(match_operand 0 "" "")] UNSPECV_SETJMPR)]
++  "TARGET_ABI_OSF"
++{
++  if (TARGET_EXPLICIT_RELOCS)
++    return "#";
++  else
++    return "br $27,$LSJ%=\n$LSJ%=:\;ldgp $29,0($27)";
++}
++  "&& TARGET_EXPLICIT_RELOCS && reload_completed"
++  [(unspec_volatile [(match_dup 0)] UNSPECV_SETJMPR_ER)
+    (set (match_dup 1)
+ 	(unspec_volatile:DI [(match_dup 2) (match_dup 3)] UNSPECV_LDGP1))
+    (set (match_dup 1)
+ 	(unspec:DI [(match_dup 1) (match_dup 3)] UNSPEC_LDGP2))]
+-  ""
+ {
+   operands[1] = pic_offset_table_rtx;
+   operands[2] = gen_rtx_REG (Pmode, 27);
+   operands[3] = GEN_INT (alpha_next_sequence_number++);
+-})
++}
++  [(set_attr "length" "12")
++   (set_attr "type" "multi")])
+ 
+-(define_expand "builtin_setjmp_receiver"
+-  [(unspec_volatile [(label_ref (match_operand 0 "" ""))] UNSPECV_SETJMPR)]
+-  "TARGET_ABI_OSF"
+-{
+-  if (TARGET_EXPLICIT_RELOCS)
+-    {
+-      emit_insn (gen_builtin_setjmp_receiver_er (operands[0]));
+-      DONE;
+-    }
+-})
++(define_insn "*builtin_setjmp_receiver_er_sl_1"
++  [(unspec_volatile [(match_operand 0 "" "")] UNSPECV_SETJMPR_ER)]
++  "TARGET_ABI_OSF && TARGET_EXPLICIT_RELOCS && TARGET_AS_CAN_SUBTRACT_LABELS"
++  "lda $27,$LSJ%=-%l0($27)\n$LSJ%=:")
+ 
+-(define_expand "exception_receiver_er"
+-  [(set (match_dup 0)
+-	(unspec_volatile:DI [(match_dup 1) (match_dup 2)] UNSPECV_LDGP1))
+-   (set (match_dup 0)
+-	(unspec:DI [(match_dup 0) (match_dup 2)] UNSPEC_LDGP2))]
+-  ""
+-{
+-  operands[0] = pic_offset_table_rtx;
+-  operands[1] = gen_rtx_REG (Pmode, 26);
+-  operands[2] = GEN_INT (alpha_next_sequence_number++);
+-})
++(define_insn "*builtin_setjmp_receiver_er_1"
++  [(unspec_volatile [(match_operand 0 "" "")] UNSPECV_SETJMPR_ER)]
++  "TARGET_ABI_OSF && TARGET_EXPLICIT_RELOCS"
++  "br $27,$LSJ%=\n$LSJ%=:"
++  [(set_attr "type" "ibr")])
+ 
+ (define_expand "exception_receiver"
+   [(unspec_volatile [(match_dup 0)] UNSPECV_EHR)]
+@@ -6835,28 +6810,38 @@
+ {
+   if (TARGET_LD_BUGGY_LDGP)
+     operands[0] = alpha_gp_save_rtx ();
+-  else if (TARGET_EXPLICIT_RELOCS)
+-    {
+-      emit_insn (gen_exception_receiver_er ());
+-      DONE;
+-    }
+   else
+     operands[0] = const0_rtx;
+ })
+ 
+-(define_insn "*exception_receiver_1"
+-  [(unspec_volatile [(const_int 0)] UNSPECV_EHR)]
+-  "! TARGET_LD_BUGGY_LDGP"
+-  "ldgp $29,0($26)"
+-  [(set_attr "length" "8")
+-   (set_attr "type" "multi")])
+-
+ (define_insn "*exception_receiver_2"
+   [(unspec_volatile [(match_operand:DI 0 "memory_operand" "m")] UNSPECV_EHR)]
+-  "TARGET_LD_BUGGY_LDGP"
++  "TARGET_ABI_OSF && TARGET_LD_BUGGY_LDGP"
+   "ldq $29,%0"
+   [(set_attr "type" "ild")])
+ 
++(define_insn_and_split "*exception_receiver_1"
++  [(unspec_volatile [(const_int 0)] UNSPECV_EHR)]
++  "TARGET_ABI_OSF"
++{
++  if (TARGET_EXPLICIT_RELOCS)
++    return "ldah $29,0($26)\t\t!gpdisp!%*\;lda $29,0($29)\t\t!gpdisp!%*";
++  else
++    return "ldgp $29,0($26)";
++}
++  "&& TARGET_EXPLICIT_RELOCS && reload_completed"
++  [(set (match_dup 0)
++	(unspec_volatile:DI [(match_dup 1) (match_dup 2)] UNSPECV_LDGP1))
++   (set (match_dup 0)
++	(unspec:DI [(match_dup 0) (match_dup 2)] UNSPEC_LDGP2))]
++{
++  operands[0] = pic_offset_table_rtx;
++  operands[1] = gen_rtx_REG (Pmode, 26);
++  operands[2] = GEN_INT (alpha_next_sequence_number++);
++}
++  [(set_attr "length" "8")
++   (set_attr "type" "multi")])
++
+ (define_expand "nonlocal_goto_receiver"
+   [(unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)
+    (set (reg:DI 27) (mem:DI (reg:DI 29)))
+Index: gcc/config/alpha/qrnnd.asm
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/alpha/qrnnd.asm,v
+retrieving revision 1.1
+retrieving revision 1.1.60.1
+diff -u -r1.1 -r1.1.60.1
+--- gcc/gcc/config/alpha/qrnnd.asm	15 Apr 2000 16:34:38 -0000	1.1
++++ gcc/gcc/config/alpha/qrnnd.asm	30 Sep 2004 19:36:28 -0000	1.1.60.1
+@@ -26,6 +26,10 @@
+  # Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+  # MA 02111-1307, USA.
+ 
++#ifdef __ELF__
++.section .note.GNU-stack,""
++#endif
++
+         .set noreorder
+         .set noat
+ 
+Index: gcc/config/i386/i386-protos.h
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/i386/i386-protos.h,v
+retrieving revision 1.86.2.2
+retrieving revision 1.86.2.3
+diff -u -r1.86.2.2 -r1.86.2.3
+--- gcc/gcc/config/i386/i386-protos.h	8 Jul 2003 19:16:44 -0000	1.86.2.2
++++ gcc/gcc/config/i386/i386-protos.h	12 Dec 2004 21:00:44 -0000	1.86.2.3
+@@ -88,6 +88,8 @@
+ extern int cmpsi_operand PARAMS ((rtx, enum machine_mode));
+ extern int long_memory_operand PARAMS ((rtx, enum machine_mode));
+ extern int aligned_operand PARAMS ((rtx, enum machine_mode));
++extern int compare_operator PARAMS ((rtx, enum machine_mode));
++extern int flags_reg_operand PARAMS ((rtx, enum machine_mode));
+ extern enum machine_mode ix86_cc_mode PARAMS ((enum rtx_code, rtx, rtx));
+ 
+ extern int ix86_expand_movstr PARAMS ((rtx, rtx, rtx, rtx));
+Index: gcc/config/i386/i386.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/i386/i386.c,v
+retrieving revision 1.495.2.36
+retrieving revision 1.495.2.37
+diff -u -r1.495.2.36 -r1.495.2.37
+--- gcc/gcc/config/i386/i386.c	18 May 2004 05:07:52 -0000	1.495.2.36
++++ gcc/gcc/config/i386/i386.c	12 Dec 2004 21:00:44 -0000	1.495.2.37
+@@ -3609,6 +3609,20 @@
+   return ANY_QI_REG_P (op);
+ }
+ 
++/* Return true if op is an flags register.  */
++
++int
++flags_reg_operand (op, mode)
++     register rtx op;
++     enum machine_mode mode;
++{
++  if (mode != VOIDmode && GET_MODE (op) != mode)
++    return 0;
++  return (GET_CODE (op) == REG
++	  && REGNO (op) == FLAGS_REG
++	  && GET_MODE (op) != VOIDmode);
++}
++
+ /* Return true if op is a NON_Q_REGS class register.  */
+ 
+ int
+@@ -3969,6 +3983,14 @@
+   /* Didn't find one -- this must be an aligned address.  */
+   return 1;
+ }
++
++int
++compare_operator (op, mode)
++     rtx op;
++     enum machine_mode mode ATTRIBUTE_UNUSED;
++{
++  return GET_CODE (op) == COMPARE;
++}
+ 
+ /* Return true if the constant is something that can be loaded with
+    a special instruction.  Only handle 0.0 and 1.0; others are less
+Index: gcc/config/i386/i386.h
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/i386/i386.h,v
+retrieving revision 1.309.2.11
+retrieving revision 1.309.2.12
+diff -u -r1.309.2.11 -r1.309.2.12
+--- gcc/gcc/config/i386/i386.h	6 Feb 2004 19:43:31 -0000	1.309.2.11
++++ gcc/gcc/config/i386/i386.h	12 Dec 2004 21:00:47 -0000	1.309.2.12
+@@ -3319,6 +3319,7 @@
+ 			SYMBOL_REF, LABEL_REF, SUBREG, REG, MEM}},	\
+   {"nonmemory_no_elim_operand", {CONST_INT, REG, SUBREG}},		\
+   {"index_register_operand", {SUBREG, REG}},				\
++  {"flags_reg_operand", {REG}},						\
+   {"q_regs_operand", {SUBREG, REG}},					\
+   {"non_q_regs_operand", {SUBREG, REG}},				\
+   {"fcmov_comparison_operator", {EQ, NE, LTU, GTU, LEU, GEU, UNORDERED, \
+@@ -3354,6 +3355,7 @@
+   {"fp_register_operand", {REG}},					\
+   {"register_and_not_fp_reg_operand", {REG}},				\
+   {"vector_move_operand", {CONST_VECTOR, SUBREG, REG, MEM}},		\
++  {"compare_operator", {COMPARE}},
+ 
+ /* A list of predicates that do special things with modes, and so
+    should not elicit warnings for VOIDmode match_operand.  */
+Index: gcc/config/i386/i386.md
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/i386/i386.md,v
+retrieving revision 1.404.2.24
+retrieving revision 1.404.2.29
+diff -u -r1.404.2.24 -r1.404.2.29
+--- gcc/gcc/config/i386/i386.md	28 Apr 2004 17:00:03 -0000	1.404.2.24
++++ gcc/gcc/config/i386/i386.md	23 Jan 2005 05:15:59 -0000	1.404.2.29
+@@ -1188,10 +1188,9 @@
+   ""
+   "xchg{l}\t%1, %0"
+   [(set_attr "type" "imov")
++   (set_attr "mode" "SI")
+    (set_attr "pent_pair" "np")
+    (set_attr "athlon_decode" "vector")
+-   (set_attr "mode" "SI")
+-   (set_attr "modrm" "0")
+    (set_attr "ppro_uops" "few")])
+ 
+ (define_expand "movhi"
+@@ -1304,12 +1303,12 @@
+ 	(match_operand:HI 1 "register_operand" "+r"))
+    (set (match_dup 1)
+ 	(match_dup 0))]
+-  "TARGET_PARTIAL_REG_STALL"
+-  "xchg{w}\t%1, %0"
++  "!TARGET_PARTIAL_REG_STALL || optimize_size"
++  "xchg{l}\t%k1, %k0"
+   [(set_attr "type" "imov")
++   (set_attr "mode" "SI")
+    (set_attr "pent_pair" "np")
+-   (set_attr "mode" "HI")
+-   (set_attr "modrm" "0")
++   (set_attr "athlon_decode" "vector")
+    (set_attr "ppro_uops" "few")])
+ 
+ (define_insn "*swaphi_2"
+@@ -1317,12 +1316,12 @@
+ 	(match_operand:HI 1 "register_operand" "+r"))
+    (set (match_dup 1)
+ 	(match_dup 0))]
+-  "! TARGET_PARTIAL_REG_STALL"
+-  "xchg{l}\t%k1, %k0"
++  "TARGET_PARTIAL_REG_STALL"
++  "xchg{w}\t%1, %0"
+   [(set_attr "type" "imov")
++   (set_attr "mode" "HI")
+    (set_attr "pent_pair" "np")
+-   (set_attr "mode" "SI")
+-   (set_attr "modrm" "0")
++   (set_attr "athlon_decode" "vector")
+    (set_attr "ppro_uops" "few")])
+ 
+ (define_expand "movstricthi"
+@@ -1470,17 +1469,30 @@
+   DONE;
+ })
+ 
+-(define_insn "*swapqi"
++(define_insn "*swapqi_1"
+   [(set (match_operand:QI 0 "register_operand" "+r")
+ 	(match_operand:QI 1 "register_operand" "+r"))
+    (set (match_dup 1)
+ 	(match_dup 0))]
+-  ""
+-  "xchg{b}\t%1, %0"
++  "!TARGET_PARTIAL_REG_STALL || optimize_size"
++  "xchg{l}\t%k1, %k0"
+   [(set_attr "type" "imov")
++   (set_attr "mode" "SI")
+    (set_attr "pent_pair" "np")
++   (set_attr "athlon_decode" "vector")
++   (set_attr "ppro_uops" "few")])
++
++(define_insn "*swapqi_2"
++  [(set (match_operand:QI 0 "register_operand" "+q")
++	(match_operand:QI 1 "register_operand" "+q"))
++   (set (match_dup 1)
++	(match_dup 0))]
++  "TARGET_PARTIAL_REG_STALL"
++  "xchg{b}\t%1, %0"
++  [(set_attr "type" "imov")
+    (set_attr "mode" "QI")
+-   (set_attr "modrm" "0")
++   (set_attr "pent_pair" "np")
++   (set_attr "athlon_decode" "vector")
+    (set_attr "ppro_uops" "few")])
+ 
+ (define_expand "movstrictqi"
+@@ -1987,13 +1999,11 @@
+   "TARGET_64BIT"
+   "xchg{q}\t%1, %0"
+   [(set_attr "type" "imov")
++   (set_attr "mode" "DI")
+    (set_attr "pent_pair" "np")
+    (set_attr "athlon_decode" "vector")
+-   (set_attr "mode" "DI")
+-   (set_attr "modrm" "0")
+    (set_attr "ppro_uops" "few")])
+ 
+-  
+ (define_expand "movsf"
+   [(set (match_operand:SF 0 "nonimmediate_operand" "")
+ 	(match_operand:SF 1 "general_operand" ""))]
+@@ -7559,17 +7569,21 @@
+   ""
+   "")
+ 
+-(define_insn "*testqi_1"
++(define_insn "*testqi_1_maybe_si"
+   [(set (reg 17)
+-        (compare (and:QI (match_operand:QI 0 "nonimmediate_operand" "%*a,q,qm,r")
+-			 (match_operand:QI 1 "nonmemory_operand" "n,n,qn,n"))
+-		 (const_int 0)))]
+-  "ix86_match_ccmode (insn, CCNOmode)"
++        (compare
++	  (and:QI
++	    (match_operand:QI 0 "nonimmediate_operand" "%*a,q,qm,r")
++	    (match_operand:QI 1 "nonmemory_operand" "n,n,qn,n"))
++	  (const_int 0)))]
++   "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
++    && ix86_match_ccmode (insn,
++ 			  GET_CODE (operands[1]) == CONST_INT
++ 			  && INTVAL (operands[1]) >= 0 ? CCNOmode : CCZmode)"
+ {
+   if (which_alternative == 3)
+     {
+-      if (GET_CODE (operands[1]) == CONST_INT
+-	  && (INTVAL (operands[1]) & 0xffffff00))
++      if (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) < 0)
+ 	operands[1] = GEN_INT (INTVAL (operands[1]) & 0xff);
+       return "test{l}\t{%1, %k0|%k0, %1}";
+     }
+@@ -7580,6 +7594,18 @@
+    (set_attr "mode" "QI,QI,QI,SI")
+    (set_attr "pent_pair" "uv,np,uv,np")])
+ 
++(define_insn "*testqi_1"
++  [(set (reg 17)
++        (compare (and:QI (match_operand:QI 0 "nonimmediate_operand" "%*a,q,qm")
++			 (match_operand:QI 1 "nonmemory_operand" "n,n,qn"))
++		 (const_int 0)))]
++  "ix86_match_ccmode (insn, CCNOmode)"
++  "test{b}\t{%1, %0|%0, %1}"
++  [(set_attr "type" "test")
++   (set_attr "modrm" "0,1,1")
++   (set_attr "mode" "QI")
++   (set_attr "pent_pair" "uv,np,uv")])
++
+ (define_expand "testqi_ext_ccno_0"
+   [(set (reg:CCNO 17)
+ 	(compare:CCNO
+@@ -7697,51 +7723,53 @@
+   "#")
+ 
+ (define_split
+-  [(set (reg 17)
+-        (compare (zero_extract
+-		   (match_operand 0 "nonimmediate_operand" "")
+-		   (match_operand 1 "const_int_operand" "")
+-		   (match_operand 2 "const_int_operand" ""))
+-		 (const_int 0)))]
++  [(set (match_operand 0 "flags_reg_operand" "")
++        (match_operator 1 "compare_operator"
++	  [(zero_extract
++	     (match_operand 2 "nonimmediate_operand" "")
++	     (match_operand 3 "const_int_operand" "")
++	     (match_operand 4 "const_int_operand" ""))
++	   (const_int 0)]))]
+   "ix86_match_ccmode (insn, CCNOmode)"
+-  [(set (reg:CCNO 17) (compare:CCNO (match_dup 3) (const_int 0)))]
++  [(set (match_dup 0) (match_op_dup 1 [(match_dup 2) (const_int 0)]))]
+ {
+-  HOST_WIDE_INT len = INTVAL (operands[1]);
+-  HOST_WIDE_INT pos = INTVAL (operands[2]);
++  rtx val = operands[2];
++  HOST_WIDE_INT len = INTVAL (operands[3]);
++  HOST_WIDE_INT pos = INTVAL (operands[4]);
+   HOST_WIDE_INT mask;
+   enum machine_mode mode, submode;
+ 
+-  mode = GET_MODE (operands[0]);
+-  if (GET_CODE (operands[0]) == MEM)
++  mode = GET_MODE (val);
++  if (GET_CODE (val) == MEM)
+     {
+       /* ??? Combine likes to put non-volatile mem extractions in QImode
+ 	 no matter the size of the test.  So find a mode that works.  */
+-      if (! MEM_VOLATILE_P (operands[0]))
++      if (! MEM_VOLATILE_P (val))
+ 	{
+ 	  mode = smallest_mode_for_size (pos + len, MODE_INT);
+-	  operands[0] = adjust_address (operands[0], mode, 0);
++	  val = adjust_address (val, mode, 0);
+ 	}
+     }
+-  else if (GET_CODE (operands[0]) == SUBREG
+-	   && (submode = GET_MODE (SUBREG_REG (operands[0])),
++  else if (GET_CODE (val) == SUBREG
++	   && (submode = GET_MODE (SUBREG_REG (val)),
+ 	       GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (submode))
+ 	   && pos + len <= GET_MODE_BITSIZE (submode))
+     {
+       /* Narrow a paradoxical subreg to prevent partial register stalls.  */
+       mode = submode;
+-      operands[0] = SUBREG_REG (operands[0]);
++      val = SUBREG_REG (val);
+     }
+   else if (mode == HImode && pos + len <= 8)
+     {
+       /* Small HImode tests can be converted to QImode.  */
+       mode = QImode;
+-      operands[0] = gen_lowpart (QImode, operands[0]);
++      val = gen_lowpart (QImode, val);
+     }
+ 
+   mask  = ((HOST_WIDE_INT)1 << (pos + len)) - 1;
+   mask &= ~(((HOST_WIDE_INT)1 << pos) - 1);
+ 
+-  operands[3] = gen_rtx_AND (mode, operands[0], gen_int_mode (mask, mode));
++  operands[2] = gen_rtx_AND (mode, val, gen_int_mode (mask, mode));
+ })
+ 
+ ;; Convert HImode/SImode test instructions with immediate to QImode ones.
+@@ -7750,46 +7778,44 @@
+ ;; Do the converison only post-reload to avoid limiting of the register class
+ ;; to QI regs.
+ (define_split
+-  [(set (reg 17)
+-	(compare
+-	  (and (match_operand 0 "register_operand" "")
+-	       (match_operand 1 "const_int_operand" ""))
+-	  (const_int 0)))]
++  [(set (match_operand 0 "flags_reg_operand" "")
++	(match_operator 1 "compare_operator"
++	  [(and (match_operand 2 "register_operand" "")
++	        (match_operand 3 "const_int_operand" ""))
++	   (const_int 0)]))]
+    "reload_completed
+-    && QI_REG_P (operands[0])
++    && QI_REG_P (operands[2])
++    && GET_MODE (operands[2]) != QImode
+     && ((ix86_match_ccmode (insn, CCZmode)
+-    	 && !(INTVAL (operands[1]) & ~(255 << 8)))
++    	 && !(INTVAL (operands[3]) & ~(255 << 8)))
+ 	|| (ix86_match_ccmode (insn, CCNOmode)
+-	    && !(INTVAL (operands[1]) & ~(127 << 8))))
+-    && GET_MODE (operands[0]) != QImode"
+-  [(set (reg:CCNO 17)
+-	(compare:CCNO
+-	  (and:SI (zero_extract:SI (match_dup 0) (const_int 8) (const_int 8))
+-		  (match_dup 1))
+-	  (const_int 0)))]
+-  "operands[0] = gen_lowpart (SImode, operands[0]);
+-   operands[1] = gen_int_mode (INTVAL (operands[1]) >> 8, SImode);")
++	    && !(INTVAL (operands[3]) & ~(127 << 8))))"
++  [(set (match_dup 0)
++	(match_op_dup 1
++	  [(and:SI (zero_extract:SI (match_dup 2) (const_int 8) (const_int 8))
++		   (match_dup 3))
++	   (const_int 0)]))]
++  "operands[2] = gen_lowpart (SImode, operands[2]);
++   operands[3] = gen_int_mode (INTVAL (operands[3]) >> 8, SImode);")
+ 
+ (define_split
+-  [(set (reg 17)
+-	(compare
+-	  (and (match_operand 0 "nonimmediate_operand" "")
+-	       (match_operand 1 "const_int_operand" ""))
+-	  (const_int 0)))]
++  [(set (match_operand 0 "flags_reg_operand" "")
++	(match_operator 1 "compare_operator"
++	  [(and (match_operand 2 "nonimmediate_operand" "")
++	        (match_operand 3 "const_int_operand" ""))
++	   (const_int 0)]))]
+    "reload_completed
+-    && (!REG_P (operands[0]) || ANY_QI_REG_P (operands[0]))
++    && GET_MODE (operands[2]) != QImode
++    && (!REG_P (operands[2]) || ANY_QI_REG_P (operands[2]))
+     && ((ix86_match_ccmode (insn, CCZmode)
+-	 && !(INTVAL (operands[1]) & ~255))
++	 && !(INTVAL (operands[3]) & ~255))
+ 	|| (ix86_match_ccmode (insn, CCNOmode)
+-	    && !(INTVAL (operands[1]) & ~127)))
+-    && GET_MODE (operands[0]) != QImode"
+-  [(set (reg:CCNO 17)
+-	(compare:CCNO
+-	  (and:QI (match_dup 0)
+-		  (match_dup 1))
+-	  (const_int 0)))]
+-  "operands[0] = gen_lowpart (QImode, operands[0]);
+-   operands[1] = gen_lowpart (QImode, operands[1]);")
++	    && !(INTVAL (operands[3]) & ~127)))"
++  [(set (match_dup 0)
++	(match_op_dup 1 [(and:QI (match_dup 2) (match_dup 3))
++			 (const_int 0)]))]
++  "operands[2] = gen_lowpart (QImode, operands[2]);
++   operands[3] = gen_lowpart (QImode, operands[3]);")
+ 
+ 
+ ;; %%% This used to optimize known byte-wide and operations to memory,
+@@ -8066,7 +8092,7 @@
+   [(set_attr "type" "alu1")
+    (set_attr "mode" "QI")])
+ 
+-(define_insn "*andqi_2"
++(define_insn "*andqi_2_maybe_si"
+   [(set (reg 17)
+ 	(compare (and:QI
+ 		   (match_operand:QI 1 "nonimmediate_operand" "%0,0,0")
+@@ -8074,13 +8100,14 @@
+ 		 (const_int 0)))
+    (set (match_operand:QI 0 "nonimmediate_operand" "=q,qm,*r")
+ 	(and:QI (match_dup 1) (match_dup 2)))]
+-  "ix86_match_ccmode (insn, CCNOmode)
+-   && ix86_binary_operator_ok (AND, QImode, operands)"
++   "ix86_binary_operator_ok (AND, QImode, operands)
++    && ix86_match_ccmode (insn,
++ 			  GET_CODE (operands[2]) == CONST_INT
++ 			  && INTVAL (operands[2]) >= 0 ? CCNOmode : CCZmode)"
+ {
+   if (which_alternative == 2)
+     {
+-      if (GET_CODE (operands[2]) == CONST_INT
+-          && (INTVAL (operands[2]) & 0xffffff00))
++      if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) < 0)
+         operands[2] = GEN_INT (INTVAL (operands[2]) & 0xff);
+       return "and{l}\t{%2, %k0|%k0, %2}";
+     }
+@@ -8089,6 +8116,20 @@
+   [(set_attr "type" "alu")
+    (set_attr "mode" "QI,QI,SI")])
+ 
++(define_insn "*andqi_2"
++  [(set (reg 17)
++	(compare (and:QI
++		   (match_operand:QI 1 "nonimmediate_operand" "%0,0")
++		   (match_operand:QI 2 "general_operand" "qim,qi"))
++		 (const_int 0)))
++   (set (match_operand:QI 0 "nonimmediate_operand" "=q,qm")
++	(and:QI (match_dup 1) (match_dup 2)))]
++  "ix86_match_ccmode (insn, CCNOmode)
++   && ix86_binary_operator_ok (AND, QImode, operands)"
++  "and{b}\t{%2, %0|%0, %2}"
++  [(set_attr "type" "alu")
++   (set_attr "mode" "QI")])
++
+ (define_insn "*andqi_2_slp"
+   [(set (reg 17)
+ 	(compare (and:QI
+@@ -10147,17 +10188,19 @@
+    (set_attr "mode" "DI")])
+ 
+ (define_split
+-  [(set (reg 17)
+-	(compare (not:DI (match_operand:DI 1 "nonimmediate_operand" ""))
+-		 (const_int 0)))
+-   (set (match_operand:DI 0 "nonimmediate_operand" "")
+-	(not:DI (match_dup 1)))]
++  [(set (match_operand 0 "flags_reg_operand" "")
++	(match_operator 2 "compare_operator"
++	  [(not:DI (match_operand:DI 3 "nonimmediate_operand" ""))
++	   (const_int 0)]))
++   (set (match_operand:DI 1 "nonimmediate_operand" "")
++	(not:DI (match_dup 3)))]
+   "TARGET_64BIT && ix86_match_ccmode (insn, CCNOmode)"
+-  [(parallel [(set (reg:CCNO 17)
+-		   (compare:CCNO (xor:DI (match_dup 1) (const_int -1))
+-				 (const_int 0)))
+-	      (set (match_dup 0)
+-		   (xor:DI (match_dup 1) (const_int -1)))])]
++  [(parallel [(set (match_dup 0)
++		   (match_op_dup 2
++		     [(xor:DI (match_dup 3) (const_int -1))
++		      (const_int 0)]))
++	      (set (match_dup 1)
++		   (xor:DI (match_dup 3) (const_int -1)))])]
+   "")
+ 
+ (define_expand "one_cmplsi2"
+@@ -10196,17 +10239,18 @@
+    (set_attr "mode" "SI")])
+ 
+ (define_split
+-  [(set (reg 17)
+-	(compare (not:SI (match_operand:SI 1 "nonimmediate_operand" ""))
+-		 (const_int 0)))
+-   (set (match_operand:SI 0 "nonimmediate_operand" "")
+-	(not:SI (match_dup 1)))]
++  [(set (match_operand 0 "flags_reg_operand" "")
++	(match_operator 2 "compare_operator"
++	  [(not:SI (match_operand:SI 3 "nonimmediate_operand" ""))
++	   (const_int 0)]))
++   (set (match_operand:SI 1 "nonimmediate_operand" "")
++	(not:SI (match_dup 3)))]
+   "ix86_match_ccmode (insn, CCNOmode)"
+-  [(parallel [(set (reg:CCNO 17)
+-		   (compare:CCNO (xor:SI (match_dup 1) (const_int -1))
+-				 (const_int 0)))
+-	      (set (match_dup 0)
+-		   (xor:SI (match_dup 1) (const_int -1)))])]
++  [(parallel [(set (match_dup 0)
++		   (match_op_dup 2 [(xor:SI (match_dup 3) (const_int -1))
++				    (const_int 0)]))
++	      (set (match_dup 1)
++		   (xor:SI (match_dup 3) (const_int -1)))])]
+   "")
+ 
+ ;; ??? Currently never generated - xor is used instead.
+@@ -10223,17 +10267,18 @@
+    (set_attr "mode" "SI")])
+ 
+ (define_split
+-  [(set (reg 17)
+-	(compare (not:SI (match_operand:SI 1 "register_operand" ""))
+-		 (const_int 0)))
+-   (set (match_operand:DI 0 "register_operand" "")
+-	(zero_extend:DI (not:SI (match_dup 1))))]
++  [(set (match_operand 0 "flags_reg_operand" "")
++	(match_operator 2 "compare_operator"
++	  [(not:SI (match_operand:SI 3 "register_operand" ""))
++	   (const_int 0)]))
++   (set (match_operand:DI 1 "register_operand" "")
++	(zero_extend:DI (not:SI (match_dup 3))))]
+   "ix86_match_ccmode (insn, CCNOmode)"
+-  [(parallel [(set (reg:CCNO 17)
+-		   (compare:CCNO (xor:SI (match_dup 1) (const_int -1))
+-				 (const_int 0)))
+-	      (set (match_dup 0)
+-		   (zero_extend:DI (xor:SI (match_dup 1) (const_int -1))))])]
++  [(parallel [(set (match_dup 0)
++		   (match_op_dup 2 [(xor:SI (match_dup 3) (const_int -1))
++				    (const_int 0)]))
++	      (set (match_dup 1)
++		   (zero_extend:DI (xor:SI (match_dup 3) (const_int -1))))])]
+   "")
+ 
+ (define_expand "one_cmplhi2"
+@@ -10263,17 +10308,18 @@
+    (set_attr "mode" "HI")])
+ 
+ (define_split
+-  [(set (reg 17)
+-	(compare (not:HI (match_operand:HI 1 "nonimmediate_operand" ""))
+-		 (const_int 0)))
+-   (set (match_operand:HI 0 "nonimmediate_operand" "")
+-	(not:HI (match_dup 1)))]
++  [(set (match_operand 0 "flags_reg_operand" "")
++	(match_operator 2 "compare_operator"
++	  [(not:HI (match_operand:HI 3 "nonimmediate_operand" ""))
++	   (const_int 0)]))
++   (set (match_operand:HI 1 "nonimmediate_operand" "")
++	(not:HI (match_dup 3)))]
+   "ix86_match_ccmode (insn, CCNOmode)"
+-  [(parallel [(set (reg:CCNO 17)
+-		   (compare:CCNO (xor:HI (match_dup 1) (const_int -1))
+-		      		 (const_int 0)))
+-	      (set (match_dup 0)
+-		   (xor:HI (match_dup 1) (const_int -1)))])]
++  [(parallel [(set (match_dup 0)
++		   (match_op_dup 2 [(xor:HI (match_dup 3) (const_int -1))
++		      		    (const_int 0)]))
++	      (set (match_dup 1)
++		   (xor:HI (match_dup 3) (const_int -1)))])]
+   "")
+ 
+ ;; %%% Potential partial reg stall on alternative 1.  What to do?
+@@ -10306,17 +10352,18 @@
+    (set_attr "mode" "QI")])
+ 
+ (define_split
+-  [(set (reg 17)
+-	(compare (not:QI (match_operand:QI 1 "nonimmediate_operand" ""))
+-		 (const_int 0)))
+-   (set (match_operand:QI 0 "nonimmediate_operand" "")
+-	(not:QI (match_dup 1)))]
++  [(set (match_operand 0 "flags_reg_operand" "")
++	(match_operator 2 "compare_operator"
++	  [(not:QI (match_operand:QI 3 "nonimmediate_operand" ""))
++	   (const_int 0)]))
++   (set (match_operand:QI 1 "nonimmediate_operand" "")
++	(not:QI (match_dup 3)))]
+   "ix86_match_ccmode (insn, CCNOmode)"
+-  [(parallel [(set (reg:CCNO 17)
+-		   (compare:CCNO (xor:QI (match_dup 1) (const_int -1))
+-		      		 (const_int 0)))
+-	      (set (match_dup 0)
+-		   (xor:QI (match_dup 1) (const_int -1)))])]
++  [(parallel [(set (match_dup 0)
++		   (match_op_dup 2 [(xor:QI (match_dup 3) (const_int -1))
++		      		    (const_int 0)]))
++	      (set (match_dup 1)
++		   (xor:QI (match_dup 3) (const_int -1)))])]
+   "")
+ 
+ ;; Arithmetic shift instructions
+@@ -16639,10 +16686,12 @@
+    (set (subreg:TI (match_dup 0) 0) (ior:TI (subreg:TI (match_dup 6) 0)
+ 					    (subreg:TI (match_dup 7) 0)))]
+ {
+-  /* If op2 == op3, op3 will be clobbered before it is used.
+-     This should be optimized out though.  */
++  /* If op2 == op3, op3 would be clobbered before it is used.  */
+   if (operands_match_p (operands[2], operands[3]))
+-    abort ();
++    {
++      emit_move_insn (operands[0], operands[2]);
++      DONE;
++    }
+   PUT_MODE (operands[1], GET_MODE (operands[0]));
+   if (operands_match_p (operands[0], operands[4]))
+     operands[6] = operands[4], operands[7] = operands[2];
+@@ -16863,52 +16912,56 @@
+ ; instruction size is unchanged, except in the %eax case for
+ ; which it is increased by one byte, hence the ! optimize_size.
+ (define_split
+-  [(set (reg 17)
+-	(compare (and (match_operand 1 "aligned_operand" "")
+-		      (match_operand 2 "const_int_operand" ""))
+-		 (const_int 0)))
+-   (set (match_operand 0 "register_operand" "")
+-	(and (match_dup 1) (match_dup 2)))]
++  [(set (match_operand 0 "flags_reg_operand" "")
++	(match_operator 2 "compare_operator"
++	  [(and (match_operand 3 "aligned_operand" "")
++		(match_operand 4 "const_int_operand" ""))
++	   (const_int 0)]))
++   (set (match_operand 1 "register_operand" "")
++	(and (match_dup 3) (match_dup 4)))]
+   "! TARGET_PARTIAL_REG_STALL && reload_completed
+    /* Ensure that the operand will remain sign-extended immediate.  */
+-   && ix86_match_ccmode (insn, INTVAL (operands[2]) >= 0 ? CCNOmode : CCZmode)
++   && ix86_match_ccmode (insn, INTVAL (operands[4]) >= 0 ? CCNOmode : CCZmode)
+    && ! optimize_size
+-   && ((GET_MODE (operands[0]) == HImode && ! TARGET_FAST_PREFIX)
+-       || (GET_MODE (operands[0]) == QImode && TARGET_PROMOTE_QImode))"
+-  [(parallel [(set (reg:CCNO 17)
+-		   (compare:CCNO (and:SI (match_dup 1) (match_dup 2))
+-			         (const_int 0)))
+-	      (set (match_dup 0)
+-		   (and:SI (match_dup 1) (match_dup 2)))])]
+-  "operands[2]
+-     = gen_int_mode (INTVAL (operands[2])
+-		     & GET_MODE_MASK (GET_MODE (operands[0])),
+-		     SImode);
+-   operands[0] = gen_lowpart (SImode, operands[0]);
+-   operands[1] = gen_lowpart (SImode, operands[1]);")
++   && ((GET_MODE (operands[1]) == HImode && ! TARGET_FAST_PREFIX)
++       || (GET_MODE (operands[1]) == QImode && TARGET_PROMOTE_QImode))"
++  [(parallel [(set (match_dup 0)
++		   (match_op_dup 2 [(and:SI (match_dup 3) (match_dup 4))
++			            (const_int 0)]))
++	      (set (match_dup 1)
++		   (and:SI (match_dup 3) (match_dup 4)))])]
++{
++  operands[4]
++    = gen_int_mode (INTVAL (operands[4])
++		    & GET_MODE_MASK (GET_MODE (operands[1])), SImode);
++  operands[1] = gen_lowpart (SImode, operands[1]);
++  operands[3] = gen_lowpart (SImode, operands[3]);
++})
+ 
+ ; Don't promote the QImode tests, as i386 doesn't have encoding of
+ ; the TEST instruction with 32-bit sign-extended immediate and thus
+ ; the instruction size would at least double, which is not what we
+ ; want even with ! optimize_size.
+ (define_split
+-  [(set (reg 17)
+-	(compare (and (match_operand:HI 0 "aligned_operand" "")
+-		      (match_operand:HI 1 "const_int_operand" ""))
+-		 (const_int 0)))]
++  [(set (match_operand 0 "flags_reg_operand" "")
++	(match_operator 1 "compare_operator"
++	  [(and (match_operand:HI 2 "aligned_operand" "")
++		(match_operand:HI 3 "const_int_operand" ""))
++	   (const_int 0)]))]
+   "! TARGET_PARTIAL_REG_STALL && reload_completed
+    /* Ensure that the operand will remain sign-extended immediate.  */
+-   && ix86_match_ccmode (insn, INTVAL (operands[1]) >= 0 ? CCNOmode : CCZmode)
++   && ix86_match_ccmode (insn, INTVAL (operands[3]) >= 0 ? CCNOmode : CCZmode)
+    && ! TARGET_FAST_PREFIX
+    && ! optimize_size"
+-  [(set (reg:CCNO 17)
+-	(compare:CCNO (and:SI (match_dup 0) (match_dup 1))
+-		      (const_int 0)))]
+-  "operands[1]
+-     = gen_int_mode (INTVAL (operands[1])
+-		     & GET_MODE_MASK (GET_MODE (operands[0])),
+-		     SImode);
+-   operands[0] = gen_lowpart (SImode, operands[0]);")
++  [(set (match_dup 0)
++	(match_op_dup 1 [(and:SI (match_dup 2) (match_dup 3))
++		         (const_int 0)]))]
++{
++  operands[3]
++    = gen_int_mode (INTVAL (operands[3])
++		    & GET_MODE_MASK (GET_MODE (operands[2])), SImode);
++  operands[2] = gen_lowpart (SImode, operands[2]);
++})
+ 
+ (define_split
+   [(set (match_operand 0 "register_operand" "")
+@@ -17081,13 +17134,14 @@
+ 
+ ;; Don't compare memory with zero, load and use a test instead.
+ (define_peephole2
+-  [(set (reg 17)
+-	(compare (match_operand:SI 0 "memory_operand" "")
+-	         (const_int 0)))
++  [(set (match_operand 0 "flags_reg_operand" "")
++ 	(match_operator 1 "compare_operator"
++	  [(match_operand:SI 2 "memory_operand" "")
++	   (const_int 0)]))
+    (match_scratch:SI 3 "r")]
+   "ix86_match_ccmode (insn, CCNOmode) && ! optimize_size"
+-  [(set (match_dup 3) (match_dup 0))
+-   (set (reg:CCNO 17) (compare:CCNO (match_dup 3) (const_int 0)))]
++  [(set (match_dup 3) (match_dup 2))
++   (set (match_dup 0) (match_op_dup 1 [(match_dup 3) (const_int 0)]))]
+   "")
+ 
+ ;; NOT is not pairable on Pentium, while XOR is, but one byte longer. 
+@@ -17151,77 +17205,77 @@
+ ;; versions if we're concerned about partial register stalls.
+ 
+ (define_peephole2
+-  [(set (reg 17)
+-	(compare (and:SI (match_operand:SI 0 "register_operand" "")
+-			 (match_operand:SI 1 "immediate_operand" ""))
+-		 (const_int 0)))]
++  [(set (match_operand 0 "flags_reg_operand" "")
++	(match_operator 1 "compare_operator"
++	  [(and:SI (match_operand:SI 2 "register_operand" "")
++		   (match_operand:SI 3 "immediate_operand" ""))
++	   (const_int 0)]))]
+   "ix86_match_ccmode (insn, CCNOmode)
+-   && (true_regnum (operands[0]) != 0
+-       || (GET_CODE (operands[1]) == CONST_INT
+-	   && CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'K')))
+-   && find_regno_note (insn, REG_DEAD, true_regnum (operands[0]))"
++   && (true_regnum (operands[2]) != 0
++       || (GET_CODE (operands[3]) == CONST_INT
++	   && CONST_OK_FOR_LETTER_P (INTVAL (operands[3]), 'K')))
++   && peep2_reg_dead_p (1, operands[2])"
+   [(parallel
+-     [(set (reg:CCNO 17)
+-	   (compare:CCNO (and:SI (match_dup 0)
+-			         (match_dup 1))
+-		         (const_int 0)))
+-      (set (match_dup 0)
+-	   (and:SI (match_dup 0) (match_dup 1)))])]
++     [(set (match_dup 0)
++	   (match_op_dup 1 [(and:SI (match_dup 2) (match_dup 3))
++		            (const_int 0)]))
++      (set (match_dup 2)
++	   (and:SI (match_dup 2) (match_dup 3)))])]
+   "")
+ 
+ ;; We don't need to handle HImode case, because it will be promoted to SImode
+ ;; on ! TARGET_PARTIAL_REG_STALL
+ 
+ (define_peephole2
+-  [(set (reg 17)
+-	(compare (and:QI (match_operand:QI 0 "register_operand" "")
+-			 (match_operand:QI 1 "immediate_operand" ""))
+-		 (const_int 0)))]
++  [(set (match_operand 0 "flags_reg_operand" "")
++	(match_operator 1 "compare_operator"
++	  [(and:QI (match_operand:QI 2 "register_operand" "")
++		   (match_operand:QI 3 "immediate_operand" ""))
++	   (const_int 0)]))]
+   "! TARGET_PARTIAL_REG_STALL
+    && ix86_match_ccmode (insn, CCNOmode)
+-   && true_regnum (operands[0]) != 0
+-   && find_regno_note (insn, REG_DEAD, true_regnum (operands[0]))"
++   && true_regnum (operands[2]) != 0
++   && peep2_reg_dead_p (1, operands[2])"
+   [(parallel
+-     [(set (reg:CCNO 17)
+-	   (compare:CCNO (and:QI (match_dup 0)
+- 			         (match_dup 1))
+-		         (const_int 0)))
+-      (set (match_dup 0)
+-	   (and:QI (match_dup 0) (match_dup 1)))])]
++     [(set (match_dup 0)
++	   (match_op_dup 1 [(and:QI (match_dup 2) (match_dup 3))
++		            (const_int 0)]))
++      (set (match_dup 2)
++	   (and:QI (match_dup 2) (match_dup 3)))])]
+   "")
+ 
+ (define_peephole2
+-  [(set (reg 17)
+-	(compare
+-	  (and:SI
+-	    (zero_extract:SI
+-	      (match_operand 0 "ext_register_operand" "")
+-	      (const_int 8)
+-	      (const_int 8))
+-	    (match_operand 1 "const_int_operand" ""))
+-	  (const_int 0)))]
++  [(set (match_operand 0 "flags_reg_operand" "")
++	(match_operator 1 "compare_operator"
++	  [(and:SI
++	     (zero_extract:SI
++	       (match_operand 2 "ext_register_operand" "")
++	       (const_int 8)
++	       (const_int 8))
++	     (match_operand 3 "const_int_operand" ""))
++	   (const_int 0)]))]
+   "! TARGET_PARTIAL_REG_STALL
+    && ix86_match_ccmode (insn, CCNOmode)
+-   && true_regnum (operands[0]) != 0
+-   && find_regno_note (insn, REG_DEAD, true_regnum (operands[0]))"
+-  [(parallel [(set (reg:CCNO 17)
+-		   (compare:CCNO
+-		       (and:SI
+-			 (zero_extract:SI
+-			 (match_dup 0)
+-			 (const_int 8)
+-			 (const_int 8))
+-			(match_dup 1))
+-		   (const_int 0)))
+-	      (set (zero_extract:SI (match_dup 0)
++   && true_regnum (operands[2]) != 0
++   && peep2_reg_dead_p (1, operands[2])"
++  [(parallel [(set (match_dup 0)
++		   (match_op_dup 1
++		     [(and:SI
++			(zero_extract:SI
++			  (match_dup 2)
++			  (const_int 8)
++			  (const_int 8))
++			(match_dup 3))
++		      (const_int 0)]))
++	      (set (zero_extract:SI (match_dup 2)
+ 				    (const_int 8)
+ 				    (const_int 8))
+ 		   (and:SI 
+ 		     (zero_extract:SI
+-		       (match_dup 0)
++		       (match_dup 2)
+ 		       (const_int 8)
+ 		       (const_int 8))
+-		     (match_dup 1)))])]
++		     (match_dup 3)))])]
+   "")
+ 
+ ;; Don't do logical operations with memory inputs.
+@@ -17523,66 +17577,20 @@
+   "")
+ 
+ ;; Convert compares with 1 to shorter inc/dec operations when CF is not
+-;; required and register dies.
+-(define_peephole2
+-  [(set (reg 17)
+-	(compare (match_operand:SI 0 "register_operand" "")
+-		 (match_operand:SI 1 "incdec_operand" "")))]
+-  "ix86_match_ccmode (insn, CCGCmode)
+-   && find_regno_note (insn, REG_DEAD, true_regnum (operands[0]))"
+-  [(parallel [(set (reg:CCGC 17)
+-		   (compare:CCGC (match_dup 0)
+-				 (match_dup 1)))
+-	      (clobber (match_dup 0))])]
+-  "")
+-
++;; required and register dies.  Similarly for 128 to plus -128.
+ (define_peephole2
+-  [(set (reg 17)
+-	(compare (match_operand:HI 0 "register_operand" "")
+-		 (match_operand:HI 1 "incdec_operand" "")))]
+-  "ix86_match_ccmode (insn, CCGCmode)
+-   && find_regno_note (insn, REG_DEAD, true_regnum (operands[0]))"
+-  [(parallel [(set (reg:CCGC 17)
+-		   (compare:CCGC (match_dup 0)
+-				 (match_dup 1)))
+-	      (clobber (match_dup 0))])]
+-  "")
+-
+-(define_peephole2
+-  [(set (reg 17)
+-	(compare (match_operand:QI 0 "register_operand" "")
+-		 (match_operand:QI 1 "incdec_operand" "")))]
+-  "ix86_match_ccmode (insn, CCGCmode)
+-   && find_regno_note (insn, REG_DEAD, true_regnum (operands[0]))"
+-  [(parallel [(set (reg:CCGC 17)
+-		   (compare:CCGC (match_dup 0)
+-				 (match_dup 1)))
+-	      (clobber (match_dup 0))])]
+-  "")
+-
+-;; Convert compares with 128 to shorter add -128
+-(define_peephole2
+-  [(set (reg 17)
+-	(compare (match_operand:SI 0 "register_operand" "")
+-		 (const_int 128)))]
+-  "ix86_match_ccmode (insn, CCGCmode)
+-   && find_regno_note (insn, REG_DEAD, true_regnum (operands[0]))"
+-  [(parallel [(set (reg:CCGC 17)
+-		   (compare:CCGC (match_dup 0)
+-			         (const_int 128)))
+-	      (clobber (match_dup 0))])]
+-  "")
+-
+-(define_peephole2
+-  [(set (reg 17)
+-	(compare (match_operand:HI 0 "register_operand" "")
+-		 (const_int 128)))]
+-  "ix86_match_ccmode (insn, CCGCmode)
+-   && find_regno_note (insn, REG_DEAD, true_regnum (operands[0]))"
+-  [(parallel [(set (reg:CCGC 17)
+-		   (compare:CCGC (match_dup 0)
+-			         (const_int 128)))
+-	      (clobber (match_dup 0))])]
++  [(set (match_operand 0 "flags_reg_operand" "")
++	(match_operator 1 "compare_operator"
++	  [(match_operand 2 "register_operand" "")
++	   (match_operand 3 "const_int_operand" "")]))]
++  "(INTVAL (operands[3]) == -1
++    || INTVAL (operands[3]) == 1
++    || INTVAL (operands[3]) == 128)
++   && ix86_match_ccmode (insn, CCGCmode)
++   && peep2_reg_dead_p (1, operands[2])"
++  [(parallel [(set (match_dup 0)
++		   (match_op_dup 1 [(match_dup 2) (match_dup 3)]))
++	      (clobber (match_dup 2))])]
+   "")
+ 
+ (define_peephole2
+@@ -17780,9 +17788,9 @@
+ 	return "call\t%P1";
+     }
+   if (SIBLING_CALL_P (insn))
+-    return "jmp\t%*%1";
++    return "jmp\t%A1";
+   else
+-    return "call\t%*%1";
++    return "call\t%A1";
+ }
+   [(set_attr "type" "callv")])
+ 
+Index: gcc/config/ia64/ia64.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/ia64/ia64.c,v
+retrieving revision 1.198.2.22
+retrieving revision 1.198.2.24
+diff -u -r1.198.2.22 -r1.198.2.24
+--- gcc/gcc/config/ia64/ia64.c	17 Sep 2004 17:56:32 -0000	1.198.2.22
++++ gcc/gcc/config/ia64/ia64.c	14 Jan 2005 19:15:40 -0000	1.198.2.24
+@@ -2884,10 +2884,13 @@
+ 	 preserve those input registers used as arguments to the sibling call.
+ 	 It is unclear how to compute that number here.  */
+       if (current_frame_info.n_input_regs != 0)
+-	emit_insn (gen_alloc (gen_rtx_REG (DImode, fp),
+-			      GEN_INT (0), GEN_INT (0),
+-			      GEN_INT (current_frame_info.n_input_regs),
+-			      GEN_INT (0)));
++	{
++	  rtx n_inputs = GEN_INT (current_frame_info.n_input_regs);
++	  insn = emit_insn (gen_alloc (gen_rtx_REG (DImode, fp),
++				const0_rtx, const0_rtx,
++				n_inputs, const0_rtx));
++	  RTX_FRAME_RELATED_P (insn) = 1;
++	}
+     }
+ }
+ 
+@@ -3021,15 +3024,16 @@
+      int aligned_p;
+ {
+   if (size == (TARGET_ILP32 ? 4 : 8)
+-      && aligned_p
+       && !(TARGET_NO_PIC || TARGET_AUTO_PIC)
+       && GET_CODE (x) == SYMBOL_REF
+       && SYMBOL_REF_FLAG (x))
+     {
+-      if (TARGET_ILP32)
+-	fputs ("\tdata4\t@fptr(", asm_out_file);
+-      else
+-	fputs ("\tdata8\t@fptr(", asm_out_file);
++      static const char * const directive[2][2] = {
++	  /* 64-bit pointer */  /* 32-bit pointer */
++	{ "\tdata8.ua\t@fptr(", "\tdata4.ua\t@fptr("},	/* unaligned */
++	{ "\tdata8\t@fptr(",    "\tdata4\t@fptr("}	/* aligned */
++      };
++      fputs (directive[aligned_p != 0][TARGET_ILP32 != 0], asm_out_file);
+       output_addr_const (asm_out_file, x);
+       fputs (")\n", asm_out_file);
+       return true;
+@@ -7451,13 +7455,24 @@
+     {
+       dest_regno = REGNO (dest);
+ 
+-      /* If this isn't the final destination for ar.pfs, the alloc
+-	 shouldn't have been marked frame related.  */
+-      if (dest_regno != current_frame_info.reg_save_ar_pfs)
+-	abort ();
+-
+-      fprintf (asm_out_file, "\t.save ar.pfs, r%d\n",
+-	       ia64_dbx_register_number (dest_regno));
++      /* If this is the final destination for ar.pfs, then this must
++	 be the alloc in the prologue.  */
++      if (dest_regno == current_frame_info.reg_save_ar_pfs)
++	fprintf (asm_out_file, "\t.save ar.pfs, r%d\n",
++		 ia64_dbx_register_number (dest_regno));
++      else
++	{
++	  /* This must be an alloc before a sibcall.  We must drop the
++	     old frame info.  The easiest way to drop the old frame
++	     info is to ensure we had a ".restore sp" directive
++	     followed by a new prologue.  If the procedure doesn't
++	     have a memory-stack frame, we'll issue a dummy ".restore
++	     sp" now.  */
++	  if (current_frame_info.total_size == 0 && !frame_pointer_needed)
++	    /* if haven't done process_epilogue() yet, do it now */
++	    process_epilogue ();
++	  fprintf (asm_out_file, "\t.prologue\n");
++	}
+       return 1;
+     }
+ 
+Index: gcc/config/m68hc11/t-m68hc11-gas
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/m68hc11/t-m68hc11-gas,v
+retrieving revision 1.7.14.3
+retrieving revision 1.7.14.4
+diff -u -r1.7.14.3 -r1.7.14.4
+--- gcc/gcc/config/m68hc11/t-m68hc11-gas	4 Oct 2003 19:45:57 -0000	1.7.14.3
++++ gcc/gcc/config/m68hc11/t-m68hc11-gas	28 Jan 2005 22:21:39 -0000	1.7.14.4
+@@ -53,7 +53,7 @@
+ dp-bit.c: $(srcdir)/config/fp-bit.c
+ 	echo '#define SMALL_MACHINE' >> dp-bit.c
+ 	echo '#define CMPtype HItype' >> dp-bit.c
+-	echo '#ifdef __LITTLE_ENDIAN__' > dp-bit.c
++	echo '#ifdef __LITTLE_ENDIAN__' >> dp-bit.c
+ 	echo '#define FLOAT_BIT_ORDER_MISMATCH' >>dp-bit.c
+ 	echo '#endif' 		>> dp-bit.c
+ 	cat $(srcdir)/config/fp-bit.c >> dp-bit.c
+Index: gcc/config/mips/mips-protos.h
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/mips/mips-protos.h,v
+retrieving revision 1.30.4.1
+retrieving revision 1.30.4.2
+diff -u -r1.30.4.1 -r1.30.4.2
+--- gcc/gcc/config/mips/mips-protos.h	31 Jan 2003 23:51:22 -0000	1.30.4.1
++++ gcc/gcc/config/mips/mips-protos.h	8 Jan 2005 14:33:32 -0000	1.30.4.2
+@@ -1,6 +1,6 @@
+ /* Prototypes of target machine for GNU compiler.  MIPS version.
+    Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+-   1999, 2001, 2002 Free Software Foundation, Inc.
++   1999, 2001, 2002, 2005 Free Software Foundation, Inc.
+    Contributed by A. Lichnewsky (lich@inria.inria.fr).
+    Changed by Michael Meissner	(meissner@osf.org).
+    64 bit r4000 support by Ian Lance Taylor (ian@cygnus.com) and
+@@ -36,9 +36,13 @@
+ extern const char *	current_section_name PARAMS ((void));
+ extern unsigned int	current_section_flags PARAMS ((void));
+ extern int		mips_can_use_return_insn PARAMS ((void));
+-extern void		mips_declare_object PARAMS ((FILE *, const char *,
+-						     const char *,
+-						     const char *, int));
++extern void 		mips_output_aligned_decl_common
++				PARAMS ((FILE *, tree, const char *,
++					 unsigned HOST_WIDE_INT,
++					 unsigned int));
++extern void		mips_declare_object
++				PARAMS ((FILE *, const char *, const char *,
++					 const char *, ...));
+ extern void		mips_expand_epilogue PARAMS ((void));
+ extern void		mips_expand_prologue PARAMS ((void));
+ extern void		mips_output_filename PARAMS ((FILE *, const char *));
+Index: gcc/config/mips/mips.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/mips/mips.c,v
+retrieving revision 1.241.2.4
+retrieving revision 1.241.2.5
+diff -u -r1.241.2.4 -r1.241.2.5
+--- gcc/gcc/config/mips/mips.c	27 Jun 2003 11:44:23 -0000	1.241.2.4
++++ gcc/gcc/config/mips/mips.c	8 Jan 2005 14:33:33 -0000	1.241.2.5
+@@ -1,6 +1,6 @@
+ /* Subroutines for insn-output.c for MIPS
+    Copyright (C) 1989, 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998,
+-   1999, 2000, 2001, 2002 Free Software Foundation, Inc.
++   1999, 2000, 2001, 2002, 2005 Free Software Foundation, Inc.
+    Contributed by A. Lichnewsky, lich@inria.inria.fr.
+    Changes by Michael Meissner, meissner@osf.org.
+    64 bit r4000 support by Ian Lance Taylor, ian@cygnus.com, and
+@@ -6562,26 +6562,84 @@
+     fatal_io_error ("can't close temp file");
+ }
+ 
+-/* Emit either a label, .comm, or .lcomm directive, and mark that the symbol
+-   is used, so that we don't emit an .extern for it in mips_asm_file_end.  */
++/* Implement ASM_OUTPUT_ALIGNED_DECL_COMMON.  This is usually the same as
++   the elfos.h version, but we also need to handle -muninit-const-in-rodata
++   and the limitations of the SGI o32 assembler.  */
+ 
+ void
+-mips_declare_object (stream, name, init_string, final_string, size)
++mips_output_aligned_decl_common (stream, decl, name, size, align)
+      FILE *stream;
++     tree decl;
+      const char *name;
+-     const char *init_string;
+-     const char *final_string;
+-     int size;
++     unsigned HOST_WIDE_INT size;
++     unsigned int align;
+ {
+-  fputs (init_string, stream);		/* "", "\t.comm\t", or "\t.lcomm\t" */
++  const char *format;
++
++  /* If the target wants uninitialized const declarations in
++     .rdata then don't put them in .comm.   */
++  if (TARGET_EMBEDDED_DATA && TARGET_UNINIT_CONST_IN_RODATA
++      && TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl)
++      && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
++    {
++      if (TREE_PUBLIC (decl) && DECL_NAME (decl))
++	targetm.asm_out.globalize_label (stream, name);
++
++      readonly_data_section ();
++      ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
++
++      format = ACONCAT ((":\n\t.space\t", HOST_WIDE_INT_PRINT_UNSIGNED,
++			 "\n", NULL));
++      mips_declare_object (stream, name, "", format, size);
++    }
++#ifdef TARGET_IRIX6
++    /* The SGI o32 assembler doesn't accept an alignment, so round up
++       the size instead.  */
++  else if (mips_abi == ABI_32 && !TARGET_GAS)
++    {
++      size += (align / BITS_PER_UNIT) - 1;
++      size -= size % (align / BITS_PER_UNIT);
++      format = ACONCAT ((",", HOST_WIDE_INT_PRINT_UNSIGNED, "\n", NULL));
++      mips_declare_object (stream, name, "\n\t.comm\t", format, size);
++    }
++#endif
++  else
++    {
++      format = ACONCAT ((",", HOST_WIDE_INT_PRINT_UNSIGNED, ",%u\n", NULL));
++      mips_declare_object (stream, name, "\n\t.comm\t", format,
++			   size, align / BITS_PER_UNIT);
++    }
++}
++
++/* Emit either a label, .comm, or .lcomm directive.  When using assembler
++   macros, mark the symbol as written so that mips_file_end won't emit an
++   .extern for it.  STREAM is the output file, NAME is the name of the
++   symbol, INIT_STRING is the string that should be written before the
++   symbol and FINAL_STRING is the string that shoulbe written after it.
++   FINAL_STRING is a printf() format that consumes the remaining arguments.  */
++
++void
++mips_declare_object VPARAMS ((FILE *stream, const char *name,
++			      const char *init_string,
++			      const char *final_string, ...))
++{
++  VA_OPEN (ap, final_string);
++  VA_FIXEDARG (ap, FILE *, stream);
++  VA_FIXEDARG (ap, const char *, name);
++  VA_FIXEDARG (ap, const char *, init_string);
++  VA_FIXEDARG (ap, const char *, final_string);
++
++  fputs (init_string, stream);
+   assemble_name (stream, name);
+-  fprintf (stream, final_string, size);	/* ":\n", ",%u\n", ",%u\n" */
++  vfprintf (stream, final_string, ap);
+ 
+   if (TARGET_GP_OPT)
+     {
+       tree name_tree = get_identifier (name);
+       TREE_ASM_WRITTEN (name_tree) = 1;
+     }
++
++  VA_CLOSE (ap);
+ }
+ 
+ /* Return the bytes needed to compute the frame pointer from the current
+Index: gcc/config/mips/mips.h
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/mips/mips.h,v
+retrieving revision 1.227.4.6
+retrieving revision 1.227.4.7
+diff -u -r1.227.4.6 -r1.227.4.7
+--- gcc/gcc/config/mips/mips.h	30 May 2003 12:00:42 -0000	1.227.4.6
++++ gcc/gcc/config/mips/mips.h	8 Jan 2005 14:33:34 -0000	1.227.4.7
+@@ -1,6 +1,6 @@
+ /* Definitions of target machine for GNU compiler.  MIPS version.
+    Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
+-   1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++   1999, 2000, 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+    Contributed by A. Lichnewsky (lich@inria.inria.fr).
+    Changed by Michael Meissner	(meissner@osf.org).
+    64 bit r4000 support by Ian Lance Taylor (ian@cygnus.com) and
+@@ -4326,28 +4326,7 @@
+ 
+ /* This says how to define a global common symbol.  */
+ 
+-#define ASM_OUTPUT_ALIGNED_DECL_COMMON(STREAM, DECL, NAME, SIZE, ALIGN) \
+-  do {									\
+-    /* If the target wants uninitialized const declarations in		\
+-       .rdata then don't put them in .comm */				\
+-    if (TARGET_EMBEDDED_DATA && TARGET_UNINIT_CONST_IN_RODATA		\
+-	&& TREE_CODE (DECL) == VAR_DECL && TREE_READONLY (DECL)		\
+-	&& (DECL_INITIAL (DECL) == 0					\
+-	    || DECL_INITIAL (DECL) == error_mark_node))			\
+-      {									\
+-	if (TREE_PUBLIC (DECL) && DECL_NAME (DECL))			\
+-	  (*targetm.asm_out.globalize_label) (STREAM, NAME);		\
+-	    								\
+-	readonly_data_section ();					\
+-	ASM_OUTPUT_ALIGN (STREAM, floor_log2 (ALIGN / BITS_PER_UNIT));	\
+-	mips_declare_object (STREAM, NAME, "", ":\n\t.space\t%u\n",	\
+-	    (SIZE));							\
+-      }									\
+-    else								\
+-	mips_declare_object (STREAM, NAME, "\n\t.comm\t", ",%u\n",	\
+-	  (SIZE));							\
+-  } while (0)
+-
++#define ASM_OUTPUT_ALIGNED_DECL_COMMON mips_output_aligned_decl_common
+ 
+ /* This says how to define a local common symbol (ie, not visible to
+    linker).  */
+Index: gcc/config/mips/mips.md
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/mips/mips.md,v
+retrieving revision 1.153.2.5
+retrieving revision 1.153.2.6
+diff -u -r1.153.2.5 -r1.153.2.6
+--- gcc/gcc/config/mips/mips.md	27 Mar 2004 10:35:03 -0000	1.153.2.5
++++ gcc/gcc/config/mips/mips.md	8 Jan 2005 14:11:12 -0000	1.153.2.6
+@@ -1,6 +1,6 @@
+ ;;  Mips.md	     Machine Description for MIPS based processors
+ ;;  Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+-;;  1999, 2000, 2001, 2002 Free Software Foundation, Inc.
++;;  1999, 2000, 2001, 2002, 2005 Free Software Foundation, Inc.
+ ;;  Contributed by   A. Lichnewsky, lich@inria.inria.fr
+ ;;  Changes by       Michael Meissner, meissner@osf.org
+ ;;  64 bit r4000 support by Ian Lance Taylor, ian@cygnus.com, and
+@@ -163,7 +163,8 @@
+ 
+ ;; Describe a user's asm statement.
+ (define_asm_attributes
+-  [(set_attr "type" "multi")])
++  [(set_attr "type" "multi")
++   (set_attr "can_delay" "no")])
+ 
+ ;; whether or not generating calls to position independent functions
+ (define_attr "abicalls" "no,yes"
+Index: gcc/config/pa/pa32-linux.h
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/pa/pa32-linux.h,v
+retrieving revision 1.10
+retrieving revision 1.10.2.1
+diff -u -r1.10 -r1.10.2.1
+--- gcc/gcc/config/pa/pa32-linux.h	6 Dec 2002 02:54:38 -0000	1.10
++++ gcc/gcc/config/pa/pa32-linux.h	27 Dec 2004 02:55:49 -0000	1.10.2.1
+@@ -28,7 +28,7 @@
+    pointer into the frame.  This target does not need multiple
+    subspace stubs, so we allow sibcalls to all functions.  */
+ #undef FUNCTION_OK_FOR_SIBCALL
+-#define FUNCTION_OK_FOR_SIBCALL(DECL) 1
++#define FUNCTION_OK_FOR_SIBCALL(DECL) (!TARGET_PORTABLE_RUNTIME)
+ 
+ /* The libcall __canonicalize_funcptr_for_compare is referenced in
+    crtend.o and the reference isn't resolved in objects that don't
+Index: gcc/config/rs6000/rs6000.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
+retrieving revision 1.403.2.14
+retrieving revision 1.403.2.16
+diff -u -r1.403.2.14 -r1.403.2.16
+--- gcc/gcc/config/rs6000/rs6000.c	14 Jan 2004 14:03:58 -0000	1.403.2.14
++++ gcc/gcc/config/rs6000/rs6000.c	1 Dec 2004 06:13:16 -0000	1.403.2.16
+@@ -150,7 +150,8 @@
+ /* Call distance, overridden by -mlongcall and #pragma longcall(1).
+    The only place that looks at this is rs6000_set_default_type_attributes;
+    everywhere else should rely on the presence or absence of a longcall
+-   attribute on the function declaration.  */
++   attribute on the function declaration.  Exception: init_cumulative_args
++   looks at it too, for libcalls.  */
+ int rs6000_default_long_calls;
+ const char *rs6000_longcall_switch;
+ 
+@@ -2910,10 +2911,11 @@
+   cum->orig_nargs = cum->nargs_prototype;
+ 
+   /* Check for a longcall attribute.  */
+-  if (fntype
+-      && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
+-      && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype)))
+-    cum->call_cookie = CALL_LONG;
++  if ((!fntype && rs6000_default_long_calls)
++      || (fntype
++	  && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
++	  && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
++    cum->call_cookie |= CALL_LONG;
+ 
+   if (TARGET_DEBUG_ARG)
+     {
+@@ -10356,8 +10358,10 @@
+       rtx reg, mem, vrsave;
+       int offset;
+ 
+-      /* Get VRSAVE onto a GPR.  */
+-      reg = gen_rtx_REG (SImode, 12);
++      /* Get VRSAVE onto a GPR.  Note that ABI_V4 might be using r12
++	 as frame_reg_rtx and r11 as the static chain pointer for
++	 nested functions.  */
++      reg = gen_rtx_REG (SImode, 0);
+       vrsave = gen_rtx_REG (SImode, VRSAVE_REGNO);
+       if (TARGET_MACHO)
+ 	emit_insn (gen_get_vrsave_internal (reg));
+Index: gcc/config/rs6000/rs6000.md
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.md,v
+retrieving revision 1.224.2.6
+retrieving revision 1.224.2.7
+diff -u -r1.224.2.6 -r1.224.2.7
+--- gcc/gcc/config/rs6000/rs6000.md	8 Mar 2004 04:20:45 -0000	1.224.2.6
++++ gcc/gcc/config/rs6000/rs6000.md	24 Dec 2004 23:17:06 -0000	1.224.2.7
+@@ -3124,61 +3124,6 @@
+ }"
+   [(set_attr "length" "8")])
+ 
+-(define_insn_and_split "*andsi3_internal7"
+-  [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y")
+-	(compare:CC (and:SI (match_operand:SI 0 "gpc_reg_operand" "r,r")
+-			    (match_operand:SI 1 "mask_operand_wrap" "i,i"))
+-		    (const_int 0)))
+-   (clobber (match_scratch:SI 3 "=r,r"))]
+-  "TARGET_POWERPC64"
+-  "#"
+-  "TARGET_POWERPC64"
+-  [(parallel [(set (match_dup 2)
+-		   (compare:CC (and:SI (rotate:SI (match_dup 0) (match_dup 4))
+-				       (match_dup 5))
+-			       (const_int 0)))
+-	      (clobber (match_dup 3))])]
+-  "
+-{
+-  int mb = extract_MB (operands[1]);
+-  int me = extract_ME (operands[1]);
+-  operands[4] = GEN_INT (me + 1);
+-  operands[5] = GEN_INT (~((HOST_WIDE_INT) -1 << (33 + me - mb)));
+-}"
+-  [(set_attr "type" "delayed_compare,compare")
+-   (set_attr "length" "4,8")])
+-
+-(define_insn_and_split "*andsi3_internal8"
+-  [(set (match_operand:CC 3 "cc_reg_operand" "=x,??y")
+-	(compare:CC (and:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
+-			    (match_operand:SI 2 "mask_operand_wrap" "i,i"))
+-		    (const_int 0)))
+-   (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
+-	(and:SI (match_dup 1)
+-		(match_dup 2)))]
+-  "TARGET_POWERPC64"
+-  "#"
+-  "TARGET_POWERPC64"
+-  [(parallel [(set (match_dup 3)
+-		   (compare:CC (and:SI (rotate:SI (match_dup 1) (match_dup 4))
+-				       (match_dup 5))
+-			       (const_int 0)))
+-	      (set (match_dup 0)
+-		   (and:SI (rotate:SI (match_dup 1) (match_dup 4))
+-			   (match_dup 5)))])
+-   (set (match_dup 0)
+-	(rotate:SI (match_dup 0) (match_dup 6)))]
+-  "
+-{
+-  int mb = extract_MB (operands[2]);
+-  int me = extract_ME (operands[2]);
+-  operands[4] = GEN_INT (me + 1);
+-  operands[6] = GEN_INT (32 - (me + 1));
+-  operands[5] = GEN_INT (~((HOST_WIDE_INT) -1 << (33 + me - mb)));
+-}"
+-  [(set_attr "type" "delayed_compare,compare")
+-   (set_attr "length" "8,12")])
+-
+ (define_expand "iorsi3"
+   [(set (match_operand:SI 0 "gpc_reg_operand" "")
+ 	(ior:SI (match_operand:SI 1 "gpc_reg_operand" "")
+Index: gcc/config/s390/s390.md
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/s390/s390.md,v
+retrieving revision 1.41.2.12
+retrieving revision 1.41.2.13
+diff -u -r1.41.2.12 -r1.41.2.13
+--- gcc/gcc/config/s390/s390.md	3 Aug 2004 20:06:51 -0000	1.41.2.12
++++ gcc/gcc/config/s390/s390.md	27 Jan 2005 23:38:39 -0000	1.41.2.13
+@@ -910,11 +910,13 @@
+ })
+ 
+ (define_expand "reload_outti"
+-  [(parallel [(match_operand:TI 0 "memory_operand" "")
++  [(parallel [(match_operand:TI 0 "" "")
+               (match_operand:TI 1 "register_operand" "d")
+               (match_operand:DI 2 "register_operand" "=&a")])]
+   "TARGET_64BIT"
+ {
++  if (GET_CODE (operands[0]) != MEM)
++    abort ();
+   s390_load_address (operands[2], XEXP (operands[0], 0));
+   operands[0] = replace_equiv_address (operands[0], operands[2]);
+   emit_move_insn (operands[0], operands[1]);
+@@ -1060,11 +1062,13 @@
+ })
+ 
+ (define_expand "reload_outdi"
+-  [(parallel [(match_operand:DI 0 "memory_operand" "")
++  [(parallel [(match_operand:DI 0 "" "")
+               (match_operand:DI 1 "register_operand" "d")
+               (match_operand:SI 2 "register_operand" "=&a")])]
+   "!TARGET_64BIT"
+ {
++  if (GET_CODE (operands[0]) != MEM)
++    abort ();
+   s390_load_address (operands[2], XEXP (operands[0], 0));
+   operands[0] = replace_equiv_address (operands[0], operands[2]);
+   emit_move_insn (operands[0], operands[1]);
+@@ -1374,11 +1378,13 @@
+ })
+ 
+ (define_expand "reload_outdf"
+-  [(parallel [(match_operand:DF 0 "memory_operand" "")
++  [(parallel [(match_operand:DF 0 "" "")
+               (match_operand:DF 1 "register_operand" "d")
+               (match_operand:SI 2 "register_operand" "=&a")])]
+   "!TARGET_64BIT"
+ {
++  if (GET_CODE (operands[0]) != MEM)
++    abort ();
+   s390_load_address (operands[2], XEXP (operands[0], 0));
+   operands[0] = replace_equiv_address (operands[0], operands[2]);
+   emit_move_insn (operands[0], operands[1]);
+Index: gcc/config/sparc/sparc.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/sparc/sparc.c,v
+retrieving revision 1.233.4.12
+retrieving revision 1.233.4.13
+diff -u -r1.233.4.12 -r1.233.4.13
+--- gcc/gcc/config/sparc/sparc.c	17 Jul 2004 19:49:21 -0000	1.233.4.12
++++ gcc/gcc/config/sparc/sparc.c	14 Oct 2004 06:54:26 -0000	1.233.4.13
+@@ -178,6 +178,8 @@
+ static void sparc_encode_section_info PARAMS ((tree, int));
+ static void sparc_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT,
+ 					   HOST_WIDE_INT, tree));
++static bool sparc_can_output_mi_thunk PARAMS ((tree, HOST_WIDE_INT,
++					       HOST_WIDE_INT, tree));
+ 
+ /* Option handling.  */
+ 
+@@ -244,7 +246,7 @@
+ #undef TARGET_ASM_OUTPUT_MI_THUNK
+ #define TARGET_ASM_OUTPUT_MI_THUNK sparc_output_mi_thunk
+ #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
+-#define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
++#define TARGET_ASM_CAN_OUTPUT_MI_THUNK sparc_can_output_mi_thunk
+ 
+ struct gcc_target targetm = TARGET_INITIALIZER;
+ 
+@@ -8622,18 +8624,21 @@
+     SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1;
+ }
+ 
+-/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
+-   Used for C++ multiple inheritance.  */
++/* Output the assembler code for a thunk function.  THUNK_DECL is the
++   declaration for the thunk function itself, FUNCTION is the decl for
++   the target function.  DELTA is an immediate constant offset to be
++   added to THIS.  If VCALL_OFFSET is nonzero, the word at address
++   (*THIS + VCALL_OFFSET) should be additionally added to THIS.  */
+ 
+ static void
+ sparc_output_mi_thunk (file, thunk_fndecl, delta, vcall_offset, function)
+      FILE *file;
+      tree thunk_fndecl ATTRIBUTE_UNUSED;
+      HOST_WIDE_INT delta;
+-     HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED;
++     HOST_WIDE_INT vcall_offset;
+      tree function;
+ {
+-  rtx this, insn, funexp, delta_rtx, tmp;
++  rtx this, insn, funexp;
+ 
+   reload_completed = 1;
+   no_new_pseudos = 1;
+@@ -8650,26 +8655,73 @@
+ 
+   /* Add DELTA.  When possible use a plain add, otherwise load it into
+      a register first.  */
+-  delta_rtx = GEN_INT (delta);
+-  if (!SPARC_SIMM13_P (delta))
++  if (delta)
+     {
++      rtx delta_rtx = GEN_INT (delta);
++
++      if (! SPARC_SIMM13_P (delta))
++	{
++	  rtx scratch = gen_rtx_REG (Pmode, 1);
++	  emit_move_insn (scratch, delta_rtx);
++	  delta_rtx = scratch;
++	}
++
++      /* THIS += DELTA.  */
++      emit_insn (gen_add2_insn (this, delta_rtx));
++    }
++
++  /* Add the word at address (*THIS + VCALL_OFFSET).  */
++  if (vcall_offset)
++    {
++      rtx vcall_offset_rtx = GEN_INT (vcall_offset);
+       rtx scratch = gen_rtx_REG (Pmode, 1);
+ 
+-      if (input_operand (delta_rtx, GET_MODE (scratch)))
+-	emit_insn (gen_rtx_SET (VOIDmode, scratch, delta_rtx));
++      if (vcall_offset >= 0)
++	abort ();
++
++      /* SCRATCH = *THIS.  */
++      emit_move_insn (scratch, gen_rtx_MEM (Pmode, this));
++
++      /* Prepare for adding VCALL_OFFSET.  The difficulty is that we
++	 may not have any available scratch register at this point.  */
++      if (SPARC_SIMM13_P (vcall_offset))
++	;
++      /* This is the case if ARCH64 (unless -ffixed-g5 is passed).  */
++      else if (! fixed_regs[5]
++	       /* The below sequence is made up of at least 2 insns,
++		  while the default method may need only one.  */
++	       && vcall_offset < -8192)
++	{
++	  rtx scratch2 = gen_rtx_REG (Pmode, 5);
++	  emit_move_insn (scratch2, vcall_offset_rtx);
++	  vcall_offset_rtx = scratch2;
++	}
+       else
+ 	{
+-	  if (TARGET_ARCH64)
+-	    sparc_emit_set_const64 (scratch, delta_rtx);
+-	  else
+-	    sparc_emit_set_const32 (scratch, delta_rtx);
++	  rtx increment = GEN_INT (-4096);
++
++	  /* VCALL_OFFSET is a negative number whose typical range can be
++	     estimated as -32768..0 in 32-bit mode.  In almost all cases
++	     it is therefore cheaper to emit multiple add insns than
++	     spilling and loading the constant into a register (at least
++	     6 insns).  */
++	  while (! SPARC_SIMM13_P (vcall_offset))
++	    {
++	      emit_insn (gen_add2_insn (scratch, increment));
++	      vcall_offset += 4096;
++	    }
++	  vcall_offset_rtx = GEN_INT (vcall_offset); /* cannot be 0 */
+ 	}
+ 
+-      delta_rtx = scratch;
+-    }
++      /* SCRATCH = *(*THIS + VCALL_OFFSET).  */
++      emit_move_insn (scratch, gen_rtx_MEM (Pmode,
++					    gen_rtx_PLUS (Pmode,
++							  scratch,
++							  vcall_offset_rtx)));
+ 
+-  tmp = gen_rtx_PLUS (Pmode, this, delta_rtx);
+-  emit_insn (gen_rtx_SET (VOIDmode, this, tmp));
++      /* THIS += *(*THIS + VCALL_OFFSET).  */
++      emit_insn (gen_add2_insn (this, scratch));
++    }
+ 
+   /* Generate a tail call to the target function.  */
+   if (! TREE_USED (function))
+@@ -8697,4 +8749,18 @@
+   no_new_pseudos = 0;
+ }
+ 
++/* Return true if sparc_output_mi_thunk would be able to output the
++   assembler code for the thunk function specified by the arguments
++   it is passed, and false otherwise.  */
++static bool
++sparc_can_output_mi_thunk (thunk_fndecl, delta, vcall_offset, function)
++     tree thunk_fndecl ATTRIBUTE_UNUSED;
++     HOST_WIDE_INT delta ATTRIBUTE_UNUSED;
++     HOST_WIDE_INT vcall_offset;
++     tree function ATTRIBUTE_UNUSED;
++{
++  /* Bound the loop used in the default method above.  */
++  return (vcall_offset >= -32768 || ! fixed_regs[5]);
++}
++
+ #include "gt-sparc.h"
+Index: gcc/config/sparc/sparc.md
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/sparc/sparc.md,v
+retrieving revision 1.181.4.13
+retrieving revision 1.181.4.14
+diff -u -r1.181.4.13 -r1.181.4.14
+--- gcc/gcc/config/sparc/sparc.md	17 Jul 2004 19:49:21 -0000	1.181.4.13
++++ gcc/gcc/config/sparc/sparc.md	14 Oct 2004 06:54:27 -0000	1.181.4.14
+@@ -2048,7 +2048,6 @@
+   if (! CONSTANT_P (operands[1]) || input_operand (operands[1], DImode))
+     ;
+   else if (TARGET_ARCH64
+-	   && CONSTANT_P (operands[1])
+            && GET_CODE (operands[1]) != HIGH
+            && GET_CODE (operands[1]) != LO_SUM)
+     {
+Index: gcc/config/vax/vax.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/vax/vax.c,v
+retrieving revision 1.38
+retrieving revision 1.38.4.1
+diff -u -r1.38 -r1.38.4.1
+--- gcc/gcc/config/vax/vax.c	22 Oct 2002 23:05:24 -0000	1.38
++++ gcc/gcc/config/vax/vax.c	28 Dec 2004 06:29:59 -0000	1.38.4.1
+@@ -462,7 +462,7 @@
+     case CONST_INT:
+       /* byte offsets cost nothing (on a VAX 2, they cost 1 cycle) */
+       if (offset == 0)
+-	offset = (unsigned)(INTVAL(addr)+128) > 256;
++	offset = (unsigned HOST_WIDE_INT)(INTVAL(addr)+128) > 256;
+       break;
+     case CONST:
+     case SYMBOL_REF:
+@@ -595,13 +595,13 @@
+ 	fmt = "e";	/* all constant rotate counts are short */
+       break;
+     case PLUS:
+-      /* Check for small negative integer operand: subl2 can be used with
+-	 a short positive constant instead.  */
+-      if (GET_CODE (XEXP (x, 1)) == CONST_INT)
+-	if ((unsigned)(INTVAL (XEXP (x, 1)) + 63) < 127)
+-	  fmt = "e";
+     case MINUS:
+       c = (mode == DFmode) ? 13 : 8;	/* 6/8 on VAX 9000, 16/15 on VAX 2 */
++      /* Small integer operands can use subl2 and addl2.  */
++      if ((GET_CODE (XEXP (x, 1)) == CONST_INT)
++	  && (unsigned HOST_WIDE_INT)(INTVAL (XEXP (x, 1)) + 63) < 127)
++	fmt = "e";
++      break;
+     case IOR:
+     case XOR:
+       c = 3;
+@@ -611,7 +611,7 @@
+       c = 3;
+       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
+ 	{
+-	  if ((unsigned)~INTVAL (XEXP (x, 0)) > 63)
++	  if ((unsigned HOST_WIDE_INT)~INTVAL (XEXP (x, 0)) > 63)
+ 	    c = 4;
+ 	  fmt = "e";
+ 	  i = 1;
+@@ -665,7 +665,8 @@
+       switch (code)
+ 	{
+ 	case CONST_INT:
+-	  if ((unsigned)INTVAL (op) > 63 && GET_MODE (x) != QImode)
++	  if ((unsigned HOST_WIDE_INT)INTVAL (op) > 63
++	      && GET_MODE (x) != QImode)
+ 	    c += 1;		/* 2 on VAX 2 */
+ 	  break;
+ 	case CONST:
+Index: gcc/config/vax/vax.h
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/vax/vax.h,v
+retrieving revision 1.54
+retrieving revision 1.54.4.1
+diff -u -r1.54 -r1.54.4.1
+--- gcc/gcc/config/vax/vax.h	22 Oct 2002 23:05:24 -0000	1.54
++++ gcc/gcc/config/vax/vax.h	28 Dec 2004 06:28:01 -0000	1.54.4.1
+@@ -800,11 +800,6 @@
+    Do not define this if the table should contain absolute addresses.  */
+ #define CASE_VECTOR_PC_RELATIVE 1
+ 
+-/* Define this if the case instruction drops through after the table
+-   when the index is out of range.  Don't define it if the case insn
+-   jumps to the default label instead.  */
+-#define CASE_DROPS_THROUGH
+-
+ /* Indicate that jump tables go in the text section.  This is
+    necessary when compiling PIC code.  */
+ #define JUMP_TABLES_IN_TEXT_SECTION 1
+Index: gcc/config/vax/vax.md
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/vax/vax.md,v
+retrieving revision 1.23
+retrieving revision 1.23.4.1
+diff -u -r1.23 -r1.23.4.1
+--- gcc/gcc/config/vax/vax.md	1 Oct 2002 20:16:04 -0000	1.23
++++ gcc/gcc/config/vax/vax.md	28 Dec 2004 06:28:01 -0000	1.23.4.1
+@@ -1969,68 +1969,63 @@
+   "jmp (%0)")
+ 
+ ;; This is here to accept 5 arguments (as passed by expand_end_case)
+-;; and pass the first 4 along to the casesi1 pattern that really does the work.
++;; and pass the first 4 along to the casesi1 pattern that really does
++;; the actual casesi work.  We emit a jump here to the default label
++;; _before_ the casesi so that we can be sure that the casesi never
++;; drops through.
++;; This is suboptimal perhaps, but so is much of the rest of this
++;; machine description.  For what it's worth, HPPA uses the same trick.
++;;
++;; operand 0 is index
++;; operand 1 is the minimum bound (a const_int)
++;; operand 2 is the maximum bound - minimum bound + 1 (also a const_int)
++;; operand 3 is CODE_LABEL for the table;
++;; operand 4 is the CODE_LABEL to go to if index out of range (ie. default).
++;;
++;; We emit:
++;;	i = index - minimum_bound
++;;	if (i > (maximum_bound - minimum_bound + 1) goto default;
++;;	casesi (i, 0, table);
++;;
+ (define_expand "casesi"
+-  [(match_operand:SI 0 "general_operand" "")	; index
+-   (match_operand:SI 1 "general_operand" "")	; lower
+-   (match_operand:SI 2 "general_operand" "")	; upper-lower
+-   (match_operand 3 "" "")			; table label
+-   (match_operand 4 "" "")]			; default label
+-  ""
+-{
+-  emit_jump_insn (gen_casesi1 (operands[0], operands[1],
+-			       operands[2], operands[3]));
++  [(match_operand:SI 0 "general_operand" "")
++   (match_operand:SI 1 "general_operand" "")
++   (match_operand:SI 2 "general_operand" "")
++   (match_operand 3 "" "")
++   (match_operand 4 "" "")]
++  ""
++{
++  /* i = index - minimum_bound;
++     But only if the lower bound is not already zero.  */
++  if (operands[1] != const0_rtx)
++    {
++      rtx index = gen_reg_rtx (SImode);
++      emit_insn (gen_addsi3 (index,
++			     operands[0],
++			     GEN_INT (-INTVAL (operands[1]))));
++      operands[0] = index;
++    }
++
++  /* if (i > (maximum_bound - minimum_bound + 1) goto default;  */
++  emit_insn (gen_cmpsi (operands[0], operands[2]));
++  emit_jump_insn (gen_bgtu (operands[4]));
++
++  /* casesi (i, 0, table);  */
++  emit_jump_insn (gen_casesi1 (operands[0], operands[2], operands[3]));
+   DONE;
+ })
+ 
++;; This insn is a bit of a lier.  It actually falls through if no case
++;; matches.  But, we prevent that from ever happening by emiting a jump
++;; before this, see the define_expand above.
+ (define_insn "casesi1"
+-  [(set (pc)
+-	(if_then_else
+-	 (leu (minus:SI (match_operand:SI 0 "general_operand" "g")
+-			(match_operand:SI 1 "general_operand" "g"))
+-	      (match_operand:SI 2 "general_operand" "g"))
+-	 (plus:SI (sign_extend:SI
+-		   (mem:HI (plus:SI (mult:SI (minus:SI (match_dup 0)
+-						       (match_dup 1))
+-					     (const_int 2))
+-				    (pc))))
+-		  (label_ref:SI (match_operand 3 "" "")))
+-	 (pc)))]
+-  ""
+-  "casel %0,%1,%2")
+-
+-;; This can arise by simplification when operand 1 is a constant int.
+-(define_insn ""
+-  [(set (pc)
+-	(if_then_else
+-	 (leu (plus:SI (match_operand:SI 0 "general_operand" "g")
+-		       (match_operand:SI 1 "const_int_operand" "n"))
+-	      (match_operand:SI 2 "general_operand" "g"))
+-	 (plus:SI (sign_extend:SI
+-		   (mem:HI (plus:SI (mult:SI (plus:SI (match_dup 0)
+-						      (match_dup 1))
+-					     (const_int 2))
+-				    (pc))))
+-		  (label_ref:SI (match_operand 3 "" "")))
+-	 (pc)))]
+-  ""
+-  "*
+-{
+-  operands[1] = GEN_INT (-INTVAL (operands[1]));
+-  return \"casel %0,%1,%2\";
+-}")
+-
+-;; This can arise by simplification when the base for the case insn is zero.
+-(define_insn ""
+-  [(set (pc)
+-	(if_then_else (leu (match_operand:SI 0 "general_operand" "g")
+-			   (match_operand:SI 1 "general_operand" "g"))
+-		      (plus:SI (sign_extend:SI
+-				(mem:HI (plus:SI (mult:SI (match_dup 0)
+-							  (const_int 2))
+-					(pc))))
+-			       (label_ref:SI (match_operand 2 "" "")))
+-		      (pc)))]
++  [(match_operand:SI 1 "const_int_operand" "n")
++   (set (pc)
++	(plus:SI (sign_extend:SI
++		  (mem:HI (plus:SI (mult:SI (match_operand:SI 0 "general_operand" "g")
++					    (const_int 2))
++			  (pc))))
++		 (label_ref:SI (match_operand 2 "" ""))))]
+   ""
+   "casel %0,$0,%1")
+ 
+Index: gcc/cp/ChangeLog
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/cp/ChangeLog,v
+retrieving revision 1.3076.2.277
+retrieving revision 1.3076.2.281
+diff -u -r1.3076.2.277 -r1.3076.2.281
+--- gcc/gcc/cp/ChangeLog	30 Sep 2004 16:44:00 -0000	1.3076.2.277
++++ gcc/gcc/cp/ChangeLog	18 Dec 2004 20:26:04 -0000	1.3076.2.281
+@@ -1,3 +1,25 @@
++2004-12-18  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
++
++	PR c++/17456
++	* cvt.c (convert_to_void): Set expr to void_zero_node after
++	overload failure.
++
++2004-12-15  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
++
++	PR c++/16806
++	* error.c (dump_expr) [BASELINK]: Use dump_expr.
++
++2004-12-10  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
++
++	PR c++/17868
++	* error.c (dump_expr): Add missing case for RDIV_EXPR.
++
++2004-12-09  Nathan Sidwell  <nathan@codesourcery.com>
++
++	PR c++/16681
++	* init.c (build_zero_init): Build a RANGE_EXPR for an array
++	initializer.
++
+ 2004-09-30  Release Manager
+ 
+ 	* GCC 3.3.5 Released.
+Index: gcc/cp/cvt.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/cp/cvt.c,v
+retrieving revision 1.126.2.4
+retrieving revision 1.126.2.5
+diff -u -r1.126.2.4 -r1.126.2.5
+--- gcc/gcc/cp/cvt.c	23 Feb 2004 12:50:50 -0000	1.126.2.4
++++ gcc/gcc/cp/cvt.c	18 Dec 2004 20:26:10 -0000	1.126.2.5
+@@ -903,6 +903,7 @@
+ 	   of an overloaded function, and this is not one of them.  */
+ 	pedwarn ("%s cannot resolve address of overloaded function",
+ 		    implicit ? implicit : "void cast");
++	expr = void_zero_node;
+       }
+     else if (implicit && probe == expr && is_overloaded_fn (probe))
+       /* Only warn when there is no &.  */
+Index: gcc/cp/error.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/cp/error.c,v
+retrieving revision 1.192.2.9
+retrieving revision 1.192.2.11
+diff -u -r1.192.2.9 -r1.192.2.11
+--- gcc/gcc/cp/error.c	24 Jul 2004 13:03:23 -0000	1.192.2.9
++++ gcc/gcc/cp/error.c	15 Dec 2004 16:45:23 -0000	1.192.2.11
+@@ -1724,6 +1724,7 @@
+     case CEIL_DIV_EXPR:
+     case FLOOR_DIV_EXPR:
+     case ROUND_DIV_EXPR:
++    case RDIV_EXPR:
+       dump_binary_op ("/", t, flags);
+       break;
+ 
+@@ -2070,7 +2071,7 @@
+       break;
+ 
+     case BASELINK:
+-      print_tree_identifier (scratch_buffer, DECL_NAME (get_first_fn (t)));
++      dump_expr (get_first_fn (t), flags & ~TFF_EXPR_IN_PARENS);
+       break;
+ 
+     case TREE_LIST:
+Index: gcc/cp/init.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/cp/init.c,v
+retrieving revision 1.299.2.18
+retrieving revision 1.299.2.19
+diff -u -r1.299.2.18 -r1.299.2.19
+--- gcc/gcc/cp/init.c	28 Jul 2004 02:17:28 -0000	1.299.2.18
++++ gcc/gcc/cp/init.c	9 Dec 2004 15:09:19 -0000	1.299.2.19
+@@ -235,7 +235,6 @@
+     }
+   else if (TREE_CODE (type) == ARRAY_TYPE)
+     {
+-      tree index;
+       tree max_index;
+       tree inits;
+ 
+@@ -249,15 +248,17 @@
+       /* A zero-sized array, which is accepted as an extension, will
+          have an upper bound of -1.  */
+       if (!tree_int_cst_equal (max_index, integer_minus_one_node))
+-        for (index = size_zero_node;
+-             !tree_int_cst_lt (max_index, index);
+-             index = size_binop (PLUS_EXPR, index, size_one_node))
+-          inits = tree_cons (index,
+-                             build_zero_init (TREE_TYPE (type),
+-                                              /*nelts=*/NULL_TREE,
+-                                              static_storage_p),
+-                             inits);
+-         CONSTRUCTOR_ELTS (init) = nreverse (inits);
++ 	{
++ 	  tree elt_init = build_zero_init (TREE_TYPE (type),
++ 					   /*nelts=*/NULL_TREE,
++ 					   static_storage_p);
++ 	  tree range = build (RANGE_EXPR,
++			      sizetype, size_zero_node, max_index);
++ 	  
++ 	  inits = tree_cons (range, elt_init, inits);
++ 	}
++       
++      CONSTRUCTOR_ELTS (init) = nreverse (inits);
+     }
+   else if (TREE_CODE (type) == REFERENCE_TYPE)
+     ;
+Index: gcc/doc/install.texi
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/doc/install.texi,v
+retrieving revision 1.151.2.53
+retrieving revision 1.151.2.56
+diff -u -r1.151.2.53 -r1.151.2.56
+--- gcc/gcc/doc/install.texi	8 May 2004 17:37:31 -0000	1.151.2.53
++++ gcc/gcc/doc/install.texi	14 Oct 2004 12:31:38 -0000	1.151.2.56
+@@ -3098,8 +3098,19 @@
+ @file{/usr/bin} before @file{/usr/xpg4/bin} for the duration of the build.
+ 
+ All releases of GNU binutils prior to 2.11.2 have known bugs on this
+-platform.  We recommend the use of GNU binutils 2.11.2 or the vendor
+-tools (Sun @command{as}, Sun @command{ld}).
++platform.  We recommend the use of GNU binutils 2.11.2 or later, or the
++vendor tools (Sun @command{as}, Sun @command{ld}).  Note that your mileage
++may vary if you use a combination of the GNU tools and the Sun tools: while
++the combination GNU @command{as} + Sun @command{ld} should reasonably work,
++the reverse combination Sun @command{as} + GNU @command{ld} is known to
++cause memory corruption at runtime in some cases for C++ programs.
++
++The stock GNU binutils 2.15 release is broken on this platform because of a
++single bug.  It has been fixed on the 2.15 branch in the CVS repository.
++You can obtain a working version by checking out the binutils-2_15-branch
++from the CVS repository or applying the patch
++@uref{http://sources.redhat.com/ml/binutils-cvs/2004-09/msg00036.html} to the
++release.
+ 
+ Sun bug 4296832 turns up when compiling X11 headers with GCC 2.95 or
+ newer: @command{g++} will complain that types are missing.  These headers assume
+@@ -3115,6 +3126,17 @@
+ 108377-20 for Intel), and Solaris 8 (108652-24 or newer for SPARC,
+ 108653-22 for Intel) that fix this bug.
+ 
++Sun bug 4927647 sometimes causes random spurious testsuite failures
++related to missing diagnostic output.  This bug doesn't affect GCC
++itself, rather it is a kernel bug triggered by the @command{expect}
++program which is used only by the GCC testsuite driver.  When the bug
++causes the @command{expect} program to miss anticipated output, extra
++testsuite failures appear.
++
++There are patches for Solaris 8 (117350-12 or newer for SPARC,
++117351-12 or newer for Intel) and Solaris 9 (117171-11 or newer for
++SPARC, 117172-11 or newer for Intel) that address this problem.
++
+ @html
+ <hr />
+ @end html
+Index: gcc/doc/tm.texi
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/doc/tm.texi,v
+retrieving revision 1.182.2.8
+retrieving revision 1.182.2.9
+diff -u -r1.182.2.8 -r1.182.2.9
+--- gcc/gcc/doc/tm.texi	5 Mar 2004 17:55:57 -0000	1.182.2.8
++++ gcc/gcc/doc/tm.texi	14 Oct 2004 06:54:32 -0000	1.182.2.9
+@@ -4160,7 +4160,7 @@
+ @end table
+ 
+ @findex TARGET_ASM_OUTPUT_MI_THUNK
+-@deftypefn {Target Hook} void TARGET_ASM_OUTPUT_MI_THUNK (FILE *@var{file}, tree @var{thunk_fndecl}, HOST_WIDE_INT @var{delta}, tree @var{function})
++@deftypefn {Target Hook} void TARGET_ASM_OUTPUT_MI_THUNK (FILE *@var{file}, tree @var{thunk_fndecl}, HOST_WIDE_INT @var{delta}, HOST_WIDE_INT @var{vcall_offset}, tree @var{function})
+ A function that outputs the assembler code for a thunk
+ function, used to implement C++ virtual function calls with multiple
+ inheritance.  The thunk acts as a wrapper around a virtual function,
+@@ -4174,7 +4174,15 @@
+ e.g.@: @samp{%o0} on a sparc.  The addition must preserve the values of
+ all other incoming arguments.
+ 
+-After the addition, emit code to jump to @var{function}, which is a
++Then, if @var{vcall_offset} is nonzero, an additional adjustment should be
++made after adding @code{delta}.  In particular, if @var{p} is the
++adjusted pointer, the following adjustment should be made:
++
++@smallexample
++p += (*((ptrdiff_t **)p))[vcall_offset/sizeof(ptrdiff_t)]
++@end smallexample
++
++After the additions, emit code to jump to @var{function}, which is a
+ @code{FUNCTION_DECL}.  This is a direct pure jump, not a call, and does
+ not touch the return address.  Hence returning from @var{FUNCTION} will
+ return to whoever called the current @samp{thunk}.
+@@ -4194,21 +4202,13 @@
+ not support varargs.
+ @end deftypefn
+ 
+-@findex TARGET_ASM_OUTPUT_MI_VCALL_THUNK
+-@deftypefn {Target Hook} void TARGET_ASM_OUTPUT_MI_VCALL_THUNK (FILE *@var{file}, tree @var{thunk_fndecl}, HOST_WIDE_INT @var{delta}, int @var{vcall_offset}, tree @var{function})
+-A function like @code{TARGET_ASM_OUTPUT_MI_THUNK}, except that if
+-@var{vcall_offset} is nonzero, an additional adjustment should be made
+-after adding @code{delta}.  In particular, if @var{p} is the
+-adjusted pointer, the following adjustment should be made:
+-
+-@example
+-p += (*((ptrdiff_t **)p))[vcall_offset/sizeof(ptrdiff_t)]
+-@end example
+-
+-@noindent
+-If this function is defined, it will always be used in place of
+-@code{TARGET_ASM_OUTPUT_MI_THUNK}.
+-
++@findex TARGET_ASM_CAN_OUTPUT_MI_THUNK
++@deftypefn {Target Hook} bool TARGET_ASM_CAN_OUTPUT_MI_THUNK (tree @var{thunk_fndecl}, HOST_WIDE_INT @var{delta}, HOST_WIDE_INT @var{vcall_offset}, tree @var{function})
++A function that returns true if TARGET_ASM_OUTPUT_MI_THUNK would be able
++to output the assembler code for the thunk function specified by the
++arguments it is passed, and false otherwise.  In the latter case, the
++generic approach will be used by the C++ front end, with the limitations
++previously exposed.
+ @end deftypefn
+ 
+ @node Profiling
+Index: gcc/testsuite/ChangeLog
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/testsuite/ChangeLog,v
+retrieving revision 1.2261.2.384
+retrieving revision 1.2261.2.398
+diff -u -r1.2261.2.384 -r1.2261.2.398
+--- gcc/gcc/testsuite/ChangeLog	30 Sep 2004 16:45:41 -0000	1.2261.2.384
++++ gcc/gcc/testsuite/ChangeLog	23 Jan 2005 05:16:05 -0000	1.2261.2.398
+@@ -1,3 +1,78 @@
++2005-01-22  Roger Sayle  <roger@eyesopen.com>
++
++	PR target/18402
++	Backport from mainline
++	2003-02-05  Jakub Jelinek  <jakub@redhat.com>
++ 
++ 	PR optimization/8555
++	* gcc.dg/20030204-1.c: New test.
++
++2005-01-21  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
++
++	PR c++/17115
++	* g++.dg/warn/Winline-4.C: New test.
++
++2005-01-18  Eric Botcazou  <ebotcazou@libertysurf.fr>
++
++	* gcc.dg/short-compare-1.c: New test.
++	* gcc.dg/short-compare-2.c: Likewise.
++
++2005-01-03  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
++
++	Backport:
++	2003-10-13  Geoffrey Keating  <geoffk@apple.com>
++
++	* gcc.dg/asm-names.c: Use scan-assembler-not rather
++	than linker trickery.
++
++2005-01-02  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
++
++	* gcc.c-torture/execute/20020720-1.x: XFAIL for x86 when using
++	-fpic or -fPIC.
++
++2004-12-21  Joseph S. Myers  <jsm@polyomino.org.uk>
++
++	PR c/14765
++	* gcc.dg/pr14765-1.c: New test.
++
++2004-12-20  Andrew Pinski  <pinskia@physics.uc.edu>
++
++	PR other/19093
++	* g++.dg/opt/max1.C: Fix for 64bit targets.
++
++2004-12-19  Roger Sayle  <roger@eyesopen.com>
++
++	PR middle-end/19068
++	* g++.dg/opt/max1.C: New test case.
++
++2004-12-16  Wolfgang Bangerth  <bangerth@dealii.com>
++
++	* g++.dg/other/complex1.C: New test.
++
++2004-12-10  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
++
++	PR rtl-optimization/16536
++	* gcc.c-torture/execute/restrict-1.c: New test.
++
++2004-12-09  Nathan Sidwell  <nathan@codesourcery.com>
++
++	PR c++/16681
++	* g++.dg/init/array15.C: New.
++	* g++.dg/init/array16.C: New.
++
++2004-11-29  Roger Sayle  <roger@eyesopen.com>
++
++	PR rtl-optimization/9771
++	* gcc.dg/pr9771-1.c: New test case.
++
++2004-11-27  Falk Hueffner  <falk@debian.org>
++
++	* gcc.dg/loop-6.c: New test.
++
++2004-10-13  Eric Botcazou  <ebotcazou@libertysurf.fr>
++
++	* g++.dg/inherit/thunk1.C: Run on the SPARC.
++
+ 2004-09-30  Release Manager
+ 
+ 	* GCC 3.3.5 Released.
+Index: gcc/testsuite/g++.dg/inherit/thunk1.C
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/testsuite/g++.dg/inherit/thunk1.C,v
+retrieving revision 1.5
+retrieving revision 1.5.12.1
+diff -u -r1.5 -r1.5.12.1
+--- gcc/gcc/testsuite/g++.dg/inherit/thunk1.C	24 Oct 2002 09:16:36 -0000	1.5
++++ gcc/gcc/testsuite/g++.dg/inherit/thunk1.C	14 Oct 2004 06:54:49 -0000	1.5.12.1
+@@ -1,4 +1,4 @@
+-// { dg-do run { target i?86-*-* x86_64-*-* s390*-*-* alpha*-*-* ia64-*-* } }
++// { dg-do run { target i?86-*-* x86_64-*-* s390*-*-* alpha*-*-* ia64-*-* sparc*-*-* } }
+ 
+ #include <stdarg.h>
+ 
+Index: gcc/testsuite/g++.dg/init/array15.C
+===================================================================
+RCS file: gcc/testsuite/g++.dg/init/array15.C
+diff -N gcc/testsuite/g++.dg/init/array15.C
+--- gcc//dev/null	1 Jan 1970 00:00:00 -0000
++++ gcc/gcc/testsuite/g++.dg/init/array15.C	9 Dec 2004 15:09:32 -0000	1.1.6.1
+@@ -0,0 +1,46 @@
++// { dg-do run }
++
++// Copyright (C) 2004 Free Software Foundation, Inc.
++// Contributed by Nathan Sidwell 8 Dec 2004 <nathan@codesourcery.com>
++
++// PR 16681 too much memory used
++// Origin:  Matt LaFary <lafary@activmedia.com>
++
++struct foo {
++  unsigned char buffer[4111222];
++  foo() ;
++  bool check () const;
++};
++
++foo::foo ()
++  : buffer()
++{}
++
++bool foo::check () const
++{
++  for (unsigned ix = sizeof (buffer); ix--;)
++    if (buffer[ix])
++      return false;
++  return true;
++}
++
++void *operator new (__SIZE_TYPE__ size, void *p)
++{
++  return p;
++}
++
++char heap[5000000];
++
++int main ()
++{
++  for (unsigned ix = sizeof (heap); ix--;)
++    heap[ix] = ix;
++  
++  foo *f = new (heap) foo ();
++
++  if (!f->check ())
++    return 1;
++  return 0;
++}
++
++  
+Index: gcc/testsuite/g++.dg/init/array16.C
+===================================================================
+RCS file: gcc/testsuite/g++.dg/init/array16.C
+diff -N gcc/testsuite/g++.dg/init/array16.C
+--- gcc//dev/null	1 Jan 1970 00:00:00 -0000
++++ gcc/gcc/testsuite/g++.dg/init/array16.C	9 Dec 2004 15:09:32 -0000	1.1.6.1
+@@ -0,0 +1,106 @@
++// { dg-do run }
++
++// Copyright (C) 2004 Free Software Foundation, Inc.
++// Contributed by Nathan Sidwell 8 Dec 2004 <nathan@codesourcery.com>
++
++// PR 16681 too much memory used
++// Origin:  Matt LaFary <lafary@activmedia.com>
++
++
++struct elt 
++{
++  static int count;
++  static elt*ptr;
++  static int abort;
++  char c;
++  
++  elt ();
++  ~elt ();
++  
++};
++
++int elt::count;
++elt *elt::ptr;
++int elt::abort;
++
++elt::elt ()
++  :c ()
++{
++  if (count >= 0)
++    {
++      if (!ptr)
++	ptr = this;
++      if (count == 100)
++	throw 2;
++      if (this != ptr)
++	abort = 1;
++      count++;
++      ptr++;
++    }
++}
++
++elt::~elt ()
++{
++  if (count >= 0)
++    {
++      ptr--;
++      count--;
++      if (ptr != this)
++	abort = 2;
++    }
++}
++
++struct foo {
++  elt buffer[4111222];
++  foo() ;
++  bool check () const;
++};
++
++foo::foo ()
++  : buffer()
++{}
++
++bool foo::check () const
++{
++  for (unsigned ix = sizeof (buffer)/ sizeof (buffer[0]); ix--;)
++    if (buffer[ix].c)
++      return false;
++  return true;
++}
++
++void *operator new (__SIZE_TYPE__ size, void *p)
++{
++  return p;
++}
++
++char heap[5000000];
++
++int main ()
++{
++  for (unsigned ix = sizeof (heap); ix--;)
++    heap[ix] = ix;
++
++  try
++    {
++      foo *f = new (heap) foo ();
++      return 1;
++    }
++  catch (...)
++    {
++      if (elt::count)
++	return 2;
++      if (elt::abort)
++	return elt::abort + 3;
++    }
++
++  for (unsigned ix = sizeof (heap); ix--;)
++    heap[ix] = ix;
++
++  elt::count = -1;
++  foo *f = new (heap) foo ();
++  if (!f->check ())
++    return 3;
++  return 0;
++}
++
++  
+Index: gcc/testsuite/g++.dg/opt/max1.C
+===================================================================
+RCS file: gcc/testsuite/g++.dg/opt/max1.C
+diff -N gcc/testsuite/g++.dg/opt/max1.C
+--- gcc//dev/null	1 Jan 1970 00:00:00 -0000
++++ gcc/gcc/testsuite/g++.dg/opt/max1.C	20 Dec 2004 21:12:34 -0000	1.2.2.2
+@@ -0,0 +1,29 @@
++/* PR middle-end/19068 */
++/* Test case by Andrew Pinski <pinskia@physics.uc.edu> */
++/* { dg-do run } */
++/* { dg-options "-O2" } */
++
++extern "C" void abort (void);
++
++long fff[10];
++
++void f(long a)
++{
++  int i;
++  a =  *((long*)(a+1+sizeof(long))) >? *((long*)(a+1)); 
++
++  for(i=0;i<10;i++)
++   fff[i] = a;
++}
++
++int main(void)
++{
++  int i;
++  long a[2] = {10,5};
++  f((long)(&a)-1);
++  for(i = 0;i<10;i++)
++   if (fff[i]!=10)
++    abort ();
++  return 0;
++}
++
+Index: gcc/testsuite/g++.dg/other/complex1.C
+===================================================================
+RCS file: gcc/testsuite/g++.dg/other/complex1.C
+diff -N gcc/testsuite/g++.dg/other/complex1.C
+--- gcc//dev/null	1 Jan 1970 00:00:00 -0000
++++ gcc/gcc/testsuite/g++.dg/other/complex1.C	16 Dec 2004 14:04:52 -0000	1.1.4.1
+@@ -0,0 +1,28 @@
++// PR middle-end/18882
++// Origin: Petr Mikulik <mikulik@physics.muni.cz>
++// Testcase by Wolfgang Bangerth <bangerth@dealii.com>
++
++// { dg-do run }
++// { dg-options "" }
++
++extern "C" void abort ();
++
++struct C {
++  __complex__ long double c; 
++};
++
++void foo()
++{ 
++  C x = {2+2i}; 
++
++  int n = 1; 
++  C y = (n==1) ? x : (C){3+3i}; 
++  if (__imag__ y.c != 2) 
++    abort (); 
++}
++
++int main(void)
++{
++  foo ();
++  return 0;
++}
+Index: gcc/testsuite/g++.dg/warn/Winline-4.C
+===================================================================
+RCS file: gcc/testsuite/g++.dg/warn/Winline-4.C
+diff -N gcc/testsuite/g++.dg/warn/Winline-4.C
+--- gcc//dev/null	1 Jan 1970 00:00:00 -0000
++++ gcc/gcc/testsuite/g++.dg/warn/Winline-4.C	21 Jan 2005 10:02:30 -0000	1.1.42.1
+@@ -0,0 +1,17 @@
++// { dg-do compile }
++// { dg-options "-O2 -Winline" }
++// Origin: <markus at oberhumer dot com>
++// PR 17115: We should not emit -Winline warning for functions marked with
++//  noinline
++
++struct Foo {
++  __attribute__((noinline)) int a(int r) { return r & 1; }
++  virtual __attribute__((noinline)) int b(int r) { return r & 1; }
++  static  __attribute__((noinline)) int c(int r) { return r & 1; }
++};
++
++int bar(int r) {
++  Foo f;
++  int k = 1; k &= f.a(r); k &= f.b(r); k &= f.a(r);
++  return k;
++}
+Index: gcc/testsuite/gcc.c-torture/execute/20020720-1.x
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/testsuite/gcc.c-torture/execute/20020720-1.x,v
+retrieving revision 1.8.6.2
+retrieving revision 1.8.6.3
+diff -u -r1.8.6.2 -r1.8.6.3
+--- gcc/gcc/testsuite/gcc.c-torture/execute/20020720-1.x	8 Mar 2003 14:34:06 -0000	1.8.6.2
++++ gcc/gcc/testsuite/gcc.c-torture/execute/20020720-1.x	3 Jan 2005 01:43:45 -0000	1.8.6.3
+@@ -11,6 +11,19 @@
+ #     and can make the optimization.
+ 
+ # Don't XFAIL at -O0, that should never fail.
++if { [istarget "i?86-*-*"] } {
++    set torture_eval_before_compile {
++        global compiler_conditional_xfail_data
++        set compiler_conditional_xfail_data {
++            "PR opt/10348" \
++            { "*-*-*" } \
++            { "-fpic" "-fPIC" } \
++            { "-O0" }
++        }
++    }
++    return 0
++}
++
+ set torture_eval_before_compile {
+     global compiler_conditional_xfail_data
+     set compiler_conditional_xfail_data {
+Index: gcc/testsuite/gcc.c-torture/execute/restrict-1.c
+===================================================================
+RCS file: gcc/testsuite/gcc.c-torture/execute/restrict-1.c
+diff -N gcc/testsuite/gcc.c-torture/execute/restrict-1.c
+--- gcc//dev/null	1 Jan 1970 00:00:00 -0000
++++ gcc/gcc/testsuite/gcc.c-torture/execute/restrict-1.c	10 Dec 2004 17:25:07 -0000	1.2.44.1
+@@ -0,0 +1,30 @@
++/*  PR rtl-optimization/16536
++    Origin:  Jeremy Denise      <jeremy.denise@libertysurf.fr>
++    Reduced: Wolfgang Bangerth  <bangerth@dealii.org>
++             Volker Reichelt    <reichelt@igpm.rwth-aachen.de>  */
++
++extern void abort ();
++
++typedef struct
++{
++  int i, dummy;
++} A;
++
++inline A foo (const A* p, const A* q)
++{
++  return (A){p->i+q->i};
++}
++
++void bar (A* __restrict__ p)
++{
++  *p=foo(p,p);
++  if (p->i!=2)
++    abort();
++}
++
++int main ()
++{
++  A a={1};
++  bar(&a);
++  return 0;
++}
+Index: gcc/testsuite/gcc.dg/20030204-1.c
+===================================================================
+RCS file: gcc/testsuite/gcc.dg/20030204-1.c
+diff -N gcc/testsuite/gcc.dg/20030204-1.c
+--- gcc//dev/null	1 Jan 1970 00:00:00 -0000
++++ gcc/gcc/testsuite/gcc.dg/20030204-1.c	23 Jan 2005 05:16:14 -0000	1.3.6.1
+@@ -0,0 +1,16 @@
++/* PR optimization/8555 */
++/* { dg-do compile } */
++/* { dg-options "-O -ffast-math -funroll-loops" } */
++/* { dg-options "-march=pentium3 -O -ffast-math -funroll-loops" { target i?86-*-* } } */
++
++float foo (float *a, int i)
++{
++  int j;
++  float x = a[j = i - 1], y;
++
++  for (j = i; --j >= 0; )
++    if ((y = a[j]) > x)
++      x = y;
++
++  return x;
++}
+Index: gcc/testsuite/gcc.dg/asm-names.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/testsuite/gcc.dg/asm-names.c,v
+retrieving revision 1.2
+retrieving revision 1.2.44.1
+diff -u -r1.2 -r1.2.44.1
+--- gcc/gcc/testsuite/gcc.dg/asm-names.c	27 Aug 2001 19:23:11 -0000	1.2
++++ gcc/gcc/testsuite/gcc.dg/asm-names.c	4 Jan 2005 00:20:35 -0000	1.2.44.1
+@@ -2,26 +2,15 @@
+    to have an underscore prefixed, even if normal symbols are.
+    Problem reported by Krister Walfridsson <cato@df.lth.se>.  */
+ 
+-/* { dg-do link } */
++/* { dg-do compile } */
+ /* { dg-options "-fleading-underscore" } */
++/* { dg-final { scan-assembler-not "____frob14" } } */
+ 
+ extern void frobnicate (void) asm ("___frob14");  /* three underscores */
+ 
+-void __frob14 (void) {} /* two underscores */
+-
+ int
+ main (void)
+ {
+   frobnicate ();
+   return 0;
+ }
+-
+-/* In case built where the runtime expects no leading underscore on
+-   main(). */
+-extern int xmain (void) asm ("main");
+-
+-int xmain (void) { return main(); }
+-
+-/* In case built where the runtime calls __main.  */
+-extern int ymain (void) asm ("___main");
+-int ymain (void) { return main(); }
+Index: gcc/testsuite/gcc.dg/loop-6.c
+===================================================================
+RCS file: gcc/testsuite/gcc.dg/loop-6.c
+diff -N gcc/testsuite/gcc.dg/loop-6.c
+--- gcc//dev/null	1 Jan 1970 00:00:00 -0000
++++ gcc/gcc/testsuite/gcc.dg/loop-6.c	27 Nov 2004 16:59:16 -0000	1.1.4.1
+@@ -0,0 +1,25 @@
++/* PR optimization/18577 */
++/* Origin: Falk Hueffner <falk@debian.org> */
++
++/* { dg-do run } */
++/* { dg-options "-O2 -funroll-all-loops" } */
++
++static float tfcos12[3];
++__attribute__((noinline)) double f(double x) { return x; }
++int g;
++
++int main(void)
++{
++  int i, j;
++  for (i = 0; i < 1; i++) 
++    tfcos12[i] = 0.5;
++    
++  for (i = 0; i < 1; i++)
++    {
++      tfcos12[i] = 0.5 * f(i);
++      for (j = 0; j < 12; j++)
++	g++;
++    }
++
++  return 0;
++}
+Index: gcc/testsuite/gcc.dg/pr14765-1.c
+===================================================================
+RCS file: gcc/testsuite/gcc.dg/pr14765-1.c
+diff -N gcc/testsuite/gcc.dg/pr14765-1.c
+--- gcc//dev/null	1 Jan 1970 00:00:00 -0000
++++ gcc/gcc/testsuite/gcc.dg/pr14765-1.c	21 Dec 2004 21:51:29 -0000	1.1.48.1
+@@ -0,0 +1,11 @@
++/* Empty statement expressions should get void type.  Bug 14765 from
++   Serge Belyshev <belyshev@lubercy.com>.  */
++/* { dg-do compile } */
++/* { dg-options "" } */
++
++int a;
++void fun ()
++{
++	a = 0;
++	a = ({}); /* { dg-error "not ignored" "void stmt expr" } */
++}
+Index: gcc/testsuite/gcc.dg/pr9771-1.c
+===================================================================
+RCS file: gcc/testsuite/gcc.dg/pr9771-1.c
+diff -N gcc/testsuite/gcc.dg/pr9771-1.c
+--- gcc//dev/null	1 Jan 1970 00:00:00 -0000
++++ gcc/gcc/testsuite/gcc.dg/pr9771-1.c	30 Nov 2004 04:34:21 -0000	1.1.44.1
+@@ -0,0 +1,43 @@
++/* PR rtl-optimization/9771 */
++/* { dg-do run { target i?86-*-* } } */
++/* { dg-options "-O2 -fomit-frame-pointer -ffixed-ebp" } */
++
++extern void abort(void);
++extern void exit(int);
++
++register long *B asm ("ebp");
++
++long x = 10;
++long y = 20;
++
++void bar(void)
++{
++  B = &y;
++}
++
++void foo()
++{
++  long *adr = B;
++  long save = *adr;
++
++  *adr = 123;
++
++  bar();
++
++  *adr = save;
++}
++
++int main()
++{
++  B = &x;
++
++  foo();
++
++  if (x != 10 || y != 20)
++    abort();
++
++  /* We can't return, as our caller may assume %ebp is preserved!  */
++  /* We could save/restore it (like foo), but its easier to exit.  */
++  exit(0);
++}
++
+Index: gcc/testsuite/gcc.dg/short-compare-1.c
+===================================================================
+RCS file: gcc/testsuite/gcc.dg/short-compare-1.c
+diff -N gcc/testsuite/gcc.dg/short-compare-1.c
+--- gcc//dev/null	1 Jan 1970 00:00:00 -0000
++++ gcc/gcc/testsuite/gcc.dg/short-compare-1.c	18 Jan 2005 08:39:29 -0000	1.1.4.1
+@@ -0,0 +1,21 @@
++/* PR rtl-optimization/19296 */
++/* Origin: Falk Hueffner <falk@debian.org> */
++
++/* { dg-do run } */
++/* { dg-options "-O" } */
++/* { dg-options "-O -mcpu=i686" { target i?86-*-* } } */
++/* { dg-options "-O -m32 -mcpu=i686" { target x86_64-*-* } } */
++
++extern void abort(void);
++
++void f(unsigned short ad)
++{
++  if (ad >= 0x4000 && ad < 0xc000) 
++    abort();
++}
++
++int main(void)
++{
++  f(0xff00); 
++  return 0;
++}
+Index: gcc/testsuite/gcc.dg/short-compare-2.c
+===================================================================
+RCS file: gcc/testsuite/gcc.dg/short-compare-2.c
+diff -N gcc/testsuite/gcc.dg/short-compare-2.c
+--- gcc//dev/null	1 Jan 1970 00:00:00 -0000
++++ gcc/gcc/testsuite/gcc.dg/short-compare-2.c	18 Jan 2005 08:39:29 -0000	1.1.4.1
+@@ -0,0 +1,22 @@
++/* PR rtl-optimization/19296 */
++/* Origin: Falk Hueffner <falk@debian.org> */
++/* Testcase by Andrew Pinski <pinskia@gcc.gnu.org> */
++
++/* { dg-do run } */
++/* { dg-options "-O" } */
++/* { dg-options "-O -mcpu=i686" { target i?86-*-* } } */
++/* { dg-options "-O -m32 -mcpu=i686" { target x86_64-*-* } } */
++
++extern void abort();
++
++void f(unsigned short ad)
++{
++  if ((short) (ad - 0x4000) >= 0)
++    abort();
++}
++
++int main(void)
++{
++  f(0xc000);
++  return 0;
++}
+Index: libstdc++-v3/ChangeLog
+===================================================================
+RCS file: /cvs/gcc/gcc/libstdc++-v3/ChangeLog,v
+retrieving revision 1.1464.2.192
+retrieving revision 1.1464.2.195
+diff -u -r1.1464.2.192 -r1.1464.2.195
+--- gcc/libstdc++-v3/ChangeLog	30 Sep 2004 16:47:23 -0000	1.1464.2.192
++++ gcc/libstdc++-v3/ChangeLog	21 Jan 2005 23:52:45 -0000	1.1464.2.195
+@@ -1,3 +1,18 @@
++2005-01-22  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
++
++	PR libstdc++/19510
++	* include/bits/stl_list.h (_List_iterator_base): Initialize _M_node
++	in constructor.
++	(_List_iterator): Initialize _List_iterator_base in constructor.
++	* include/bits/stl_tree.h (_Rb_tree_iterator): Initialize _M_node
++	in constructor.
++
++2004-12-03  Richard Henderson  <rth@redhat.com>
++
++	PR 17856
++	* config/cpu/i486/atomicity.h (__exchange_and_add, __atomic_add):
++	Split in-out memory constraints.
++
+ 2004-09-30  Release Manager
+ 
+ 	* GCC 3.3.5 Released.
+Index: libstdc++-v3/config/cpu/i486/atomicity.h
+===================================================================
+RCS file: /cvs/gcc/gcc/libstdc++-v3/config/cpu/i486/atomicity.h,v
+retrieving revision 1.1.22.1
+retrieving revision 1.1.22.2
+diff -u -r1.1.22.1 -r1.1.22.2
+--- gcc/libstdc++-v3/config/cpu/i486/atomicity.h	2 Jun 2003 18:48:52 -0000	1.1.22.1
++++ gcc/libstdc++-v3/config/cpu/i486/atomicity.h	3 Dec 2004 23:44:07 -0000	1.1.22.2
+@@ -1,6 +1,6 @@
+ // Low-level functions for atomic operations: x86, x >= 4 version  -*- C++ -*-
+ 
+-// Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
++// Copyright (C) 1999, 2000, 2001, 2004 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+@@ -38,8 +38,8 @@
+ {
+   register _Atomic_word __result;
+   __asm__ __volatile__ ("lock; xadd{l} {%0,%1|%1,%0}"
+-			: "=r" (__result), "+m" (*__mem) 
+-                        : "0" (__val)
++			: "=r" (__result), "=m" (*__mem) 
++                        : "0" (__val), "m"(*__mem)
+                         : "memory");
+   return __result;
+ }
+@@ -49,7 +49,9 @@
+ __atomic_add (volatile _Atomic_word* __mem, int __val)
+ {
+   __asm__ __volatile__ ("lock; add{l} {%1,%0|%0,%1}"
+-			: "+m" (*__mem) : "ir" (__val) : "memory");
++			: "=m" (*__mem)
++			: "ir" (__val), "m"(*__mem)
++			: "memory");
+ }
+ 
+ #endif /* atomicity.h */
+Index: libstdc++-v3/include/bits/c++config
+===================================================================
+RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/c++config,v
+retrieving revision 1.574.2.657
+retrieving revision 1.574.2.779
+diff -u -r1.574.2.657 -r1.574.2.779
+--- gcc/libstdc++-v3/include/bits/c++config	30 Sep 2004 00:16:09 -0000	1.574.2.657
++++ gcc/libstdc++-v3/include/bits/c++config	30 Jan 2005 00:16:14 -0000	1.574.2.779
+@@ -35,7 +35,7 @@
+ #include <bits/os_defines.h>
+ 
+ // The current version of the C++ library in compressed ISO date format.
+-#define __GLIBCPP__ 20040930
++#define __GLIBCPP__ 20050130
+ 
+ // This is necessary until GCC supports separate template compilation.
+ #define _GLIBCPP_NO_TEMPLATE_EXPORT 1
+Index: libstdc++-v3/include/bits/stl_list.h
+===================================================================
+RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/stl_list.h,v
+retrieving revision 1.20
+retrieving revision 1.20.8.1
+diff -u -r1.20 -r1.20.8.1
+--- gcc/libstdc++-v3/include/bits/stl_list.h	10 Sep 2002 23:19:10 -0000	1.20
++++ gcc/libstdc++-v3/include/bits/stl_list.h	21 Jan 2005 23:52:48 -0000	1.20.8.1
+@@ -1,6 +1,6 @@
+ // List implementation -*- C++ -*-
+ 
+-// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
++// Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+@@ -108,6 +108,7 @@
+     { }
+   
+     _List_iterator_base()
++    : _M_node()
+     { }
+   
+     /// Walk the %list forward.
+@@ -156,6 +157,7 @@
+     { }
+   
+     _List_iterator()
++    : _List_iterator_base()
+     { }
+   
+     _List_iterator(const iterator& __x)
+Index: libstdc++-v3/include/bits/stl_tree.h
+===================================================================
+RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/stl_tree.h,v
+retrieving revision 1.17
+retrieving revision 1.17.2.1
+diff -u -r1.17 -r1.17.2.1
+--- gcc/libstdc++-v3/include/bits/stl_tree.h	22 Nov 2002 18:53:53 -0000	1.17
++++ gcc/libstdc++-v3/include/bits/stl_tree.h	21 Jan 2005 23:52:49 -0000	1.17.2.1
+@@ -1,6 +1,6 @@
+ // RB tree implementation -*- C++ -*-
+ 
+-// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
++// Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+@@ -191,7 +191,7 @@
+       typedef _Rb_tree_iterator<_Val, _Ref, _Ptr> _Self;
+       typedef _Rb_tree_node<_Val>* _Link_type;
+       
+-      _Rb_tree_iterator() {}
++      _Rb_tree_iterator() { _M_node = 0; }
+       _Rb_tree_iterator(_Link_type __x) { _M_node = __x; }
+       _Rb_tree_iterator(const iterator& __it) { _M_node = __it._M_node; }
+