aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Eager <eager@eagercon.com>2011-12-29 15:50:28 +0000
committerMichael Eager <eager@gcc.gnu.org>2011-12-29 15:50:28 +0000
commit1893a69a50e1baae2fe767b9ab8c883588e87c0a (patch)
treec9eab138ad6040d5dbd6d6f765fb1d0d20528606
parent10b293bbd0844afa8a500f535dbd4b3a010f5d81 (diff)
downloadgcc-1893a69a50e1baae2fe767b9ab8c883588e87c0a.zip
gcc-1893a69a50e1baae2fe767b9ab8c883588e87c0a.tar.gz
gcc-1893a69a50e1baae2fe767b9ab8c883588e87c0a.tar.bz2
microblaze.md: Add expander for simple_return...
* config/microblaze/microblaze.md: Add expander for simple_return, return, add return_internal and simple_return_internal insns. From-SVN: r182725
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/microblaze/microblaze.md34
2 files changed, 31 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4c8ff34..8b7c11e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2011-12-29 Michael Eager <eager@eagercon.com>
+
+ * config/microblaze/microblaze.md: Add expander for simple_return,
+ return, add return_internal and simple_return_internal insns.
+
2011-12-29 Oleg Endo <olegendo@gcc.gnu.org>
* config/sh/sh.h (BRANCH_COST): Use sh_branch_cost variable.
diff --git a/gcc/config/microblaze/microblaze.md b/gcc/config/microblaze/microblaze.md
index 61ae2f7..a4c341f 100644
--- a/gcc/config/microblaze/microblaze.md
+++ b/gcc/config/microblaze/microblaze.md
@@ -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 ())