aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/sh
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1996-08-12 14:43:22 -0700
committerJim Wilson <wilson@gcc.gnu.org>1996-08-12 14:43:22 -0700
commit2afeea0fa3280a0fc50945b4d4c3eec30475a0c6 (patch)
treec98d0af44ad3264ac8ef3d8d7fd49d54b80d1ab6 /gcc/config/sh
parentf434403dd78bd9ecd8cfd721396170b9e05af2ea (diff)
downloadgcc-2afeea0fa3280a0fc50945b4d4c3eec30475a0c6.zip
gcc-2afeea0fa3280a0fc50945b4d4c3eec30475a0c6.tar.gz
gcc-2afeea0fa3280a0fc50945b4d4c3eec30475a0c6.tar.bz2
(regno_reg_class): Change entry 23 from NO_REGS to GENERAL_REGS.
(initial_elimination_offset): New variable live_regs_mask. Add code to handle RETURN_ADDRESS_POINTER_REGNUM. From-SVN: r12627
Diffstat (limited to 'gcc/config/sh')
-rw-r--r--gcc/config/sh/sh.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 834e60b..f7625a4 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -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 ();
}