diff options
Diffstat (limited to 'gcc/testsuite/gcc.target/loongarch/abd-lsx.c')
-rw-r--r-- | gcc/testsuite/gcc.target/loongarch/abd-lsx.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/loongarch/abd-lsx.c b/gcc/testsuite/gcc.target/loongarch/abd-lsx.c new file mode 100644 index 0000000..c036888 --- /dev/null +++ b/gcc/testsuite/gcc.target/loongarch/abd-lsx.c @@ -0,0 +1,67 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -mlsx -fdump-rtl-expand-all" } */ + +#define ABD(x, y) ((x - y > 0) ? (x - y) : -(x - y)) +#define MAX(x, y) ((x) > (y) ? (x) : (y)) +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#define N 1024 + +#define FUNC1(T) \ + void \ + sabd1_##T (signed T *restrict a, signed T *restrict b, \ + signed T *restrict out) \ + { \ + for (int i = 0; i < N; i++) \ + out[i] = ABD (a[i], b[i]); \ + } \ + \ + void \ + uabd1_##T (unsigned T *restrict a, unsigned T *restrict b, \ + unsigned T *restrict out) \ + { \ + for (int i = 0; i < N; i++) \ + out[i] = ABD (a[i], b[i]); \ + } + +#define FUNC2(T) \ + void \ + sabd2_##T (signed T *restrict a, signed T *restrict b, \ + signed T *restrict out) \ + { \ + for (int i = 0; i < N; i++) \ + out[i] = MAX (a[i], b[i]) - MIN (a[i], b[i]); \ + } \ + \ + void \ + uabd2_##T (unsigned T *restrict a, unsigned T *restrict b, \ + unsigned T *restrict out) \ + { \ + for (int i = 0; i < N; i++) \ + out[i] = MAX (a[i], b[i]) - MIN (a[i], b[i]); \ + } + +/* Verify if the expand pass fits standard pattern name. */ +FUNC1 (char) +FUNC1 (short) +FUNC1 (int) +FUNC1 (long) + +/* Verify if the combiner works well. */ +FUNC2 (char) +FUNC2 (short) +FUNC2 (int) +FUNC2 (long) +/* { dg-final { scan-rtl-dump "Function sabd1_char.*ABD.*Function uabd1_char" "expand" } } */ +/* { dg-final { scan-rtl-dump "Function uabd1_char.*ABD.*Function sabd1_short" "expand" } } */ +/* { dg-final { scan-rtl-dump "Function sabd1_short.*ABD.*Function uabd1_short" "expand" } } */ +/* { dg-final { scan-rtl-dump "Function uabd1_short.*ABD.*Function sabd1_int" "expand" } } */ +/* { dg-final { scan-rtl-dump "Function sabd1_int.*ABD.*Function uabd1_int" "expand" } } */ +/* { dg-final { scan-rtl-dump "Function sabd1_long.*ABD.*Function uabd1_long" "expand" } } */ +/* { dg-final { scan-assembler-times "sabd2_char:.*\tvabsd\\.b.*-sabd2_char" 1 } } */ +/* { dg-final { scan-assembler-times "uabd2_char:.*\tvabsd\\.bu.*-uabd2_char" 1 } } */ +/* { dg-final { scan-assembler-times "sabd2_short:.*\tvabsd\\.h.*-sabd2_short" 1 } } */ +/* { dg-final { scan-assembler-times "uabd2_short:.*\tvabsd\\.hu.*-uabd2_short" 1 } } */ +/* { dg-final { scan-assembler-times "sabd2_int:.*\tvabsd\\.w.*-sabd2_int" 1 } } */ +/* { dg-final { scan-assembler-times "uabd2_int:.*\tvabsd\\.wu.*-uabd2_int" 1 } } */ +/* { dg-final { scan-assembler-times "sabd2_long:.*\tvabsd\\.d.*-sabd2_long" 1 } } */ +/* { dg-final { scan-assembler-times "uabd2_long:.*\tvabsd\\.du.*-uabd2_long" 1 } } */ |