Ping! Please review.
Thanks,
Avinash
On Fri, 2025-12-05 at 17:40 +0530, Avinash Jayakar wrote:
> Hi,
>
> A small patch to fix PR119468. Bootstrapped and regtested on
> powerpc64le-linux. Ok for trunk?
>
> Thanks and regards,
> Avinash Jayakar
>
> This patch aims to fix PR119468 by emitting better code for parity
> builtin. Currently the following code:
>
> bool parity(unsigned long long l)
> {
> return __builtin_parityll(l);
> }
> with O2 flag and even if the target supports popcntd emits,
> popcntb 3,3
> prtyd 3,3
> extsw 3,3
>
> With this patch, if there is support for popcntd (2.06) instruction,
> we emit
> popcntd 3,3
> rldicl 3,3,0,63
> Making use of the existing instruction and reducing the latency
> compared
> to existing code generated.
>
> 2025-12-05 Avinash Jayakar <[email protected]>
>
> gcc/ChangeLog:
> PR 119468
> * config/rs6000/rs6000.cc (rs6000_emit_parity): Add code to
> generate popcntd if available.
>
> gcc/testsuite/ChangeLog:
> PR target/119468
> * gcc.target/powerpc/pr119468.c: New test.
> ---
> gcc/config/rs6000/rs6000.cc | 8 ++++++++
> gcc/testsuite/gcc.target/powerpc/pr119468.c | 16 ++++++++++++++++
> 2 files changed, 24 insertions(+)
> create mode 100644 gcc/testsuite/gcc.target/powerpc/pr119468.c
>
> diff --git a/gcc/config/rs6000/rs6000.cc
> b/gcc/config/rs6000/rs6000.cc
> index bf899adc531..c9b2d88a363 100644
> --- a/gcc/config/rs6000/rs6000.cc
> +++ b/gcc/config/rs6000/rs6000.cc
> @@ -23233,6 +23233,14 @@ rs6000_emit_parity (rtx dst, rtx src)
>
> tmp = gen_reg_rtx (mode);
>
> + /* Use ISA 2.06 insn popcntd if we can. */
> + if (mode == DImode && TARGET_POPCNTD)
> + {
> + emit_insn (gen_popcntddi2 (tmp, src));
> + emit_insn (gen_anddi3 (dst, tmp, const1_rtx));
> + return;
> + }
> +
> /* Use the PPC ISA 2.05 prtyw/prtyd instruction if we can. */
> if (TARGET_CMPB)
> {
> diff --git a/gcc/testsuite/gcc.target/powerpc/pr119468.c
> b/gcc/testsuite/gcc.target/powerpc/pr119468.c
> new file mode 100644
> index 00000000000..f43319210b7
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/pr119468.c
> @@ -0,0 +1,16 @@
> +/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
> +/* { dg-options "-O2 -mdejagnu-cpu=power7" } */
> +
> +bool foo(unsigned long long x)
> +{
> + return __builtin_parityll(x);
> +}
> +
> +bool parity2(unsigned long long l)
> +{
> + return __builtin_popcountll(l) & 1;
> +}
> +
> +/* { dg-final { scan-assembler-times "popcntd" 2 } } */
> +/* { dg-final { scan-assembler-not "popcntb" } } */
> +/* { dg-final { scan-assembler-times "rldicl" 2 } } */