Hello!

Similar to tls_symbolic_operand and tls_modbase_operand, we are not
interested in the mode of the operand in the predicate.

2012-03-13  Uros Bizjak  <ubiz...@gmail.com>

        * config/i386/predicates.md (constant_call_address_operand): Declare
        as special predicate.  Update all uses.
        * config/i386/i386.md: Remove mode from constant_call_address_operand
        predicates.
        * config/i386/i386.c (ix86_output_call_insn): Call
        constant_call_address_operand with VOIDmode.

Tested on x86_64-pc-linux-gnu {,-m32}, committed to mainline SVN.

Uros.
Index: i386.md
===================================================================
--- i386.md     (revision 185341)
+++ i386.md     (working copy)
@@ -12592,7 +12592,7 @@
        (unspec:SI
         [(match_operand:SI 1 "register_operand" "b")
          (match_operand 2 "tls_symbolic_operand" "")
-         (match_operand:SI 3 "constant_call_address_operand" "z")]
+         (match_operand 3 "constant_call_address_operand" "z")]
         UNSPEC_TLS_GD))
    (clobber (match_scratch:SI 4 "=d"))
    (clobber (match_scratch:SI 5 "=c"))
@@ -12617,7 +12617,7 @@
     [(set (match_operand:SI 0 "register_operand" "")
          (unspec:SI [(match_operand:SI 2 "register_operand" "")
                      (match_operand 1 "tls_symbolic_operand" "")
-                     (match_operand:SI 3 "constant_call_address_operand" "")]
+                     (match_operand 3 "constant_call_address_operand" "")]
                     UNSPEC_TLS_GD))
      (clobber (match_scratch:SI 4 ""))
      (clobber (match_scratch:SI 5 ""))
@@ -12626,8 +12626,8 @@
 (define_insn "*tls_global_dynamic_64_<mode>"
   [(set (match_operand:P 0 "register_operand" "=a")
        (call:P
-        (mem:QI (match_operand:P 2 "constant_call_address_operand" "z"))
-        (match_operand:P 3 "" "")))
+        (mem:QI (match_operand 2 "constant_call_address_operand" "z"))
+        (match_operand 3 "" "")))
    (unspec:P [(match_operand 1 "tls_symbolic_operand" "")]
             UNSPEC_TLS_GD)]
   "TARGET_64BIT"
@@ -12650,7 +12650,7 @@
   [(parallel
     [(set (match_operand:P 0 "register_operand" "")
          (call:P
-          (mem:QI (match_operand:P 2 "constant_call_address_operand" ""))
+          (mem:QI (match_operand 2 "constant_call_address_operand" ""))
           (const_int 0)))
      (unspec:P [(match_operand 1 "tls_symbolic_operand" "")]
               UNSPEC_TLS_GD)])]
@@ -12660,7 +12660,7 @@
   [(set (match_operand:SI 0 "register_operand" "=a")
        (unspec:SI
         [(match_operand:SI 1 "register_operand" "b")
-         (match_operand:SI 2 "constant_call_address_operand" "z")]
+         (match_operand 2 "constant_call_address_operand" "z")]
         UNSPEC_TLS_LD_BASE))
    (clobber (match_scratch:SI 3 "=d"))
    (clobber (match_scratch:SI 4 "=c"))
@@ -12685,7 +12685,7 @@
      [(set (match_operand:SI 0 "register_operand" "")
           (unspec:SI
            [(match_operand:SI 1 "register_operand" "")
-            (match_operand:SI 2 "constant_call_address_operand" "")]
+            (match_operand 2 "constant_call_address_operand" "")]
            UNSPEC_TLS_LD_BASE))
       (clobber (match_scratch:SI 3 ""))
       (clobber (match_scratch:SI 4 ""))
@@ -12694,8 +12694,8 @@
 (define_insn "*tls_local_dynamic_base_64_<mode>"
   [(set (match_operand:P 0 "register_operand" "=a")
        (call:P
-        (mem:QI (match_operand:P 1 "constant_call_address_operand" "z"))
-        (match_operand:P 2 "" "")))
+        (mem:QI (match_operand 1 "constant_call_address_operand" "z"))
+        (match_operand 2 "" "")))
    (unspec:P [(const_int 0)] UNSPEC_TLS_LD_BASE)]
   "TARGET_64BIT"
 {
@@ -12712,7 +12712,7 @@
   [(parallel
      [(set (match_operand:P 0 "register_operand" "")
           (call:P
-           (mem:QI (match_operand:P 1 "constant_call_address_operand" ""))
+           (mem:QI (match_operand 1 "constant_call_address_operand" ""))
            (const_int 0)))
       (unspec:P [(const_int 0)] UNSPEC_TLS_LD_BASE)])]
   "TARGET_64BIT")
@@ -12724,7 +12724,7 @@
   [(set (match_operand:SI 0 "register_operand" "=a")
        (plus:SI
         (unspec:SI [(match_operand:SI 1 "register_operand" "b")
-                    (match_operand:SI 2 "constant_call_address_operand" "z")]
+                    (match_operand 2 "constant_call_address_operand" "z")]
                    UNSPEC_TLS_LD_BASE)
         (const:SI (unspec:SI
                    [(match_operand 3 "tls_symbolic_operand" "")]
Index: i386.c
===================================================================
--- i386.c      (revision 185343)
+++ i386.c      (working copy)
@@ -23121,7 +23121,7 @@
 const char *
 ix86_output_call_insn (rtx insn, rtx call_op)
 {
-  bool direct_p = constant_call_address_operand (call_op, Pmode);
+  bool direct_p = constant_call_address_operand (call_op, VOIDmode);
   bool seh_nop_p = false;
   const char *xasm;
 
Index: predicates.md
===================================================================
--- predicates.md       (revision 185341)
+++ predicates.md       (working copy)
@@ -500,7 +500,7 @@
        (match_test "op == ix86_tls_module_base ()")))
 
 ;; Test for a pc-relative call operand
-(define_predicate "constant_call_address_operand"
+(define_special_predicate "constant_call_address_operand"
   (match_code "symbol_ref")
 {
   if (ix86_cmodel == CM_LARGE || ix86_cmodel == CM_LARGE_PIC)
@@ -573,16 +573,14 @@
 ;; Test for a valid operand for a call instruction.
 ;; Allow constant call address operands in Pmode only.
 (define_special_predicate "call_insn_operand"
-  (ior (match_test "constant_call_address_operand
-                    (op, mode == VOIDmode ? mode : Pmode)")
+  (ior (match_operand 0 "constant_call_address_operand")
        (match_operand 0 "call_register_no_elim_operand")
        (and (not (match_test "TARGET_X32"))
            (match_operand 0 "memory_operand"))))
 
 ;; Similarly, but for tail calls, in which we cannot allow memory references.
 (define_special_predicate "sibcall_insn_operand"
-  (ior (match_test "constant_call_address_operand
-                    (op, mode == VOIDmode ? mode : Pmode)")
+  (ior (match_operand 0 "constant_call_address_operand")
        (match_operand 0 "register_no_elim_operand")))
 
 ;; Match exactly zero.

Reply via email to