blob: 3d7319d45c1889d64ee9ffa4c0770e60090c2640 [file] [log] [blame]
/* { 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;
}