(regno_reg_class): Change entry 23 from NO_REGS to GENERAL_REGS.
authorJim Wilson <wilson@gcc.gnu.org>
Mon, 12 Aug 1996 21:43:22 +0000 (14:43 -0700)
committerJim Wilson <wilson@gcc.gnu.org>
Mon, 12 Aug 1996 21:43:22 +0000 (14:43 -0700)
(initial_elimination_offset): New variable live_regs_mask.  Add
code to handle RETURN_ADDRESS_POINTER_REGNUM.

From-SVN: r12627

gcc/config/sh/sh.c

index 834e60bf382a772e7f5e16533d2f0a0cb9152f91..f7625a4a3dc196b1811e6160ac3ab666c1266a85 100644 (file)
@@ -84,7 +84,7 @@ int regno_reg_class[FIRST_PSEUDO_REGISTER] =
   GENERAL_REGS, GENERAL_REGS, GENERAL_REGS, GENERAL_REGS,
   GENERAL_REGS, GENERAL_REGS, GENERAL_REGS, GENERAL_REGS,
   GENERAL_REGS, PR_REGS, T_REGS, NO_REGS,
-  MAC_REGS, MAC_REGS, FPUL_REGS, NO_REGS,
+  MAC_REGS, MAC_REGS, FPUL_REGS, GENERAL_REGS,
   FP0_REGS,FP_REGS, FP_REGS, FP_REGS,
   FP_REGS, FP_REGS, FP_REGS, FP_REGS,
   FP_REGS, FP_REGS, FP_REGS, FP_REGS,
@@ -2074,8 +2074,8 @@ initial_elimination_offset (from, to)
   int total_saved_regs_space;
   int total_auto_space = get_frame_size ();
 
-  int live_regs_mask2;
-  calc_live_regs (&regs_saved, &live_regs_mask2);
+  int live_regs_mask, live_regs_mask2;
+  live_regs_mask = calc_live_regs (&regs_saved, &live_regs_mask2);
 
   total_saved_regs_space = (regs_saved) * 4;
 
@@ -2089,6 +2089,19 @@ initial_elimination_offset (from, to)
   if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
     return 0;
 
+  if (from == RETURN_ADDRESS_POINTER_REGNUM
+      && (to == FRAME_POINTER_REGNUM || to == STACK_POINTER_REGNUM))
+    {
+      int i, n = 0;
+      for (i = PR_REG+1; i < 32; i++)
+       if (live_regs_mask & (1 << i))
+         n += 4;
+      for (i = 32; i < FIRST_PSEUDO_REGISTER; i++)
+       if (live_regs_mask2 & (1 << (i - 32)))
+         n += 4;
+      return n + total_auto_space;
+    }
+
   abort ();
 }
 \f