1/* { dg-do run } */
2#define vector(elcount, type)  \
3__attribute__((vector_size((elcount)*sizeof(type)))) type
4
5#define check_compare(count, res, i0, i1, op, fmt) \
6do { \
7    int __i; \
8    for (__i = 0; __i < count; __i ++) { \
9      if ((res)[__i] != ((i0)[__i] op (i1)[__i] ? -1 : 0)) \
10	{ \
11            __builtin_printf ("%i != ((" fmt " " #op " " fmt " ? -1 : 0) ", \
12			      (res)[__i], (i0)[__i], (i1)[__i]); \
13            __builtin_abort (); \
14        } \
15    } \
16} while (0)
17
18#define test(count, v0, v1, res, fmt); \
19do { \
20    res = (v0 > v1); \
21    check_compare (count, res, v0, v1, >, fmt); \
22    res = (v0 < v1); \
23    check_compare (count, res, v0, v1, <, fmt); \
24    res = (v0 >= v1); \
25    check_compare (count, res, v0, v1, >=, fmt); \
26    res = (v0 <= v1); \
27    check_compare (count, res, v0, v1, <=, fmt); \
28    res = (v0 == v1); \
29    check_compare (count, res, v0, v1, ==, fmt); \
30    res = (v0 != v1); \
31    check_compare (count, res, v0, v1, !=, fmt); \
32} while (0)
33
34
35int main (int argc, char *argv[]) {
36#define INT  int
37    vector (4, INT) i0;
38    vector (4, INT) i1;
39    vector (4, int) ires;
40    int i;
41
42    i0 = (vector (4, INT)){(INT)argc, 1,  2,  10};
43    i1 = (vector (4, INT)){0, 3, 2, (INT)-23};
44    test (4, i0, i1, ires, "%i");
45#undef INT
46
47#define INT unsigned int
48    vector (4, int) ures;
49    vector (4, INT) u0;
50    vector (4, INT) u1;
51
52    u0 = (vector (4, INT)){(INT)argc, 1,  2,  10};
53    u1 = (vector (4, INT)){0, 3, 2, (INT)-23};
54    test (4, u0, u1, ures, "%u");
55#undef INT
56
57
58#define SHORT short
59    vector (8, SHORT) s0;
60    vector (8, SHORT) s1;
61    vector (8, short) sres;
62
63    s0 = (vector (8, SHORT)){(SHORT)argc, 1,  2,  10,  6, 87, (SHORT)-5, 2};
64    s1 = (vector (8, SHORT)){0, 3, 2, (SHORT)-23, 12, 10, (SHORT)-2, 0};
65    test (8, s0, s1, sres, "%i");
66#undef SHORT
67
68#define SHORT unsigned short
69    vector (8, SHORT) us0;
70    vector (8, SHORT) us1;
71    vector (8, short) usres;
72
73    us0 = (vector (8, SHORT)){(SHORT)argc, 1,  2,  10,  6, 87, (SHORT)-5, 2};
74    us1 = (vector (8, SHORT)){0, 3, 2, (SHORT)-23, 12, 10, (SHORT)-2, 0};
75    test (8, us0, us1, usres, "%u");
76#undef SHORT
77
78#define CHAR signed char
79    vector (16, CHAR) c0;
80    vector (16, CHAR) c1;
81    vector (16, signed char) cres;
82
83    c0 = (vector (16, CHAR)){(CHAR)argc, 1,  2,  10,  6, 87, (CHAR)-5, 2, \
84                             (CHAR)argc, 1,  2,  10,  6, 87, (CHAR)-5, 2 };
85
86    c1 = (vector (16, CHAR)){0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0, \
87                             0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0};
88    test (16, c0, c1, cres, "%i");
89#undef CHAR
90
91#define CHAR unsigned char
92    vector (16, CHAR) uc0;
93    vector (16, CHAR) uc1;
94    vector (16, signed char) ucres;
95
96    uc0 = (vector (16, CHAR)){(CHAR)argc, 1,  2,  10,  6, 87, (CHAR)-5, 2, \
97                              (CHAR)argc, 1,  2,  10,  6, 87, (CHAR)-5, 2 };
98
99    uc1 = (vector (16, CHAR)){0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0, \
100                             0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0};
101    test (16, uc0, uc1, ucres, "%u");
102#undef CHAR
103/* Float comparison.  */
104    vector (4, float) f0;
105    vector (4, float) f1;
106    __typeof (f0 == f1) ifres;
107
108    f0 = (vector (4, float)){(float)argc, 1.,  2.,  10.};
109    f1 = (vector (4, float)){0., 3., 2., (float)-23};
110    test (4, f0, f1, ifres, "%f");
111
112/* Double comparison.  */
113    vector (2, double) d0;
114    vector (2, double) d1;
115    __typeof (d0 == d1) idres;
116
117    d0 = (vector (2, double)){(double)argc,  10.};
118    d1 = (vector (2, double)){0., (double)-23};
119    test (2, d0, d1, idres, "%f");
120
121
122    return 0;
123}
124
125