1#define vector(elcount, type) \ 2__attribute__((vector_size((elcount)*sizeof(type)))) type 3 4#define vidx(type, vec, idx) (*((type *) &(vec) + idx)) 5 6#define operl(a, b, op) (a op b) 7#define operr(a, b, op) (b op a) 8 9#define check(type, count, vec0, vec1, num, op, lr) \ 10do {\ 11 int __i; \ 12 for (__i = 0; __i < count; __i++) {\ 13 if (vidx (type, vec1, __i) != oper##lr (num, vidx (type, vec0, __i), op)) \ 14 __builtin_abort (); \ 15 }\ 16} while (0) 17 18#define veccompare(type, count, v0, v1) \ 19do {\ 20 int __i; \ 21 for (__i = 0; __i < count; __i++) { \ 22 if (vidx (type, v0, __i) != vidx (type, v1, __i)) \ 23 __builtin_abort (); \ 24 } \ 25} while (0) 26 27volatile int one = 1; 28 29int main (int argc, char *argv[]) { 30#define fvec_2 (vector(4, float)){2., 2., 2., 2.} 31#define dvec_2 (vector(2, double)){2., 2.} 32 33 34 vector(8, short) v0 = {one, 1, 2, 3, 4, 5, 6, 7}; 35 vector(8, short) v1; 36 37 vector(4, float) f0 = {1., 2., 3., 4.}; 38 vector(4, float) f1, f2; 39 40 vector(2, double) d0 = {1., 2.}; 41 vector(2, double) d1, d2; 42 43 44 45 v1 = 2 + v0; check (short, 8, v0, v1, 2, +, l); 46 v1 = 2 - v0; check (short, 8, v0, v1, 2, -, l); 47 v1 = 2 * v0; check (short, 8, v0, v1, 2, *, l); 48 v1 = 2 / v0; check (short, 8, v0, v1, 2, /, l); 49 v1 = 2 % v0; check (short, 8, v0, v1, 2, %, l); 50 v1 = 2 ^ v0; check (short, 8, v0, v1, 2, ^, l); 51 v1 = 2 & v0; check (short, 8, v0, v1, 2, &, l); 52 v1 = 2 | v0; check (short, 8, v0, v1, 2, |, l); 53 v1 = 2 << v0; check (short, 8, v0, v1, 2, <<, l); 54 v1 = 2 >> v0; check (short, 8, v0, v1, 2, >>, l); 55 56 v1 = v0 + 2; check (short, 8, v0, v1, 2, +, r); 57 v1 = v0 - 2; check (short, 8, v0, v1, 2, -, r); 58 v1 = v0 * 2; check (short, 8, v0, v1, 2, *, r); 59 v1 = v0 / 2; check (short, 8, v0, v1, 2, /, r); 60 v1 = v0 % 2; check (short, 8, v0, v1, 2, %, r); 61 v1 = v0 ^ 2; check (short, 8, v0, v1, 2, ^, r); 62 v1 = v0 & 2; check (short, 8, v0, v1, 2, &, r); 63 v1 = v0 | 2; check (short, 8, v0, v1, 2, |, r); 64 65 f1 = 2. + f0; f2 = fvec_2 + f0; veccompare (float, 4, f1, f2); 66 f1 = 2. - f0; f2 = fvec_2 - f0; veccompare (float, 4, f1, f2); 67 f1 = 2. * f0; f2 = fvec_2 * f0; veccompare (float, 4, f1, f2); 68 f1 = 2. / f0; f2 = fvec_2 / f0; veccompare (float, 4, f1, f2); 69 70 f1 = f0 + 2.; f2 = f0 + fvec_2; veccompare (float, 4, f1, f2); 71 f1 = f0 - 2.; f2 = f0 - fvec_2; veccompare (float, 4, f1, f2); 72 f1 = f0 * 2.; f2 = f0 * fvec_2; veccompare (float, 4, f1, f2); 73 f1 = f0 / 2.; f2 = f0 / fvec_2; veccompare (float, 4, f1, f2); 74 75 d1 = 2. + d0; d2 = dvec_2 + d0; veccompare (double, 2, d1, d2); 76 d1 = 2. - d0; d2 = dvec_2 - d0; veccompare (double, 2, d1, d2); 77 d1 = 2. * d0; d2 = dvec_2 * d0; veccompare (double, 2, d1, d2); 78 d1 = 2. / d0; d2 = dvec_2 / d0; veccompare (double, 2, d1, d2); 79 80 d1 = d0 + 2.; d2 = d0 + dvec_2; veccompare (double, 2, d1, d2); 81 d1 = d0 - 2.; d2 = d0 - dvec_2; veccompare (double, 2, d1, d2); 82 d1 = d0 * 2.; d2 = d0 * dvec_2; veccompare (double, 2, d1, d2); 83 d1 = d0 / 2.; d2 = d0 / dvec_2; veccompare (double, 2, d1, d2); 84 85 return 0; 86} 87