OSDN Git Service

* i386.md (call_pop_0, call_value_pop_0): New.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 27 Mar 2000 19:19:14 +0000 (19:19 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 27 Mar 2000 19:19:14 +0000 (19:19 +0000)
        (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
gcc/config/i386/i386.md

index 9b899a2..9bbae4b 100644 (file)
@@ -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
index b188d91..2b48b0a 100644 (file)
     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")])
 
     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\";
 ;; 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\";