This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Commit: RX: Add return pattern


Hi Richard,

Not an ideal solution, since the availability of this pattern implies
it's extremely cheap, and we'll replace jumps to the epilogue with
this pattern.
Or to define an availability predicate similar to i386, testing if
the epilogue is trivial, and only a return insn is needed.

Something like the attached ?


I am running some local checks now and if there are no regressions then I will check the patch in tomorrow.

Cheers
  Nick


Index: gcc/config/rx/rx-protos.h
===================================================================
--- gcc/config/rx/rx-protos.h	(revision 183121)
+++ gcc/config/rx/rx-protos.h	(working copy)
@@ -21,6 +22,8 @@
 #ifndef GCC_RX_PROTOS_H
 #define GCC_RX_PROTOS_H
 
+extern bool             rx_can_use_simple_return (void);
+extern void		rx_expand_epilogue (bool);
 extern void		rx_expand_prologue (void);
 extern int		rx_initial_elimination_offset (int, int);
 
@@ -29,7 +32,6 @@
 extern int 		rx_align_for_label (rtx, int);
 extern void             rx_emit_stack_popm (rtx *, bool);
 extern void             rx_emit_stack_pushm (rtx *);
-extern void		rx_expand_epilogue (bool);
 extern char *		rx_gen_move_template (rtx *, bool);
 extern bool		rx_is_legitimate_constant (enum machine_mode, rtx);
 extern bool		rx_is_restricted_memory_address (rtx,
Index: gcc/config/rx/rx.md
===================================================================
--- gcc/config/rx/rx.md	(revision 183121)
+++ gcc/config/rx/rx.md	(working copy)
@@ -342,7 +343,7 @@
 
 (define_expand "return"
   [(return)]
-  ""
+  "rx_can_use_simple_return ()"
   "rx_expand_epilogue (false); DONE;"
 )
 
Index: gcc/config/rx/rx.c
===================================================================
--- gcc/config/rx/rx.c	(revision 183121)
+++ gcc/config/rx/rx.c	(working copy)
@@ -1818,7 +1819,31 @@
 
   return vector;
 }
-  
+
+/* Returns true if a simple return insn can be used.  */
+
+bool
+rx_can_use_simple_return (void)
+{
+  unsigned int low;
+  unsigned int high;
+  unsigned int frame_size;
+  unsigned int stack_size;
+  unsigned int register_mask;
+
+  if (is_naked_func (NULL_TREE)
+      || is_fast_interrupt_func (NULL_TREE)
+      || is_interrupt_func (NULL_TREE))
+    return false;
+
+  rx_get_stack_layout (& low, & high, & register_mask,
+		       & frame_size, & stack_size);
+
+  return (register_mask == 0
+	  && (frame_size + stack_size) == 0
+	  && low == 0);
+}
+
 void
 rx_expand_epilogue (bool is_sibcall)
 {

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]