sparc.h (TARGET_BUGGY_QP_LIB): Define to zero.
authorDavid S. Miller <davem@redhat.com>
Thu, 9 May 2002 10:38:44 +0000 (03:38 -0700)
committerDavid S. Miller <davem@gcc.gnu.org>
Thu, 9 May 2002 10:38:44 +0000 (03:38 -0700)
2002-05-07  David S. Miller  <davem@redhat.com>

* config/sparc/sparc.h (TARGET_BUGGY_QP_LIB): Define to zero.
* config/sparc/sol2.h (TARGET_BUGGY_QP_LIB): Override to one.
* config/sparc/sparc.c (emit_soft_tfmode_libcall): If the Qp
library implementation clobbers the output before the inputs
are fully consumed, use stack temporary for the output.

From-SVN: r53322

gcc/ChangeLog
gcc/config/sparc/sol2.h
gcc/config/sparc/sparc.c
gcc/config/sparc/sparc.h

index e1f507c0efc2fc42051aa33a25688d9c15945c8a..9bf0db8d6f625c37369e445eae56693accc37e98 100644 (file)
@@ -1,3 +1,11 @@
+2002-05-07  David S. Miller  <davem@redhat.com>
+
+       * config/sparc/sparc.h (TARGET_BUGGY_QP_LIB): Define to zero.
+       * config/sparc/sol2.h (TARGET_BUGGY_QP_LIB): Override to one.
+       * config/sparc/sparc.c (emit_soft_tfmode_libcall): If the Qp
+       library implementation clobbers the output before the inputs
+       are fully consumed, use stack temporary for the output.
+
 2002-05-09  Jason Thorpe  <thorpej@wasabisystems.com>
 
        * config/netbsd.h (CPP_SPEC): Remove.
index 69ba9f5fc6011552623b3e4bf14bff02c818a5ea..f27b3ad73d23ba72d5c07f8fce1481a266579fbe 100644 (file)
@@ -225,6 +225,12 @@ Boston, MA 02111-1307, USA.  */
 #define MODDI3_LIBCALL "__rem64"
 #define UMODDI3_LIBCALL "__urem64"
 
+/* Solaris's _Qp_* library routine implementation clobbers the output
+   memory before the inputs are fully consumed.  */
+
+#undef TARGET_BUGGY_QP_LIB
+#define TARGET_BUGGY_QP_LIB    1
+
 #undef INIT_SUBTARGET_OPTABS
 #define INIT_SUBTARGET_OPTABS                                          \
   fixsfdi_libfunc                                                      \
index cd7c983954e8a9df4ec06d2c365861883730b194..6219be324e5f9f1c789d151b96fba218fa41d1cc 100644 (file)
@@ -2476,7 +2476,7 @@ emit_soft_tfmode_libcall (func_name, nargs, operands)
      rtx *operands;
 {
   rtx ret_slot = NULL, arg[3], func_sym;
-  int i, j;
+  int i;
 
   /* We only expect to be called for conversions, unary, and binary ops.  */
   if (nargs < 2 || nargs > 3)
@@ -2490,27 +2490,17 @@ emit_soft_tfmode_libcall (func_name, nargs, operands)
       /* TFmode arguments and return values are passed by reference.  */
       if (GET_MODE (this_arg) == TFmode)
        {
-         if (GET_CODE (this_arg) == MEM)
-           {
-             this_arg = XEXP (this_arg, 0);
+         int force_stack_temp;
 
-             /* Make sure the output is not in the same place
-                as one of our inputs.  */
-             if (i == 0)
-               {
-                 for (j = 1; j < nargs; j++)
-                   if (rtx_equal_p (operands[0], operands[j]))
-                     break;
+         force_stack_temp = 0;
+         if (TARGET_BUGGY_QP_LIB && i == 0)
+           force_stack_temp = 1;
 
-                 if (j != nargs)
-                   {
-                     ret_slot = assign_stack_temp (TFmode,
-                                                   GET_MODE_SIZE (TFmode), 0);
-                     this_arg = XEXP (ret_slot, 0);
-                   }
-               }
-           }
-         else if (CONSTANT_P (this_arg))
+         if (GET_CODE (this_arg) == MEM
+             && ! force_stack_temp)
+           this_arg = XEXP (this_arg, 0);
+         else if (CONSTANT_P (this_arg)
+                  && ! force_stack_temp)
            {
              this_slot = force_const_mem (TFmode, this_arg);
              this_arg = XEXP (this_slot, 0);
index 073debda1e7fc03947b311ceb1a9a6959a82d855..1b3b2ead507a12a672bebb51724a2e52c4657eb4 100644 (file)
@@ -2598,6 +2598,11 @@ do {                                                                    \
 #define LTTF2_LIBCALL "_Q_flt"
 #define LETF2_LIBCALL "_Q_fle"
 
+/* Assume by default that the _Qp_* 64-bit libcalls are implemented such
+   that the inputs are fully consumed before the output memory is clobbered.  */
+
+#define TARGET_BUGGY_QP_LIB    0
+
 /* We can define the TFmode sqrt optab only if TARGET_FPU.  This is because
    with soft-float, the SFmode and DFmode sqrt instructions will be absent,
    and the compiler will notice and try to use the TFmode sqrt instruction