From: xuli <xu...@eswincomputing.com>

This patch adds testcase for form1, as shown below:

void __attribute__((noinline))                                       \
vec_sat_s_add_imm_##T##_fmt_1##_##INDEX (T *out, T *op_1, unsigned limit) \
{                                                                    \
  unsigned i;                                                        \
  for (i = 0; i < limit; i++)                                        \
    {                                                                \
      T x = op_1[i];                                                 \
      T sum = (UT)x + (UT)IMM;                                       \
      out[i] = (x ^ IMM) < 0                                         \
        ? sum                                                        \
        : (sum ^ x) >= 0                                             \
          ? sum                                                      \
          : x < 0 ? MIN : MAX;                                       \
    }                                                                \
}

Passed the rv64gcv regression test.

Signed-off-by: Li Xu <xu...@eswincomputing.com>
gcc/testsuite/ChangeLog:

        * gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h: add signed vec 
SAT_ADD IMM form1.
        * gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h: add sat_s_add_imm 
data.
        * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c: New test.
        * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c: New test.
        * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c: New test.
        * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c: New test.
        * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c: New 
test.
        * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c: New 
test.
        * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c: New 
test.
        * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c: New 
test.
        * 
gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c: New test.
        * 
gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c: New test.
        * gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c: 
New test.

---
 .../riscv/rvv/autovec/sat/vec_sat_arith.h     |  25 ++
 .../riscv/rvv/autovec/sat/vec_sat_data.h      | 240 ++++++++++++++++++
 .../rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c |  10 +
 .../rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c |  10 +
 .../rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c |  10 +
 .../rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c  |  10 +
 .../autovec/sat/vec_sat_s_add_imm-run-1-i16.c |  28 ++
 .../autovec/sat/vec_sat_s_add_imm-run-1-i32.c |  28 ++
 .../autovec/sat/vec_sat_s_add_imm-run-1-i64.c |  28 ++
 .../autovec/sat/vec_sat_s_add_imm-run-1-i8.c  |  28 ++
 .../sat/vec_sat_s_add_imm_type_check-1-i16.c  |   9 +
 .../sat/vec_sat_s_add_imm_type_check-1-i32.c  |   9 +
 .../sat/vec_sat_s_add_imm_type_check-1-i8.c   |  10 +
 13 files changed, 445 insertions(+)
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c
 create mode 100644 
gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c

diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h
index 7db892cc2e9..ffdccd79b7a 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_arith.h
@@ -314,6 +314,31 @@ vec_sat_s_add_##T##_fmt_4 (T *out, T *op_1, T *op_2, 
unsigned limit) \
 #define RUN_VEC_SAT_S_ADD_FMT_4_WRAP(T, out, op_1, op_2, N) \
   RUN_VEC_SAT_S_ADD_FMT_4(T, out, op_1, op_2, N)
 
+#define DEF_VEC_SAT_S_ADD_IMM_FMT_1(INDEX, T, UT, IMM, MIN, MAX)     \
+void __attribute__((noinline))                                       \
+vec_sat_s_add_imm_##T##_fmt_1##_##INDEX (T *out, T *op_1, unsigned limit) \
+{                                                                    \
+  unsigned i;                                                        \
+  for (i = 0; i < limit; i++)                                        \
+    {                                                                \
+      T x = op_1[i];                                                 \
+      T sum = (UT)x + (UT)IMM;                                       \
+      out[i] = (x ^ IMM) < 0                                         \
+        ? sum                                                        \
+        : (sum ^ x) >= 0                                             \
+          ? sum                                                      \
+          : x < 0 ? MIN : MAX;                                       \
+    }                                                                \
+}
+#define DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(INDEX, T, UT, IMM, MIN, MAX) \
+  DEF_VEC_SAT_S_ADD_IMM_FMT_1(INDEX, T, UT, IMM, MIN, MAX)
+
+#define RUN_VEC_SAT_S_ADD_IMM_FMT_1(INDEX, T, out, in, expect, IMM, N) \
+  vec_sat_s_add_imm_##T##_fmt_1##_##INDEX (out, in, N);             \
+  VALIDATE_RESULT (out, expect, N)
+#define RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(INDEX, T, out, in, expect, IMM, N) \
+  RUN_VEC_SAT_S_ADD_IMM_FMT_1(INDEX, T, out, in, expect, IMM, N)
+
 
/******************************************************************************/
 /* Saturation Sub (Unsigned and Signed)                                       
*/
 
/******************************************************************************/
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h
index ec4d64cc100..9f05c0c9291 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_data.h
@@ -744,6 +744,246 @@ uint64_t TEST_UNARY_DATA(uint64_t, sat_u_sub_imm)[][2][N] 
=
   },
 };
 
+int8_t TEST_UNARY_DATA(int8_t, sat_s_add_imm)[][2][N] =
+{
+  { /* For add imm -128 */
+    {
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+    },
+    {
+      -128, -128, -28, -1,
+      -128, -128, -28, -1,
+      -128, -128, -28, -1,
+      -128, -128, -28, -1,
+    },
+  },
+  { /* For add imm 0 */
+    {
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+    },
+    {
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+    },
+  },
+  { /* For add imm 1 */
+    {
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+    },
+    {
+      -127, 1, 101, 127,
+      -127, 1, 101, 127,
+      -127, 1, 101, 127,
+      -127, 1, 101, 127,
+    },
+  },
+  { /* For add imm 127 */
+    {
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+      -128, 0, 100, 127,
+    },
+    {
+      -1, 127, 127, 127,
+      -1, 127, 127, 127,
+      -1, 127, 127, 127,
+      -1, 127, 127, 127,
+    },
+  },
+};
+
+int16_t TEST_UNARY_DATA(int16_t, sat_s_add_imm)[][2][N] =
+{
+  { /* For add imm -32768 */
+    {
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+    },
+    {
+      -32768, -32768, -32668, -1,
+      -32768, -32768, -32668, -1,
+      -32768, -32768, -32668, -1,
+      -32768, -32768, -32668, -1,
+    },
+  },
+  { /* For add imm 0 */
+    {
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+    },
+    {
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+    },
+  },
+  { /* For add imm 1 */
+    {
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+    },
+    {
+      -32767, 1, 101, 32767,
+      -32767, 1, 101, 32767,
+      -32767, 1, 101, 32767,
+      -32767, 1, 101, 32767,
+    },
+  },
+  { /* For add imm 32767 */
+    {
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+      -32768, 0, 100, 32767,
+    },
+    {
+      -1, 32767, 32767, 32767,
+      -1, 32767, 32767, 32767,
+      -1, 32767, 32767, 32767,
+      -1, 32767, 32767, 32767,
+    },
+  },
+};
+
+int32_t TEST_UNARY_DATA(int32_t, sat_s_add_imm)[][2][N] =
+{
+  { /* For add imm -2147483648 */
+    {
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+    },
+    {
+      -2147483648, -2147483648, -2147483548, -1,
+      -2147483648, -2147483648, -2147483548, -1,
+      -2147483648, -2147483648, -2147483548, -1,
+      -2147483648, -2147483648, -2147483548, -1,
+    },
+  },
+  { /* For add imm 0 */
+    {
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+    },
+    {
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+    },
+  },
+  { /* For add imm 1 */
+    {
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+    },
+    {
+      -2147483647, 1, 101, 2147483647,
+      -2147483647, 1, 101, 2147483647,
+      -2147483647, 1, 101, 2147483647,
+      -2147483647, 1, 101, 2147483647,
+    },
+  },
+  { /* For add imm 2147483647 */
+    {
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+      -2147483648, 0, 100, 2147483647,
+    },
+    {
+      -1, 2147483647, 2147483647, 2147483647,
+      -1, 2147483647, 2147483647, 2147483647,
+      -1, 2147483647, 2147483647, 2147483647,
+      -1, 2147483647, 2147483647, 2147483647,
+    },
+  },
+};
+
+int64_t TEST_UNARY_DATA(int64_t, sat_s_add_imm)[][2][N] =
+{
+  { /* For add imm -9223372036854775808ll */
+    {
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+    },
+    {
+      INT64_MIN, INT64_MIN, -9223372036854775708ll, -1,
+      INT64_MIN, INT64_MIN, -9223372036854775708ll, -1,
+      INT64_MIN, INT64_MIN, -9223372036854775708ll, -1,
+      INT64_MIN, INT64_MIN, -9223372036854775708ll, -1,
+    },
+  },
+  { /* For add imm 0 */
+    {
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+    },
+    {
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+    },
+  },
+  { /* For add imm 1 */
+    {
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+    },
+    {
+      -INT64_MAX, 1, 101, INT64_MAX,
+      -INT64_MAX, 1, 101, INT64_MAX,
+      -INT64_MAX, 1, 101, INT64_MAX,
+      -INT64_MAX, 1, 101, INT64_MAX,
+    },
+  },
+  { /* For add imm 9223372036854775807ll */
+    {
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+      INT64_MIN, 0, 100, INT64_MAX,
+    },
+    {
+      -1, INT64_MAX, INT64_MAX, INT64_MAX,
+      -1, INT64_MAX, INT64_MAX, INT64_MAX,
+      -1, INT64_MAX, INT64_MAX, INT64_MAX,
+      -1, INT64_MAX, INT64_MAX, INT64_MAX,
+    },
+  },
+};
+
 #define TEST_BINARY_DATA_NAME(T1, T2, NAME) 
test_bin_##T1##_##T2##_##NAME##_data
 #define TEST_BINARY_DATA_NAME_WRAP(T1, T2, NAME) \
   TEST_BINARY_DATA_NAME(T1, T2, NAME)
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c
new file mode 100644
index 00000000000..396c741d321
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i16.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize 
-fdump-tree-optimized" } */
+
+#include "vec_sat_arith.h"
+
+DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int16_t, uint16_t, 9, INT16_MIN, INT16_MAX)
+
+/* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" { target { 
no-opts "-O2" } } } } */
+/* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" { target { 
no-opts "-O3" } } } } */
+/* { dg-final { scan-assembler-times {vsadd\.vi} 1 } } */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c
new file mode 100644
index 00000000000..da9e53879d1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i32.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize 
-fdump-tree-optimized" } */
+
+#include "vec_sat_arith.h"
+
+DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int32_t, uint32_t, 9, INT32_MIN, INT32_MAX)
+
+/* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" { target { 
no-opts "-O2" } } } } */
+/* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" { target { 
no-opts "-O3" } } } } */
+/* { dg-final { scan-assembler-times {vsadd\.vi} 1 } } */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c
new file mode 100644
index 00000000000..e9af1a159df
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i64.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize 
-fdump-tree-optimized" } */
+
+#include "vec_sat_arith.h"
+
+DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int64_t, uint64_t, 9, INT64_MIN, INT64_MAX)
+
+/* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" { target { 
no-opts "-O2" } } } } */
+/* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" { target { 
no-opts "-O3" } } } } */
+/* { dg-final { scan-assembler-times {vsadd\.vi} 1 } } */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c
new file mode 100644
index 00000000000..66b9d7f4a2d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-1-i8.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize 
-fdump-tree-optimized" } */
+
+#include "vec_sat_arith.h"
+
+DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int8_t, uint8_t, 9, INT8_MIN, INT8_MAX)
+
+/* { dg-final { scan-tree-dump-times ".SAT_ADD " 1 "optimized" { target { 
no-opts "-O2" } } } } */
+/* { dg-final { scan-tree-dump-times ".SAT_ADD " 2 "optimized" { target { 
no-opts "-O3" } } } } */
+/* { dg-final { scan-assembler-times {vsadd\.vi} 1 } } */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c
new file mode 100644
index 00000000000..fbfa4e23bff
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i16.c
@@ -0,0 +1,28 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "-std=c99" } */
+
+#include "vec_sat_arith.h"
+#include "vec_sat_data.h"
+
+#define T int16_t
+#define RUN(INDEX, T, out, in, expect, IMM, N) \
+  RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP (INDEX, T, out, in, expect, IMM, N)
+
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(0, int16_t, uint16_t, -32768, INT16_MIN, 
INT16_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(1, int16_t, uint16_t, 0, INT16_MIN, INT16_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(2, int16_t, uint16_t, 1, INT16_MIN, INT16_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(3, int16_t, uint16_t, 32767, INT16_MIN, 
INT16_MAX)
+
+int
+main ()
+{
+  T out[N];
+  T (*d)[2][N] = TEST_UNARY_DATA_WRAP (T, sat_s_add_imm);
+
+  RUN (0, T, out, d[0][0], d[0][1], -32768, N);
+  RUN (1, T, out, d[1][0], d[1][1], 0,    N);
+  RUN (2, T, out, d[2][0], d[2][1], 1,    N);
+  RUN (3, T, out, d[3][0], d[3][1], 32767,  N);
+
+  return 0;
+}
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c
new file mode 100644
index 00000000000..5f1763cb060
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i32.c
@@ -0,0 +1,28 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "-std=c99" } */
+
+#include "vec_sat_arith.h"
+#include "vec_sat_data.h"
+
+#define T int32_t
+#define RUN(INDEX, T, out, in, expect, IMM, N) \
+  RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP (INDEX, T, out, in, expect, IMM, N)
+
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(0, int32_t, uint32_t, -2147483648, INT32_MIN, 
INT32_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(1, int32_t, uint32_t, 0, INT32_MIN, INT32_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(2, int32_t, uint32_t, 1, INT32_MIN, INT32_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(3, int32_t, uint32_t, 2147483647, INT32_MIN, 
INT32_MAX)
+
+int
+main ()
+{
+  T out[N];
+  T (*d)[2][N] = TEST_UNARY_DATA_WRAP (T, sat_s_add_imm);
+
+  RUN (0, T, out, d[0][0], d[0][1], -2147483648, N);
+  RUN (1, T, out, d[1][0], d[1][1], 0,    N);
+  RUN (2, T, out, d[2][0], d[2][1], 1,    N);
+  RUN (3, T, out, d[3][0], d[3][1], 2147483647,  N);
+
+  return 0;
+}
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c
new file mode 100644
index 00000000000..435eb1bcdc4
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i64.c
@@ -0,0 +1,28 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "-std=c99" } */
+
+#include "vec_sat_arith.h"
+#include "vec_sat_data.h"
+
+#define T int64_t
+#define RUN(INDEX, T, out, in, expect, IMM, N) \
+  RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP (INDEX, T, out, in, expect, IMM, N)
+
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(0, int64_t, uint64_t, INT64_MIN, INT64_MIN, 
INT64_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(1, int64_t, uint64_t, 0, INT64_MIN, INT64_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(2, int64_t, uint64_t, 1, INT64_MIN, INT64_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(3, int64_t, uint64_t, INT64_MAX, INT64_MIN, 
INT64_MAX)
+
+int
+main ()
+{
+  T out[N];
+  T (*d)[2][N] = TEST_UNARY_DATA_WRAP (T, sat_s_add_imm);
+
+  RUN (0, T, out, d[0][0], d[0][1], INT64_MIN, N);
+  RUN (1, T, out, d[1][0], d[1][1], 0,    N);
+  RUN (2, T, out, d[2][0], d[2][1], 1,    N);
+  RUN (3, T, out, d[3][0], d[3][1], INT64_MAX,  N);
+
+  return 0;
+}
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c
new file mode 100644
index 00000000000..535e873fe9a
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm-run-1-i8.c
@@ -0,0 +1,28 @@
+/* { dg-do run { target { riscv_v } } } */
+/* { dg-additional-options "-std=c99" } */
+
+#include "vec_sat_arith.h"
+#include "vec_sat_data.h"
+
+#define T int8_t
+#define RUN(INDEX, T, out, in, expect, IMM, N) \
+  RUN_VEC_SAT_S_ADD_IMM_FMT_1_WRAP (INDEX, T, out, in, expect, IMM, N)
+
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(0, int8_t, uint8_t, -128, INT8_MIN, INT8_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(1, int8_t, uint8_t, 0, INT8_MIN, INT8_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(2, int8_t, uint8_t, 1, INT8_MIN, INT8_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1_WRAP(3, int8_t, uint8_t, 127, INT8_MIN, INT8_MAX)
+
+int
+main ()
+{
+  T out[N];
+  T (*d)[2][N] = TEST_UNARY_DATA_WRAP (T, sat_s_add_imm);
+
+  RUN (0, T, out, d[0][0], d[0][1], -128, N);
+  RUN (1, T, out, d[1][0], d[1][1], 0,    N);
+  RUN (2, T, out, d[2][0], d[2][1], 1,    N);
+  RUN (3, T, out, d[3][0], d[3][1], 127,  N);
+
+  return 0;
+}
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c
 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c
new file mode 100644
index 00000000000..26e96fc18f0
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i16.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+
+#include "vec_sat_arith.h"
+
+DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int16_t, uint16_t, -32769, INT16_MIN, INT16_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1(1, int16_t, uint16_t, 32768, INT16_MIN, INT16_MAX)
+
+/* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c
 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c
new file mode 100644
index 00000000000..519e72c7b8c
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i32.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gc -mabi=lp64d -fdump-tree-optimized" } */
+
+#include "vec_sat_arith.h"
+
+DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int32_t, uint32_t, -2147483649, INT32_MIN, 
INT32_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1(1, int32_t, uint32_t, 2147483648, INT32_MIN, 
INT32_MAX)
+
+/* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c
 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c
new file mode 100644
index 00000000000..2b0af52ee07
--- /dev/null
+++ 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/sat/vec_sat_s_add_imm_type_check-1-i8.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d -ftree-vectorize 
-fdump-tree-optimized" } */
+
+#include "vec_sat_arith.h"
+
+DEF_VEC_SAT_S_ADD_IMM_FMT_1(0, int8_t, uint8_t, 200, INT8_MIN, INT8_MAX)
+DEF_VEC_SAT_S_ADD_IMM_FMT_1(1, int8_t, uint8_t, -300, INT8_MIN, INT8_MAX)
+
+/* { dg-final { scan-tree-dump-not ".SAT_ADD " "optimized" } } */
+
-- 
2.17.1

Reply via email to