diff options
author | bernie <bernie@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-22 12:47:24 +0000 |
---|---|---|
committer | bernie <bernie@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-22 12:47:24 +0000 |
commit | b09edf9a31d58567a8db2bb08761e0352c60223e (patch) | |
tree | 43359c11c7f5bbd27bcfc04b3fa9c413511b0bd7 /gcc/config/m68k | |
parent | da4e72c7fe35d5895fbc8b90d4c777d1a703143c (diff) | |
download | gcc-b09edf9a31d58567a8db2bb08761e0352c60223e.tar.gz |
* config/m68k/m68k.h (HARD_REGNO_RENAME_OK): New macro.
* config/m68k/m68k.c (m68k_hard regno_rename_ok): Disallow
renaming of non-live registers in interrupt functions.
* config/m68k/m68k-protos.h (m68k_hard_regno_rename_ok): Add prototype.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89441 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/m68k')
-rw-r--r-- | gcc/config/m68k/m68k-protos.h | 2 | ||||
-rw-r--r-- | gcc/config/m68k/m68k.c | 17 | ||||
-rw-r--r-- | gcc/config/m68k/m68k.h | 6 |
3 files changed, 25 insertions, 0 deletions
diff --git a/gcc/config/m68k/m68k-protos.h b/gcc/config/m68k/m68k-protos.h index 8538b8e0d28..4b66927d239 100644 --- a/gcc/config/m68k/m68k-protos.h +++ b/gcc/config/m68k/m68k-protos.h @@ -50,9 +50,11 @@ extern void print_operand_address (FILE *, rtx); extern void print_operand (FILE *, rtx, int); extern void notice_update_cc (rtx, rtx); extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx); + #endif /* RTX_CODE */ extern int flags_in_68881 (void); extern bool use_return_insn (void); extern void override_options (void); extern void init_68881_table (void); +extern int m68k_hard_regno_rename_ok(unsigned int, unsigned int); diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c index 7a726930720..18b8fb41501 100644 --- a/gcc/config/m68k/m68k.c +++ b/gcc/config/m68k/m68k.c @@ -3428,3 +3428,20 @@ m68k_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED, { return gen_rtx_REG (Pmode, M68K_STRUCT_VALUE_REGNUM); } + +/* Return nonzero if register old_reg can be renamed to register new_reg. */ +int +m68k_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED, + unsigned int new_reg) +{ + + /* Interrupt functions can only use registers that have already been + saved by the prologue, even if they would normally be + call-clobbered. */ + + if (m68k_interrupt_function_p (current_function_decl) + && !regs_ever_live[new_reg]) + return 0; + + return 1; +} diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h index 6af7116f78b..a7a36f90d9d 100644 --- a/gcc/config/m68k/m68k.h +++ b/gcc/config/m68k/m68k.h @@ -480,6 +480,12 @@ extern int target_flags; ((REGNO) >= 16 ? GET_MODE_NUNITS (MODE) \ : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)) +/* A C expression that is nonzero if hard register NEW_REG can be + considered for use as a rename register for OLD_REG register. */ + +#define HARD_REGNO_RENAME_OK(OLD_REG, NEW_REG) \ + m68k_hard_regno_rename_ok (OLD_REG, NEW_REG) + /* On the m68k, the cpu registers can hold any mode but the 68881 registers can hold only SFmode or DFmode. */ #define HARD_REGNO_MODE_OK(REGNO, MODE) \ |