> On 29 Jul 2025, at 18:41, Richard Sandiford <richard.sandif...@arm.com> wrote:
> 
> Patterns that fuse a predicate operation P with a PTEST use
> aarch64_sve_same_pred_for_ptest_p to test whether the governing
> predicates of P and the PTEST are compatible.  Most patterns were also
> written as define_insn_and_rewrites, with the rewrite replacing P's
> original governing predicate with PTEST's.  This ensures that we don't,
> for example, have both a .H PTRUE for the PTEST and a .B PTRUE for a
> comparison that feeds the PTEST.
> 
> The svcmp_wide* patterns were missing this rewrite, meaning that we did
> have redundant PTRUEs.
> 

Ok.
Thanks,
Kyrill

> gcc/
> * config/aarch64/aarch64-sve.md
> (*aarch64_pred_cmp<cmp_op><mode>_wide_cc): Turn into a
> define_insn_and_rewrite and rewrite the governing predicate
> of the comparison so that it is identical to the PTEST's.
> (*aarch64_pred_cmp<cmp_op><mode>_wide_ptest): Likewise.
> 
> gcc/testsuite/
> * gcc.target/aarch64/sve/acle/general/cmpeq_1.c: Check the number
> of PTRUEs.
> * gcc.target/aarch64/sve/acle/general/cmpge_5.c: New test.
> * gcc.target/aarch64/sve/acle/general/cmpge_6.c: Likewise.
> * gcc.target/aarch64/sve/acle/general/cmpgt_5.c: Likewise.
> * gcc.target/aarch64/sve/acle/general/cmpgt_6.c: Likewise.
> * gcc.target/aarch64/sve/acle/general/cmple_5.c: Likewise.
> * gcc.target/aarch64/sve/acle/general/cmple_6.c: Likewise.
> * gcc.target/aarch64/sve/acle/general/cmplt_5.c: Likewise.
> * gcc.target/aarch64/sve/acle/general/cmplt_6.c: Likewise.
> * gcc.target/aarch64/sve/acle/general/cmpne_3.c: Likewise.
> ---
> gcc/config/aarch64/aarch64-sve.md             | 14 +++-
> .../aarch64/sve/acle/general/cmpeq_1.c        |  1 +
> .../aarch64/sve/acle/general/cmpge_5.c        | 74 +++++++++++++++++++
> .../aarch64/sve/acle/general/cmpge_6.c        | 74 +++++++++++++++++++
> .../aarch64/sve/acle/general/cmpgt_5.c        | 74 +++++++++++++++++++
> .../aarch64/sve/acle/general/cmpgt_6.c        | 74 +++++++++++++++++++
> .../aarch64/sve/acle/general/cmple_5.c        | 74 +++++++++++++++++++
> .../aarch64/sve/acle/general/cmple_6.c        | 74 +++++++++++++++++++
> .../aarch64/sve/acle/general/cmplt_5.c        | 74 +++++++++++++++++++
> .../aarch64/sve/acle/general/cmplt_6.c        | 74 +++++++++++++++++++
> .../aarch64/sve/acle/general/cmpne_3.c        | 74 +++++++++++++++++++
> 11 files changed, 679 insertions(+), 2 deletions(-)
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpge_5.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpge_6.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpgt_5.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpgt_6.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmple_5.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmple_6.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmplt_5.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmplt_6.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpne_3.c
> 
> diff --git a/gcc/config/aarch64/aarch64-sve.md 
> b/gcc/config/aarch64/aarch64-sve.md
> index 997c340a725..1a37ece49ac 100644
> --- a/gcc/config/aarch64/aarch64-sve.md
> +++ b/gcc/config/aarch64/aarch64-sve.md
> @@ -8627,7 +8627,7 @@ (define_insn "@aarch64_pred_cmp<cmp_op><mode>_wide"
> 
> ;; Predicated integer wide comparisons in which both the flag and
> ;; predicate results are interesting.
> -(define_insn "*aarch64_pred_cmp<cmp_op><mode>_wide_cc"
> +(define_insn_and_rewrite "*aarch64_pred_cmp<cmp_op><mode>_wide_cc"
>   [(set (reg:CC_NZC CC_REGNUM)
> (unspec:CC_NZC
>  [(match_operand:VNx16BI 1 "register_operand")
> @@ -8658,11 +8658,16 @@ (define_insn "*aarch64_pred_cmp<cmp_op><mode>_wide_cc"
>      [ ?Upl    ,  0  , w, w, Upl; yes                 ] ^
>      [ Upa     ,  Upl, w, w, Upl; no                  ] ^
>   }
> +  "&& !rtx_equal_p (operands[4], operands[6])"
> +  {
> +    operands[6] = copy_rtx (operands[4]);
> +    operands[7] = operands[5];
> +  }
> )
> 
> ;; Predicated integer wide comparisons in which only the flags result
> ;; is interesting.
> -(define_insn "*aarch64_pred_cmp<cmp_op><mode>_wide_ptest"
> +(define_insn_and_rewrite "*aarch64_pred_cmp<cmp_op><mode>_wide_ptest"
>   [(set (reg:CC_NZC CC_REGNUM)
> (unspec:CC_NZC
>  [(match_operand:VNx16BI 1 "register_operand")
> @@ -8685,6 +8690,11 @@ (define_insn 
> "*aarch64_pred_cmp<cmp_op><mode>_wide_ptest"
>      [ ?Upl     ,  0  , w, w, Upl; yes                 ] ^
>      [ Upa      ,  Upl, w, w, Upl; no                  ] ^
>   }
> +  "&& !rtx_equal_p (operands[4], operands[6])"
> +  {
> +    operands[6] = copy_rtx (operands[4]);
> +    operands[7] = operands[5];
> +  }
> )
> 
> ;; -------------------------------------------------------------------------
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpeq_1.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpeq_1.c
> index c73d10959fa..d6aabc8317f 100644
> --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpeq_1.c
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpeq_1.c
> @@ -70,4 +70,5 @@ test8 (svint32_t x, svint64_t y, int *any)
> }
> 
> /* { dg-final { scan-assembler-times {\tcmpeq\t} 8 } } */
> +/* { dg-final { scan-assembler-times {\tptrue\t} 6 } } */
> /* { dg-final { scan-assembler-not {\tptest\t} } } */
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpge_5.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpge_5.c
> new file mode 100644
> index 00000000000..f4fa7584cbc
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpge_5.c
> @@ -0,0 +1,74 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +#include <arm_sve.h>
> +
> +void
> +test1 (svbool_t pg, svint8_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test2 (svbool_t pg, svint8_t x, svint64_t y, int *any)
> +{
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test3 (svint8_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test4 (svint8_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test5 (svint16_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test6 (svint16_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test7 (svint32_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test8 (svint32_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +/* { dg-final { scan-assembler-times {\tcmpge\t} 8 } } */
> +/* { dg-final { scan-assembler-times {\tptrue\t} 6 } } */
> +/* { dg-final { scan-assembler-not {\tptest\t} } } */
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpge_6.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpge_6.c
> new file mode 100644
> index 00000000000..979db4cf570
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpge_6.c
> @@ -0,0 +1,74 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +#include <arm_sve.h>
> +
> +void
> +test1 (svbool_t pg, svuint8_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test2 (svbool_t pg, svuint8_t x, svuint64_t y, int *any)
> +{
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test3 (svuint8_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test4 (svuint8_t x, svuint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test5 (svuint16_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test6 (svuint16_t x, svuint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test7 (svuint32_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test8 (svuint32_t x, svuint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmpge_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +/* { dg-final { scan-assembler-times {\tcmphs\t} 8 } } */
> +/* { dg-final { scan-assembler-times {\tptrue\t} 6 } } */
> +/* { dg-final { scan-assembler-not {\tptest\t} } } */
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpgt_5.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpgt_5.c
> new file mode 100644
> index 00000000000..f9f4c7dd060
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpgt_5.c
> @@ -0,0 +1,74 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +#include <arm_sve.h>
> +
> +void
> +test1 (svbool_t pg, svint8_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test2 (svbool_t pg, svint8_t x, svint64_t y, int *any)
> +{
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test3 (svint8_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test4 (svint8_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test5 (svint16_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test6 (svint16_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test7 (svint32_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test8 (svint32_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +/* { dg-final { scan-assembler-times {\tcmpgt\t} 8 } } */
> +/* { dg-final { scan-assembler-times {\tptrue\t} 6 } } */
> +/* { dg-final { scan-assembler-not {\tptest\t} } } */
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpgt_6.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpgt_6.c
> new file mode 100644
> index 00000000000..6df15b94a6b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpgt_6.c
> @@ -0,0 +1,74 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +#include <arm_sve.h>
> +
> +void
> +test1 (svbool_t pg, svuint8_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test2 (svbool_t pg, svuint8_t x, svuint64_t y, int *any)
> +{
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test3 (svuint8_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test4 (svuint8_t x, svuint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test5 (svuint16_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test6 (svuint16_t x, svuint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test7 (svuint32_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test8 (svuint32_t x, svuint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmpgt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +/* { dg-final { scan-assembler-times {\tcmphi\t} 8 } } */
> +/* { dg-final { scan-assembler-times {\tptrue\t} 6 } } */
> +/* { dg-final { scan-assembler-not {\tptest\t} } } */
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmple_5.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmple_5.c
> new file mode 100644
> index 00000000000..1caf4968887
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmple_5.c
> @@ -0,0 +1,74 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +#include <arm_sve.h>
> +
> +void
> +test1 (svbool_t pg, svint8_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test2 (svbool_t pg, svint8_t x, svint64_t y, int *any)
> +{
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test3 (svint8_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test4 (svint8_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test5 (svint16_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test6 (svint16_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test7 (svint32_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test8 (svint32_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +/* { dg-final { scan-assembler-times {\tcmple\t} 8 } } */
> +/* { dg-final { scan-assembler-times {\tptrue\t} 6 } } */
> +/* { dg-final { scan-assembler-not {\tptest\t} } } */
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmple_6.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmple_6.c
> new file mode 100644
> index 00000000000..ae85e897493
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmple_6.c
> @@ -0,0 +1,74 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +#include <arm_sve.h>
> +
> +void
> +test1 (svbool_t pg, svuint8_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test2 (svbool_t pg, svuint8_t x, svuint64_t y, int *any)
> +{
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test3 (svuint8_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test4 (svuint8_t x, svuint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test5 (svuint16_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test6 (svuint16_t x, svuint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test7 (svuint32_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test8 (svuint32_t x, svuint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmple_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +/* { dg-final { scan-assembler-times {\tcmpls\t} 8 } } */
> +/* { dg-final { scan-assembler-times {\tptrue\t} 6 } } */
> +/* { dg-final { scan-assembler-not {\tptest\t} } } */
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmplt_5.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmplt_5.c
> new file mode 100644
> index 00000000000..6885e4d0ee2
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmplt_5.c
> @@ -0,0 +1,74 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +#include <arm_sve.h>
> +
> +void
> +test1 (svbool_t pg, svint8_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test2 (svbool_t pg, svint8_t x, svint64_t y, int *any)
> +{
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test3 (svint8_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test4 (svint8_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test5 (svint16_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test6 (svint16_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test7 (svint32_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test8 (svint32_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +/* { dg-final { scan-assembler-times {\tcmplt\t} 8 } } */
> +/* { dg-final { scan-assembler-times {\tptrue\t} 6 } } */
> +/* { dg-final { scan-assembler-not {\tptest\t} } } */
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmplt_6.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmplt_6.c
> new file mode 100644
> index 00000000000..e9be9e88fca
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmplt_6.c
> @@ -0,0 +1,74 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +#include <arm_sve.h>
> +
> +void
> +test1 (svbool_t pg, svuint8_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test2 (svbool_t pg, svuint8_t x, svuint64_t y, int *any)
> +{
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test3 (svuint8_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test4 (svuint8_t x, svuint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test5 (svuint16_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test6 (svuint16_t x, svuint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test7 (svuint32_t x, svuint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test8 (svuint32_t x, svuint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmplt_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +/* { dg-final { scan-assembler-times {\tcmplo\t} 8 } } */
> +/* { dg-final { scan-assembler-times {\tptrue\t} 6 } } */
> +/* { dg-final { scan-assembler-not {\tptest\t} } } */
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpne_3.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpne_3.c
> new file mode 100644
> index 00000000000..c5c3936fa24
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/cmpne_3.c
> @@ -0,0 +1,74 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +#include <arm_sve.h>
> +
> +void
> +test1 (svbool_t pg, svint8_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t res = svcmpne_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test2 (svbool_t pg, svint8_t x, svint64_t y, int *any)
> +{
> +  svbool_t res = svcmpne_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test3 (svint8_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmpne_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test4 (svint8_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b8 ();
> +  svbool_t res = svcmpne_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test5 (svint16_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmpne_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test6 (svint16_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b16 ();
> +  svbool_t res = svcmpne_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +void
> +test7 (svint32_t x, svint64_t y, int *any, svbool_t *ptr)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmpne_wide (pg, x, y);
> +  *any = svptest_any (pg, res);
> +  *ptr = res;
> +}
> +
> +int
> +test8 (svint32_t x, svint64_t y, int *any)
> +{
> +  svbool_t pg = svptrue_b32 ();
> +  svbool_t res = svcmpne_wide (pg, x, y);
> +  return svptest_any (pg, res);
> +}
> +
> +/* { dg-final { scan-assembler-times {\tcmpne\t} 8 } } */
> +/* { dg-final { scan-assembler-times {\tptrue\t} 6 } } */
> +/* { dg-final { scan-assembler-not {\tptest\t} } } */
> -- 
> 2.43.0
> 

Reply via email to