aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2015-04-29 20:53:19 +0200
committerUros Bizjak <uros@gcc.gnu.org>2015-04-29 20:53:19 +0200
commit3c908a5b5c5bf5693dd2c5a3f1858867d1b96034 (patch)
treedae6a7281ef2669aa08033f45b2d5e5ac0d04dcf
parent716c0ba6bf36efd36fff564f42f1b121720cc611 (diff)
downloadgcc-3c908a5b5c5bf5693dd2c5a3f1858867d1b96034.zip
gcc-3c908a5b5c5bf5693dd2c5a3f1858867d1b96034.tar.gz
gcc-3c908a5b5c5bf5693dd2c5a3f1858867d1b96034.tar.bz2
re PR target/65871 (bzhi builtin/intrinsic wrongly assumes bzhi instruction doesn't set the ZF flag)
PR target/65871 * config/i386/i386.md (*bmi_bextr_<mode>_cczonly): New pattern. (*bmi2_bzhi_<mode>3_1_cczonly): Ditto. testsuite/ChangeLog: PR target/65871 * gcc.target/i386/pr65871-1.c: New test * gcc.target/i386/pr65871-2.c: Ditto. From-SVN: r222588
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.md32
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.target/i386/pr65871-1.c12
-rw-r--r--gcc/testsuite/gcc.target/i386/pr65871-2.c12
5 files changed, 68 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d7455e4..4c95a75 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
2015-04-29 Thomas Schwinge <thomas@codesourcery.com>
PR libgomp/65099
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 937871a..060ffa8 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -12594,6 +12594,20 @@
(set_attr "btver2_decode" "direct, double")
(set_attr "mode" "<MODE>")])
+(define_insn "*bmi_bextr_<mode>_cczonly"
+ [(set (reg:CCZ FLAGS_REG)
+ (compare:CCZ
+ (unspec:SWI48 [(match_operand:SWI48 1 "nonimmediate_operand" "r,m")
+ (match_operand:SWI48 2 "register_operand" "r,r")]
+ UNSPEC_BEXTR)
+ (const_int 0)))
+ (clobber (match_scratch:SWI48 0 "=r,r"))]
+ "TARGET_BMI"
+ "bextr\t{%2, %1, %0|%0, %1, %2}"
+ [(set_attr "type" "bitmanip")
+ (set_attr "btver2_decode" "direct, double")
+ (set_attr "mode" "<MODE>")])
+
(define_insn "*bmi_blsi_<mode>"
[(set (match_operand:SWI48 0 "register_operand" "=r")
(and:SWI48
@@ -12667,6 +12681,7 @@
(set_attr "mode" "<MODE>")])
(define_mode_attr k [(SI "k") (DI "q")])
+
(define_insn "*bmi2_bzhi_<mode>3_1"
[(set (match_operand:SWI48 0 "register_operand" "=r")
(zero_extract:SWI48
@@ -12682,6 +12697,23 @@
(set_attr "prefix" "vex")
(set_attr "mode" "<MODE>")])
+(define_insn "*bmi2_bzhi_<mode>3_1_cczonly"
+ [(set (reg:CCZ FLAGS_REG)
+ (compare:CCZ
+ (zero_extract:SWI48
+ (match_operand:SWI48 1 "nonimmediate_operand" "rm")
+ (umin:SWI48
+ (zero_extend:SWI48 (match_operand:QI 2 "register_operand" "r"))
+ (match_operand:SWI48 3 "const_int_operand" "n"))
+ (const_int 0))
+ (const_int 0)))
+ (clobber (match_scratch:SWI48 0 "=r"))]
+ "TARGET_BMI2 && INTVAL (operands[3]) == <MODE_SIZE> * BITS_PER_UNIT"
+ "bzhi\t{%<k>2, %1, %0|%0, %1, %<k>2}"
+ [(set_attr "type" "bitmanip")
+ (set_attr "prefix" "vex")
+ (set_attr "mode" "<MODE>")])
+
(define_insn "bmi2_pdep_<mode>3"
[(set (match_operand:SWI48 0 "register_operand" "=r")
(unspec:SWI48 [(match_operand:SWI48 1 "register_operand" "r")
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7ff9566..9d428f8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2015-04-29 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/65871
+ * gcc.target/i386/pr65871-1.c: New test
+ * gcc.target/i386/pr65871-2.c: Ditto.
+
2015-04-29 Marek Polacek <polacek@redhat.com>
PR c/64610
diff --git a/gcc/testsuite/gcc.target/i386/pr65871-1.c b/gcc/testsuite/gcc.target/i386/pr65871-1.c
new file mode 100644
index 0000000..d76181e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr65871-1.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mbmi" } */
+
+int foo (unsigned int x, unsigned int y)
+{
+ if (__builtin_ia32_bextr_u32 (x, y))
+ return 1;
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler-not "test" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr65871-2.c b/gcc/testsuite/gcc.target/i386/pr65871-2.c
new file mode 100644
index 0000000..e6538cc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr65871-2.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mbmi2" } */
+
+int foo (unsigned int x, unsigned int y)
+{
+ if (__builtin_ia32_bzhi_si (x, y))
+ return 1;
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler-not "test" } } */