Akram Ahmad <akram.ah...@arm.com> writes:
> Rename the existing SVE unpredicated saturating arithmetic instructions
> to use standard names which are used by IFN_SAT_ADD and IFN_SAT_SUB.
>
> gcc/ChangeLog:
>
>       * config/aarch64/aarch64-sve.md: Rename insns
>
> gcc/testsuite/ChangeLog:
>
>       * gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic.inc:
>       Template file for auto-vectorizer tests.
>       * gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_1.c:
>       Instantiate 8-bit vector tests.
>       * gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_2.c
>       Instantiate 16-bit vector tests.
>       * gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_3.c
>       Instantiate 32-bit vector tests.
>       * gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_4.c
>       Instantiate 64-bit vector tests.

OK, thanks.  I'll push it along with patch 1.

Sorry again for the long delay in reviewing this series.

Richard


> ---
>  gcc/config/aarch64/aarch64-sve.md             |  4 +-
>  .../aarch64/sve/saturating_arithmetic.inc     | 68 +++++++++++++++++++
>  .../aarch64/sve/saturating_arithmetic_1.c     | 60 ++++++++++++++++
>  .../aarch64/sve/saturating_arithmetic_2.c     | 60 ++++++++++++++++
>  .../aarch64/sve/saturating_arithmetic_3.c     | 62 +++++++++++++++++
>  .../aarch64/sve/saturating_arithmetic_4.c     | 62 +++++++++++++++++
>  6 files changed, 314 insertions(+), 2 deletions(-)
>  create mode 100644 
> gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic.inc
>  create mode 100644 
> gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_1.c
>  create mode 100644 
> gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_2.c
>  create mode 100644 
> gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_3.c
>  create mode 100644 
> gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_4.c
>
> diff --git a/gcc/config/aarch64/aarch64-sve.md 
> b/gcc/config/aarch64/aarch64-sve.md
> index 06bd3e4bb2c..b987b292b20 100644
> --- a/gcc/config/aarch64/aarch64-sve.md
> +++ b/gcc/config/aarch64/aarch64-sve.md
> @@ -4379,7 +4379,7 @@
>  ;; -------------------------------------------------------------------------
>  
>  ;; Unpredicated saturating signed addition and subtraction.
> -(define_insn "@aarch64_sve_<optab><mode>"
> +(define_insn "<su_optab>s<addsub><mode>3"
>    [(set (match_operand:SVE_FULL_I 0 "register_operand")
>       (SBINQOPS:SVE_FULL_I
>         (match_operand:SVE_FULL_I 1 "register_operand")
> @@ -4395,7 +4395,7 @@
>  )
>  
>  ;; Unpredicated saturating unsigned addition and subtraction.
> -(define_insn "@aarch64_sve_<optab><mode>"
> +(define_insn "<su_optab>s<addsub><mode>3"
>    [(set (match_operand:SVE_FULL_I 0 "register_operand")
>       (UBINQOPS:SVE_FULL_I
>         (match_operand:SVE_FULL_I 1 "register_operand")
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic.inc 
> b/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic.inc
> new file mode 100644
> index 00000000000..0b3ebbcb0d6
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic.inc
> @@ -0,0 +1,68 @@
> +/* Template file for vector saturating arithmetic validation.
> +
> +   This file defines saturating addition and subtraction functions for a 
> given
> +   scalar type, testing the auto-vectorization of these two operators. This
> +   type, along with the corresponding minimum and maximum values for that 
> type,
> +   must be defined by any test file which includes this template file.  */
> +
> +#ifndef SAT_ARIT_AUTOVEC_INC
> +#define SAT_ARIT_AUTOVEC_INC
> +
> +#include <limits.h>
> +#include <arm_neon.h>
> +
> +#ifndef UT
> +#define UT uint32_t
> +#define UMAX UINT_MAX
> +#define UMIN 0
> +#endif
> +
> +void uaddq (UT *out, UT *a, UT *b, int n)
> +{
> +  for (int i = 0; i < n; i++)
> +    {
> +      UT sum = a[i] + b[i];
> +      out[i] = sum < a[i] ? UMAX : sum;
> +    }
> +}
> +
> +void uaddq2 (UT *out, UT *a, UT *b, int n)
> +{
> +  for (int i = 0; i < n; i++)
> +    {
> +      UT sum;
> +      if (!__builtin_add_overflow(a[i], b[i], &sum))
> +     out[i] = sum;
> +      else
> +     out[i] = UMAX;
> +    }
> +}
> +
> +void uaddq_imm (UT *out, UT *a, int n)
> +{
> +  for (int i = 0; i < n; i++)
> +    {
> +      UT sum = a[i] + 50;
> +      out[i] = sum < a[i] ? UMAX : sum;
> +    }
> +}
> +
> +void usubq (UT *out, UT *a, UT *b, int n)
> +{
> +  for (int i = 0; i < n; i++)
> +    {
> +      UT sum = a[i] - b[i];
> +      out[i] = sum > a[i] ? UMIN : sum;
> +    }
> +}
> +
> +void usubq_imm (UT *out, UT *a, int n)
> +{
> +  for (int i = 0; i < n; i++)
> +    {
> +      UT sum = a[i] - 50;
> +      out[i] = sum > a[i] ? UMIN : sum;
> +    }
> +}
> +
> +#endif
> \ No newline at end of file
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_1.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_1.c
> new file mode 100644
> index 00000000000..6936e9a2704
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_1.c
> @@ -0,0 +1,60 @@
> +/* { dg-do compile { target { aarch64*-*-* } } } */
> +/* { dg-options "-O2 --save-temps -ftree-vectorize" } */
> +/* { dg-final { check-function-bodies "**" "" "" } } */
> +
> +/*
> +** uaddq:
> +** ...
> +**   ld1b\tz([0-9]+)\.b, .*
> +**   ld1b\tz([0-9]+)\.b, .*
> +**   uqadd\tz\2.b, z\1\.b, z\2\.b
> +** ...
> +**   ldr\tb([0-9]+), .*
> +**   ldr\tb([0-9]+), .*
> +**   uqadd\tb\4, b\3, b\4
> +** ...
> +*/
> +/*
> +** uaddq2:
> +** ...
> +**   ld1b\tz([0-9]+)\.b, .*
> +**   ld1b\tz([0-9]+)\.b, .*
> +**   uqadd\tz\2.b, z\1\.b, z\2\.b
> +** ...
> +**   ldr\tb([0-9]+), .*
> +**   ldr\tb([0-9]+), .*
> +**   uqadd\tb\4, b\3, b\4
> +** ...
> +*/
> +/*
> +** uaddq_imm:
> +** ...
> +**   ld1b\tz([0-9]+)\.b, .*
> +**   uqadd\tz\1.b, z\1\.b, #50
> +** ...
> +**   movi\tv([0-9]+)\.8b, 0x32
> +** ...
> +**   ldr\tb([0-9]+), .*
> +**   uqadd\tb\3, b\3, b\2
> +** ...
> +*/
> +/*
> +** usubq: { xfail *-*-* }
> +** ...
> +**   ld1b\tz([0-9]+)\.b, .*
> +**   ld1b\tz([0-9]+)\.b, .*
> +**   uqsub\tz\2.b, z\1\.b, z\2\.b
> +** ...
> +**   ldr\tb([0-9]+), .*
> +**   ldr\tb([0-9]+), .*
> +**   uqsub\tb\4, b\3, b\4
> +** ...
> +*/
> +
> +#include <limits.h>
> +
> +#define UT unsigned char
> +#define UMAX UCHAR_MAX
> +#define UMIN 0
> +
> +#include "saturating_arithmetic.inc"
> \ No newline at end of file
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_2.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_2.c
> new file mode 100644
> index 00000000000..928bc0054df
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_2.c
> @@ -0,0 +1,60 @@
> +/* { dg-do compile { target { aarch64*-*-* } } } */
> +/* { dg-options "-O2 --save-temps -ftree-vectorize" } */
> +/* { dg-final { check-function-bodies "**" "" "" } } */
> +
> +/*
> +** uaddq:
> +** ...
> +**   ld1h\tz([0-9]+)\.h, .*
> +**   ld1h\tz([0-9]+)\.h, .*
> +**   uqadd\tz\2.h, z\1\.h, z\2\.h
> +** ...
> +**   ldr\th([0-9]+), .*
> +**   ldr\th([0-9]+), .*
> +**   uqadd\th\4, h\3, h\4
> +** ...
> +*/
> +/*
> +** uaddq2:
> +** ...
> +**   ld1h\tz([0-9]+)\.h, .*
> +**   ld1h\tz([0-9]+)\.h, .*
> +**   uqadd\tz\2.h, z\1\.h, z\2\.h
> +** ...
> +**   ldr\th([0-9]+), .*
> +**   ldr\th([0-9]+), .*
> +**   uqadd\th\4, h\3, h\4
> +** ...
> +*/
> +/*
> +** uaddq_imm:
> +** ...
> +**   ld1h\tz([0-9]+)\.h, .*
> +**   uqadd\tz\1.h, z\1\.h, #50
> +** ...
> +**   movi\tv([0-9]+)\.4h, 0x32
> +** ...
> +**   ldr\th([0-9]+), .*
> +**   uqadd\th\3, h\3, h\2
> +** ...
> +*/
> +/*
> +** usubq: { xfail *-*-* }
> +** ...
> +**   ld1h\tz([0-9]+)\.h, .*
> +**   ld1h\tz([0-9]+)\.h, .*
> +**   usubq\tz\2.h, z\1\.h, z\2\.h
> +** ...
> +**   ldr\th([0-9]+), .*
> +**   ldr\th([0-9]+), .*
> +**   usubq\th\4, h\3, h\4
> +** ...
> +*/
> +
> +#include <limits.h>
> +
> +#define UT unsigned short
> +#define UMAX USHRT_MAX
> +#define UMIN 0
> +
> +#include "saturating_arithmetic.inc"
> \ No newline at end of file
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_3.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_3.c
> new file mode 100644
> index 00000000000..14e2de59b1e
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_3.c
> @@ -0,0 +1,62 @@
> +/* { dg-do compile { target { aarch64*-*-* } } } */
> +/* { dg-options "-O2 --save-temps -ftree-vectorize" } */
> +/* { dg-final { check-function-bodies "**" "" "" } } */
> +
> +/*
> +** uaddq:
> +** ...
> +**   ld1w\tz([0-9]+)\.s, .*
> +**   ld1w\tz([0-9]+)\.s, .*
> +**   uqadd\tz\2.s, z\1\.s, z\2\.s
> +** ...
> +**   ldr\tw([0-9]+), .*
> +**   ldr\tw([0-9]+), .*
> +**   adds\tw\3, w\3, w\4
> +**   csinv\tw\3, w\3, wzr, cc
> +** ...
> +*/
> +/*
> +** uaddq2:
> +** ...
> +**   ld1w\tz([0-9]+)\.s, .*
> +**   ld1w\tz([0-9]+)\.s, .*
> +**   uqadd\tz\2.s, z\1\.s, z\2\.s
> +** ...
> +**   ldr\tw([0-9]+), .*
> +**   ldr\tw([0-9]+), .*
> +**   adds\tw\3, w\3, w\4
> +**   csinv\tw\3, w\3, wzr, cc
> +** ...
> +*/
> +/*
> +** uaddq_imm:
> +** ...
> +**   ld1w\tz([0-9]+)\.s, .*
> +**   uqadd\tz\1.s, z\1\.s, #50
> +** ...
> +**   ldr\tw([0-9]+), .*
> +**   adds\tw\2, w\2, #50
> +**   csinv\tw\2, w\2, wzr, cc
> +** ...
> +*/
> +/*
> +** usubq: { xfail *-*-* }
> +** ...
> +**   ld1w\tz([0-9]+)\.s, .*
> +**   ld1w\tz([0-9]+)\.s, .*
> +**   uqsub\tz\2.s, z\1\.s, z\2\.s
> +** ...
> +**   ldr\tw([0-9]+), .*
> +**   ldr\tw([0-9]+), .*
> +**   subs\tw\3, w\3, w\4
> +**   csel\tw\3, w\3, wzr, cs
> +** ...
> +*/
> +
> +#include <limits.h>
> +
> +#define UT unsigned int
> +#define UMAX UINT_MAX
> +#define UMIN 0
> +
> +#include "saturating_arithmetic.inc"
> \ No newline at end of file
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_4.c 
> b/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_4.c
> new file mode 100644
> index 00000000000..05a5786b4ab
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sve/saturating_arithmetic_4.c
> @@ -0,0 +1,62 @@
> +/* { dg-do compile { target { aarch64*-*-* } } } */
> +/* { dg-options "-O2 --save-temps -ftree-vectorize" } */
> +/* { dg-final { check-function-bodies "**" "" "" } } */
> +
> +/*
> +** uaddq:
> +** ...
> +**   ld1d\tz([0-9]+)\.d, .*
> +**   ld1d\tz([0-9]+)\.d, .*
> +**   uqadd\tz\2.d, z\1\.d, z\2\.d
> +** ...
> +**   ldr\tx([0-9]+), .*
> +**   ldr\tx([0-9]+), .*
> +**   adds\tx\3, x\3, x\4
> +**   csinv\tx\3, x\3, xzr, cc
> +** ...
> +*/
> +/*
> +** uaddq2:
> +** ...
> +**   ld1d\tz([0-9]+)\.d, .*
> +**   ld1d\tz([0-9]+)\.d, .*
> +**   uqadd\tz\2.d, z\1\.d, z\2\.d
> +** ...
> +**   ldr\tx([0-9]+), .*
> +**   ldr\tx([0-9]+), .*
> +**   adds\tx\3, x\3, x\4
> +**   csinv\tx\3, x\3, xzr, cc
> +** ...
> +*/
> +/*
> +** uaddq_imm:
> +** ...
> +**   ld1d\tz([0-9]+)\.d, .*
> +**   uqadd\tz\1.d, z\1\.d, #50
> +** ...
> +**   ldr\tx([0-9]+), .*
> +**   adds\tx\2, x\2, #50
> +**   csinv\tx\2, x\2, xzr, cc
> +** ...
> +*/
> +/*
> +** usubq: { xfail *-*-* }
> +** ...
> +**   ld1d\tz([0-9]+)\.d, .*
> +**   ld1d\tz([0-9]+)\.d, .*
> +**   uqsub\tz\2.d, z\1\.d, z\2\.d
> +** ...
> +**   ldr\tx([0-9]+), .*
> +**   ldr\tx([0-9]+), .*
> +**   subs\tx\3, x\3, x\4
> +**   csel\tx\3, x\3, xzr, cs
> +** ...
> +*/
> +
> +#include <limits.h>
> +
> +#define UT unsigned long
> +#define UMAX ULONG_MAX
> +#define UMIN 0
> +
> +#include "saturating_arithmetic.inc"
> \ No newline at end of file

Reply via email to