| /* { dg-options "-mdejagnu-cpu=power9 -O2" } */ |
| /* { dg-require-effective-target powerpc_vsx } */ |
| |
| /* Expliot vector absolute difference unsigned. */ |
| |
| #define N 128 |
| #define PRAGMA(X) _Pragma (#X) |
| #define UNROLL0 PRAGMA (GCC unroll 0) |
| |
| #define TEST1(TYPE) \ |
| void test1_##TYPE (unsigned TYPE *restrict a, unsigned TYPE *restrict b, \ |
| unsigned TYPE *restrict out) \ |
| { \ |
| UNROLL0 \ |
| for (int i = 0; i < N; i++) \ |
| out[i] = __builtin_abs (a[i] - b[i]); \ |
| } |
| |
| TEST1(char) |
| TEST1(short) |
| |
| #define TEST2(TYPE1, TYPE2, FUNC) \ |
| void test2_##TYPE1 (unsigned TYPE1 *restrict a, unsigned TYPE1 *restrict b, \ |
| unsigned TYPE1 *restrict out) \ |
| { \ |
| UNROLL0 \ |
| for (int i = 0; i < N; i++) \ |
| out[i] = __builtin_##FUNC ((TYPE2) a[i] - (TYPE2) b[i]); \ |
| } |
| |
| TEST2(char, int, abs) |
| TEST2(short, int, abs) |
| TEST2(int, long long, llabs) |
| |
| /* { dg-final { scan-assembler-times {\mvabsdub\M} 2 } } */ |
| /* { dg-final { scan-assembler-times {\mvabsduh\M} 2 } } */ |
| /* { dg-final { scan-assembler-times {\mvabsduw\M} 1 } } */ |