i386: Use bzhi for x & ((1 << y) - 1) or x & ((1U << y) - 1) [PR93346]
authorJakub Jelinek <jakub@redhat.com>
Thu, 23 Jan 2020 11:39:13 +0000 (12:39 +0100)
committerJakub Jelinek <jakub@redhat.com>
Thu, 23 Jan 2020 11:39:13 +0000 (12:39 +0100)
commit9592f639ff4655203f1cffb7c6752696e2721fb0
tree949dba7cd858fa9cea9afc9746505573a3054489
parent8a990ffafaaa18981c6e91d4ed88f05ed74c5f3f
i386: Use bzhi for x & ((1 << y) - 1) or x & ((1U << y) - 1) [PR93346]

The bzhi patterns are quite complicated because they need to accurately
describe the behavior of the instruction for all input values.
The following patterns are simple and make bzhi recognizable even for
cases where not all input values are valid, because the user used
a shift, in which case the low 8 bit of the last operand need to be in
between 0 and precision-1.

2020-01-23  Jakub Jelinek  <jakub@redhat.com>

PR target/93346
* config/i386/i386.md (*bmi2_bzhi_<mode>3_2, *bmi2_bzhi_<mode>3_3):
New define_insn patterns.

* gcc.target/i386/pr93346.c: New test.
gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr93346.c [new file with mode: 0644]