File nov65883.diff of Package gcc33

Index: gcc/gcc/Makefile.in
===================================================================
RCS file: /home/jgrimm/gcc-cvs/gcc/gcc/Makefile.in,v
retrieving revision 1.955.2.35
diff -u -3 -r1.955.2.35 Makefile.in
--- gcc/gcc/Makefile.in	14 Jun 2004 18:18:49 -0000	1.955.2.35
+++ gcc/gcc/Makefile.in	25 Feb 2005 21:50:42 -0000
@@ -449,6 +449,10 @@
 # Assembler files should have names ending in `.asm'.
 LIB2FUNCS_STATIC_EXTRA =
 
+# List of extra C and assembler files to add to shared libgcc2.
+# Assembler files should have names ending in `.asm'.
+LIB2FUNCS_SHARED_EXTRA =
+
 # Program to convert libraries.
 LIBCONVERT =
 
@@ -1027,8 +1031,10 @@
 
 LIB2ADD = $(LIB2FUNCS_EXTRA)
 LIB2ADD_ST = $(LIB2FUNCS_STATIC_EXTRA)
+LIB2ADD_SH = $(LIB2FUNCS_SHARED_EXTRA)
 
-libgcc.mk: config.status Makefile mklibgcc $(LIB2ADD) $(LIB2ADD_ST) xgcc$(exeext) specs
+libgcc.mk: config.status Makefile mklibgcc $(LIB2ADD) $(LIB2ADD_ST) \
+ $(LIB2ADD_SH) xgcc$(exeext) specs
 	objext='$(objext)' \
 	LIB1ASMFUNCS='$(LIB1ASMFUNCS)' \
 	LIB2FUNCS_1='$(LIB2FUNCS_1)' \
@@ -1036,6 +1042,7 @@
 	LIB2FUNCS_ST='$(LIB2FUNCS_ST)' \
 	LIB2ADD='$(LIB2ADD)' \
 	LIB2ADD_ST='$(LIB2ADD_ST)' \
+	LIB2ADD_SH='$(LIB2ADD_SH)' \
 	LIB2ADDEH='$(LIB2ADDEH)' \
 	LIB2ADDEHDEP='$(LIB2ADDEHDEP)' \
 	FPBIT='$(FPBIT)' \
@@ -1065,8 +1072,8 @@
 	libgcc.mk $(srcdir)/libgcc2.c $(TCONFIG_H) \
 	$(MACHMODE_H) longlong.h gbl-ctors.h config.status stmp-int-hdrs \
 	tsystem.h $(FPBIT) $(DPBIT) $(TPBIT) $(LIB2ADD) \
-	$(LIB2ADD_ST) $(LIB2ADDEH) $(LIB2ADDEHDEP) $(EXTRA_PARTS) \
-	$(srcdir)/config/$(LIB1ASMSRC)
+	$(LIB2ADD_ST) $(LIB2ADD_SH) $(LIB2ADDEH) $(LIB2ADDEHDEP) \
+	$(EXTRA_PARTS) $(srcdir)/config/$(LIB1ASMSRC)
 
 libgcc.a: $(LIBGCC_DEPS)
 	$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
Index: gcc/gcc/mklibgcc.in
===================================================================
RCS file: /home/jgrimm/gcc-cvs/gcc/gcc/mklibgcc.in,v
retrieving revision 1.48.2.6
diff -u -3 -r1.48.2.6 mklibgcc.in
--- gcc/gcc/mklibgcc.in	27 Jan 2004 23:21:58 -0000	1.48.2.6
+++ gcc/gcc/mklibgcc.in	25 Feb 2005 21:35:35 -0000
@@ -14,6 +14,7 @@
 # LIB2FUNCS_ST
 # LIB2ADD
 # LIB2ADD_ST 
+# LIB2ADD_SH
 # LIB2ADDEH
 # LIB2ADDEHDEP
 # FPBIT
@@ -267,7 +268,31 @@
   for o in $libgcc2_eh_objs; do
     libgcc_eh_objs="$libgcc_eh_objs libgcc/${dir}/$o"
   done
+
+  if [ "$SHLIB_LINK" ]; then
+    for file in $LIB2ADD_SH; do
+      name=`echo $file | sed -e 's/[.][cSo]$//' -e 's/[.]asm$//' -e 's/[.]txt$//'`
+      oname=`echo $name | sed -e 's,.*/,,'`
+
+      for ml in $MULTILIBS; do
+        dir=`echo ${ml} | sed -e 's/;.*$//' -e 's/=/$(EQ)/g'`
+        flags=`echo ${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`;
+        out="libgcc/${dir}/${oname}${objext}"
+        if [ ${name}.asm = ${file} ]; then
+            flags="$flags -xassembler-with-cpp"
+        fi
+
+        echo $out: stmp-dirs $file
+        echo "  $gcc_compile" $flags -c $file -o $out
+      done
+      libgcc2_sh_objs="$libgcc2_sh_objs ${oname}${objext}"
+    done
+  fi
+
   libgcc_sh_objs="$libgcc_objs $libgcc_eh_objs"
+  for o in $libgcc2_sh_objs; do
+    libgcc_sh_objs="$libgcc_sh_objs libgcc/${dir}/$o"
+  done
   shlib_deps="$libgcc_sh_objs"
 
   libgcc_st_objs=""
Index: gcc/gcc/reload.c
===================================================================
RCS file: /home/jgrimm/gcc-cvs/gcc/gcc/reload.c,v
retrieving revision 1.197.2.15
diff -u -3 -r1.197.2.15 reload.c
--- gcc/gcc/reload.c	14 Jun 2004 18:19:20 -0000	1.197.2.15
+++ gcc/gcc/reload.c	25 Feb 2005 22:57:15 -0000
@@ -2202,12 +2202,15 @@
 	j = REGNO (y);
 
       /* On a WORDS_BIG_ENDIAN machine, point to the last register of a
-	 multiple hard register group, so that for example (reg:DI 0) and
-	 (reg:SI 1) will be considered the same register.  */
+	 multiple hard register group of scalar integer registers, so that
+	 for example (reg:DI 0) and (reg:SI 1) will be considered the same
+	 register. */
       if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD
+	  && SCALAR_INT_MODE_P (GET_MODE (x))
 	  && i < FIRST_PSEUDO_REGISTER)
 	i += (GET_MODE_SIZE (GET_MODE (x)) / UNITS_PER_WORD) - 1;
       if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (y)) > UNITS_PER_WORD
+	  && SCALAR_INT_MODE_P (GET_MODE (y))
 	  && j < FIRST_PSEUDO_REGISTER)
 	j += (GET_MODE_SIZE (GET_MODE (y)) / UNITS_PER_WORD) - 1;
 
Index: gcc/gcc/config/rs6000/aix.h
===================================================================
RCS file: /home/jgrimm/gcc-cvs/gcc/gcc/config/rs6000/aix.h,v
retrieving revision 1.33.12.3
diff -u -3 -r1.33.12.3 aix.h
--- gcc/gcc/config/rs6000/aix.h	6 Feb 2004 07:17:38 -0000	1.33.12.3
+++ gcc/gcc/config/rs6000/aix.h	25 Feb 2005 17:44:06 -0000
@@ -1,6 +1,6 @@
 /* Definitions of target machine for GNU compiler,
    for IBM RS/6000 POWER running AIX.
-   Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
    This file is part of GCC.
 
@@ -175,15 +175,15 @@
 #define JUMP_TABLES_IN_TEXT_SECTION 1
 
 /* Enable AIX XL compiler calling convention breakage compatibility.  */
-#undef TARGET_XL_CALL
-#define MASK_XL_CALL		0x40000000
-#define	TARGET_XL_CALL		(target_flags & MASK_XL_CALL)
+#undef TARGET_XL_COMPAT
+#define MASK_XL_COMPAT		0x40000000
+#define	TARGET_XL_COMPAT	(target_flags & MASK_XL_COMPAT)
 #undef  SUBTARGET_SWITCHES
 #define SUBTARGET_SWITCHES		\
-  {"xl-call", 		MASK_XL_CALL,					\
-   N_("Always pass floating-point arguments in memory") },		\
-  {"no-xl-call",	- MASK_XL_CALL,					\
-   N_("Don't always pass floating-point arguments in memory") },	\
+  {"xl-compat",		MASK_XL_COMPAT,					\
+   N_("Conform more closely to IBM XLC semantics") },			\
+  {"no-xl-compat",	- MASK_XL_COMPAT,				\
+   N_("Default GCC semantics that differ from IBM XLC") },		\
   SUBSUBTARGET_SWITCHES
 #define SUBSUBTARGET_SWITCHES 
 
Index: gcc/gcc/config/rs6000/beos.h
===================================================================
RCS file: /home/jgrimm/gcc-cvs/gcc/gcc/config/rs6000/beos.h,v
retrieving revision 1.11
diff -u -3 -r1.11 beos.h
--- gcc/gcc/config/rs6000/beos.h	10 Jul 2002 00:33:51 -0000	1.11
+++ gcc/gcc/config/rs6000/beos.h	25 Feb 2005 17:44:06 -0000
@@ -23,18 +23,6 @@
 #undef  TARGET_VERSION
 #define TARGET_VERSION fprintf (stderr, " (BeOS/PowerPC)");
 
-/* Enable AIX XL compiler calling convention breakage compatibility.  */
-#define MASK_XL_CALL		0x40000000
-#define	TARGET_XL_CALL		(target_flags & MASK_XL_CALL)
-#undef  SUBTARGET_SWITCHES
-#define SUBTARGET_SWITCHES		\
-  {"xl-call", 		MASK_XL_CALL,					\
-   N_("Always pass floating-point arguments in memory") },		\
-  {"no-xl-call",	- MASK_XL_CALL,					\
-   N_("Don't always pass floating-point arguments in memory") },	\
-  {"threads",		0},						\
-  {"pe",		0},
-
 #undef ASM_SPEC
 #define ASM_SPEC "-u %(asm_cpu)"
 
Index: gcc/gcc/config/rs6000/darwin-ldouble-shared.c
===================================================================
RCS file: gcc/gcc/config/rs6000/darwin-ldouble-shared.c
diff -N gcc/gcc/config/rs6000/darwin-ldouble-shared.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gcc/gcc/config/rs6000/darwin-ldouble-shared.c	26 Feb 2005 01:20:40 -0000
@@ -0,0 +1,2 @@
+#define IN_LIBGCC2_S 1
+#include "darwin-ldouble.c"
Index: gcc/gcc/config/rs6000/darwin-ldouble.c
===================================================================
RCS file: /home/jgrimm/gcc-cvs/gcc/gcc/config/rs6000/darwin-ldouble.c,v
retrieving revision 1.5.2.1
diff -u -3 -r1.5.2.1 darwin-ldouble.c
--- gcc/gcc/config/rs6000/darwin-ldouble.c	6 Feb 2004 07:17:38 -0000	1.5.2.1
+++ gcc/gcc/config/rs6000/darwin-ldouble.c	25 Feb 2005 21:08:58 -0000
@@ -1,5 +1,5 @@
 /* 128-bit long double support routines for Darwin.
-   Copyright (C) 1993, 2003, 2004 Free Software Foundation, Inc.
+   Copyright (C) 1993, 2003, 2004, 2005 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -48,7 +48,7 @@
 
    This code currently assumes big-endian.  */
 
-#if !_SOFT_FLOAT && (defined (__MACH__) || defined (__powerpc64__))
+#if !_SOFT_FLOAT && (defined (__MACH__) || defined (__powerpc64__) || defined (_AIX))
 
 #define fabs(x) __builtin_fabs(x)
 
@@ -58,10 +58,27 @@
    but GCC currently generates poor code when a union is used to turn
    a long double into a pair of doubles.  */
 
-extern long double _xlqadd (double, double, double, double);
-extern long double _xlqsub (double, double, double, double);
-extern long double _xlqmul (double, double, double, double);
-extern long double _xlqdiv (double, double, double, double);
+extern long double __gcc_qadd (double, double, double, double);
+extern long double __gcc_qsub (double, double, double, double);
+extern long double __gcc_qmul (double, double, double, double);
+extern long double __gcc_qdiv (double, double, double, double);
+
+#if defined __ELF__ && defined IN_LIBGCC2_S
+/* Provide definitions of the old symbol names to statisfy apps and
+   shared libs built against an older libgcc.  To access the _xlq
+   symbols an explicit version reference is needed, so these won't
+   satisfy an unadorned reference like _xlqadd.  If dot symbols are
+   not needed, the assembler will remove the aliases from the symbol
+   table.  */
+__asm__ (".symver __gcc_qadd,_xlqadd@GCC_3.4\n\t"
+         ".symver __gcc_qsub,_xlqsub@GCC_3.4\n\t"
+         ".symver __gcc_qmul,_xlqmul@GCC_3.4\n\t"
+         ".symver __gcc_qdiv,_xlqdiv@GCC_3.4\n\t"
+         ".symver .__gcc_qadd,._xlqadd@GCC_3.4\n\t"
+         ".symver .__gcc_qsub,._xlqsub@GCC_3.4\n\t"
+         ".symver .__gcc_qmul,._xlqmul@GCC_3.4\n\t"
+         ".symver .__gcc_qdiv,._xlqdiv@GCC_3.4");
+#endif
 
 typedef union
 {
@@ -73,7 +90,7 @@
 
 /* Add two 'long double' values and return the result.	*/
 long double
-_xlqadd (double a, double b, double c, double d)
+__gcc_qadd (double a, double b, double c, double d)
 {
   longDblUnion z;
   double t, tau, u, FPR_zero, FPR_PosInf;
@@ -132,13 +149,13 @@
 }
 
 long double
-_xlqsub (double a, double b, double c, double d)
+__gcc_qsub (double a, double b, double c, double d)
 {
-  return _xlqadd (a, b, -c, -d);
+  return __gcc_qadd (a, b, -c, -d);
 }
 
 long double
-_xlqmul (double a, double b, double c, double d)
+__gcc_qmul (double a, double b, double c, double d)
 {
   longDblUnion z;
   double t, tau, u, v, w, FPR_zero, FPR_PosInf;
@@ -169,7 +186,7 @@
 }
 
 long double
-_xlqdiv (double a, double b, double c, double d)
+__gcc_qdiv (double a, double b, double c, double d)
 {
   longDblUnion z;
   double s, sigma, t, tau, u, v, w, FPR_zero, FPR_PosInf;
Index: gcc/gcc/config/rs6000/libgcc-ppc64.ver
===================================================================
RCS file: /home/jgrimm/gcc-cvs/gcc/gcc/config/rs6000/libgcc-ppc64.ver,v
retrieving revision 1.1.2.1
diff -u -3 -r1.1.2.1 libgcc-ppc64.ver
--- gcc/gcc/config/rs6000/libgcc-ppc64.ver	6 Feb 2004 07:17:38 -0000	1.1.2.1
+++ gcc/gcc/config/rs6000/libgcc-ppc64.ver	25 Feb 2005 17:44:06 -0000
@@ -1,7 +1,7 @@
-GCC_3.4 {
+GCC_3.4.4 {
   # long double support
-  _xlqadd
-  _xlqsub
-  _xlqmul
-  _xlqdiv
+  __gcc_qadd
+  __gcc_qsub
+  __gcc_qmul
+  __gcc_qdiv
 }
Index: gcc/gcc/config/rs6000/rs6000.c
===================================================================
RCS file: /home/jgrimm/gcc-cvs/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.397.2.47
diff -u -3 -r1.397.2.47 rs6000.c
--- gcc/gcc/config/rs6000/rs6000.c	17 Jan 2005 19:24:26 -0000	1.397.2.47
+++ gcc/gcc/config/rs6000/rs6000.c	25 Feb 2005 19:54:32 -0000
@@ -1,6 +1,6 @@
 /* Subroutines used for code generation on IBM RS/6000.
    Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 
-   2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
    Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
 
    This file is part of GCC.
@@ -4638,7 +4638,7 @@
 	  needs_psave = (type
 			 && (cum->nargs_prototype <= 0
 			     || (DEFAULT_ABI == ABI_AIX
-				 && TARGET_XL_CALL
+				 && TARGET_XL_COMPAT
 				 && align_words >= GP_ARG_NUM_REG)));
 
 	  if (!needs_psave && mode == fmode)
@@ -4735,7 +4735,7 @@
       && !(type
 	   && (cum->nargs_prototype <= 0
 	       || (DEFAULT_ABI == ABI_AIX
-		   && TARGET_XL_CALL
+		   && TARGET_XL_COMPAT
 		   && align_words >= GP_ARG_NUM_REG))))
     {
       if (cum->fregno + ((GET_MODE_SIZE (mode) + 7) >> 3) > FP_ARG_MAX_REG + 1)
@@ -10121,10 +10121,34 @@
       emit_insn (cmp);
     }
   else
-    emit_insn (gen_rtx_SET (VOIDmode, compare_result,
-			    gen_rtx_COMPARE (comp_mode,
-					     rs6000_compare_op0,
-					     rs6000_compare_op1)));
+    {
+      /* Generate XLC-compatible TFmode compare as PARALLEL with extra
+	 CLOBBERs to match cmptf_internal2 pattern.  */
+      if (comp_mode == CCFPmode && TARGET_XL_COMPAT
+	  && GET_MODE (rs6000_compare_op0) == TFmode
+	  && (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
+	  && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128)
+	emit_insn (gen_rtx_PARALLEL (VOIDmode,
+	  gen_rtvec (9,
+		     gen_rtx_SET (VOIDmode,
+				  compare_result,
+				  gen_rtx_COMPARE (comp_mode,
+						   rs6000_compare_op0,
+						   rs6000_compare_op1)),
+		     gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
+		     gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
+		     gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
+		     gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
+		     gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
+		     gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
+		     gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)),
+		     gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (DFmode)))));
+      else
+	emit_insn (gen_rtx_SET (VOIDmode, compare_result,     
+				gen_rtx_COMPARE (comp_mode,
+						 rs6000_compare_op0,
+						 rs6000_compare_op1)));
+    }
 
   /* Some kinds of FP comparisons need an OR operation;
      under flag_finite_math_only we don't bother.  */
Index: gcc/gcc/config/rs6000/rs6000.h
===================================================================
RCS file: /home/jgrimm/gcc-cvs/gcc/gcc/config/rs6000/rs6000.h,v
retrieving revision 1.234.2.29
diff -u -3 -r1.234.2.29 rs6000.h
--- gcc/gcc/config/rs6000/rs6000.h	25 May 2004 06:08:57 -0000	1.234.2.29
+++ gcc/gcc/config/rs6000/rs6000.h	25 Feb 2005 19:05:15 -0000
@@ -257,7 +257,7 @@
 #define TARGET_POWERPC64	(target_flags & MASK_POWERPC64)
 #endif
 
-#define TARGET_XL_CALL 0
+#define TARGET_XL_COMPAT 0
 
 /* Run-time compilation parameters selecting different hardware subsets.
 
@@ -3393,13 +3393,13 @@
 									\
       /* AIX/Darwin/64-bit SVR4 quad floating point routines.  */	\
       add_optab->handlers[(int) TFmode].libfunc				\
-	= init_one_libfunc ("_xlqadd");					\
+	= init_one_libfunc ("__gcc_qadd");				\
       sub_optab->handlers[(int) TFmode].libfunc				\
-	= init_one_libfunc ("_xlqsub");					\
+	= init_one_libfunc ("__gcc_qsub");				\
       smul_optab->handlers[(int) TFmode].libfunc			\
-	= init_one_libfunc ("_xlqmul");					\
+	= init_one_libfunc ("__gcc_qmul");				\
       sdiv_optab->handlers[(int) TFmode].libfunc			\
-	= init_one_libfunc ("_xlqdiv");					\
+	= init_one_libfunc ("__gcc_qdiv");				\
     }									\
   else									\
     {									\
Index: gcc/gcc/config/rs6000/rs6000.md
===================================================================
RCS file: /home/jgrimm/gcc-cvs/gcc/gcc/config/rs6000/rs6000.md,v
retrieving revision 1.221.4.20
diff -u -3 -r1.221.4.20 rs6000.md
--- gcc/gcc/config/rs6000/rs6000.md	17 Jan 2005 19:24:30 -0000	1.221.4.20
+++ gcc/gcc/config/rs6000/rs6000.md	25 Feb 2005 22:59:05 -0000
@@ -1,6 +1,6 @@
 ;; Machine description for IBM RISC System 6000 (POWER) for GNU C compiler
 ;; Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-;; 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+;; 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 ;; Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
 
 ;; This file is part of GCC.
@@ -8159,14 +8159,36 @@
   DONE;
 })
 
-(define_insn "trunctfdf2"
+(define_expand "trunctfdf2"
+  [(set (match_operand:DF 0 "gpc_reg_operand" "")
+     (float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "")))]
+  "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
+   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
+  "")
+
+(define_insn_and_split "trunctfdf2_internal1"
+  [(set (match_operand:DF 0 "gpc_reg_operand" "=f,?f")
+	(float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "0,f")))]
+  "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) && !TARGET_XL_COMPAT
+   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
+  "@
+   #
+   fmr %0,%1"
+  "&& reload_completed && REGNO (operands[0]) == REGNO (operands[1])"
+  [(const_int 0)]
+{
+  emit_note (0, NOTE_INSN_DELETED);
+  DONE;
+}
+  [(set_attr "type" "fp")])
+
+(define_insn "trunctfdf2_internal2"
   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
 	(float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "f")))]
-  "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
+  "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) && TARGET_XL_COMPAT
    && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
   "fadd %0,%1,%L1"
-  [(set_attr "type" "fp")
-   (set_attr "length" "4")])
+  [(set_attr "type" "fp")])
 
 (define_insn_and_split "trunctfsf2"
   [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
@@ -11156,11 +11178,73 @@
   [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
 	(compare:CCFP (match_operand:TF 1 "gpc_reg_operand" "f")
 		      (match_operand:TF 2 "gpc_reg_operand" "f")))]
-  "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
+  "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) && !TARGET_XL_COMPAT
    && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
   "fcmpu %0,%1,%2\;bne %0,$+8\;fcmpu %0,%L1,%L2"
   [(set_attr "type" "fpcompare")
    (set_attr "length" "12")])
+
+
+(define_insn_and_split "*cmptf_internal2"
+  [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
+	(compare:CCFP (match_operand:TF 1 "gpc_reg_operand" "f")
+        	      (match_operand:TF 2 "gpc_reg_operand" "f")))
+     (clobber (match_scratch:DF 3 "=f"))
+     (clobber (match_scratch:DF 4 "=f"))
+     (clobber (match_scratch:DF 5 "=f"))
+     (clobber (match_scratch:DF 6 "=f"))
+     (clobber (match_scratch:DF 7 "=f"))
+     (clobber (match_scratch:DF 8 "=f"))
+     (clobber (match_scratch:DF 9 "=f"))
+     (clobber (match_scratch:DF 10 "=f"))]
+  "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) && TARGET_XL_COMPAT
+   && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
+  "#"
+  "&& reload_completed"
+  [(set (match_dup 3) (match_dup 13))
+   (set (match_dup 4) (match_dup 14))
+   (set (match_dup 9) (abs:DF (match_dup 5)))
+   (set (match_dup 0) (compare:CCFP (match_dup 9) (match_dup 3)))
+   (set (pc) (if_then_else (ne (match_dup 0) (const_int 0))
+  	                       (label_ref (match_dup 11))
+        	               (pc)))
+   (set (match_dup 0) (compare:CCFP (match_dup 5) (match_dup 7)))
+   (set (pc) (label_ref (match_dup 12)))
+   (match_dup 11)
+   (set (match_dup 10) (minus:DF (match_dup 5) (match_dup 7)))
+   (set (match_dup 9) (minus:DF (match_dup 6) (match_dup 8)))
+   (set (match_dup 9) (plus:DF (match_dup 10) (match_dup 9)))
+   (set (match_dup 0) (compare:CCFP (match_dup 7) (match_dup 4)))
+   (match_dup 12)]
+{
+   REAL_VALUE_TYPE rv;
+   const int lo_word = FLOAT_WORDS_BIG_ENDIAN ? GET_MODE_SIZE (DFmode) : 0;
+   const int hi_word = FLOAT_WORDS_BIG_ENDIAN ? 0 : GET_MODE_SIZE (DFmode);
+
+   operands[5] = simplify_gen_subreg (DFmode, operands[1], TFmode, hi_word);
+   operands[6] = simplify_gen_subreg (DFmode, operands[1], TFmode, lo_word);
+   operands[7] = simplify_gen_subreg (DFmode, operands[2], TFmode, hi_word);
+   operands[8] = simplify_gen_subreg (DFmode, operands[2], TFmode, lo_word);
+   operands[11] = gen_label_rtx ();
+   operands[12] = gen_label_rtx ();
+   real_inf (&rv);
+   operands[13] = force_const_mem (DFmode,
+                                 CONST_DOUBLE_FROM_REAL_VALUE (rv, DFmode));
+   operands[14] = force_const_mem (DFmode,
+                                 CONST_DOUBLE_FROM_REAL_VALUE (dconst0,
+                                                               DFmode));
+   if (TARGET_TOC)
+     {	
+       operands[13] = gen_rtx_MEM (DFmode,
+                             create_TOC_reference (XEXP (operands[13], 0)));
+       operands[14] = gen_rtx_MEM (DFmode,
+	                     create_TOC_reference (XEXP (operands[14], 0)));
+       set_mem_alias_set (operands[13], get_TOC_alias_set ());
+       set_mem_alias_set (operands[14], get_TOC_alias_set ());
+       RTX_UNCHANGING_P (operands[13]) = 1;
+       RTX_UNCHANGING_P (operands[14]) = 1;
+     }
+})
 
 ;; Now we have the scc insns.  We can do some combinations because of the
 ;; way the machine works.
Index: gcc/gcc/config/rs6000/t-aix43
===================================================================
RCS file: /home/jgrimm/gcc-cvs/gcc/gcc/config/rs6000/t-aix43,v
retrieving revision 1.18.12.1
diff -u -3 -r1.18.12.1 t-aix43
--- gcc/gcc/config/rs6000/t-aix43	31 Jan 2003 21:50:11 -0000	1.18.12.1
+++ gcc/gcc/config/rs6000/t-aix43	25 Feb 2005 17:44:06 -0000
@@ -58,9 +58,12 @@
 SHLIB_INSTALL = $(INSTALL_DATA) @shlib_base_name@.a $$(DESTDIR)$$(slibdir)/
 SHLIB_LIBS = -lc `case @shlib_base_name@ in *pthread*) echo -lpthread ;; esac`
 SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
+SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver
 SHLIB_NM_FLAGS = -Bpg -X32_64
 
+# GCC 128-bit long double support routines.
+LIB2FUNCS_EXTRA = $(srcdir)/config/rs6000/darwin-ldouble.c
+
 # Either 32-bit and 64-bit objects in archives.
 AR_FLAGS_FOR_TARGET = -X32_64
 
Index: gcc/gcc/config/rs6000/t-aix52
===================================================================
RCS file: /home/jgrimm/gcc-cvs/gcc/gcc/config/rs6000/t-aix52,v
retrieving revision 1.1.10.1
diff -u -3 -r1.1.10.1 t-aix52
--- gcc/gcc/config/rs6000/t-aix52	31 Jan 2003 21:50:11 -0000	1.1.10.1
+++ gcc/gcc/config/rs6000/t-aix52	25 Feb 2005 17:44:06 -0000
@@ -39,9 +39,12 @@
 SHLIB_INSTALL = $(INSTALL_DATA) @shlib_base_name@.a $$(DESTDIR)$$(slibdir)/
 SHLIB_LIBS = -lc `case @shlib_base_name@ in *pthread*) echo -lpthread ;; esac`
 SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
+SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver
 SHLIB_NM_FLAGS = -Bpg -X32_64
 
+# GCC 128-bit long double support routines.
+LIB2FUNCS_EXTRA = $(srcdir)/config/rs6000/darwin-ldouble.c
+
 # Either 32-bit and 64-bit objects in archives.
 AR_FLAGS_FOR_TARGET = -X32_64
 
Index: gcc/gcc/config/rs6000/t-newas
===================================================================
RCS file: /home/jgrimm/gcc-cvs/gcc/gcc/config/rs6000/t-newas,v
retrieving revision 1.5
diff -u -3 -r1.5 t-newas
--- gcc/gcc/config/rs6000/t-newas	17 May 2001 03:16:11 -0000	1.5
+++ gcc/gcc/config/rs6000/t-newas	25 Feb 2005 19:36:15 -0000
@@ -42,6 +42,9 @@
 LIBGCC = stmp-multilib
 INSTALL_LIBGCC = install-multilib
 
+# GCC 128-bit long double support routines.
+LIB2FUNCS_EXTRA = $(srcdir)/config/rs6000/darwin-ldouble.c
+
 # Aix 3.2.x needs milli.exp for -mcpu=common
 EXTRA_PARTS = milli.exp
 milli.exp: $(srcdir)/config/rs6000/milli.exp
Index: gcc/gcc/doc/invoke.texi
===================================================================
RCS file: /home/jgrimm/gcc-cvs/gcc/gcc/doc/invoke.texi,v
retrieving revision 1.198.2.44
diff -u -3 -r1.198.2.44 invoke.texi
--- gcc/gcc/doc/invoke.texi	17 Jan 2005 19:24:56 -0000	1.198.2.44
+++ gcc/gcc/doc/invoke.texi	25 Feb 2005 17:49:28 -0000
@@ -1,12 +1,12 @@
 @c Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-@c 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+@c 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 @c This is part of the GCC manual.
 @c For copying conditions, see the file gcc.texi.
 
 @ignore
 @c man begin COPYRIGHT
 Copyright @copyright{} 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
-1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.2 or
@@ -407,7 +407,7 @@
 -mpowerpc-gfxopt  -mno-powerpc-gfxopt @gol
 -mnew-mnemonics  -mold-mnemonics @gol
 -mfull-toc   -mminimal-toc  -mno-fp-in-toc  -mno-sum-in-toc @gol
--m64  -m32  -mxl-call  -mno-xl-call  -mpe @gol
+-m64  -m32  -mxl-compat  -mno-xl-compat  -mpe @gol
 -msoft-float  -mhard-float  -mmultiple  -mno-multiple @gol
 -mstring  -mno-string  -mupdate  -mno-update @gol
 -mfused-madd  -mno-fused-madd  -mbit-align  -mno-bit-align @gol
@@ -6956,13 +6956,17 @@
 @option{-mpowerpc}, while @option{-maix32} disables the 64-bit ABI and
 implies @option{-mno-powerpc64}.  GCC defaults to @option{-maix32}.
 
-@item -mxl-call
-@itemx -mno-xl-call
-@opindex mxl-call
-@opindex mno-xl-call
-On AIX, pass floating-point arguments to prototyped functions beyond the
-register save area (RSA) on the stack in addition to argument FPRs.  The
-AIX calling convention was extended but not initially documented to
+@item -mxl-compat
+@itemx -mno-xl-compat
+@opindex mxl-compat
+@opindex mno-xl-compat
+Produce code that conforms more closely to IBM XLC semantics when using
+AIX-compatible ABI.  Pass floating-point arguments to prototyped
+functions beyond the register save area (RSA) on the stack in addition
+to argument FPRs.  Do not assume that most significant double in 128
+bit long double value is properly rounded when comparing values.
+
+The AIX calling convention was extended but not initially documented to
 handle an obscure K&R C case of calling a function that takes the
 address of its arguments with fewer arguments than declared.  AIX XL
 compilers access floating point arguments which do not fit in the
openSUSE Build Service is sponsored by