diff options
author | J"orn Rennecke <joern.rennecke@superh.com> | 2002-06-18 19:03:18 +0000 |
---|---|---|
committer | Joern Rennecke <amylaar@gcc.gnu.org> | 2002-06-18 20:03:18 +0100 |
commit | e3ba8d11f88f79ce3bd07c5e9a98c85b6d394c45 (patch) | |
tree | b12bb67aa8799a75653ec55ee6c6d4c19ddd3380 /gcc | |
parent | ab928b32414497eba794c15e4965cf282858eb3f (diff) | |
download | gcc-e3ba8d11f88f79ce3bd07c5e9a98c85b6d394c45.zip gcc-e3ba8d11f88f79ce3bd07c5e9a98c85b6d394c45.tar.gz gcc-e3ba8d11f88f79ce3bd07c5e9a98c85b6d394c45.tar.bz2 |
sh-protos.h (sh_pr_interrupt): Declare.
* sh-protos.h (sh_pr_interrupt): Declare.
* sh.c (sh_pr_interrupt): New function.
(print_operand, calc_live_regs, sh_expand_prologue): Use it.
(sh_hard_regno_rename_ok): Likewise.
* sh.h (NORMAL_MODE): FP_MODE_NONE for interupt handlers.
From-SVN: r54756
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/sh/sh-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/sh/sh.c | 39 | ||||
-rw-r--r-- | gcc/config/sh/sh.h | 4 |
4 files changed, 23 insertions, 29 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ed371f7..a6bba3a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +Tue Jun 18 20:00:37 2002 J"orn Rennecke <joern.rennecke@superh.com> + + * sh-protos.h (sh_pr_interrupt): Declare. + * sh.c (sh_pr_interrupt): New function. + (print_operand, calc_live_regs, sh_expand_prologue): Use it. + (sh_hard_regno_rename_ok): Likewise. + * sh.h (NORMAL_MODE): FP_MODE_NONE for interupt handlers. + 2002-06-18 Vladimir Makarov <vmakarov@redhat.com> * rtl.def (DEFINE_AUTOMATON): Add description of new options diff --git a/gcc/config/sh/sh-protos.h b/gcc/config/sh/sh-protos.h index 3503f57..9aa1143 100644 --- a/gcc/config/sh/sh-protos.h +++ b/gcc/config/sh/sh-protos.h @@ -123,6 +123,7 @@ extern int initial_elimination_offset PARAMS ((int, int)); extern int fldi_ok PARAMS ((void)); extern int sh_pr_n_sets PARAMS ((void)); extern int sh_hard_regno_rename_ok PARAMS ((unsigned int, unsigned int)); +extern int sh_cfun_interrupt_handler_p (void); #ifdef HARD_CONST extern void fpscr_set_from_mem PARAMS ((int, HARD_REG_SET)); diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 2285137..a489dcf 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -341,25 +341,13 @@ print_operand (stream, x, code) fprintf (stream, "%s", LOCAL_LABEL_PREFIX); break; case '@': - { - int interrupt_handler; - - if ((lookup_attribute - ("interrupt_handler", - DECL_ATTRIBUTES (current_function_decl))) - != NULL_TREE) - interrupt_handler = 1; - else - interrupt_handler = 0; - if (trap_exit) fprintf (stream, "trapa #%d", trap_exit); - else if (interrupt_handler) + else if (sh_cfun_interrupt_handler_p ()) fprintf (stream, "rte"); else fprintf (stream, "rts"); break; - } case '#': /* Output a nop if there's nothing in the delay slot. */ if (dbr_sequence_length () == 0) @@ -4364,13 +4352,7 @@ calc_live_regs (count_ptr, live_regs_mask) int interrupt_handler; int pr_live; - if ((lookup_attribute - ("interrupt_handler", - DECL_ATTRIBUTES (current_function_decl))) - != NULL_TREE) - interrupt_handler = 1; - else - interrupt_handler = 0; + interrupt_handler = sh_cfun_interrupt_handler_p (); for (count = 0; 32 * count < FIRST_PSEUDO_REGISTER; count++) live_regs_mask[count] = 0; @@ -4489,10 +4471,7 @@ sh_expand_prologue () int d_rounding = 0; int save_flags = target_flags; - current_function_interrupt - = lookup_attribute ("interrupt_handler", - DECL_ATTRIBUTES (current_function_decl)) - != NULL_TREE; + current_function_interrupt = sh_cfun_interrupt_handler_p (); /* We have pretend args if we had an object sent partially in registers and partially on the stack, e.g. a large structure. */ @@ -5747,6 +5726,13 @@ sh_handle_trap_exit_attribute (node, name, args, flags, no_add_attrs) return NULL_TREE; } +int +sh_cfun_interrupt_handler_p (void) +{ + return (lookup_attribute ("interrupt_handler", + DECL_ATTRIBUTES (current_function_decl)) + != NULL_TREE); +} /* Predicates used by the templates. */ @@ -6712,10 +6698,7 @@ sh_hard_regno_rename_ok (old_reg, new_reg) saved by the prologue, even if they would normally be call-clobbered. */ - if ((lookup_attribute ("interrupt_handler", - DECL_ATTRIBUTES (current_function_decl)) - != NULL_TREE) - && !regs_ever_live[new_reg]) + if (sh_cfun_interrupt_handler_p () && !regs_ever_live[new_reg]) return 0; return 1; diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index 6891fd0..32baea4 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -3251,7 +3251,9 @@ extern struct rtx_def *fpscr_rtx; #define OPTIMIZE_MODE_SWITCHING(ENTITY) TARGET_SH4 #define NORMAL_MODE(ENTITY) \ - (TARGET_FPU_SINGLE ? FP_MODE_SINGLE : FP_MODE_DOUBLE) + (sh_cfun_interrupt_handler_p () ? FP_MODE_NONE \ + : TARGET_FPU_SINGLE ? FP_MODE_SINGLE \ + : FP_MODE_DOUBLE) #define EPILOGUE_USES(REGNO) ((TARGET_SH3E || TARGET_SH4) \ && (REGNO) == FPSCR_REG) |