1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
/* { dg-do run { target { powerpc*-*-linux* && { p8vector_hw } } } } */
/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=power8" } } */
/* { dg-require-effective-target p8vector_hw } */
/* { dg-options "-mcpu=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);
}
|