sparc.c (emit_soft_tfmode_libcall): Do not allow result to overlap input operands...
authorDavid S. Miller <davem@redhat.com>
Mon, 6 May 2002 07:09:21 +0000 (00:09 -0700)
committerDavid S. Miller <davem@gcc.gnu.org>
Mon, 6 May 2002 07:09:21 +0000 (00:09 -0700)
2002-05-06  David S. Miller  <davem@redhat.com>

* config/sparc/sparc.c (emit_soft_tfmode_libcall): Do not
allow result to overlap input operands in memory.

From-SVN: r53204

gcc/ChangeLog
gcc/config/sparc/sparc.c

index 91effc86db48b1f350e3b2e1dbbd68cecd3ee1f7..543d1c61fa2524e72facca601b1be06cf2104189 100644 (file)
@@ -1,3 +1,8 @@
+2002-05-06  David S. Miller  <davem@redhat.com>
+
+       * config/sparc/sparc.c (emit_soft_tfmode_libcall): Do not
+       allow result to overlap input operands in memory.
+
 2002-05-06  Neil Booth  <neil@daikokuya.demon.co.uk>
 
 doc:
index b28bcf53e8c917a332c10dbaa65722f4f7067bbc..cd7c983954e8a9df4ec06d2c365861883730b194 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;
+  int i, j;
 
   /* We only expect to be called for conversions, unary, and binary ops.  */
   if (nargs < 2 || nargs > 3)
@@ -2491,7 +2491,25 @@ emit_soft_tfmode_libcall (func_name, nargs, operands)
       if (GET_MODE (this_arg) == TFmode)
        {
          if (GET_CODE (this_arg) == MEM)
-           this_arg = XEXP (this_arg, 0);
+           {
+             this_arg = XEXP (this_arg, 0);
+
+             /* 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;
+
+                 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))
            {
              this_slot = force_const_mem (TFmode, this_arg);