aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJ"orn Rennecke <joern.rennecke@superh.com>2002-06-18 19:03:18 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>2002-06-18 20:03:18 +0100
commite3ba8d11f88f79ce3bd07c5e9a98c85b6d394c45 (patch)
treeb12bb67aa8799a75653ec55ee6c6d4c19ddd3380 /gcc
parentab928b32414497eba794c15e4965cf282858eb3f (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/config/sh/sh-protos.h1
-rw-r--r--gcc/config/sh/sh.c39
-rw-r--r--gcc/config/sh/sh.h4
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)