1 // RUN: %clang_cc1 -triple=powerpc-apple-darwin8 -target-feature +altivec -fsyntax-only -verify=expected,novsx %s
2 // RUN: %clang_cc1 -triple=powerpc64-unknown-linux-gnu -target-feature +altivec -target-feature +vsx -fsyntax-only -verify=expected,nonaix %s
3 // RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu -target-feature +altivec -target-feature -vsx -fsyntax-only -verify=expected,novsx %s
4 // RUN: %clang_cc1 -triple=powerpc-ibm-aix -target-feature +altivec -fsyntax-only -verify=expected,aix %s
5 // fRUN: %clang_cc1 -triple=powerpc64-ibm-aix -target-feature +altivec -target-feature -vsx -fsyntax-only -verify=expected,aix %s
8 __vector
signed char vv_sc
;
9 __vector
unsigned char vv_uc
;
11 __vector
signed short vv_ss
;
12 __vector
unsigned short vv_us
;
13 __vector
short int vv_si
;
14 __vector
signed short int vv_ssi
;
15 __vector
unsigned short int vv_usi
;
17 __vector
signed int vv_sint
;
18 __vector
unsigned int vv_ui
;
20 __vector
bool char vv_bc
;
21 __vector
bool short vv_bs
;
22 __vector
bool int vv_bi
;
23 __vector __bool
char vv___bc
;
24 __vector __bool
short vv___bs
;
25 __vector __bool
int vv___bi
;
26 __vector __pixel vv_p
;
29 void vf__a(__vector
int a
);
30 void vf__a2(int b
, __vector
int a
);
33 vector
signed char v_sc
;
34 vector
unsigned char v_uc
;
36 vector
signed short v_ss
;
37 vector
unsigned short v_us
;
38 vector
short int v_si
;
39 vector
signed short int v_ssi
;
40 vector
unsigned short int v_usi
;
42 vector
signed int v_sint
;
43 vector
unsigned int v_ui
;
45 vector
bool char v_bc
;
46 vector
bool short v_bs
;
48 vector __bool
char v___bc
;
49 vector __bool
short v___bs
;
50 vector __bool
int v___bi
;
54 void f_a(vector
int a
);
55 void f_a2(int b
, vector
int a
);
57 vector
int v
= (vector
int)(-1);
59 // These should have errors on AIX and warnings otherwise.
60 __vector
long vv_l
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
61 // aix-error@-1 {{cannot use 'long' with '__vector'}}
62 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
63 __vector
signed long vv_sl
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
64 // aix-error@-1 {{cannot use 'long' with '__vector'}}
65 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
66 __vector
unsigned long vv_ul
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
67 // aix-error@-1 {{cannot use 'long' with '__vector'}}
68 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
69 __vector
long int vv_li
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
70 // aix-error@-1 {{cannot use 'long' with '__vector'}}
71 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
72 __vector
signed long int vv_sli
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
73 // aix-error@-1 {{cannot use 'long' with '__vector'}}
74 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
75 __vector
unsigned long int vv_uli
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
76 // aix-error@-1 {{cannot use 'long' with '__vector'}}
77 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
78 vector
long v_l
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
79 // aix-error@-1 {{cannot use 'long' with '__vector'}}
80 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
81 vector
signed long v_sl
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
82 // aix-error@-1 {{cannot use 'long' with '__vector'}}
83 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
84 vector
unsigned long v_ul
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
85 // aix-error@-1 {{cannot use 'long' with '__vector'}}
86 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
87 vector
long int v_li
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
88 // aix-error@-1 {{cannot use 'long' with '__vector'}}
89 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
90 vector
signed long int v_sli
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
91 // aix-error@-1 {{cannot use 'long' with '__vector'}}
92 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
93 vector
unsigned long int v_uli
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
94 // aix-error@-1 {{cannot use 'long' with '__vector'}}
95 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
97 // These should have warnings.
98 __vector
long double vv_ld
; // expected-error {{cannot use 'long double' with '__vector'}}
99 vector
long double v_ld
; // expected-error {{cannot use 'long double' with '__vector'}}
100 vector
bool v_b
; // expected-warning {{type specifier missing, defaults to 'int'}}
101 vector __bool v___b
; // expected-warning {{type specifier missing, defaults to 'int'}}
103 // These should have errors.
105 __vector
double vv_d1
; // expected-error {{use of 'double' with '__vector' requires VSX support to be enabled (available on POWER7 or later)}}
106 vector
double v_d2
; // expected-error {{use of 'double' with '__vector' requires VSX support to be enabled (available on POWER7 or later)}}
107 __vector
bool long long v_bll1
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
108 __vector __bool
long long v_bll2
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
109 vector
bool long long v_bll3
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
110 vector __bool
long long v_bll4
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
112 __vector
long double vv_ld3
; // expected-error {{cannot use 'long double' with '__vector'}}
113 vector
long double v_ld4
; // expected-error {{cannot use 'long double' with '__vector'}}
114 vector
bool float v_bf
; // expected-error {{cannot use 'float' with '__vector bool'}}
115 vector
bool double v_bd
; // expected-error {{cannot use 'double' with '__vector bool'}}
116 vector
bool pixel v_bp
; // expected-error {{cannot use '__pixel' with '__vector bool'}}
117 vector
bool signed char v_bsc
; // expected-error {{cannot use 'signed' with '__vector bool'}}
118 vector
bool unsigned int v_bsc2
; // expected-error {{cannot use 'unsigned' with '__vector bool'}}
119 vector
bool long v_bl
; // expected-error {{cannot use 'long' with '__vector bool'}}
120 vector __bool
float v___bf
; // expected-error {{cannot use 'float' with '__vector bool'}}
121 vector __bool
double v___bd
; // expected-error {{cannot use 'double' with '__vector bool'}}
122 vector __bool pixel v___bp
; // expected-error {{cannot use '__pixel' with '__vector bool'}}
123 vector __bool
signed char v___bsc
; // expected-error {{cannot use 'signed' with '__vector bool'}}
124 vector __bool
unsigned int v___bsc2
; // expected-error {{cannot use 'unsigned' with '__vector bool'}}
125 vector __bool
long v___bl
; // expected-error {{cannot use 'long' with '__vector bool'}}
128 // vector long is deprecated, but vector long long is not.
129 vector
long long v_ll
;
130 vector
signed long long v_sll
;
131 vector
unsigned long long v_ull
;
133 // vector long long is not supported without vsx.
134 vector
long long v_ll
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
135 vector
signed long long v_sll
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
136 vector
unsigned long long v_ull
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
143 // i8, i16, i32 here are field names, not type names.
144 vector
bool i8
; // expected-error {{requires a specifier or qualifier}}
150 __vector
unsigned int v
= {0,0,0,0};
151 __vector
int v__cast
= (__vector
int)v
;
152 __vector
int v_cast
= (vector
int)v
;
153 __vector
char vb_cast
= (vector
char)v
;
155 // Check some casting between gcc and altivec vectors.
156 #define gccvector __attribute__((vector_size(16)))
157 gccvector
unsigned int gccv
= {0,0,0,0};
158 gccvector
unsigned int gccv1
= gccv
;
159 gccvector
int gccv2
= (gccvector
int)gccv
;
160 gccvector
unsigned int gccv3
= v
;
161 __vector
unsigned int av
= gccv
;
162 __vector
int avi
= (__vector
int)gccv
;
163 gccvector
unsigned int gv
= v
;
164 gccvector
int gvi
= (gccvector
int)v
;
165 __attribute__((vector_size(8))) unsigned int gv8
;
166 gv8
= gccv
; // expected-error {{assigning to '__attribute__((__vector_size__(2 * sizeof(unsigned int)))) unsigned int' (vector of 2 'unsigned int' values) from incompatible type '__attribute__((__vector_size__(4 * sizeof(unsigned int)))) unsigned int' (vector of 4 'unsigned int' values)}}
167 av
= gv8
; // expected-error {{assigning to '__vector unsigned int' (vector of 4 'unsigned int' values) from incompatible type '__attribute__((__vector_size__(2 * sizeof(unsigned int)))) unsigned int' (vector of 2 'unsigned int' values)}}
170 __vector
unsigned int tv
= gccv
;
172 gccvector
unsigned int tgv
= v
;
175 // bug 7553 - Problem with '==' and vectors
176 res_i
= (vv_sc
== vv_sc
);
177 res_i
= (vv_uc
!= vv_uc
);
178 res_i
= (vv_s
> vv_s
);
179 res_i
= (vv_us
>= vv_us
);
180 res_i
= (vv_i
< vv_i
);
181 res_i
= (vv_ui
<= vv_ui
);
182 res_i
= (vv_f
<= vv_f
);
185 // bug 6895 - Vectorl literal casting confusion.
186 vector
char v1
= (vector
char)((vector
int)(1, 2, 3, 4));
187 vector
char v2
= (vector
char)((vector
float)(1.0f
, 2.0f
, 3.0f
, 4.0f
));
188 vector
char v3
= (vector
char)((vector
int)('a', 'b', 'c', 'd'));
189 vector
int v4
= (vector
int)(1, 2, 3, 4);
190 vector
float v5
= (vector
float)(1.0f
, 2.0f
, 3.0f
, 4.0f
);
191 vector
char v6
= (vector
char)((vector
int)(1+2, -2, (int)(2.0 * 3), -(5-3)));