| /* { dg-do run { target { powerpc64*-*-* && { p8vector_hw } } } } */ |
| /* { dg-require-effective-target powerpc_p8vector_ok } */ |
| /* { dg-options "-mdejagnu-cpu=power8 -mpower8-vector -O3" } */ |
| |
| /* Test that the vec_cmpne builtin works as expected for long long |
| and double vectors. */ |
| |
| #include "altivec.h" |
| |
| #define N 4096 |
| |
| void abort (); |
| |
| #define define_test_functions(VBTYPE, RTYPE, STYPE, NAME) \ |
| \ |
| RTYPE result_ne_##NAME[N] __attribute__((aligned(16))); \ |
| RTYPE result_eq_##NAME[N] __attribute__((aligned(16))); \ |
| STYPE operand1_##NAME[N] __attribute__((aligned(16))); \ |
| STYPE operand2_##NAME[N] __attribute__((aligned(16))); \ |
| RTYPE expected_##NAME[N] __attribute__((aligned(16))); \ |
| \ |
| __attribute__((noinline)) void vector_tests_##NAME () \ |
| { \ |
| vector STYPE v1_##NAME, v2_##NAME; \ |
| vector bool VBTYPE tmp_##NAME; \ |
| int i; \ |
| for (i = 0; i < N; i+=16/sizeof (STYPE)) \ |
| { \ |
| /* result_ne = operand1!=operand2. */ \ |
| v1_##NAME = (vector STYPE) { operand1_##NAME[i], \ |
| operand1_##NAME[i+1] }; \ |
| v2_##NAME = (vector STYPE) { operand2_##NAME[i], \ |
| operand2_##NAME[i+1] }; \ |
| \ |
| tmp_##NAME = vec_cmpeq (v1_##NAME, v2_##NAME); \ |
| result_eq_##NAME[i] = tmp_##NAME[0]; \ |
| result_eq_##NAME[i+1] = tmp_##NAME[1]; \ |
| \ |
| tmp_##NAME = vec_cmpne (v1_##NAME, v2_##NAME); \ |
| result_ne_##NAME[i] = tmp_##NAME[0]; \ |
| result_ne_##NAME[i+1] = tmp_##NAME[1]; \ |
| } \ |
| } \ |
| \ |
| __attribute__((noinline)) void init_##NAME () \ |
| { \ |
| int i; \ |
| for (i = 0; i < N; ++i) \ |
| { \ |
| result_ne_##NAME[i] = 7; \ |
| result_eq_##NAME[i] = 15; \ |
| if (i%3 == 0) \ |
| { \ |
| /* op1 < op2. */ \ |
| operand1_##NAME[i] = 1; \ |
| operand2_##NAME[i] = 2; \ |
| } \ |
| else if (i%3 == 1) \ |
| { \ |
| /* op1 > op2. */ \ |
| operand1_##NAME[i] = 2; \ |
| operand2_##NAME[i] = 1; \ |
| } \ |
| else if (i%3 == 2) \ |
| { \ |
| /* op1 == op2. */ \ |
| operand1_##NAME[i] = 3; \ |
| operand2_##NAME[i] = 3; \ |
| } \ |
| /* For vector comparisons: "For each element of the result_ne, the \ |
| value of each bit is 1 if the corresponding elements of ARG1 and \ |
| ARG2 are equal." {or whatever the comparison is} "Otherwise, the \ |
| value of each bit is 0." */ \ |
| expected_##NAME[i] = -1 * (RTYPE)(operand1_##NAME[i] != operand2_##NAME[i]); \ |
| } \ |
| } \ |
| \ |
| __attribute__((noinline)) void verify_results_##NAME () \ |
| { \ |
| int i; \ |
| for (i = 0; i < N; ++i) \ |
| { \ |
| if ( ((result_ne_##NAME[i] != expected_##NAME[i]) || \ |
| (result_ne_##NAME[i] == result_eq_##NAME[i]))) \ |
| abort (); \ |
| } \ |
| } |
| |
| |
| #define execute_test_functions(VBTYPE, RTYPE, STYPE, NAME) \ |
| { \ |
| init_##NAME (); \ |
| vector_tests_##NAME (); \ |
| verify_results_##NAME (); \ |
| } |
| |
| |
| define_test_functions (long long, signed long long, signed long long, si); |
| define_test_functions (long long, signed long long, double, dd); |
| |
| int main () |
| { |
| execute_test_functions (long long, signed long long, signed long long, si); |
| execute_test_functions (long long, signed long long, double, dd); |
| |
| return 0; |
| } |
| |
| |