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
|
extern
#ifdef __cplusplus
"C"
#endif
void abort (void);
typedef int v4si __attribute__((vector_size (4 * sizeof (int))));
typedef unsigned int v4usi __attribute__((vector_size (4 * sizeof (unsigned int))));
typedef float v4sf __attribute__((vector_size (4 * sizeof (float))));
typedef double v4df __attribute__((vector_size (4 * sizeof (double))));
typedef long long v256di __attribute__((vector_size (256 * sizeof (long long))));
typedef double v256df __attribute__((vector_size (256 * sizeof (double))));
void
f1 (v4usi *x, v4si *y)
{
*y = __builtin_convertvector (*x, v4si);
}
void
f2 (v4sf *x, v4si *y)
{
*y = __builtin_convertvector (*x, v4si);
}
void
f3 (v4si *x, v4sf *y)
{
*y = __builtin_convertvector (*x, v4sf);
}
void
f4 (v4df *x, v4si *y)
{
*y = __builtin_convertvector (*x, v4si);
}
void
f5 (v4si *x, v4df *y)
{
*y = __builtin_convertvector (*x, v4df);
}
void
f6 (v256df *x, v256di *y)
{
*y = __builtin_convertvector (*x, v256di);
}
void
f7 (v256di *x, v256df *y)
{
*y = __builtin_convertvector (*x, v256df);
}
void
f8 (v4df *x)
{
v4si a = { 1, 2, -3, -4 };
*x = __builtin_convertvector (a, v4df);
}
int
main ()
{
union U1 { v4si v; int a[4]; } u1;
union U2 { v4usi v; unsigned int a[4]; } u2;
union U3 { v4sf v; float a[4]; } u3;
union U4 { v4df v; double a[4]; } u4;
union U5 { v256di v; long long a[256]; } u5;
union U6 { v256df v; double a[256]; } u6;
int i;
for (i = 0; i < 4; i++)
u2.a[i] = i * 2;
f1 (&u2.v, &u1.v);
for (i = 0; i < 4; i++)
if (u1.a[i] != i * 2)
abort ();
else
u3.a[i] = i - 2.25f;
f2 (&u3.v, &u1.v);
for (i = 0; i < 4; i++)
if (u1.a[i] != (i == 3 ? 0 : i - 2))
abort ();
else
u3.a[i] = i + 0.75f;
f2 (&u3.v, &u1.v);
for (i = 0; i < 4; i++)
if (u1.a[i] != i)
abort ();
else
u1.a[i] = 7 * i - 5;
f3 (&u1.v, &u3.v);
for (i = 0; i < 4; i++)
if (u3.a[i] != 7 * i - 5)
abort ();
else
u4.a[i] = i - 2.25;
f4 (&u4.v, &u1.v);
for (i = 0; i < 4; i++)
if (u1.a[i] != (i == 3 ? 0 : i - 2))
abort ();
else
u4.a[i] = i + 0.75;
f4 (&u4.v, &u1.v);
for (i = 0; i < 4; i++)
if (u1.a[i] != i)
abort ();
else
u1.a[i] = 7 * i - 5;
f5 (&u1.v, &u4.v);
for (i = 0; i < 4; i++)
if (u4.a[i] != 7 * i - 5)
abort ();
for (i = 0; i < 256; i++)
u6.a[i] = i - 128.25;
f6 (&u6.v, &u5.v);
for (i = 0; i < 256; i++)
if (u5.a[i] != i - 128 - (i > 128))
abort ();
else
u5.a[i] = i - 128;
f7 (&u5.v, &u6.v);
for (i = 0; i < 256; i++)
if (u6.a[i] != i - 128)
abort ();
f8 (&u4.v);
for (i = 0; i < 4; i++)
if (u4.a[i] != (i >= 2 ? -1 - i : i + 1))
abort ();
return 0;
}
|