LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File nov65883.diff of Package gcc33 (Project openSUSE:Factory)

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