From aeb99a899b9bdc2364bc51bc2b3aa38fc1d05540 Mon Sep 17 00:00:00 2001
From: rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Mon, 27 Mar 2000 19:19:14 +0000
Subject: [PATCH]         * i386.md (call_pop_0, call_value_pop_0): New.       
  (call_pop_1): Remove constraint from unused arg.  Support sibcalls.        
 (call_value_pop_1): Likewise.         (call_0, call_value_0): New.        
 (call_1, call_value_1): Remove constraint from unused arg.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@32768 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog           |   8 ++++
 gcc/config/i386/i386.md | 104 +++++++++++++++++++++++++++++++++-------
 2 files changed, 94 insertions(+), 18 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9b899a2725a1..9bbae4be37d4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2000-03-27  Richard Henderson  <rth@cygnus.com>
+
+	* i386.md (call_pop_0, call_value_pop_0): New.
+	(call_pop_1): Remove constraint from unused arg.  Support sibcalls.
+	(call_value_pop_1): Likewise.
+	(call_0, call_value_0): New.
+	(call_1, call_value_1): Remove constraint from unused arg.
+
 2000-03-27  Nick Clifton  <nickc@cygnus.com>
 
 	* invoke.texi (Spec Files): Document new spec % command created by
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index b188d915f313..2b48b0a12db3 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -7039,19 +7039,41 @@
     XEXP (operands[0], 0) = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
 }")
 
+(define_insn "*call_pop_0"
+  [(call (match_operand:QI 0 "constant_call_address_operand" "")
+	 (match_operand:SI 1 "" ""))
+   (set (reg:SI 7) (plus:SI (reg:SI 7)
+			    (match_operand:SI 3 "immediate_operand" "")))]
+  ""
+  "*
+{
+  if (SIBLING_CALL_P (insn))
+    return \"jmp\\t%P0\";
+  else
+    return \"call\\t%P0\";
+}"
+  [(set_attr "type" "call")])
+  
 (define_insn "*call_pop_1"
   [(call (match_operand:QI 0 "call_insn_operand" "m")
-	 (match_operand:SI 1 "general_operand" "g"))
+	 (match_operand:SI 1 "" ""))
    (set (reg:SI 7) (plus:SI (reg:SI 7)
 			    (match_operand:SI 3 "immediate_operand" "i")))]
   ""
   "*
 {
-  if (constant_call_address_operand (operands[0], GET_MODE (operands[0])))
-    return \"call\\t%P0\";
-  
+  if (constant_call_address_operand (operands[0], QImode))
+    {
+      if (SIBLING_CALL_P (insn))
+	return \"jmp\\t%P0\";
+      else
+	return \"call\\t%P0\";
+    }
   operands[0] = XEXP (operands[0], 0);
-  return \"call\\t%*%0\";
+  if (SIBLING_CALL_P (insn))
+    return \"jmp\\t%*%0\";
+  else
+    return \"call\\t%*%0\";
 }"
   [(set_attr "type" "call")])
 
@@ -7070,21 +7092,32 @@
     XEXP (operands[0], 0) = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
 }")
 
+(define_insn "*call_0"
+  [(call (match_operand:QI 0 "constant_call_address_operand" "")
+	 (match_operand:SI 1 "" ""))]
+  ""
+  "*
+{
+  if (SIBLING_CALL_P (insn))
+    return \"jmp\\t%P0\";
+  else
+    return \"call\\t%P0\";
+}"
+  [(set_attr "type" "call")])
+
 (define_insn "*call_1"
   [(call (match_operand:QI 0 "call_insn_operand" "m")
-	 (match_operand:SI 1 "general_operand" "g"))]
-  ;; Operand 1 not used on the i386.
+	 (match_operand:SI 1 "" ""))]
   ""
   "*
 {
-  if (constant_call_address_operand (operands[0], GET_MODE (operands[0])))
+  if (constant_call_address_operand (operands[0], QImode))
     {
       if (SIBLING_CALL_P (insn))
 	return \"jmp\\t%P0\";
       else
 	return \"call\\t%P0\";
     }
-
   operands[0] = XEXP (operands[0], 0);
   if (SIBLING_CALL_P (insn))
     return \"jmp\\t%*%0\";
@@ -9363,39 +9396,74 @@
 ;; Call-value patterns last so that the wildcard operand does not
 ;; disrupt insn-recog's switch tables.
 
+(define_insn "*call_value_pop_0"
+  [(set (match_operand 0 "" "")
+	(call (match_operand:QI 1 "constant_call_address_operand" "")
+	      (match_operand:SI 2 "" "")))
+   (set (reg:SI 7) (plus:SI (reg:SI 7)
+			    (match_operand:SI 4 "immediate_operand" "")))]
+  ""
+  "*
+{
+  if (SIBLING_CALL_P (insn))
+    return \"jmp\\t%P1\";
+  else
+    return \"call\\t%P1\";
+}"
+  [(set_attr "type" "callv")])
+
 (define_insn "*call_value_pop_1"
   [(set (match_operand 0 "" "")
 	(call (match_operand:QI 1 "call_insn_operand" "m")
-	      (match_operand:SI 2 "general_operand" "g")))
+	      (match_operand:SI 2 "" "")))
    (set (reg:SI 7) (plus:SI (reg:SI 7)
 			    (match_operand:SI 4 "immediate_operand" "i")))]
   ""
   "*
 {
-  if (constant_call_address_operand (operands[1], GET_MODE (operands[1])))
-    return \"call\\t%P1\";
-  
+  if (constant_call_address_operand (operands[1], QImode))
+    {
+      if (SIBLING_CALL_P (insn))
+	return \"jmp\\t%P1\";
+      else
+	return \"call\\t%P1\";
+    }
   operands[1] = XEXP (operands[1], 0);
-  return \"call\\t%*%1\";
+  if (SIBLING_CALL_P (insn))
+    return \"jmp\\t%*%1\";
+  else
+    return \"call\\t%*%1\";
+}"
+  [(set_attr "type" "callv")])
+
+(define_insn "*call_value_0"
+  [(set (match_operand 0 "" "")
+	(call (match_operand:QI 1 "constant_call_address_operand" "")
+	      (match_operand:SI 2 "" "")))]
+  ""
+  "*
+{
+  if (SIBLING_CALL_P (insn))
+    return \"jmp\\t%P1\";
+  else
+    return \"call\\t%P1\";
 }"
   [(set_attr "type" "callv")])
 
 (define_insn "*call_value_1"
   [(set (match_operand 0 "" "")
 	(call (match_operand:QI 1 "call_insn_operand" "m")
-	      (match_operand:SI 2 "general_operand" "g")))]
-  ;; Operand 2 not used on the i386.
+	      (match_operand:SI 2 "" "")))]
   ""
   "*
 {
-  if (constant_call_address_operand (operands[1], GET_MODE (operands[1])))
+  if (constant_call_address_operand (operands[1], QImode))
     {
       if (SIBLING_CALL_P (insn))
 	return \"jmp\\t%P1\";
       else
 	return \"call\\t%P1\";
     }
-  
   operands[1] = XEXP (operands[1], 0);
   if (SIBLING_CALL_P (insn))
     return \"jmp\\t%*%1\";
-- 
GitLab