i386.md (*and<mode>_1): Merge insn pattern from *andsi_1 and *andhi_1 using SWI24...
authorUros Bizjak <ubizjak@gmail.com>
Mon, 28 Nov 2016 23:21:43 +0000 (00:21 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Mon, 28 Nov 2016 23:21:43 +0000 (00:21 +0100)
* config/i386/i386.md (*and<mode>_1): Merge insn pattern from
*andsi_1 and *andhi_1 using SWI24 mode iterator.  Use multi-line
output template string.
(*anddi_1): Use multi-line output template string.
(*andqi_1): Ditto.

From-SVN: r242938

gcc/ChangeLog
gcc/config/i386/i386.md

index f62f7cb95cba8cdbbca6f3b83a30c55335d9c5e6..5ce50b04f55f75a71998d71df3f33e64db95d308 100644 (file)
@@ -1,3 +1,11 @@
+2016-11-28  Uros Bizjak  <ubizjak@gmail.com>
+
+       * config/i386/i386.md (*and<mode>_1): Merge insn pattern from
+       *andsi_1 and *andhi_1 using SWI24 mode iterator.  Use multi-line
+       output template string.
+       (*anddi_1): Use multi-line output template string.
+       (*andqi_1): Ditto.
+
 2016-11-28  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/78540
index 123c4b8ccbd307bf1dff53a382cd707d5048d670..d7cce66d8417b75ca8d647435bf618bb2e70e435 100644 (file)
         (match_operand:DI 2 "x86_64_szext_general_operand" "Z,re,rm,L")))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_64BIT && ix86_binary_operator_ok (AND, DImode, operands)"
-{
-  switch (get_attr_type (insn))
-    {
-    case TYPE_IMOVX:
-      return "#";
-
-    default:
-      gcc_assert (rtx_equal_p (operands[0], operands[1]));
-      if (get_attr_mode (insn) == MODE_SI)
-       return "and{l}\t{%k2, %k0|%k0, %k2}";
-      else
-       return "and{q}\t{%2, %0|%0, %2}";
-    }
-}
+  "@
+   and{l}\t{%k2, %k0|%k0, %k2}
+   and{q}\t{%2, %0|%0, %2}
+   and{q}\t{%2, %0|%0, %2}
+   #"
   [(set_attr "type" "alu,alu,alu,imovx")
    (set_attr "length_immediate" "*,*,*,0")
    (set (attr "prefix_rex")
   [(set_attr "type" "alu")
    (set_attr "mode" "SI")])
 
-(define_insn "*andsi_1"
-  [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,r,Ya")
-       (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,qm")
-               (match_operand:SI 2 "x86_64_general_operand" "re,rm,L")))
+(define_insn "*and<mode>_1"
+  [(set (match_operand:SWI24 0 "nonimmediate_operand" "=rm,r,Ya")
+       (and:SWI24 (match_operand:SWI24 1 "nonimmediate_operand" "%0,0,qm")
+                  (match_operand:SWI24 2 "<general_operand>" "r<i>,rm,L")))
    (clobber (reg:CC FLAGS_REG))]
-  "ix86_binary_operator_ok (AND, SImode, operands)"
-{
-  switch (get_attr_type (insn))
-    {
-    case TYPE_IMOVX:
-      return "#";
-
-    default:
-      gcc_assert (rtx_equal_p (operands[0], operands[1]));
-      return "and{l}\t{%2, %0|%0, %2}";
-    }
-}
+  "ix86_binary_operator_ok (AND, <MODE>mode, operands)"
+  "@
+   and{<imodesuffix>}\t{%2, %0|%0, %2}
+   and{<imodesuffix>}\t{%2, %0|%0, %2}
+   #"
   [(set_attr "type" "alu,alu,imovx")
+   (set_attr "length_immediate" "*,*,0")
    (set (attr "prefix_rex")
      (if_then_else
        (and (eq_attr "type" "imovx")
                 (match_operand 1 "ext_QIreg_operand")))
        (const_string "1")
        (const_string "*")))
-   (set_attr "length_immediate" "*,*,0")
-   (set_attr "mode" "SI")])
-
-(define_insn "*andhi_1"
-  [(set (match_operand:HI 0 "nonimmediate_operand" "=rm,r,Ya")
-       (and:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,qm")
-               (match_operand:HI 2 "general_operand" "rn,rm,L")))
-   (clobber (reg:CC FLAGS_REG))]
-  "ix86_binary_operator_ok (AND, HImode, operands)"
-{
-  switch (get_attr_type (insn))
-    {
-    case TYPE_IMOVX:
-      return "#";
-
-    default:
-      gcc_assert (rtx_equal_p (operands[0], operands[1]));
-      return "and{w}\t{%2, %0|%0, %2}";
-    }
-}
-  [(set_attr "type" "alu,alu,imovx")
-   (set_attr "length_immediate" "*,*,0")
-   (set (attr "prefix_rex")
-     (if_then_else
-       (and (eq_attr "type" "imovx")
-           (match_operand 1 "ext_QIreg_operand"))
-       (const_string "1")
-       (const_string "*")))
-   (set_attr "mode" "HI,HI,SI")])
+   (set_attr "mode" "<MODE>,<MODE>,SI")])
 
 (define_insn "*andqi_1"
   [(set (match_operand:QI 0 "nonimmediate_operand" "=qm,q,r")
                (match_operand:QI 2 "general_operand" "qn,qmn,rn")))
    (clobber (reg:CC FLAGS_REG))]
   "ix86_binary_operator_ok (AND, QImode, operands)"
-{
-  switch (which_alternative)
-    {
-    case 0:
-    case 1:
-      return "and{b}\t{%2, %0|%0, %2}";
-    case 2:
-      return "and{l}\t{%k2, %k0|%k0, %k2}";
-    default:
-      gcc_unreachable ();
-    }
-}
+  "@
+   and{b}\t{%2, %0|%0, %2}
+   and{b}\t{%2, %0|%0, %2}
+   and{l}\t{%k2, %k0|%k0, %k2}"
   [(set_attr "type" "alu")
    (set_attr "mode" "QI,QI,SI")
    ;; Potential partial reg stall on alternative 2.