mips-protos.h (mips_expand_before_return): Declare.
authorRichard Sandiford <rdsandiford@googlemail.com>
Sun, 1 Jun 2008 10:01:51 +0000 (10:01 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 1 Jun 2008 10:01:51 +0000 (10:01 +0000)
gcc/
* config/mips/mips-protos.h (mips_expand_before_return): Declare.
* config/mips/mips.c (mips_expand_before_return): New function.
(mips_expand_epilogue): Call it.
* config/mips/mips.md (return): Turn into a define_expand.
(*return): New insn.

From-SVN: r136252

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

index e990443a4bcf54e0a77adaa44eb9ec49e6f91ade..624d3386f468809e063969757a08ee57427c7e06 100644 (file)
@@ -1,3 +1,11 @@
+2008-06-01  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * config/mips/mips-protos.h (mips_expand_before_return): Declare.
+       * config/mips/mips.c (mips_expand_before_return): New function.
+       (mips_expand_epilogue): Call it.
+       * config/mips/mips.md (return): Turn into a define_expand.
+       (*return): New insn.
+
 2008-06-01  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * rtl.h (emit_clobber, gen_clobber, emit_use, gen_use): Declare.
index db65aab93c91d5be8116f44fe043a9989f5fdbb9..1bf0ee9865d7dcaddd06eae3e2540a7d02ddb7c4 100644 (file)
@@ -257,6 +257,7 @@ extern HOST_WIDE_INT mips_initial_elimination_offset (int, int);
 extern rtx mips_return_addr (int, rtx);
 extern enum mips_loadgp_style mips_current_loadgp_style (void);
 extern void mips_expand_prologue (void);
+extern void mips_expand_before_return (void);
 extern void mips_expand_epilogue (bool);
 extern bool mips_can_use_return_insn (void);
 extern rtx mips_function_value (const_tree, enum machine_mode);
index b12e2e24c6287d3881e2455afd5951a7da918ec0..246600d8b35e3e6c8058e4a36b1fefd85404eb85 100644 (file)
@@ -8633,6 +8633,24 @@ mips_restore_reg (rtx reg, rtx mem)
     mips_emit_move (reg, mem);
 }
 
+/* Emit any instructions needed before a return.  */
+
+void
+mips_expand_before_return (void)
+{
+  /* When using a call-clobbered gp, we start out with unified call
+     insns that include instructions to restore the gp.  We then split
+     these unified calls after reload.  These split calls explicitly
+     clobber gp, so there is no need to define
+     PIC_OFFSET_TABLE_REG_CALL_CLOBBERED.
+
+     For consistency, we should also insert an explicit clobber of $28
+     before return insns, so that the post-reload optimizers know that
+     the register is not live on exit.  */
+  if (TARGET_CALL_CLOBBERED_GP)
+    emit_clobber (pic_offset_table_rtx);
+}
+
 /* Expand an "epilogue" or "sibcall_epilogue" pattern; SIBCALL_P
    says which.  */
 
@@ -8775,6 +8793,7 @@ mips_expand_epilogue (bool sibcall_p)
        regno = GP_REG_FIRST + 7;
       else
        regno = GP_REG_FIRST + 31;
+      mips_expand_before_return ();
       emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode, regno)));
     }
 }
index 921e416bd0ef033395bd8d7b2eabbd8ae7965b07..55e1cd0ece3a7d8b82580b522eb81f9a32b1c0f4 100644 (file)
 ;; Trivial return.  Make it look like a normal return insn as that
 ;; allows jump optimizations to work better.
 
-(define_insn "return"
+(define_expand "return"
+  [(return)]
+  "mips_can_use_return_insn ()"
+  { mips_expand_before_return (); })
+
+(define_insn "*return"
   [(return)]
   "mips_can_use_return_insn ()"
   "%*j\t$31%/"