#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) */
/******************************************************************************/
},
};
+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)
--- /dev/null
+/* { 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 } } */
--- /dev/null
+/* { 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 } } */
--- /dev/null
+/* { 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 } } */
--- /dev/null
+/* { 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 } } */
--- /dev/null
+/* { 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;
+}
--- /dev/null
+/* { 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;
+}
--- /dev/null
+/* { 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;
+}
--- /dev/null
+/* { 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;
+}
--- /dev/null
+/* { 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" } } */
--- /dev/null
+/* { 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" } } */
--- /dev/null
+/* { 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" } } */
+