]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/65871 (bzhi builtin/intrinsic wrongly assumes bzhi instruction doesn...
authorUros Bizjak <uros@gcc.gnu.org>
Tue, 5 May 2015 04:36:19 +0000 (06:36 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Tue, 5 May 2015 04:36:19 +0000 (06:36 +0200)
PR target/65871
* config/i386/i386.md (*bmi_andn_<mode>_ccno): New pattern.

testsuite/ChangeLog:

PR target/65871
* gcc.target/i386/pr65871-3.c: New test.

From-SVN: r222795

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr65871-3.c [new file with mode: 0644]

index 2ee441424f377fff814aa64405f3ea435e349097..a9920d7c356fe409841e142c943ede44242e583b 100644 (file)
@@ -1,4 +1,9 @@
-2015-05-02  Jan Hubicka  <hubicka@ucw.cz>
+2015-05-05  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/65871
+       * config/i386/i386.md (*bmi_andn_<mode>_ccno): New pattern.
+
+2015-05-04  Jan Hubicka  <hubicka@ucw.cz>
 
        * tree.c (verify_type): Check various uses of TYPE_MAXVAL;
        fix overactive TYPE_MIN_VALUE check and add FIXME for type
 2015-04-29  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/65871
-       * config/i386/i386.md (*bmi_bextr_<mode>_cczonly): New pattern.
-       (*bmi2_bzhi_<mode>3_1_cczonly): Ditto.
+       * config/i386/i386.md (*bmi_bextr_<mode>_ccz): New pattern.
+       (*bmi2_bzhi_<mode>3_1_ccz): Ditto.
        (setcc+movzbl peephole2): Check also clobbered reg.
        (setcc+andl peephole2): Ditto.
 
index 8b0830c7a1b5c004355ffb4902df16dd3ebf40e8..3ce8f411c0ab2569ce031b40379cea561d7e5b7e 100644 (file)
 ;; BMI instructions.
 (define_insn "*bmi_andn_<mode>"
   [(set (match_operand:SWI48 0 "register_operand" "=r,r")
-        (and:SWI48
-          (not:SWI48
-            (match_operand:SWI48 1 "register_operand" "r,r"))
-            (match_operand:SWI48 2 "nonimmediate_operand" "r,m")))
+       (and:SWI48
+         (not:SWI48 (match_operand:SWI48 1 "register_operand" "r,r"))
+         (match_operand:SWI48 2 "nonimmediate_operand" "r,m")))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_BMI"
   "andn\t{%2, %1, %0|%0, %1, %2}"
    (set_attr "btver2_decode" "direct, double")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*bmi_andn_<mode>_ccno"
+  [(set (reg FLAGS_REG)
+       (compare
+         (and:SWI48
+           (not:SWI48 (match_operand:SWI48 1 "register_operand" "r,r"))
+           (match_operand:SWI48 2 "nonimmediate_operand" "r,m"))
+         (const_int 0)))
+   (clobber (match_scratch:SWI48 0 "=r,r"))]
+  "TARGET_BMI && ix86_match_ccmode (insn, CCNOmode)"
+  "andn\t{%2, %1, %0|%0, %1, %2}"
+  [(set_attr "type" "bitmanip")
+   (set_attr "btver2_decode" "direct, double")
+   (set_attr "mode" "<MODE>")])
+
 (define_insn "bmi_bextr_<mode>"
   [(set (match_operand:SWI48 0 "register_operand" "=r,r")
-        (unspec:SWI48 [(match_operand:SWI48 1 "nonimmediate_operand" "r,m")
-                       (match_operand:SWI48 2 "register_operand" "r,r")]
-                       UNSPEC_BEXTR))
+       (unspec:SWI48 [(match_operand:SWI48 1 "nonimmediate_operand" "r,m")
+                      (match_operand:SWI48 2 "register_operand" "r,r")]
+                     UNSPEC_BEXTR))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_BMI"
   "bextr\t{%2, %1, %0|%0, %1, %2}"
    (set_attr "btver2_decode" "direct, double")
    (set_attr "mode" "<MODE>")])
 
-(define_insn "*bmi_bextr_<mode>_cczonly"
+(define_insn "*bmi_bextr_<mode>_ccz"
   [(set (reg:CCZ FLAGS_REG)
        (compare:CCZ
          (unspec:SWI48 [(match_operand:SWI48 1 "nonimmediate_operand" "r,m")
    (set_attr "prefix" "vex")
    (set_attr "mode" "<MODE>")])
 
-(define_insn "*bmi2_bzhi_<mode>3_1_cczonly"
+(define_insn "*bmi2_bzhi_<mode>3_1_ccz"
   [(set (reg:CCZ FLAGS_REG)
        (compare:CCZ
          (zero_extract:SWI48
index 94ee3120469532f91a8285d11d58ba6638544d05..37cdbf965d009c63fe3cbd4c86fd55c995ed9d8c 100644 (file)
@@ -1,3 +1,8 @@
+2015-05-05  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/65871
+       * gcc.target/i386/pr65871-3.c: New test.
+
 2015-05-04  Jeff Law  <law@redhat.com>
 
        Revert:
        scan pattern.
        * gfortran.dg/bound_9.f90:  New test case.
 
-2015-04-29  Uros Bizjak  <ubizjak@gmail.com>
+2015-04-30  Uros Bizjak  <ubizjak@gmail.com>
 
        * g++.dg/ipa/devirt-28a.C: Require LTO effective target.
        * g++.dg/ext/sync-4.C (dg-additional-options): Use -march=pentium
 2015-04-29  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/65871
-       * gcc.target/i386/pr65871-1.c: New test
+       * gcc.target/i386/pr65871-1.c: New test.
        * gcc.target/i386/pr65871-2.c: Ditto.
 
 2015-04-29  Marek Polacek  <polacek@redhat.com>
diff --git a/gcc/testsuite/gcc.target/i386/pr65871-3.c b/gcc/testsuite/gcc.target/i386/pr65871-3.c
new file mode 100644 (file)
index 0000000..c7d9bdd
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mbmi" } */
+
+int foo (int x, int y)
+{
+  if (~x & y)
+    return 1;
+
+  return 0;
+}
+
+int bar (int x, int y)
+{
+  if ((~x & y) > 0)
+    return 1;
+
+  return 0;
+}
+
+/* { dg-final { scan-assembler-not "test" } } */