| /* { dg-do run { target lp64 } } */ |
| /* { dg-require-effective-target vsx_hw } */ |
| /* { dg-options "-O2 -mvsx" } */ |
| |
| #define DEBUG 0 |
| |
| /* Functional test of the two operand logical vector builtins. */ |
| #include "vsx-vector-6-func-2lop.h" |
| |
| /* Macros to check the results of the builtin tests. */ |
| #define FLOAT_CHECK(NAME) \ |
| f_result = vec_##NAME (f_src_a, f_src_b); \ |
| \ |
| if ((f_result[0] != f_##NAME##_expected[0]) \ |
| || (f_result[1] != f_##NAME##_expected[1]) \ |
| || (f_result[2] != f_##NAME##_expected[2]) \ |
| || (f_result[3] != f_##NAME##_expected[3])) \ |
| { \ |
| if (DEBUG) \ |
| { \ |
| printf("ERROR: vec_%s (float) expected value does not match\n", \ |
| #NAME); \ |
| for (i = 0; i < 4; i++) \ |
| { \ |
| conv_result.f[i] = f_result[i]; \ |
| printf(" expected[%d] = 0x%x; result[%d] = 0x%x\n", i, \ |
| conv_exp.u[i], i, conv_result.u[i]); \ |
| } \ |
| } \ |
| else \ |
| abort(); \ |
| } |
| |
| #define DOUBLE_CHECK(NAME) \ |
| d_result = vec_##NAME (d_src_a, d_src_b); \ |
| \ |
| if ((d_result[0] != d_##NAME##_expected[0]) \ |
| || (d_result[1] != d_##NAME##_expected[1])) \ |
| { \ |
| if (DEBUG) \ |
| { \ |
| printf("ERROR: vec_%s (double) expected value does not match\n", \ |
| #NAME); \ |
| for (i = 0; i < 2; i++) \ |
| { \ |
| conv_result.d[i] = d_result[i]; \ |
| printf(" expected[%d] = 0x%lx; result[%d] = 0x%lx\n", i, \ |
| conv_exp.ul, i, conv_result.ul); \ |
| } \ |
| } \ |
| else \ |
| abort(); \ |
| } |
| |
| int |
| main () { |
| int i; |
| |
| vector float f_src_a = { 1.0, 2.0, 3.0, 4.0}; |
| vector float f_src_b = { 1.0, 3.0, -3.0, 2.0}; |
| vector float f_and_expected, f_andc_expected, f_nor_expected, f_or_expected; |
| vector float f_xor_expected; |
| vector float f_result; |
| |
| vector double d_src_a = { 8.0, 10.0}; |
| vector double d_src_b = { 12.0, 2.0}; |
| vector double d_and_expected, d_andc_expected, d_nor_expected; |
| vector double d_result; |
| vector double d_or_expected, d_xor_expected; |
| |
| /* Calculate expected results. */ |
| /* AND, float */ |
| for (i = 0; i < 4; i++) |
| { |
| conv_src_a.f[i] = f_src_a[i]; |
| conv_src_b.f[i] = f_src_b[i]; |
| conv_exp.u[i] = conv_src_a.u[i] & conv_src_b.u[i]; |
| f_and_expected[i] = conv_exp.f[i]; |
| } |
| |
| /* ANDC, float */ |
| for (i = 0; i < 4; i++) |
| { |
| conv_src_a.f[i] = f_src_a[i]; |
| conv_src_b.f[i] = f_src_b[i]; |
| conv_exp.u[i] = conv_src_a.u[i] & ~conv_src_b.u[i]; |
| f_andc_expected[i] = conv_exp.f[i]; |
| } |
| |
| /* NOR, max */ |
| for (i = 0; i < 4; i++) |
| { |
| conv_src_a.f[i] = f_src_a[i]; |
| conv_src_b.f[i] = f_src_b[i]; |
| conv_exp.u[i] = ~(conv_src_a.u[i] | conv_src_b.u[i]); |
| f_nor_expected[i] = conv_exp.f[i]; |
| } |
| |
| /* OR, float */ |
| for (i = 0; i < 4; i++) |
| { |
| conv_src_a.f[i] = f_src_a[i]; |
| conv_src_b.f[i] = f_src_b[i]; |
| conv_exp.u[i] = conv_src_a.u[i] | conv_src_b.u[i]; |
| f_or_expected[i] = conv_exp.f[i]; |
| } |
| |
| /* XOR, float */ |
| for (i = 0; i < 4; i++) |
| { |
| conv_src_a.f[i] = f_src_a[i]; |
| conv_src_b.f[i] = f_src_b[i]; |
| conv_exp.u[i] = conv_src_a.u[i] ^ conv_src_b.u[i]; |
| f_xor_expected[i] = conv_exp.f[i]; |
| } |
| |
| /* AND, double */ |
| for (i = 0; i < 2; i++) |
| { |
| conv_src_a.d[i] = d_src_a[i]; |
| conv_src_b.d[i] = d_src_b[i]; |
| conv_exp.ul[i] = conv_src_a.ul[i] & conv_src_b.ul[i]; |
| d_and_expected[i] = conv_exp.d[i]; |
| } |
| |
| /* ANDC, double */ |
| for (i = 0; i < 2; i++) |
| { |
| conv_src_a.d[i] = d_src_a[i]; |
| conv_src_b.d[i] = d_src_b[i]; |
| conv_exp.ul[i] = conv_src_a.ul[i] & ~conv_src_b.ul[i]; |
| d_andc_expected[i] = conv_exp.d[i]; |
| } |
| |
| /* NOR, double */ |
| for (i = 0; i < 2; i++) |
| { |
| conv_src_a.d[i] = d_src_a[i]; |
| conv_src_b.d[i] = d_src_b[i]; |
| conv_exp.ul[i] = ~(conv_src_a.ul[i] | conv_src_b.ul[i]); |
| d_nor_expected[i] = conv_exp.d[i]; |
| } |
| |
| /* OR, double */ |
| for (i = 0; i < 2; i++) |
| { |
| conv_src_a.d[i] = d_src_a[i]; |
| conv_src_b.d[i] = d_src_b[i]; |
| conv_exp.ul[i] = conv_src_a.ul[i] | conv_src_b.ul[i]; |
| d_or_expected[i] = conv_exp.d[i]; |
| } |
| |
| /* XOR, double */ |
| for (i = 0; i < 2; i++) |
| { |
| conv_src_a.d[i] = d_src_a[i]; |
| conv_src_b.d[i] = d_src_b[i]; |
| conv_exp.ul[i] = conv_src_a.ul[i] ^ conv_src_b.ul[i]; |
| d_xor_expected[i] = conv_exp.d[i]; |
| } |
| |
| /* Run tests. */ |
| FLOAT_CHECK (and) |
| FLOAT_CHECK (andc) |
| FLOAT_CHECK (nor) |
| FLOAT_CHECK (or) |
| FLOAT_CHECK (xor) |
| |
| DOUBLE_CHECK (and) |
| DOUBLE_CHECK (andc) |
| DOUBLE_CHECK (nor) |
| DOUBLE_CHECK (or) |
| DOUBLE_CHECK (xor) |
| |
| return 0; |
| } |
| |