File nov65883.diff of Package gcc33

Index: gcc-3.3.3/gcc/Makefile.in
===================================================================
--- gcc-3.3.3.orig/gcc/Makefile.in	2009-11-20 13:06:00.000000000 +0100
+++ gcc-3.3.3/gcc/Makefile.in	2009-11-20 13:06:36.000000000 +0100
@@ -449,6 +449,10 @@ LIB2FUNCS_EXTRA =
 # 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 @@ xlimits.h: glimits.h limitx.h limity.h
 
 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 @@ libgcc.mk: config.status Makefile mklibg
 	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_DEPS = $(GCC_PASSES) $(LANGUAGES)
 	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-3.3.3/gcc/mklibgcc.in
===================================================================
--- gcc-3.3.3.orig/gcc/mklibgcc.in	2003-12-24 23:42:28.000000000 +0100
+++ gcc-3.3.3/gcc/mklibgcc.in	2009-11-20 13:06:36.000000000 +0100
@@ -14,6 +14,7 @@
 # LIB2FUNCS_ST
 # LIB2ADD
 # LIB2ADD_ST 
+# LIB2ADD_SH
 # LIB2ADDEH
 # LIB2ADDEHDEP
 # FPBIT
@@ -267,7 +268,31 @@ for ml in $MULTILIBS; do
   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-3.3.3/gcc/reload.c
===================================================================
--- gcc-3.3.3.orig/gcc/reload.c	2009-11-20 13:04:56.000000000 +0100
+++ gcc-3.3.3/gcc/reload.c	2009-11-20 13:06:36.000000000 +0100
@@ -2202,12 +2202,15 @@ operands_match_p (x, y)
 	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-3.3.3/gcc/config/rs6000/aix.h
===================================================================
--- gcc-3.3.3.orig/gcc/config/rs6000/aix.h	2009-11-20 13:04:57.000000000 +0100
+++ gcc-3.3.3/gcc/config/rs6000/aix.h	2009-11-20 13:06:36.000000000 +0100
@@ -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-3.3.3/gcc/config/rs6000/beos.h
===================================================================
--- gcc-3.3.3.orig/gcc/config/rs6000/beos.h	2002-07-10 02:33:51.000000000 +0200
+++ gcc-3.3.3/gcc/config/rs6000/beos.h	2009-11-20 13:06:36.000000000 +0100
@@ -23,18 +23,6 @@ Boston, MA 02111-1307, USA.  */
 #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-3.3.3/gcc/config/rs6000/darwin-ldouble-shared.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ gcc-3.3.3/gcc/config/rs6000/darwin-ldouble-shared.c	2009-11-20 13:06:36.000000000 +0100
@@ -0,0 +1,2 @@
+#define IN_LIBGCC2_S 1
+#include "darwin-ldouble.c"
Index: gcc-3.3.3/gcc/config/rs6000/darwin-ldouble.c
===================================================================
--- gcc-3.3.3.orig/gcc/config/rs6000/darwin-ldouble.c	2009-11-20 13:04:57.000000000 +0100
+++ gcc-3.3.3/gcc/config/rs6000/darwin-ldouble.c	2009-11-20 13:06:36.000000000 +0100
@@ -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 @@ Software Foundation, 59 Temple Place - S
 
    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 @@ Software Foundation, 59 Temple Place - S
    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 @@ static const double FPKINF = 1.0/0.0;
 
 /* 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 @@ _xlqadd (double a, double b, double c, d
 }
 
 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 @@ _xlqmul (double a, double b, double c, d
 }
 
 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-3.3.3/gcc/config/rs6000/libgcc-ppc64.ver
===================================================================
--- gcc-3.3.3.orig/gcc/config/rs6000/libgcc-ppc64.ver	2009-11-20 13:04:57.000000000 +0100
+++ gcc-3.3.3/gcc/config/rs6000/libgcc-ppc64.ver	2009-11-20 13:06:36.000000000 +0100
@@ -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-3.3.3/gcc/config/rs6000/rs6000.c
===================================================================
--- gcc-3.3.3.orig/gcc/config/rs6000/rs6000.c	2009-11-20 13:04:57.000000000 +0100
+++ gcc-3.3.3/gcc/config/rs6000/rs6000.c	2009-11-20 13:06:36.000000000 +0100
@@ -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.
@@ -4636,7 +4636,7 @@ function_arg (cum, mode, type, named)
 	  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)
@@ -4733,7 +4733,7 @@ function_arg_partial_nregs (cum, mode, t
       && !(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)
@@ -10119,10 +10119,34 @@ rs6000_generate_compare (code)
       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-3.3.3/gcc/config/rs6000/rs6000.h
===================================================================
--- gcc-3.3.3.orig/gcc/config/rs6000/rs6000.h	2009-11-20 13:04:57.000000000 +0100
+++ gcc-3.3.3/gcc/config/rs6000/rs6000.h	2009-11-20 13:06:36.000000000 +0100
@@ -257,7 +257,7 @@ extern int target_flags;
 #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 @@ do {									\
 									\
       /* 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-3.3.3/gcc/config/rs6000/rs6000.md
===================================================================
--- gcc-3.3.3.orig/gcc/config/rs6000/rs6000.md	2009-11-20 13:06:29.000000000 +0100
+++ gcc-3.3.3/gcc/config/rs6000/rs6000.md	2009-11-20 13:06:36.000000000 +0100
@@ -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.
@@ -8213,14 +8213,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")
@@ -11210,11 +11232,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-3.3.3/gcc/config/rs6000/t-aix43
===================================================================
--- gcc-3.3.3.orig/gcc/config/rs6000/t-aix43	2003-01-26 12:35:08.000000000 +0100
+++ gcc-3.3.3/gcc/config/rs6000/t-aix43	2009-11-20 13:06:36.000000000 +0100
@@ -58,9 +58,12 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2
 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-3.3.3/gcc/config/rs6000/t-aix52
===================================================================
--- gcc-3.3.3.orig/gcc/config/rs6000/t-aix52	2003-01-26 12:35:08.000000000 +0100
+++ gcc-3.3.3/gcc/config/rs6000/t-aix52	2009-11-20 13:06:36.000000000 +0100
@@ -39,9 +39,12 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2
 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-3.3.3/gcc/config/rs6000/t-newas
===================================================================
--- gcc-3.3.3.orig/gcc/config/rs6000/t-newas	2001-05-17 05:16:11.000000000 +0200
+++ gcc-3.3.3/gcc/config/rs6000/t-newas	2009-11-20 13:06:36.000000000 +0100
@@ -42,6 +42,9 @@ MULTILIB_MATCHES	= msoft-float=mcpu?403
 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-3.3.3/gcc/doc/invoke.texi
===================================================================
--- gcc-3.3.3.orig/gcc/doc/invoke.texi	2009-11-20 13:04:57.000000000 +0100
+++ gcc-3.3.3/gcc/doc/invoke.texi	2009-11-20 13:06:36.000000000 +0100
@@ -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
@@ -406,7 +406,7 @@ in the following sections.
 -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
@@ -6937,13 +6937,17 @@ Specifying @option{-maix64} implies @opt
 @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