162 lines
3.9 KiB
C
162 lines
3.9 KiB
C
/* { dg-do run } */
|
|
/* { dg-require-effective-target p8vector_hw } */
|
|
/* { dg-options "-mdejagnu-cpu=power8" } */
|
|
|
|
#include <altivec.h> // vector
|
|
|
|
#ifdef DEBUG
|
|
#include <stdio.h>
|
|
#endif
|
|
|
|
#define ALL 1
|
|
#define EVEN 2
|
|
#define ODD 3
|
|
|
|
void abort (void);
|
|
|
|
void test_int_result(int check, vector int vec_result, vector int vec_expected)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
switch (check) {
|
|
case ALL:
|
|
break;
|
|
case EVEN:
|
|
if (i%2 == 0)
|
|
break;
|
|
else
|
|
continue;
|
|
case ODD:
|
|
if (i%2 != 0)
|
|
break;
|
|
else
|
|
continue;
|
|
}
|
|
|
|
if (vec_result[i] != vec_expected[i]) {
|
|
#ifdef DEBUG
|
|
printf("Test_int_result: ");
|
|
printf("vec_result[%d] (%d) != vec_expected[%d] (%d)\n",
|
|
i, vec_result[i], i, vec_expected[i]);
|
|
#else
|
|
abort();
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
|
|
void test_unsigned_int_result(int check, vector unsigned int vec_result,
|
|
vector unsigned int vec_expected)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
switch (check) {
|
|
case ALL:
|
|
break;
|
|
case EVEN:
|
|
if (i%2 == 0)
|
|
break;
|
|
else
|
|
continue;
|
|
case ODD:
|
|
if (i%2 != 0)
|
|
break;
|
|
else
|
|
continue;
|
|
}
|
|
|
|
if (vec_result[i] != vec_expected[i]) {
|
|
#ifdef DEBUG
|
|
printf("Test_unsigned int_result: ");
|
|
printf("vec_result[%d] (%d) != vec_expected[%d] (%d)\n",
|
|
i, vec_result[i], i, vec_expected[i]);
|
|
#else
|
|
abort();
|
|
#endif
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
void test_result_sp(int check, vector float vec_result,
|
|
vector float vec_expected)
|
|
{
|
|
int i;
|
|
for(i = 0; i<4; i++) {
|
|
|
|
switch (check) {
|
|
case ALL:
|
|
break;
|
|
case EVEN:
|
|
if (i%2 == 0)
|
|
break;
|
|
else
|
|
continue;
|
|
case ODD:
|
|
if (i%2 != 0)
|
|
break;
|
|
else
|
|
continue;
|
|
}
|
|
|
|
if (vec_result[i] != vec_expected[i]) {
|
|
#ifdef DEBUG
|
|
printf("Test_result_sp: ");
|
|
printf("vec_result[%d] (%f) != vec_expected[%d] (%f)\n",
|
|
i, vec_result[i], i, vec_expected[i]);
|
|
#else
|
|
abort();
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
|
|
int main()
|
|
{
|
|
int i;
|
|
vector unsigned int vec_unint, vec_uns_int_expected, vec_uns_int_result;
|
|
vector signed int vec_int, vec_int_expected, vec_int_result;
|
|
vector float vec_flt, vec_flt_result, vec_flt_expected;
|
|
vector long long int vec_ll_int0, vec_ll_int1;
|
|
vector long long unsigned int vec_ll_uns_int0, vec_ll_uns_int1;
|
|
vector double vec_dble0, vec_dble1, vec_dble_result, vec_dble_expected;
|
|
|
|
vec_ll_int0 = (vector long long int){ -12, -12345678901234 };
|
|
vec_ll_int1 = (vector long long int){ 12, 9876543210 };
|
|
vec_ll_uns_int0 = (vector unsigned long long int){ 102, 9753108642 };
|
|
vec_ll_uns_int1 = (vector unsigned long long int){ 23, 29 };
|
|
|
|
/* Convert two double precision vector float to vector int */
|
|
vec_dble0 = (vector double){-124.930, 81234.49};
|
|
vec_dble1 = (vector double){-24.370, 8354.99};
|
|
vec_int_expected = (vector signed int){-124, 81234, -24, 8354};
|
|
vec_int_result = vec_signed2 (vec_dble0, vec_dble1);
|
|
test_int_result (ALL, vec_int_result, vec_int_expected);
|
|
|
|
/* Convert two double precision vector float to vector unsigned int */
|
|
vec_dble0 = (vector double){124.930, 8134.49};
|
|
vec_dble1 = (vector double){24.370, 834.99};
|
|
vec_uns_int_expected = (vector unsigned int){124, 8134, 24, 834};
|
|
vec_uns_int_result = vec_unsigned2 (vec_dble0, vec_dble1);
|
|
test_unsigned_int_result (ALL, vec_uns_int_result,
|
|
vec_uns_int_expected);
|
|
|
|
/* conversion of two double precision vectors to single precision vector */
|
|
vec_flt_expected = (vector float){-12.00, -12345678901234.00, 12.00, 9876543210.00};
|
|
vec_flt_result = vec_float2 (vec_ll_int0, vec_ll_int1);
|
|
test_result_sp(ALL, vec_flt_result, vec_flt_expected);
|
|
|
|
vec_flt_expected = (vector float){102.00, 9753108642.00, 23.00, 29.00};
|
|
vec_flt_result = vec_float2 (vec_ll_uns_int0, vec_ll_uns_int1);
|
|
test_result_sp(ALL, vec_flt_result, vec_flt_expected);
|
|
|
|
vec_dble0 = (vector double){ 34.0, 97.0 };
|
|
vec_dble1 = (vector double){ 214.0, -5.5 };
|
|
vec_flt_expected = (vector float){34.0, 97.0, 214.0, -5.5};
|
|
vec_flt_result = vec_float2 (vec_dble0, vec_dble1);
|
|
test_result_sp(ALL, vec_flt_result, vec_flt_expected);
|
|
}
|
|
|