OSDN Git Service

* lib/compat.exp (compat-execute): Break up long lines.
[pf3gnuchains/gcc-fork.git] / gcc / caller-save.c
index 7133fe3..da083da 100644 (file)
@@ -1,6 +1,6 @@
 /* Save and restore call-clobbered registers which are live across a call.
    Copyright (C) 1989, 1992, 1994, 1995, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -300,7 +300,7 @@ setup_save_areas (void)
       {
        unsigned int regno = reg_renumber[i];
        unsigned int endregno
-         = regno + HARD_REGNO_NREGS (regno, GET_MODE (regno_reg_rtx[i]));
+         = regno + hard_regno_nregs[regno][GET_MODE (regno_reg_rtx[i])];
 
        for (r = regno; r < endregno; r++)
          if (call_used_regs[r])
@@ -384,7 +384,7 @@ save_call_clobbered_regs (void)
       if (chain->is_caller_save_insn)
        abort ();
 
-      if (GET_RTX_CLASS (code) == 'i')
+      if (INSN_P (insn))
        {
          /* If some registers have been saved, see if INSN references
             any of them.  We must restore them before the insn if so.  */
@@ -436,7 +436,7 @@ save_call_clobbered_regs (void)
                     {
                       enum machine_mode mode;
 
-                      nregs = HARD_REGNO_NREGS (r, PSEUDO_REGNO_MODE (regno));
+                      nregs = hard_regno_nregs[r][PSEUDO_REGNO_MODE (regno)];
                       mode = HARD_REGNO_CALLER_SAVE_MODE
                                (r, nregs, PSEUDO_REGNO_MODE (regno));
                       if (GET_MODE_BITSIZE (mode)
@@ -515,7 +515,7 @@ mark_set_regs (rtx reg, rtx setter ATTRIBUTE_UNUSED,
   else
     return;
 
-  endregno = regno + HARD_REGNO_NREGS (regno, mode);
+  endregno = regno + hard_regno_nregs[regno][mode];
 
   for (i = regno; i < endregno; i++)
     SET_HARD_REG_BIT (this_insn_sets, i);
@@ -548,7 +548,7 @@ add_stored_regs (rtx reg, rtx setter, void *data)
     return;
 
   regno = REGNO (reg) + offset;
-  endregno = regno + HARD_REGNO_NREGS (regno, mode);
+  endregno = regno + hard_regno_nregs[regno][mode];
 
   for (i = regno; i < endregno; i++)
     SET_REGNO_REG_SET ((regset) data, i);
@@ -595,7 +595,7 @@ mark_referenced_regs (rtx x)
 
       if (hardregno >= 0)
        {
-         int nregs = HARD_REGNO_NREGS (hardregno, GET_MODE (x));
+         int nregs = hard_regno_nregs[hardregno][GET_MODE (x)];
          while (nregs-- > 0)
            SET_HARD_REG_BIT (referenced_regs, hardregno + nregs);
        }
@@ -683,8 +683,10 @@ insert_restore (struct insn_chain *chain, int before_p, int regno,
   mem = regno_save_mem [regno][numregs];
   if (save_mode [regno] != VOIDmode
       && save_mode [regno] != GET_MODE (mem)
-      && numregs == (unsigned int) HARD_REGNO_NREGS (regno, save_mode [regno]))
+      && numregs == (unsigned int) hard_regno_nregs[regno][save_mode [regno]])
     mem = adjust_address (mem, save_mode[regno], 0);
+  else
+    mem = copy_rtx (mem);
   pat = gen_rtx_SET (VOIDmode,
                     gen_rtx_REG (GET_MODE (mem),
                                  regno), mem);
@@ -755,8 +757,10 @@ insert_save (struct insn_chain *chain, int before_p, int regno,
   mem = regno_save_mem [regno][numregs];
   if (save_mode [regno] != VOIDmode
       && save_mode [regno] != GET_MODE (mem)
-      && numregs == (unsigned int) HARD_REGNO_NREGS (regno, save_mode [regno]))
+      && numregs == (unsigned int) hard_regno_nregs[regno][save_mode [regno]])
     mem = adjust_address (mem, save_mode[regno], 0);
+  else
+    mem = copy_rtx (mem);
   pat = gen_rtx_SET (VOIDmode, mem,
                     gen_rtx_REG (GET_MODE (mem),
                                  regno));
@@ -828,7 +832,7 @@ insert_one_insn (struct insn_chain *chain, int before_p, int code, rtx pat)
                regno = reg_renumber[regno];
              if (regno < 0)
                continue;
-             for (i = HARD_REGNO_NREGS (regno, GET_MODE (reg)) - 1;
+             for (i = hard_regno_nregs[regno][GET_MODE (reg)] - 1;
                   i >= 0; i--)
                SET_REGNO_REG_SET (&new->live_throughout, regno + i);
            }