[PATCH] i386, v2: Optimize blsi followed by comparison [PR98567]

Uros Bizjak ubizjak@gmail.com
Thu Jan 7 10:12:42 GMT 2021


On Thu, Jan 7, 2021 at 10:46 AM Jakub Jelinek <jakub@redhat.com> wrote:
>
> On Thu, Jan 07, 2021 at 10:14:33AM +0100, Uros Bizjak wrote:
> > I wonder if we should also add _cc variant where scratch is used:
>
> So like this then if it passes bootstrap/regtest?
>
> I think both variants are useful, e.g. one could compare the result but
> store it in one of the branches etc.
>
> 2021-01-07  Jakub Jelinek  <jakub@redhat.com>
>
>         PR target/98567
>         * config/i386/i386.md (*bmi_blsi_<mode>_cmp, *bmi_blsi_<mode>_ccno):
>         New define_insn patterns.
>
>         * gcc.target/i386/pr98567-1.c: New test.
>         * gcc.target/i386/pr98567-2.c: New test.

OK.

Thanks,
Uros.

>
> --- gcc/config/i386/i386.md.jj  2021-01-07 09:57:03.711083006 +0100
> +++ gcc/config/i386/i386.md     2021-01-07 10:41:12.763159199 +0100
> @@ -14568,6 +14568,35 @@ (define_insn "*bmi_blsi_<mode>"
>     (set_attr "btver2_decode" "double")
>     (set_attr "mode" "<MODE>")])
>
> +(define_insn "*bmi_blsi_<mode>_cmp"
> +  [(set (reg FLAGS_REG)
> +       (compare
> +         (and:SWI48
> +           (neg:SWI48 (match_operand:SWI48 1 "nonimmediate_operand" "rm"))
> +           (match_dup 1))
> +         (const_int 0)))
> +   (set (match_operand:SWI48 0 "register_operand" "=r")
> +       (and:SWI48 (neg:SWI48 (match_dup 1)) (match_dup 1)))]
> +   "TARGET_BMI && ix86_match_ccmode (insn, CCNOmode)"
> +   "blsi\t{%1, %0|%0, %1}"
> +  [(set_attr "type" "bitmanip")
> +   (set_attr "btver2_decode" "double")
> +   (set_attr "mode" "<MODE>")])
> +
> +(define_insn "*bmi_blsi_<mode>_ccno"
> +  [(set (reg FLAGS_REG)
> +       (compare
> +         (and:SWI48
> +           (neg:SWI48 (match_operand:SWI48 1 "nonimmediate_operand" "rm"))
> +           (match_dup 1))
> +         (const_int 0)))
> +   (clobber (match_scratch:SWI48 0 "=r"))]
> +   "TARGET_BMI && ix86_match_ccmode (insn, CCNOmode)"
> +   "blsi\t{%1, %0|%0, %1}"
> +  [(set_attr "type" "bitmanip")
> +   (set_attr "btver2_decode" "double")
> +   (set_attr "mode" "<MODE>")])
> +
>  (define_insn "*bmi_blsmsk_<mode>"
>    [(set (match_operand:SWI48 0 "register_operand" "=r")
>          (xor:SWI48
> --- gcc/testsuite/gcc.target/i386/pr98567-1.c.jj        2021-01-07 10:35:01.123354599 +0100
> +++ gcc/testsuite/gcc.target/i386/pr98567-1.c   2021-01-07 10:35:01.123354599 +0100
> @@ -0,0 +1,31 @@
> +/* PR target/98567 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mbmi -fno-stack-protector" } */
> +/* { dg-final { scan-assembler-times "\tblsi" 4 } } */
> +/* { dg-final { scan-assembler-times "\tsetne\t" 2 } } */
> +/* { dg-final { scan-assembler-times "\tsete\t" 2 } } */
> +/* { dg-final { scan-assembler-not "\ttest\[ld]" } } */
> +
> +int
> +foo (unsigned long x)
> +{
> +  return (-x & x) == 0;
> +}
> +
> +int
> +bar (unsigned int x)
> +{
> +  return (-x & x) == 0;
> +}
> +
> +int
> +baz (unsigned long x)
> +{
> +  return (x & -x) != 0;
> +}
> +
> +int
> +qux (unsigned int x)
> +{
> +  return 0 != (x & -x);
> +}
> --- gcc/testsuite/gcc.target/i386/pr98567-2.c.jj        2021-01-07 10:35:01.124354588 +0100
> +++ gcc/testsuite/gcc.target/i386/pr98567-2.c   2021-01-07 10:35:01.124354588 +0100
> @@ -0,0 +1,31 @@
> +/* PR target/98567 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mbmi -fno-stack-protector" } */
> +/* { dg-final { scan-assembler-times "\tblsi" 4 } } */
> +/* { dg-final { scan-assembler-times "\tsetle\t" 2 } } */
> +/* { dg-final { scan-assembler-times "\tsetg\t" 2 } } */
> +/* { dg-final { scan-assembler-not "\ttest\[ld]" } } */
> +
> +int
> +foo (unsigned long x)
> +{
> +  return 0 >= (int) (-x & x);
> +}
> +
> +int
> +bar (unsigned int x)
> +{
> +  return (int) (-x & x) <= 0;
> +}
> +
> +int
> +baz (unsigned long x)
> +{
> +  return (int) (x & -x) > 0;
> +}
> +
> +int
> +qux (unsigned int x)
> +{
> +  return 0 < (int) (x & -x);
> +}
>
>
>         Jakub
>


More information about the Gcc-patches mailing list