This patch makes MicroBlaze handle return and simple_return in
the same fashion as MIPS.

2011-12-29  Michael Eager  <ea...@eagercon.com>

        * config/microblaze/microblaze.md: Add expander for simple_return,
        return, add return_internal and simple_return_internal insns.

Checked in, revision 182725.

--
Michael Eager    ea...@eagercon.com
1960 Park Blvd., Palo Alto, CA 94306  650-325-8077
Index: config/microblaze/microblaze.md
===================================================================
--- config/microblaze/microblaze.md     (revision 182723)
+++ config/microblaze/microblaze.md     (working copy)
@@ -82,6 +82,13 @@
 ;; # instructions (4 bytes each)
 (define_attr "length" "" (const_int 4))
 
+(define_code_iterator any_return [return simple_return])
+
+;; <optab> expands to the name of the optab for a particular code.
+(define_code_attr optab [(return "return")
+                        (simple_return "simple_return")])
+
+
 ;;----------------------------------------------------
 ;; Attribute describing the processor.  
 ;;----------------------------------------------------
@@ -1936,9 +1943,21 @@
 
 ;; Trivial return.  Make it look like a normal return insn as that
 ;; allows jump optimizations to work better .
-(define_insn "return"
-  [(return)]
+(define_expand "return"
+  [(simple_return)]
   "microblaze_can_use_return_insn ()"
+  {}
+)
+
+(define_expand "simple_return"
+  [(simple_return)]
+  ""
+  {}
+)
+
+(define_insn "*<optab>"
+  [(any_return)]
+  ""
   { 
     if (microblaze_is_interrupt_handler ())
         return "rtid\tr14, 0\;%#";
@@ -1947,15 +1966,14 @@
   }
   [(set_attr "type"    "jump")
   (set_attr "mode"     "none")
-  (set_attr "length"   "4")])
+  (set_attr "length"   "4")]
+)
 
 ;; Normal return.
-;; We match any mode for the return address, so that this will work with
-;; both 32 bit and 64 bit targets.
 
-(define_insn "return_internal"
-  [(parallel [(use (match_operand:SI 0 "register_operand" ""))
-              (return)])]
+(define_insn "<optab>_internal"
+  [(any_return)
+   (use (match_operand:SI 0 "register_operand" ""))]
   ""
   {    
     if (microblaze_is_interrupt_handler ())

Reply via email to