(untyped_call): New pattern.
authorJim Wilson <wilson@gcc.gnu.org>
Sun, 19 May 1996 00:33:19 +0000 (17:33 -0700)
committerJim Wilson <wilson@gcc.gnu.org>
Sun, 19 May 1996 00:33:19 +0000 (17:33 -0700)
From-SVN: r12035

gcc/config/sh/sh.md

index b0ab67eb51001ec261d1bd2cb99288b42fe590f2..d0ac20cf01f80ec42ba5ec18bf0c22647d19a973 100644 (file)
   ""
   "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;
+}")
 \f
 ;; ------------------------------------------------------------------------
 ;; Misc insns