1 #define vector(elcount, type) \
2 __attribute__((vector_size((elcount)*sizeof(type)))) type
4 #define vidx(type, vec, idx) (*((type *) &(vec) + idx))
6 #define operl(a, b, op) (a op b)
7 #define operr(a, b, op) (b op a)
9 #define check(type, count, vec0, vec1, num, op, lr) \
12 for (__i = 0; __i < count; __i++) {\
13 if (vidx (type, vec1, __i) != oper##lr (num, vidx (type, vec0, __i), op)) \
18 #define veccompare(type, count, v0, v1) \
21 for (__i = 0; __i < count; __i++) { \
22 if (vidx (type, v0, __i) != vidx (type, v1, __i)) \
29 int 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.}
34 vector(8, short) v0
= {one
, 1, 2, 3, 4, 5, 6, 7};
37 vector(4, float) f0
= {1., 2., 3., 4.};
38 vector(4, float) f1
, f2
;
40 vector(2, double) d0
= {1., 2.};
41 vector(2, double) d1
, d2
;
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
);
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
);
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
);
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
);
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
);
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
);