Commit 3007d592 by J"orn Rennecke Committed by Joern Rennecke

sh-protos.h (sh_pr_n_sets): Declare.

	* sh-protos.h (sh_pr_n_sets): Declare.
	* sh.c (calc_live_regs): If the initial value for PR has been copied,
	look at the copy to determine if PR needs to be saved.
	sh_pr_n_sets: New function.
	* sh.h (RETURN_ADDR_RTX): Use get_hard_reg_initial_val.
	(ALLOCATE_INITIAL_VALUE): Define.

	* sh.c (initial_elimination_offset):
	Fix RETURN_ADDRESS_POINTER_REGNUM case.

From-SVN: r45717
parent 385b6e2d
Fri Sep 21 01:49:41 2001 J"orn Rennecke <amylaar@redhat.com>
* sh-protos.h (sh_pr_n_sets): Declare.
* sh.c (calc_live_regs): If the initial value for PR has been copied,
look at the copy to determine if PR needs to be saved.
sh_pr_n_sets: New function.
* sh.h (RETURN_ADDR_RTX): Use get_hard_reg_initial_val.
(ALLOCATE_INITIAL_VALUE): Define.
* sh.c (initial_elimination_offset):
Fix RETURN_ADDRESS_POINTER_REGNUM case.
Fri Sep 21 01:13:56 2001 J"orn Rennecke <amylaar@redhat.com> Fri Sep 21 01:13:56 2001 J"orn Rennecke <amylaar@redhat.com>
* integrate.c (allocate_initial_values): New function. * integrate.c (allocate_initial_values): New function.
......
...@@ -119,6 +119,7 @@ extern void sh_expand_epilogue PARAMS ((void)); ...@@ -119,6 +119,7 @@ extern void sh_expand_epilogue PARAMS ((void));
extern int sh_need_epilogue PARAMS ((void)); extern int sh_need_epilogue PARAMS ((void));
extern int initial_elimination_offset PARAMS ((int, int)); extern int initial_elimination_offset PARAMS ((int, int));
extern int fldi_ok PARAMS ((void)); extern int fldi_ok PARAMS ((void));
extern int sh_pr_n_sets PARAMS ((void));
#ifdef HARD_CONST #ifdef HARD_CONST
extern void fpscr_set_from_mem PARAMS ((int, HARD_REG_SET)); extern void fpscr_set_from_mem PARAMS ((int, HARD_REG_SET));
......
...@@ -3959,6 +3959,8 @@ calc_live_regs (count_ptr, live_regs_mask2) ...@@ -3959,6 +3959,8 @@ calc_live_regs (count_ptr, live_regs_mask2)
int live_regs_mask = 0; int live_regs_mask = 0;
int count; int count;
int interrupt_handler; int interrupt_handler;
rtx pr_initial;
int pr_live;
if ((lookup_attribute if ((lookup_attribute
("interrupt_handler", ("interrupt_handler",
...@@ -3979,14 +3981,20 @@ calc_live_regs (count_ptr, live_regs_mask2) ...@@ -3979,14 +3981,20 @@ calc_live_regs (count_ptr, live_regs_mask2)
target_flags &= ~FPU_SINGLE_BIT; target_flags &= ~FPU_SINGLE_BIT;
break; break;
} }
pr_initial = has_hard_reg_initial_val (Pmode, PR_REG);
pr_live = (pr_initial
? REGNO (pr_initial) != PR_REG
: regs_ever_live[PR_REG]);
for (count = 0, reg = FIRST_PSEUDO_REGISTER - 1; reg >= 0; reg--) for (count = 0, reg = FIRST_PSEUDO_REGISTER - 1; reg >= 0; reg--)
{ {
if ((interrupt_handler && ! pragma_trapa) if (reg == PR_REG
? pr_live
: (interrupt_handler && ! pragma_trapa)
? (/* Need to save all the regs ever live. */ ? (/* Need to save all the regs ever live. */
(regs_ever_live[reg] (regs_ever_live[reg]
|| (call_used_regs[reg] || (call_used_regs[reg]
&& (! fixed_regs[reg] || reg == MACH_REG || reg == MACL_REG) && (! fixed_regs[reg] || reg == MACH_REG || reg == MACL_REG)
&& regs_ever_live[PR_REG])) && pr_live))
&& reg != STACK_POINTER_REGNUM && reg != ARG_POINTER_REGNUM && reg != STACK_POINTER_REGNUM && reg != ARG_POINTER_REGNUM
&& reg != RETURN_ADDRESS_POINTER_REGNUM && reg != RETURN_ADDRESS_POINTER_REGNUM
&& reg != T_REG && reg != GBR_REG && reg != FPSCR_REG) && reg != T_REG && reg != GBR_REG && reg != FPSCR_REG)
...@@ -4598,7 +4606,7 @@ initial_elimination_offset (from, to) ...@@ -4598,7 +4606,7 @@ initial_elimination_offset (from, to)
if (from == RETURN_ADDRESS_POINTER_REGNUM if (from == RETURN_ADDRESS_POINTER_REGNUM
&& (to == FRAME_POINTER_REGNUM || to == STACK_POINTER_REGNUM)) && (to == FRAME_POINTER_REGNUM || to == STACK_POINTER_REGNUM))
return UNITS_PER_WORD + total_auto_space; return total_auto_space;
abort (); abort ();
} }
...@@ -5638,3 +5646,13 @@ sh_adjust_cost (insn, link, dep_insn, cost) ...@@ -5638,3 +5646,13 @@ sh_adjust_cost (insn, link, dep_insn, cost)
return cost; return cost;
} }
/* For use by ALLOCATE_INITIAL_VALUE. Note that sh.md contains some
'special function' patterns (type sfunc) that clobber pr, but that
do not look like function calls to leaf_function_p. Hence we must
do this extra check. */
int
sh_pr_n_sets ()
{
return REG_N_SETS (PR_REG);
}
...@@ -1293,7 +1293,7 @@ extern int current_function_anonymous_args; ...@@ -1293,7 +1293,7 @@ extern int current_function_anonymous_args;
#define RETURN_ADDR_RTX(COUNT, FRAME) \ #define RETURN_ADDR_RTX(COUNT, FRAME) \
(((COUNT) == 0) \ (((COUNT) == 0) \
? gen_rtx_MEM (Pmode, gen_rtx_REG (Pmode, RETURN_ADDRESS_POINTER_REGNUM)) \ ? get_hard_reg_initial_val (Pmode, PR_REG) \
: (rtx) 0) : (rtx) 0)
/* Generate necessary RTL for __builtin_saveregs(). */ /* Generate necessary RTL for __builtin_saveregs(). */
...@@ -2369,4 +2369,11 @@ extern struct rtx_def *fpscr_rtx; ...@@ -2369,4 +2369,11 @@ extern struct rtx_def *fpscr_rtx;
1: .long " USER_LABEL_PREFIX #func " - 0b\n\ 1: .long " USER_LABEL_PREFIX #func " - 0b\n\
2:") 2:")
#define ALLOCATE_INITIAL_VALUE(hard_reg) \
(REGNO (hard_reg) == PR_REG \
? (current_function_is_leaf && ! sh_pr_n_sets () \
? (hard_reg) \
: gen_rtx_MEM (Pmode, arg_pointer_rtx)) \
: NULL_RTX)
#endif /* ! GCC_SH_H */ #endif /* ! GCC_SH_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment