| /* { dg-do run { target lp64 } } */ |
| /* { dg-require-effective-target vsx_hw } */ |
| /* { dg-options "-O2 -mvsx" } */ |
| |
| #define DEBUG 0 |
| |
| /* This file just generates calls to the various builtins and verifies the |
| expected number of instructions for each builtin were generated. */ |
| |
| #include "vsx-vector-6-func-cmp.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); \ |
| printf(" expected[0] = 0x%x; result[0] =0x%x\n", \ |
| f_##NAME##_expected[0], f_result[0]); \ |
| printf(" expected[1] = 0x%x; result[1] = 0x%x\n", \ |
| f_##NAME##_expected[1], f_result[1]); \ |
| printf(" expected[2] = 0x%x; result[2] = 0x%x\n", \ |
| f_##NAME##_expected[2], f_result[2]); \ |
| printf(" expected[3] = 0x%x; result[3] = 0x%x\n", \ |
| f_##NAME##_expected[3], f_result[3]); \ |
| } \ |
| 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); \ |
| printf(" expected[0] = 0x%lx; result[0] = 0x%lx\n", \ |
| d_##NAME##_expected[0], d_result[0]); \ |
| printf(" expected[1] = 0x%lx; result[1] = 0x%lx\n", \ |
| d_##NAME##_expected[1], d_result[1]); \ |
| } \ |
| else \ |
| abort(); \ |
| } |
| |
| int |
| main () { |
| int i; |
| vector float f_src_a = { 126.0, 23.0, -338.0, 17.0}; |
| vector float f_src_b = { 2.00, 23.0, 1.0, 4.0}; |
| vector bool f_result; |
| vector bool int f_cmpeq_expected = {0x0, 0xFFFFFFFF, 0x0, 0x0}; |
| vector bool int f_cmpgt_expected = {0xFFFFFFFF, 0x0, 0x0, 0xFFFFFFFF}; |
| vector bool int f_cmpge_expected = {0xFFFFFFFF, 0xFFFFFFFF, 0x0, 0xFFFFFFFF}; |
| vector bool int f_cmplt_expected = {0x0, 0x0, 0xFFFFFFFF, 0x0}; |
| vector bool int f_cmple_expected = {0x0, 0xFFFFFFFF, 0xFFFFFFFF, 0x0}; |
| |
| vector double d_src_a = { 125.44, -338.56}; |
| vector double d_src_b = { 4.0, -338.56}; |
| vector bool long long d_result; |
| vector bool long long d_cmpeq_expected = {0x0, 0xFFFFFFFFFFFFFFFF}; |
| vector bool long long d_cmpgt_expected = {0xFFFFFFFFFFFFFFFF, 0x0}; |
| vector bool long long d_cmpge_expected = {0xFFFFFFFFFFFFFFFF, |
| 0xFFFFFFFFFFFFFFFF}; |
| vector bool long long d_cmplt_expected = {0x0, 0x0}; |
| vector bool long long d_cmple_expected = {0x0, 0xFFFFFFFFFFFFFFFF}; |
| |
| FLOAT_CHECK (cmpeq) |
| FLOAT_CHECK (cmpgt) |
| FLOAT_CHECK (cmpge) |
| FLOAT_CHECK (cmplt) |
| FLOAT_CHECK (cmple) |
| |
| DOUBLE_CHECK (cmpeq) |
| DOUBLE_CHECK (cmpgt) |
| DOUBLE_CHECK (cmpge) |
| DOUBLE_CHECK (cmplt) |
| DOUBLE_CHECK (cmple) |
| |
| return 0; |
| } |