aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/sh/sh.md
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1996-05-18 17:33:19 -0700
committerJim Wilson <wilson@gcc.gnu.org>1996-05-18 17:33:19 -0700
commita1a0806af6d53e260b5169bac55a58285dce65f7 (patch)
treedcc170cebba4f1f4bb49e2b28048ded12fc0b00e /gcc/config/sh/sh.md
parent7085bad383da40cb4e8c22076991277d088bc882 (diff)
downloadgcc-a1a0806af6d53e260b5169bac55a58285dce65f7.zip
gcc-a1a0806af6d53e260b5169bac55a58285dce65f7.tar.gz
gcc-a1a0806af6d53e260b5169bac55a58285dce65f7.tar.bz2
(untyped_call): New pattern.
From-SVN: r12035
Diffstat (limited to 'gcc/config/sh/sh.md')
-rw-r--r--gcc/config/sh/sh.md30
1 files changed, 30 insertions, 0 deletions
diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md
index b0ab67e..d0ac20c 100644
--- a/gcc/config/sh/sh.md
+++ b/gcc/config/sh/sh.md
@@ -1680,6 +1680,36 @@
""
"jmp @%0%#"
[(set_attr "needs_delay_slot" "yes")])
+
+;; Call subroutine returning any type.
+;; ??? This probably doesn't work.
+
+(define_expand "untyped_call"
+ [(parallel [(call (match_operand 0 "" "")
+ (const_int 0))
+ (match_operand 1 "" "")
+ (match_operand 2 "" "")])]
+ "TARGET_SH3E"
+ "
+{
+ int i;
+
+ emit_call_insn (gen_call (operands[0], const0_rtx, const0_rtx, const0_rtx));
+
+ for (i = 0; i < XVECLEN (operands[2], 0); i++)
+ {
+ rtx set = XVECEXP (operands[2], 0, i);
+ emit_move_insn (SET_DEST (set), SET_SRC (set));
+ }
+
+ /* The optimizer does not know that the call sets the function value
+ registers we stored in the result block. We avoid problems by
+ claiming that all hard registers are used and clobbered at this
+ point. */
+ emit_insn (gen_blockage ());
+
+ DONE;
+}")
;; ------------------------------------------------------------------------
;; Misc insns