* pa.md (untyped_call): New define_expand.
authorJeff Law <law@gcc.gnu.org>
Mon, 23 Aug 1993 03:38:16 +0000 (21:38 -0600)
committerJeff Law <law@gcc.gnu.org>
Mon, 23 Aug 1993 03:38:16 +0000 (21:38 -0600)
From-SVN: r5192

gcc/config/pa/pa.md

index 732ec4e..ad20969 100644 (file)
  [(set_attr "type" "dyncall")
   (set_attr "length" "12")])
 
+;; Call subroutine returning any type.
+
+(define_expand "untyped_call"
+  [(parallel [(call (match_operand 0 "" "")
+                   (const_int 0))
+             (match_operand 1 "" "")
+             (match_operand 2 "" "")])]
+  ""
+  "
+{
+  int i;
+
+  emit_call_insn (gen_call (operands[0], 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;
+}")
 (define_insn "nop"
   [(const_int 0)]
   ""