OSDN Git Service

2002-03-03 Aldy Hernandez <aldyh@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / reload.c
index 3996050..0e08aba 100644 (file)
@@ -1879,6 +1879,7 @@ find_dummy_reload (real_in, real_out, inloc, outloc,
       *inloc = const0_rtx;
 
       if (regno < FIRST_PSEUDO_REGISTER
+         && HARD_REGNO_MODE_OK (regno, outmode)
          && ! refers_to_regno_for_reload_p (regno, regno + nwords,
                                             PATTERN (this_insn), outloc))
        {
@@ -3120,18 +3121,6 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
                break;
 
              case 'E':
-#ifndef REAL_ARITHMETIC
-               /* Match any floating double constant, but only if
-                  we can examine the bits of it reliably.  */
-               if ((HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT
-                    || HOST_BITS_PER_WIDE_INT != BITS_PER_WORD)
-                   && GET_MODE (operand) != VOIDmode && ! flag_pretend_float)
-                 break;
-#endif
-               if (GET_CODE (operand) == CONST_DOUBLE)
-                 win = 1;
-               break;
-
              case 'F':
                if (GET_CODE (operand) == CONST_DOUBLE)
                  win = 1;
@@ -4241,6 +4230,23 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
       rld[i].nregs = CLASS_MAX_NREGS (rld[i].class, rld[i].mode);
     }
 
+  /* Special case a simple move with an input reload and a
+     destination of a hard reg, if the hard reg is ok, use it.  */
+  for (i = 0; i < n_reloads; i++)
+    if (rld[i].when_needed == RELOAD_FOR_INPUT
+       && GET_CODE (PATTERN (insn)) == SET
+       && GET_CODE (SET_DEST (PATTERN (insn))) == REG
+       && SET_SRC (PATTERN (insn)) == rld[i].in)
+      {
+       rtx dest = SET_DEST (PATTERN (insn));
+       unsigned int regno = REGNO (dest);
+
+       if (regno < FIRST_PSEUDO_REGISTER
+           && TEST_HARD_REG_BIT (reg_class_contents[rld[i].class], regno)
+           && HARD_REGNO_MODE_OK (regno, rld[i].mode))
+         rld[i].reg_rtx = dest;
+      }
+
   return retval;
 }
 
@@ -4909,6 +4915,7 @@ subst_reg_equivs (ad, insn)
     case CONST_INT:
     case CONST:
     case CONST_DOUBLE:
+    case CONST_VECTOR:
     case SYMBOL_REF:
     case LABEL_REF:
     case PC:
@@ -6149,7 +6156,8 @@ reg_overlap_mentioned_for_reload_p (x, in)
   int regno, endregno;
 
   /* Overly conservative.  */
-  if (GET_CODE (x) == STRICT_LOW_PART)
+  if (GET_CODE (x) == STRICT_LOW_PART
+      || GET_RTX_CLASS (GET_CODE (x)) == 'a')
     x = XEXP (x, 0);
 
   /* If either argument is a constant, then modifying X can not affect IN.  */
@@ -6185,6 +6193,9 @@ reg_overlap_mentioned_for_reload_p (x, in)
   else if (GET_CODE (x) == SCRATCH || GET_CODE (x) == PC
           || GET_CODE (x) == CC0)
     return reg_mentioned_p (x, in);
+  else if (GET_CODE (x) == PLUS)
+    return (reg_overlap_mentioned_for_reload_p (XEXP (x, 0), in)
+           || reg_overlap_mentioned_for_reload_p (XEXP (x, 1), in));
   else
     abort ();