OSDN Git Service

* sh-protos.h (sh_pr_interrupt): Declare.
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 18 Jun 2002 19:03:18 +0000 (19:03 +0000)
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 18 Jun 2002 19:03:18 +0000 (19:03 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@54756 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/sh/sh-protos.h
gcc/config/sh/sh.c
gcc/config/sh/sh.h

index ed371f7..a6bba3a 100644 (file)
@@ -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
index 3503f57..9aa1143 100644 (file)
@@ -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));
index 2285137..a489dcf 100644 (file)
@@ -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);
+}
 \f
 /* 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;
index 6891fd0..32baea4 100644 (file)
@@ -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)