diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2018-03-26 21:26:19 +0200 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2018-03-26 21:26:19 +0200 |
commit | 2903ad2d599eeba2c32fd2b07b6d697950c84c6e (patch) | |
tree | 0b66f8bc70d52bb5ea2ea3af859e6494a268a1e0 /gcc | |
parent | 125c297c69ffe620caa66a9aed3db6287b8f5b33 (diff) | |
download | gcc-2903ad2d599eeba2c32fd2b07b6d697950c84c6e.zip gcc-2903ad2d599eeba2c32fd2b07b6d697950c84c6e.tar.gz gcc-2903ad2d599eeba2c32fd2b07b6d697950c84c6e.tar.bz2 |
re PR target/85073 ([x86] extra check after BLSR)
PR target/85073
* config/i386/i386.md (*bmi_blsr_<mode>_cmp): New insn pattern.
(*bmi_blsr_<mode>_ccz): Ditto.
testsuite/ChangeLog:
PR target/85073
* gcc.target/i386/pr85073.c: New test.
From-SVN: r258864
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 37 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr85073.c | 18 |
4 files changed, 66 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a8d9e76..e2a809c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-03-26 Uros Bizjak <ubizjak@gmail.com> + + PR target/85073 + * config/i386/i386.md (*bmi_blsr_<mode>_cmp): New insn pattern. + (*bmi_blsr_<mode>_ccz): Ditto. + 2018-03-26 Tom de Vries <tom@codesourcery.com> PR tree-optimization/85063 diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 2b73e8f..5eb9e2f 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -13774,6 +13774,43 @@ (set_attr "btver2_decode" "double") (set_attr "mode" "<MODE>")]) +(define_insn "*bmi_blsr_<mode>_cmp" + [(set (reg:CCZ FLAGS_REG) + (compare:CCZ + (and:SWI48 + (plus:SWI48 + (match_operand:SWI48 1 "nonimmediate_operand" "rm") + (const_int -1)) + (match_dup 1)) + (const_int 0))) + (set (match_operand:SWI48 0 "register_operand" "=r") + (and:SWI48 + (plus:SWI48 + (match_dup 1) + (const_int -1)) + (match_dup 1)))] + "TARGET_BMI" + "blsr\t{%1, %0|%0, %1}" + [(set_attr "type" "bitmanip") + (set_attr "btver2_decode" "double") + (set_attr "mode" "<MODE>")]) + +(define_insn "*bmi_blsr_<mode>_ccz" + [(set (reg:CCZ FLAGS_REG) + (compare:CCZ + (and:SWI48 + (plus:SWI48 + (match_operand:SWI48 1 "nonimmediate_operand" "rm") + (const_int -1)) + (match_dup 1)) + (const_int 0))) + (clobber (match_scratch:SWI48 0 "=r"))] + "TARGET_BMI" + "blsr\t{%1, %0|%0, %1}" + [(set_attr "type" "bitmanip") + (set_attr "btver2_decode" "double") + (set_attr "mode" "<MODE>")]) + ;; BMI2 instructions. (define_expand "bmi2_bzhi_<mode>3" [(parallel diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fd7345b..857870a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-26 Uros Bizjak <ubizjak@gmail.com> + + PR target/85073 + * gcc.target/i386/pr85073.c: New test. + 2018-03-26 Richard Biener <rguenther@suse.de> PR testsuite/85066 diff --git a/gcc/testsuite/gcc.target/i386/pr85073.c b/gcc/testsuite/gcc.target/i386/pr85073.c new file mode 100644 index 0000000..187102d --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr85073.c @@ -0,0 +1,18 @@ +/* PR target/85073 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mbmi" } */ + +int +foo (unsigned x) +{ + int c = 0; + while (x) + { + c += 1; + x = (x - 1) & x; + } + + return c; +} + +/* { dg-final { scan-assembler-times "test" 1 } } */ |