1*67e74705SXin Li // RUN: %clang_cc1 -triple arm64-apple-ios7 -target-abi darwinpcs -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li // RUN: %clang_cc1 -triple aarch64-linux-android -emit-llvm -o - %s | FileCheck -check-prefix=ANDROID %s
3*67e74705SXin Li
4*67e74705SXin Li #include <stdarg.h>
5*67e74705SXin Li
6*67e74705SXin Li typedef __attribute__(( ext_vector_type(2) )) char __char2;
7*67e74705SXin Li typedef __attribute__(( ext_vector_type(3) )) char __char3;
8*67e74705SXin Li typedef __attribute__(( ext_vector_type(4) )) char __char4;
9*67e74705SXin Li typedef __attribute__(( ext_vector_type(5) )) char __char5;
10*67e74705SXin Li typedef __attribute__(( ext_vector_type(9) )) char __char9;
11*67e74705SXin Li typedef __attribute__(( ext_vector_type(19) )) char __char19;
12*67e74705SXin Li typedef __attribute__(( ext_vector_type(3) )) short __short3;
13*67e74705SXin Li typedef __attribute__(( ext_vector_type(5) )) short __short5;
14*67e74705SXin Li typedef __attribute__(( ext_vector_type(3) )) int __int3;
15*67e74705SXin Li typedef __attribute__(( ext_vector_type(5) )) int __int5;
16*67e74705SXin Li typedef __attribute__(( ext_vector_type(3) )) double __double3;
17*67e74705SXin Li
18*67e74705SXin Li // Passing legal vector types as varargs. Check that we've allocated the appropriate size
varargs_vec_2c(int fixed,...)19*67e74705SXin Li double varargs_vec_2c(int fixed, ...) {
20*67e74705SXin Li // ANDROID: varargs_vec_2c
21*67e74705SXin Li // ANDROID: [[VAR:%.*]] = alloca <2 x i8>, align 2
22*67e74705SXin Li // ANDROID: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_CUR:%.*]], i64 8
23*67e74705SXin Li // ANDROID: bitcast i8* [[AP_CUR]] to <2 x i8>*
24*67e74705SXin Li va_list ap;
25*67e74705SXin Li double sum = fixed;
26*67e74705SXin Li va_start(ap, fixed);
27*67e74705SXin Li __char2 c3 = va_arg(ap, __char2);
28*67e74705SXin Li sum = sum + c3.x + c3.y;
29*67e74705SXin Li va_end(ap);
30*67e74705SXin Li return sum;
31*67e74705SXin Li }
32*67e74705SXin Li
test_2c(__char2 * in)33*67e74705SXin Li double test_2c(__char2 *in) {
34*67e74705SXin Li // ANDROID: call double (i32, ...) @varargs_vec_2c(i32 3, i16 {{%.*}})
35*67e74705SXin Li return varargs_vec_2c(3, *in);
36*67e74705SXin Li }
37*67e74705SXin Li
varargs_vec_3c(int fixed,...)38*67e74705SXin Li double varargs_vec_3c(int fixed, ...) {
39*67e74705SXin Li // CHECK: varargs_vec_3c
40*67e74705SXin Li // CHECK: alloca <3 x i8>, align 4
41*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_CUR:%.*]], i64 8
42*67e74705SXin Li // CHECK: bitcast i8* [[AP_CUR]] to <3 x i8>*
43*67e74705SXin Li va_list ap;
44*67e74705SXin Li double sum = fixed;
45*67e74705SXin Li va_start(ap, fixed);
46*67e74705SXin Li __char3 c3 = va_arg(ap, __char3);
47*67e74705SXin Li sum = sum + c3.x + c3.y;
48*67e74705SXin Li va_end(ap);
49*67e74705SXin Li return sum;
50*67e74705SXin Li }
51*67e74705SXin Li
test_3c(__char3 * in)52*67e74705SXin Li double test_3c(__char3 *in) {
53*67e74705SXin Li // CHECK: test_3c
54*67e74705SXin Li // CHECK: call double (i32, ...) @varargs_vec_3c(i32 3, i32 {{%.*}})
55*67e74705SXin Li return varargs_vec_3c(3, *in);
56*67e74705SXin Li }
57*67e74705SXin Li
varargs_vec_4c(int fixed,...)58*67e74705SXin Li double varargs_vec_4c(int fixed, ...) {
59*67e74705SXin Li // CHECK: varargs_vec_4c
60*67e74705SXin Li // CHECK: alloca <4 x i8>, align 4
61*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_CUR:%.*]], i64 8
62*67e74705SXin Li // CHECK: bitcast i8* [[AP_CUR]] to <4 x i8>*
63*67e74705SXin Li va_list ap;
64*67e74705SXin Li double sum = fixed;
65*67e74705SXin Li va_start(ap, fixed);
66*67e74705SXin Li __char4 c4 = va_arg(ap, __char4);
67*67e74705SXin Li sum = sum + c4.x + c4.y;
68*67e74705SXin Li va_end(ap);
69*67e74705SXin Li return sum;
70*67e74705SXin Li }
71*67e74705SXin Li
test_4c(__char4 * in)72*67e74705SXin Li double test_4c(__char4 *in) {
73*67e74705SXin Li // CHECK: test_4c
74*67e74705SXin Li // CHECK: call double (i32, ...) @varargs_vec_4c(i32 4, i32 {{%.*}})
75*67e74705SXin Li return varargs_vec_4c(4, *in);
76*67e74705SXin Li }
77*67e74705SXin Li
varargs_vec_5c(int fixed,...)78*67e74705SXin Li double varargs_vec_5c(int fixed, ...) {
79*67e74705SXin Li // CHECK: varargs_vec_5c
80*67e74705SXin Li // CHECK: alloca <5 x i8>, align 8
81*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_CUR:%.*]], i64 8
82*67e74705SXin Li // CHECK: bitcast i8* [[AP_CUR]] to <5 x i8>*
83*67e74705SXin Li va_list ap;
84*67e74705SXin Li double sum = fixed;
85*67e74705SXin Li va_start(ap, fixed);
86*67e74705SXin Li __char5 c5 = va_arg(ap, __char5);
87*67e74705SXin Li sum = sum + c5.x + c5.y;
88*67e74705SXin Li va_end(ap);
89*67e74705SXin Li return sum;
90*67e74705SXin Li }
91*67e74705SXin Li
test_5c(__char5 * in)92*67e74705SXin Li double test_5c(__char5 *in) {
93*67e74705SXin Li // CHECK: test_5c
94*67e74705SXin Li // CHECK: call double (i32, ...) @varargs_vec_5c(i32 5, <2 x i32> {{%.*}})
95*67e74705SXin Li return varargs_vec_5c(5, *in);
96*67e74705SXin Li }
97*67e74705SXin Li
varargs_vec_9c(int fixed,...)98*67e74705SXin Li double varargs_vec_9c(int fixed, ...) {
99*67e74705SXin Li // CHECK: varargs_vec_9c
100*67e74705SXin Li // CHECK: alloca <9 x i8>, align 16
101*67e74705SXin Li // CHECK: [[ALIGN:%.*]] = and i64 {{%.*}}, -16
102*67e74705SXin Li // CHECK: [[AP_ALIGN:%.*]] = inttoptr i64 [[ALIGN]] to i8*
103*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i64 16
104*67e74705SXin Li // CHECK: bitcast i8* [[AP_ALIGN]] to <9 x i8>*
105*67e74705SXin Li va_list ap;
106*67e74705SXin Li double sum = fixed;
107*67e74705SXin Li va_start(ap, fixed);
108*67e74705SXin Li __char9 c9 = va_arg(ap, __char9);
109*67e74705SXin Li sum = sum + c9.x + c9.y;
110*67e74705SXin Li va_end(ap);
111*67e74705SXin Li return sum;
112*67e74705SXin Li }
113*67e74705SXin Li
test_9c(__char9 * in)114*67e74705SXin Li double test_9c(__char9 *in) {
115*67e74705SXin Li // CHECK: test_9c
116*67e74705SXin Li // CHECK: call double (i32, ...) @varargs_vec_9c(i32 9, <4 x i32> {{%.*}})
117*67e74705SXin Li return varargs_vec_9c(9, *in);
118*67e74705SXin Li }
119*67e74705SXin Li
varargs_vec_19c(int fixed,...)120*67e74705SXin Li double varargs_vec_19c(int fixed, ...) {
121*67e74705SXin Li // CHECK: varargs_vec_19c
122*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_CUR:%.*]], i64 8
123*67e74705SXin Li // CHECK: [[VAR:%.*]] = bitcast i8* [[AP_CUR]] to <19 x i8>**
124*67e74705SXin Li // CHECK: [[VAR2:%.*]] = load <19 x i8>*, <19 x i8>** [[VAR]]
125*67e74705SXin Li va_list ap;
126*67e74705SXin Li double sum = fixed;
127*67e74705SXin Li va_start(ap, fixed);
128*67e74705SXin Li __char19 c19 = va_arg(ap, __char19);
129*67e74705SXin Li sum = sum + c19.x + c19.y;
130*67e74705SXin Li va_end(ap);
131*67e74705SXin Li return sum;
132*67e74705SXin Li }
133*67e74705SXin Li
test_19c(__char19 * in)134*67e74705SXin Li double test_19c(__char19 *in) {
135*67e74705SXin Li // CHECK: test_19c
136*67e74705SXin Li // CHECK: call double (i32, ...) @varargs_vec_19c(i32 19, <19 x i8>* {{%.*}})
137*67e74705SXin Li return varargs_vec_19c(19, *in);
138*67e74705SXin Li }
139*67e74705SXin Li
varargs_vec_3s(int fixed,...)140*67e74705SXin Li double varargs_vec_3s(int fixed, ...) {
141*67e74705SXin Li // CHECK: varargs_vec_3s
142*67e74705SXin Li // CHECK: alloca <3 x i16>, align 8
143*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_CUR:%.*]], i64 8
144*67e74705SXin Li // CHECK: bitcast i8* [[AP_CUR]] to <3 x i16>*
145*67e74705SXin Li va_list ap;
146*67e74705SXin Li double sum = fixed;
147*67e74705SXin Li va_start(ap, fixed);
148*67e74705SXin Li __short3 c3 = va_arg(ap, __short3);
149*67e74705SXin Li sum = sum + c3.x + c3.y;
150*67e74705SXin Li va_end(ap);
151*67e74705SXin Li return sum;
152*67e74705SXin Li }
153*67e74705SXin Li
test_3s(__short3 * in)154*67e74705SXin Li double test_3s(__short3 *in) {
155*67e74705SXin Li // CHECK: test_3s
156*67e74705SXin Li // CHECK: call double (i32, ...) @varargs_vec_3s(i32 3, <2 x i32> {{%.*}})
157*67e74705SXin Li return varargs_vec_3s(3, *in);
158*67e74705SXin Li }
159*67e74705SXin Li
varargs_vec_5s(int fixed,...)160*67e74705SXin Li double varargs_vec_5s(int fixed, ...) {
161*67e74705SXin Li // CHECK: varargs_vec_5s
162*67e74705SXin Li // CHECK: alloca <5 x i16>, align 16
163*67e74705SXin Li // CHECK: [[ALIGN:%.*]] = and i64 {{%.*}}, -16
164*67e74705SXin Li // CHECK: [[AP_ALIGN:%.*]] = inttoptr i64 [[ALIGN]] to i8*
165*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i64 16
166*67e74705SXin Li // CHECK: bitcast i8* [[AP_ALIGN]] to <5 x i16>*
167*67e74705SXin Li va_list ap;
168*67e74705SXin Li double sum = fixed;
169*67e74705SXin Li va_start(ap, fixed);
170*67e74705SXin Li __short5 c5 = va_arg(ap, __short5);
171*67e74705SXin Li sum = sum + c5.x + c5.y;
172*67e74705SXin Li va_end(ap);
173*67e74705SXin Li return sum;
174*67e74705SXin Li }
175*67e74705SXin Li
test_5s(__short5 * in)176*67e74705SXin Li double test_5s(__short5 *in) {
177*67e74705SXin Li // CHECK: test_5s
178*67e74705SXin Li // CHECK: call double (i32, ...) @varargs_vec_5s(i32 5, <4 x i32> {{%.*}})
179*67e74705SXin Li return varargs_vec_5s(5, *in);
180*67e74705SXin Li }
181*67e74705SXin Li
varargs_vec_3i(int fixed,...)182*67e74705SXin Li double varargs_vec_3i(int fixed, ...) {
183*67e74705SXin Li // CHECK: varargs_vec_3i
184*67e74705SXin Li // CHECK: alloca <3 x i32>, align 16
185*67e74705SXin Li // CHECK: [[ALIGN:%.*]] = and i64 {{%.*}}, -16
186*67e74705SXin Li // CHECK: [[AP_ALIGN:%.*]] = inttoptr i64 [[ALIGN]] to i8*
187*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i64 16
188*67e74705SXin Li // CHECK: bitcast i8* [[AP_ALIGN]] to <3 x i32>*
189*67e74705SXin Li va_list ap;
190*67e74705SXin Li double sum = fixed;
191*67e74705SXin Li va_start(ap, fixed);
192*67e74705SXin Li __int3 c3 = va_arg(ap, __int3);
193*67e74705SXin Li sum = sum + c3.x + c3.y;
194*67e74705SXin Li va_end(ap);
195*67e74705SXin Li return sum;
196*67e74705SXin Li }
197*67e74705SXin Li
test_3i(__int3 * in)198*67e74705SXin Li double test_3i(__int3 *in) {
199*67e74705SXin Li // CHECK: test_3i
200*67e74705SXin Li // CHECK: call double (i32, ...) @varargs_vec_3i(i32 3, <4 x i32> {{%.*}})
201*67e74705SXin Li return varargs_vec_3i(3, *in);
202*67e74705SXin Li }
203*67e74705SXin Li
varargs_vec_5i(int fixed,...)204*67e74705SXin Li double varargs_vec_5i(int fixed, ...) {
205*67e74705SXin Li // CHECK: varargs_vec_5i
206*67e74705SXin Li // CHECK: alloca <5 x i32>, align 16
207*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_CUR:%.*]], i64 8
208*67e74705SXin Li // CHECK: [[VAR:%.*]] = bitcast i8* [[AP_CUR]] to <5 x i32>**
209*67e74705SXin Li // CHECK: [[VAR2:%.*]] = load <5 x i32>*, <5 x i32>** [[VAR]]
210*67e74705SXin Li va_list ap;
211*67e74705SXin Li double sum = fixed;
212*67e74705SXin Li va_start(ap, fixed);
213*67e74705SXin Li __int5 c5 = va_arg(ap, __int5);
214*67e74705SXin Li sum = sum + c5.x + c5.y;
215*67e74705SXin Li va_end(ap);
216*67e74705SXin Li return sum;
217*67e74705SXin Li }
218*67e74705SXin Li
test_5i(__int5 * in)219*67e74705SXin Li double test_5i(__int5 *in) {
220*67e74705SXin Li // CHECK: test_5i
221*67e74705SXin Li // CHECK: call double (i32, ...) @varargs_vec_5i(i32 5, <5 x i32>* {{%.*}})
222*67e74705SXin Li return varargs_vec_5i(5, *in);
223*67e74705SXin Li }
224*67e74705SXin Li
varargs_vec_3d(int fixed,...)225*67e74705SXin Li double varargs_vec_3d(int fixed, ...) {
226*67e74705SXin Li // CHECK: varargs_vec_3d
227*67e74705SXin Li // CHECK: alloca <3 x double>, align 16
228*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_CUR:%.*]], i64 8
229*67e74705SXin Li // CHECK: [[VAR:%.*]] = bitcast i8* [[AP_CUR]] to <3 x double>**
230*67e74705SXin Li // CHECK: [[VAR2:%.*]] = load <3 x double>*, <3 x double>** [[VAR]]
231*67e74705SXin Li va_list ap;
232*67e74705SXin Li double sum = fixed;
233*67e74705SXin Li va_start(ap, fixed);
234*67e74705SXin Li __double3 c3 = va_arg(ap, __double3);
235*67e74705SXin Li sum = sum + c3.x + c3.y;
236*67e74705SXin Li va_end(ap);
237*67e74705SXin Li return sum;
238*67e74705SXin Li }
239*67e74705SXin Li
test_3d(__double3 * in)240*67e74705SXin Li double test_3d(__double3 *in) {
241*67e74705SXin Li // CHECK: test_3d
242*67e74705SXin Li // CHECK: call double (i32, ...) @varargs_vec_3d(i32 3, <3 x double>* {{%.*}})
243*67e74705SXin Li return varargs_vec_3d(3, *in);
244*67e74705SXin Li }
245*67e74705SXin Li
varargs_vec(int fixed,...)246*67e74705SXin Li double varargs_vec(int fixed, ...) {
247*67e74705SXin Li // CHECK: varargs_vec
248*67e74705SXin Li va_list ap;
249*67e74705SXin Li double sum = fixed;
250*67e74705SXin Li va_start(ap, fixed);
251*67e74705SXin Li __char3 c3 = va_arg(ap, __char3);
252*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_CUR:%.*]], i64 8
253*67e74705SXin Li // CHECK: bitcast i8* [[AP_CUR]] to <3 x i8>*
254*67e74705SXin Li sum = sum + c3.x + c3.y;
255*67e74705SXin Li __char5 c5 = va_arg(ap, __char5);
256*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_CUR:%.*]], i64 8
257*67e74705SXin Li // CHECK: bitcast i8* [[AP_CUR]] to <5 x i8>*
258*67e74705SXin Li sum = sum + c5.x + c5.y;
259*67e74705SXin Li __char9 c9 = va_arg(ap, __char9);
260*67e74705SXin Li // CHECK: [[ALIGN:%.*]] = and i64 {{%.*}}, -16
261*67e74705SXin Li // CHECK: [[AP_ALIGN:%.*]] = inttoptr i64 [[ALIGN]] to i8*
262*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i64 16
263*67e74705SXin Li // CHECK: bitcast i8* [[AP_ALIGN]] to <9 x i8>*
264*67e74705SXin Li sum = sum + c9.x + c9.y;
265*67e74705SXin Li __char19 c19 = va_arg(ap, __char19);
266*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_CUR:%.*]], i64 8
267*67e74705SXin Li // CHECK: [[VAR:%.*]] = bitcast i8* [[AP_CUR]] to <19 x i8>**
268*67e74705SXin Li // CHECK: [[VAR2:%.*]] = load <19 x i8>*, <19 x i8>** [[VAR]]
269*67e74705SXin Li sum = sum + c19.x + c19.y;
270*67e74705SXin Li __short3 s3 = va_arg(ap, __short3);
271*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_CUR:%.*]], i64 8
272*67e74705SXin Li // CHECK: bitcast i8* [[AP_CUR]] to <3 x i16>*
273*67e74705SXin Li sum = sum + s3.x + s3.y;
274*67e74705SXin Li __short5 s5 = va_arg(ap, __short5);
275*67e74705SXin Li // CHECK: [[ALIGN:%.*]] = and i64 {{%.*}}, -16
276*67e74705SXin Li // CHECK: [[AP_ALIGN:%.*]] = inttoptr i64 [[ALIGN]] to i8*
277*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i64 16
278*67e74705SXin Li // CHECK: bitcast i8* [[AP_ALIGN]] to <5 x i16>*
279*67e74705SXin Li sum = sum + s5.x + s5.y;
280*67e74705SXin Li __int3 i3 = va_arg(ap, __int3);
281*67e74705SXin Li // CHECK: [[ALIGN:%.*]] = and i64 {{%.*}}, -16
282*67e74705SXin Li // CHECK: [[AP_ALIGN:%.*]] = inttoptr i64 [[ALIGN]] to i8*
283*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i64 16
284*67e74705SXin Li // CHECK: bitcast i8* [[AP_ALIGN]] to <3 x i32>*
285*67e74705SXin Li sum = sum + i3.x + i3.y;
286*67e74705SXin Li __int5 i5 = va_arg(ap, __int5);
287*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_CUR:%.*]], i64 8
288*67e74705SXin Li // CHECK: [[VAR:%.*]] = bitcast i8* [[AP_CUR]] to <5 x i32>**
289*67e74705SXin Li // CHECK: [[VAR2:%.*]] = load <5 x i32>*, <5 x i32>** [[VAR]]
290*67e74705SXin Li sum = sum + i5.x + i5.y;
291*67e74705SXin Li __double3 d3 = va_arg(ap, __double3);
292*67e74705SXin Li // CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_CUR:%.*]], i64 8
293*67e74705SXin Li // CHECK: [[VAR:%.*]] = bitcast i8* [[AP_CUR]] to <3 x double>**
294*67e74705SXin Li // CHECK: [[VAR2:%.*]] = load <3 x double>*, <3 x double>** [[VAR]]
295*67e74705SXin Li sum = sum + d3.x + d3.y;
296*67e74705SXin Li va_end(ap);
297*67e74705SXin Li return sum;
298*67e74705SXin Li }
299*67e74705SXin Li
test(__char3 * c3,__char5 * c5,__char9 * c9,__char19 * c19,__short3 * s3,__short5 * s5,__int3 * i3,__int5 * i5,__double3 * d3)300*67e74705SXin Li double test(__char3 *c3, __char5 *c5, __char9 *c9, __char19 *c19,
301*67e74705SXin Li __short3 *s3, __short5 *s5, __int3 *i3, __int5 *i5,
302*67e74705SXin Li __double3 *d3) {
303*67e74705SXin Li double ret = varargs_vec(3, *c3, *c5, *c9, *c19, *s3, *s5, *i3, *i5, *d3);
304*67e74705SXin Li // CHECK: call double (i32, ...) @varargs_vec(i32 3, i32 {{%.*}}, <2 x i32> {{%.*}}, <4 x i32> {{%.*}}, <19 x i8>* {{%.*}}, <2 x i32> {{%.*}}, <4 x i32> {{%.*}}, <4 x i32> {{%.*}}, <5 x i32>* {{%.*}}, <3 x double>* {{%.*}})
305*67e74705SXin Li return ret;
306*67e74705SXin Li }
307*67e74705SXin Li
args_vec_3c(int fixed,__char3 c3)308*67e74705SXin Li __attribute__((noinline)) double args_vec_3c(int fixed, __char3 c3) {
309*67e74705SXin Li // CHECK: args_vec_3c
310*67e74705SXin Li // CHECK: [[C3:%.*]] = alloca <3 x i8>, align 4
311*67e74705SXin Li // CHECK: [[TMP:%.*]] = bitcast <3 x i8>* [[C3]] to i32*
312*67e74705SXin Li // CHECK: store i32 {{%.*}}, i32* [[TMP]]
313*67e74705SXin Li double sum = fixed;
314*67e74705SXin Li sum = sum + c3.x + c3.y;
315*67e74705SXin Li return sum;
316*67e74705SXin Li }
317*67e74705SXin Li
fixed_3c(__char3 * in)318*67e74705SXin Li double fixed_3c(__char3 *in) {
319*67e74705SXin Li // CHECK: fixed_3c
320*67e74705SXin Li // CHECK: call double @args_vec_3c(i32 3, i32 {{%.*}})
321*67e74705SXin Li return args_vec_3c(3, *in);
322*67e74705SXin Li }
323*67e74705SXin Li
args_vec_5c(int fixed,__char5 c5)324*67e74705SXin Li __attribute__((noinline)) double args_vec_5c(int fixed, __char5 c5) {
325*67e74705SXin Li // CHECK: args_vec_5c
326*67e74705SXin Li // CHECK: [[C5:%.*]] = alloca <5 x i8>, align 8
327*67e74705SXin Li // CHECK: [[TMP:%.*]] = bitcast <5 x i8>* [[C5]] to <2 x i32>*
328*67e74705SXin Li // CHECK: store <2 x i32> {{%.*}}, <2 x i32>* [[TMP]], align 8
329*67e74705SXin Li double sum = fixed;
330*67e74705SXin Li sum = sum + c5.x + c5.y;
331*67e74705SXin Li return sum;
332*67e74705SXin Li }
333*67e74705SXin Li
fixed_5c(__char5 * in)334*67e74705SXin Li double fixed_5c(__char5 *in) {
335*67e74705SXin Li // CHECK: fixed_5c
336*67e74705SXin Li // CHECK: call double @args_vec_5c(i32 5, <2 x i32> {{%.*}})
337*67e74705SXin Li return args_vec_5c(5, *in);
338*67e74705SXin Li }
339*67e74705SXin Li
args_vec_9c(int fixed,__char9 c9)340*67e74705SXin Li __attribute__((noinline)) double args_vec_9c(int fixed, __char9 c9) {
341*67e74705SXin Li // CHECK: args_vec_9c
342*67e74705SXin Li // CHECK: [[C9:%.*]] = alloca <9 x i8>, align 16
343*67e74705SXin Li // CHECK: [[TMP:%.*]] = bitcast <9 x i8>* [[C9]] to <4 x i32>*
344*67e74705SXin Li // CHECK: store <4 x i32> {{%.*}}, <4 x i32>* [[TMP]], align 16
345*67e74705SXin Li double sum = fixed;
346*67e74705SXin Li sum = sum + c9.x + c9.y;
347*67e74705SXin Li return sum;
348*67e74705SXin Li }
349*67e74705SXin Li
fixed_9c(__char9 * in)350*67e74705SXin Li double fixed_9c(__char9 *in) {
351*67e74705SXin Li // CHECK: fixed_9c
352*67e74705SXin Li // CHECK: call double @args_vec_9c(i32 9, <4 x i32> {{%.*}})
353*67e74705SXin Li return args_vec_9c(9, *in);
354*67e74705SXin Li }
355*67e74705SXin Li
args_vec_19c(int fixed,__char19 c19)356*67e74705SXin Li __attribute__((noinline)) double args_vec_19c(int fixed, __char19 c19) {
357*67e74705SXin Li // CHECK: args_vec_19c
358*67e74705SXin Li // CHECK: [[C19:%.*]] = load <19 x i8>, <19 x i8>* {{.*}}, align 16
359*67e74705SXin Li double sum = fixed;
360*67e74705SXin Li sum = sum + c19.x + c19.y;
361*67e74705SXin Li return sum;
362*67e74705SXin Li }
363*67e74705SXin Li
fixed_19c(__char19 * in)364*67e74705SXin Li double fixed_19c(__char19 *in) {
365*67e74705SXin Li // CHECK: fixed_19c
366*67e74705SXin Li // CHECK: call double @args_vec_19c(i32 19, <19 x i8>* {{%.*}})
367*67e74705SXin Li return args_vec_19c(19, *in);
368*67e74705SXin Li }
369*67e74705SXin Li
args_vec_3s(int fixed,__short3 c3)370*67e74705SXin Li __attribute__((noinline)) double args_vec_3s(int fixed, __short3 c3) {
371*67e74705SXin Li // CHECK: args_vec_3s
372*67e74705SXin Li // CHECK: [[C3:%.*]] = alloca <3 x i16>, align 8
373*67e74705SXin Li // CHECK: [[TMP:%.*]] = bitcast <3 x i16>* [[C3]] to <2 x i32>*
374*67e74705SXin Li // CHECK: store <2 x i32> {{%.*}}, <2 x i32>* [[TMP]], align 8
375*67e74705SXin Li double sum = fixed;
376*67e74705SXin Li sum = sum + c3.x + c3.y;
377*67e74705SXin Li return sum;
378*67e74705SXin Li }
379*67e74705SXin Li
fixed_3s(__short3 * in)380*67e74705SXin Li double fixed_3s(__short3 *in) {
381*67e74705SXin Li // CHECK: fixed_3s
382*67e74705SXin Li // CHECK: call double @args_vec_3s(i32 3, <2 x i32> {{%.*}})
383*67e74705SXin Li return args_vec_3s(3, *in);
384*67e74705SXin Li }
385*67e74705SXin Li
args_vec_5s(int fixed,__short5 c5)386*67e74705SXin Li __attribute__((noinline)) double args_vec_5s(int fixed, __short5 c5) {
387*67e74705SXin Li // CHECK: args_vec_5s
388*67e74705SXin Li // CHECK: [[C5:%.*]] = alloca <5 x i16>, align 16
389*67e74705SXin Li // CHECK: [[TMP:%.*]] = bitcast <5 x i16>* [[C5]] to <4 x i32>*
390*67e74705SXin Li // CHECK: store <4 x i32> {{%.*}}, <4 x i32>* [[TMP]], align 16
391*67e74705SXin Li double sum = fixed;
392*67e74705SXin Li sum = sum + c5.x + c5.y;
393*67e74705SXin Li return sum;
394*67e74705SXin Li }
395*67e74705SXin Li
fixed_5s(__short5 * in)396*67e74705SXin Li double fixed_5s(__short5 *in) {
397*67e74705SXin Li // CHECK: fixed_5s
398*67e74705SXin Li // CHECK: call double @args_vec_5s(i32 5, <4 x i32> {{%.*}})
399*67e74705SXin Li return args_vec_5s(5, *in);
400*67e74705SXin Li }
401*67e74705SXin Li
args_vec_3i(int fixed,__int3 c3)402*67e74705SXin Li __attribute__((noinline)) double args_vec_3i(int fixed, __int3 c3) {
403*67e74705SXin Li // CHECK: args_vec_3i
404*67e74705SXin Li // CHECK: [[C3:%.*]] = alloca <3 x i32>, align 16
405*67e74705SXin Li // CHECK: [[TMP:%.*]] = bitcast <3 x i32>* [[C3]] to <4 x i32>*
406*67e74705SXin Li // CHECK: store <4 x i32> {{%.*}}, <4 x i32>* [[TMP]], align 16
407*67e74705SXin Li double sum = fixed;
408*67e74705SXin Li sum = sum + c3.x + c3.y;
409*67e74705SXin Li return sum;
410*67e74705SXin Li }
411*67e74705SXin Li
fixed_3i(__int3 * in)412*67e74705SXin Li double fixed_3i(__int3 *in) {
413*67e74705SXin Li // CHECK: fixed_3i
414*67e74705SXin Li // CHECK: call double @args_vec_3i(i32 3, <4 x i32> {{%.*}})
415*67e74705SXin Li return args_vec_3i(3, *in);
416*67e74705SXin Li }
417*67e74705SXin Li
args_vec_5i(int fixed,__int5 c5)418*67e74705SXin Li __attribute__((noinline)) double args_vec_5i(int fixed, __int5 c5) {
419*67e74705SXin Li // CHECK: args_vec_5i
420*67e74705SXin Li // CHECK: [[C5:%.*]] = load <5 x i32>, <5 x i32>* {{%.*}}, align 16
421*67e74705SXin Li double sum = fixed;
422*67e74705SXin Li sum = sum + c5.x + c5.y;
423*67e74705SXin Li return sum;
424*67e74705SXin Li }
425*67e74705SXin Li
fixed_5i(__int5 * in)426*67e74705SXin Li double fixed_5i(__int5 *in) {
427*67e74705SXin Li // CHECK: fixed_5i
428*67e74705SXin Li // CHECK: call double @args_vec_5i(i32 5, <5 x i32>* {{%.*}})
429*67e74705SXin Li return args_vec_5i(5, *in);
430*67e74705SXin Li }
431*67e74705SXin Li
args_vec_3d(int fixed,__double3 c3)432*67e74705SXin Li __attribute__((noinline)) double args_vec_3d(int fixed, __double3 c3) {
433*67e74705SXin Li // CHECK: args_vec_3d
434*67e74705SXin Li // CHECK: [[CAST:%.*]] = bitcast <3 x double>* {{%.*}} to <4 x double>*
435*67e74705SXin Li // CHECK: [[LOAD:%.*]] = load <4 x double>, <4 x double>* [[CAST]]
436*67e74705SXin Li // CHECK: shufflevector <4 x double> [[LOAD]], <4 x double> undef, <3 x i32> <i32 0, i32 1, i32 2>
437*67e74705SXin Li double sum = fixed;
438*67e74705SXin Li sum = sum + c3.x + c3.y;
439*67e74705SXin Li return sum;
440*67e74705SXin Li }
441*67e74705SXin Li
fixed_3d(__double3 * in)442*67e74705SXin Li double fixed_3d(__double3 *in) {
443*67e74705SXin Li // CHECK: fixed_3d
444*67e74705SXin Li // CHECK: call double @args_vec_3d(i32 3, <3 x double>* {{%.*}})
445*67e74705SXin Li return args_vec_3d(3, *in);
446*67e74705SXin Li }
447