* config/mn10300/mn10300.c (REG_SAVE_BYTES): Delete.
authornickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Jul 2012 14:23:51 +0000 (14:23 +0000)
committernickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Jul 2012 14:23:51 +0000 (14:23 +0000)
(mn10300_get_live_callee_saved_regs): If requested return a count
of the number of bytes in the mask.
(mn10300_expand_prologue): Add argument to invocation of
mn10300_get_live_callee_regs.
(mn10300_expand_epilogue): Compute reg_save_bytes by calling
mn10300_get_live_callee_saved_regs.
(mn10300_initial_offset): Likewise.
* config/mn10300/mn10300-protos.h (mn10300_get_live_callee_saved_regs):
Update prototype.
* config/mn10300/mn10300.md (return_ret): Add argument to
invocation of mn10300_get_live_callee_saved_regs.

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

gcc/ChangeLog
gcc/config/mn10300/mn10300-protos.h
gcc/config/mn10300/mn10300.c
gcc/config/mn10300/mn10300.md

index ec73ade..ab76884 100644 (file)
@@ -1,3 +1,18 @@
+2012-07-26  Nick Clifton  <nickc@redhat.com>
+
+       * config/mn10300/mn10300.c (REG_SAVE_BYTES): Delete.
+       (mn10300_get_live_callee_saved_regs): If requested return a count
+       of the number of bytes in the mask.
+       (mn10300_expand_prologue): Add argument to invocation of
+       mn10300_get_live_callee_regs.
+       (mn10300_expand_epilogue): Compute reg_save_bytes by calling
+       mn10300_get_live_callee_saved_regs.
+       (mn10300_initial_offset): Likewise.
+       * config/mn10300/mn10300-protos.h (mn10300_get_live_callee_saved_regs):
+       Update prototype.
+       * config/mn10300/mn10300.md (return_ret): Add argument to
+       invocation of mn10300_get_live_callee_saved_regs.
+
 2012-07-26  Steven Bosscher  <steven@gcc.gnu.org>
 
        PR regression/54084
index fe0452b..b6760e8 100644 (file)
@@ -25,7 +25,7 @@ extern int   mn10300_legitimate_pic_operand_p (rtx);
 extern rtx   mn10300_legitimize_reload_address (rtx, enum machine_mode,
                                                int, int, int);
 extern bool  mn10300_function_value_regno_p (const unsigned int);
-extern int   mn10300_get_live_callee_saved_regs (void);
+extern unsigned int   mn10300_get_live_callee_saved_regs (unsigned int *);
 extern bool  mn10300_hard_regno_mode_ok (unsigned int, enum machine_mode);
 extern bool  mn10300_modes_tieable (enum machine_mode, enum machine_mode);
 extern const char *mn10300_output_add (rtx[3], bool);
index b522c2e..a8a4050 100644 (file)
@@ -57,18 +57,6 @@ int mn10300_protect_label;
 /* Selected processor type for tuning.  */
 enum processor_type mn10300_tune_cpu = PROCESSOR_DEFAULT;
 
-/* The size of the callee register save area.  Right now we save everything
-   on entry since it costs us nothing in code size.  It does cost us from a
-   speed standpoint, so we want to optimize this sooner or later.  */
-#define REG_SAVE_BYTES (4 * df_regs_ever_live_p (2)            \
-                       + 4 * df_regs_ever_live_p (3)           \
-                       + 4 * df_regs_ever_live_p (6)           \
-                       + 4 * df_regs_ever_live_p (7)           \
-                       + 16 * (df_regs_ever_live_p (14)        \
-                               || df_regs_ever_live_p (15)     \
-                               || df_regs_ever_live_p (16)     \
-                               || df_regs_ever_live_p (17)))
-
 #define CC_FLAG_Z      1
 #define CC_FLAG_N      2
 #define CC_FLAG_C      4
@@ -635,20 +623,35 @@ mn10300_can_use_rets_insn (void)
 
 /* Returns the set of live, callee-saved registers as a bitmask.  The
    callee-saved extended registers cannot be stored individually, so
-   all of them will be included in the mask if any one of them is used.  */
+   Also returns the number of bytes in the registers in the mask if
+   BYTES_SAVED is not NULL.  */
 
-int
-mn10300_get_live_callee_saved_regs (void)
+unsigned int
+mn10300_get_live_callee_saved_regs (unsigned int * bytes_saved)
 {
   int mask;
   int i;
+  unsigned int count;
 
-  mask = 0;
+  count = mask = 0;
   for (i = 0; i <= LAST_EXTENDED_REGNUM; i++)
     if (df_regs_ever_live_p (i) && ! call_really_used_regs[i])
-      mask |= (1 << i);
+      {
+       mask |= (1 << i);
+       ++ count;
+      }
+
   if ((mask & 0x3c000) != 0)
-    mask |= 0x3c000;
+    {
+      for (i = 0x04000; i < 0x40000; i <<= 1)
+       if ((mask & i) == 0)
+         ++ count;
+      
+      mask |= 0x3c000;
+    }
+
+  if (bytes_saved)
+    * bytes_saved = count * UNITS_PER_WORD;
 
   return mask;
 }
@@ -742,7 +745,7 @@ mn10300_expand_prologue (void)
   HOST_WIDE_INT size = mn10300_frame_size ();
 
   /* If we use any of the callee-saved registers, save them now.  */
-  mn10300_gen_multiple_store (mn10300_get_live_callee_saved_regs ());
+  mn10300_gen_multiple_store (mn10300_get_live_callee_saved_regs (NULL));
 
   if (TARGET_AM33_2 && fp_regs_to_save ())
     {
@@ -999,8 +1002,10 @@ void
 mn10300_expand_epilogue (void)
 {
   HOST_WIDE_INT size = mn10300_frame_size ();
-  int reg_save_bytes = REG_SAVE_BYTES;
-  
+  unsigned int reg_save_bytes;
+
+  mn10300_get_live_callee_saved_regs (& reg_save_bytes);
+
   if (TARGET_AM33_2 && fp_regs_to_save ())
     {
       int num_regs_to_save = fp_regs_to_save (), i;
@@ -1220,7 +1225,7 @@ mn10300_expand_epilogue (void)
   if (mn10300_can_use_rets_insn ())
     emit_jump_insn (ret_rtx);
   else
-    emit_jump_insn (gen_return_ret (GEN_INT (size + REG_SAVE_BYTES)));
+    emit_jump_insn (gen_return_ret (GEN_INT (size + reg_save_bytes)));
 }
 
 /* Recognize the PARALLEL rtx generated by mn10300_gen_multiple_store().
@@ -1435,7 +1440,10 @@ mn10300_initial_offset (int from, int to)
      is the size of the callee register save area.  */
   if (from == ARG_POINTER_REGNUM)
     {
-      diff += REG_SAVE_BYTES;
+      unsigned int reg_save_bytes;
+
+      mn10300_get_live_callee_saved_regs (& reg_save_bytes);
+      diff += reg_save_bytes;
       diff += 4 * fp_regs_to_save ();
     }
 
index a1cbc7a..ee92b68 100644 (file)
 {
   /* The RETF insn is up to 3 cycles faster than RET.  */
   fputs ((mn10300_can_use_retf_insn () ? "\tretf " : "\tret "), asm_out_file);
-  mn10300_print_reg_list (asm_out_file, mn10300_get_live_callee_saved_regs ());
+  mn10300_print_reg_list (asm_out_file, mn10300_get_live_callee_saved_regs (NULL));
   fprintf (asm_out_file, ",%d\n", (int) INTVAL (operands[0]));
   return "";
 })