RISC-V: Add testcases for form 2 of signed scalar SAT_ADD

This patch would like to add testcases of the signed scalar SAT_ADD
for form 2.  Aka:

Form 2:
  #define DEF_SAT_S_ADD_FMT_2(T, UT, MIN, MAX) \
  T __attribute__((noinline))                  \
  sat_s_add_##T##_fmt_2 (T x, T y)             \
  {                                            \
    T sum = (UT)x + (UT)y;                     \
    if ((x ^ y) < 0 || (sum ^ x) >= 0)         \
      return sum;                              \
    return x < 0 ? MIN : MAX;                  \
  }

DEF_SAT_S_ADD_FMT_2 (int64_t, uint64_t, INT64_MIN, INT64_MAX)

The below test are passed for this patch.
* The rv64gcv fully regression test.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/sat_arith.h: Add test helper macros.
	* gcc.target/riscv/sat_s_add-5.c: New test.
	* gcc.target/riscv/sat_s_add-6.c: New test.
	* gcc.target/riscv/sat_s_add-7.c: New test.
	* gcc.target/riscv/sat_s_add-8.c: New test.
	* gcc.target/riscv/sat_s_add-run-5.c: New test.
	* gcc.target/riscv/sat_s_add-run-6.c: New test.
	* gcc.target/riscv/sat_s_add-run-7.c: New test.
	* gcc.target/riscv/sat_s_add-run-8.c: New test.

Signed-off-by: Pan Li <pan2.li@intel.com>
This commit is contained in:
Pan Li 2024-09-13 10:05:49 +08:00
parent 5b5a36b122
commit cee868ae0d
9 changed files with 199 additions and 0 deletions

View file

@ -132,9 +132,22 @@ sat_s_add_##T##_fmt_1 (T x, T y) \
#define DEF_SAT_S_ADD_FMT_1_WRAP(T, UT, MIN, MAX) \
DEF_SAT_S_ADD_FMT_1(T, UT, MIN, MAX)
#define DEF_SAT_S_ADD_FMT_2(T, UT, MIN, MAX) \
T __attribute__((noinline)) \
sat_s_add_##T##_fmt_2 (T x, T y) \
{ \
T sum = (UT)x + (UT)y; \
if ((x ^ y) < 0 || (sum ^ x) >= 0) \
return sum; \
return x < 0 ? MIN : MAX; \
}
#define RUN_SAT_S_ADD_FMT_1(T, x, y) sat_s_add_##T##_fmt_1(x, y)
#define RUN_SAT_S_ADD_FMT_1_WRAP(T, x, y) RUN_SAT_S_ADD_FMT_1(T, x, y)
#define RUN_SAT_S_ADD_FMT_2(T, x, y) sat_s_add_##T##_fmt_2(x, y)
#define RUN_SAT_S_ADD_FMT_2_WRAP(T, x, y) RUN_SAT_S_ADD_FMT_2(T, x, y)
/******************************************************************************/
/* Saturation Sub (Unsigned and Signed) */
/******************************************************************************/

View file

@ -0,0 +1,30 @@
/* { dg-do compile } */
/* { dg-options "-march=rv64gc -mabi=lp64d -O3 -fdump-rtl-expand-details -fno-schedule-insns -fno-schedule-insns2" } */
/* { dg-final { check-function-bodies "**" "" } } */
#include "sat_arith.h"
/*
** sat_s_add_int8_t_fmt_2:
** add\s+[atx][0-9]+,\s*a0,\s*a1
** xor\s+[atx][0-9]+,\s*a0,\s*a1
** xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*7
** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*7
** xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** andi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
** srai\s+[atx][0-9]+,\s*[atx][0-9]+,\s*63
** xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*127
** neg\s+[atx][0-9]+,\s*[atx][0-9]+
** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** or\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
** slliw\s+a0,\s*a0,\s*24
** sraiw\s+a0,\s*a0,\s*24
** ret
*/
DEF_SAT_S_ADD_FMT_2(int8_t, uint8_t, INT8_MIN, INT8_MAX)
/* { dg-final { scan-rtl-dump-times ".SAT_ADD " 2 "expand" } } */

View file

@ -0,0 +1,32 @@
/* { dg-do compile } */
/* { dg-options "-march=rv64gc -mabi=lp64d -O3 -fdump-rtl-expand-details -fno-schedule-insns -fno-schedule-insns2" } */
/* { dg-final { check-function-bodies "**" "" } } */
#include "sat_arith.h"
/*
** sat_s_add_int16_t_fmt_2:
** add\s+[atx][0-9]+,\s*a0,\s*a1
** xor\s+[atx][0-9]+,\s*a0,\s*a1
** xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*15
** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*15
** xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** andi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
** srai\s+[atx][0-9]+,\s*[atx][0-9]+,\s*63
** li\s+[atx][0-9]+,\s*32768
** addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
** xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** neg\s+[atx][0-9]+,\s*[atx][0-9]+
** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** or\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
** slliw\s+a0,\s*a0,\s*16
** sraiw\s+a0,\s*a0,\s*16
** ret
*/
DEF_SAT_S_ADD_FMT_2(int16_t, uint16_t, INT16_MIN, INT16_MAX)
/* { dg-final { scan-rtl-dump-times ".SAT_ADD " 2 "expand" } } */

View file

@ -0,0 +1,31 @@
/* { dg-do compile } */
/* { dg-options "-march=rv64gc -mabi=lp64d -O3 -fdump-rtl-expand-details -fno-schedule-insns -fno-schedule-insns2" } */
/* { dg-final { check-function-bodies "**" "" } } */
#include "sat_arith.h"
/*
** sat_s_add_int32_t_fmt_2:
** add\s+[atx][0-9]+,\s*a0,\s*a1
** xor\s+[atx][0-9]+,\s*a0,\s*a1
** xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*31
** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*31
** xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** andi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
** srai\s+[atx][0-9]+,\s*[atx][0-9]+,\s*63
** li\s+[atx][0-9]+,\s*-2147483648
** xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
** xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** neg\s+[atx][0-9]+,\s*[atx][0-9]+
** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** or\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
** sext\.w\s+a0,\s*a0
** ret
*/
DEF_SAT_S_ADD_FMT_2(int32_t, uint32_t, INT32_MIN, INT32_MAX)
/* { dg-final { scan-rtl-dump-times ".SAT_ADD " 2 "expand" } } */

View file

@ -0,0 +1,29 @@
/* { dg-do compile } */
/* { dg-options "-march=rv64gc -mabi=lp64d -O3 -fdump-rtl-expand-details -fno-schedule-insns -fno-schedule-insns2" } */
/* { dg-final { check-function-bodies "**" "" } } */
#include "sat_arith.h"
/*
** sat_s_add_int64_t_fmt_2:
** add\s+[atx][0-9]+,\s*a0,\s*a1
** xor\s+[atx][0-9]+,\s*a0,\s*a1
** xor\s+[atx][0-9]+,\s*a0,\s*[atx][0-9]+
** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*63
** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*63
** xori\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** srai\s+[atx][0-9]+,\s*[atx][0-9]+,\s*63
** li\s+[atx][0-9]+,\s*-1
** srli\s+[atx][0-9]+,\s*[atx][0-9]+,\s*1
** xor\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** neg\s+[atx][0-9]+,\s*[atx][0-9]+
** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** addi\s+[atx][0-9]+,\s*[atx][0-9]+,\s*-1
** and\s+[atx][0-9]+,\s*[atx][0-9]+,\s*[atx][0-9]+
** or\s+a0,\s*[atx][0-9]+,\s*[atx][0-9]+
** ret
*/
DEF_SAT_S_ADD_FMT_2(int64_t, uint64_t, INT64_MIN, INT64_MAX)
/* { dg-final { scan-rtl-dump-times ".SAT_ADD " 2 "expand" } } */

View file

@ -0,0 +1,16 @@
/* { dg-do run { target { riscv_v } } } */
/* { dg-additional-options "-std=c99" } */
#include "sat_arith.h"
#include "sat_arith_data.h"
#define T1 int8_t
#define T2 uint8_t
DEF_SAT_S_ADD_FMT_1_WRAP(T1, T2, INT8_MIN, INT8_MAX)
#define DATA TEST_BINARY_DATA_WRAP(T1, ssadd)
#define T TEST_BINARY_STRUCT_DECL(T1, ssadd)
#define RUN_BINARY(x, y) RUN_SAT_S_ADD_FMT_1_WRAP(T1, x, y)
#include "scalar_sat_binary_run_xxx.h"

View file

@ -0,0 +1,16 @@
/* { dg-do run { target { riscv_v } } } */
/* { dg-additional-options "-std=c99" } */
#include "sat_arith.h"
#include "sat_arith_data.h"
#define T1 int16_t
#define T2 uint16_t
DEF_SAT_S_ADD_FMT_1_WRAP(T1, T2, INT16_MIN, INT16_MAX)
#define DATA TEST_BINARY_DATA_WRAP(T1, ssadd)
#define T TEST_BINARY_STRUCT_DECL(T1, ssadd)
#define RUN_BINARY(x, y) RUN_SAT_S_ADD_FMT_1_WRAP(T1, x, y)
#include "scalar_sat_binary_run_xxx.h"

View file

@ -0,0 +1,16 @@
/* { dg-do run { target { riscv_v } } } */
/* { dg-additional-options "-std=c99" } */
#include "sat_arith.h"
#include "sat_arith_data.h"
#define T1 int32_t
#define T2 uint32_t
DEF_SAT_S_ADD_FMT_1_WRAP(T1, T2, INT32_MIN, INT32_MAX)
#define DATA TEST_BINARY_DATA_WRAP(T1, ssadd)
#define T TEST_BINARY_STRUCT_DECL(T1, ssadd)
#define RUN_BINARY(x, y) RUN_SAT_S_ADD_FMT_1_WRAP(T1, x, y)
#include "scalar_sat_binary_run_xxx.h"

View file

@ -0,0 +1,16 @@
/* { dg-do run { target { riscv_v } } } */
/* { dg-additional-options "-std=c99" } */
#include "sat_arith.h"
#include "sat_arith_data.h"
#define T1 int64_t
#define T2 uint64_t
DEF_SAT_S_ADD_FMT_1_WRAP(T1, T2, INT64_MIN, INT64_MAX)
#define DATA TEST_BINARY_DATA_WRAP(T1, ssadd)
#define T TEST_BINARY_STRUCT_DECL(T1, ssadd)
#define RUN_BINARY(x, y) RUN_SAT_S_ADD_FMT_1_WRAP(T1, x, y)
#include "scalar_sat_binary_run_xxx.h"