AArch64/ARM64: move ARM64 into AArch64's place
[oota-llvm.git] / test / CodeGen / AArch64 / arm64-big-endian-vector-caller.ll
1 ; RUN: llc -mtriple arm64_be < %s -aarch64-load-store-opt=false -o - | FileCheck %s
2 ; RUN: llc -mtriple arm64_be < %s -aarch64-load-store-opt=false -fast-isel=true -O0 -o - | FileCheck %s
3
4 ; CHECK-LABEL: test_i64_f64:
5 declare i64 @test_i64_f64_helper(double %p)
6 define void @test_i64_f64(double* %p, i64* %q) {
7 ; CHECK-NOT: rev
8     %1 = load double* %p
9     %2 = fadd double %1, %1
10     %3 = call i64 @test_i64_f64_helper(double %2)
11     %4 = add i64 %3, %3
12     store i64 %4, i64* %q
13     ret void
14 }
15
16 ; CHECK-LABEL: test_i64_v1i64:
17 declare i64 @test_i64_v1i64_helper(<1 x i64> %p)
18 define void @test_i64_v1i64(<1 x i64>* %p, i64* %q) {
19 ; CHECK-NOT: rev
20     %1 = load <1 x i64>* %p
21     %2 = add <1 x i64> %1, %1
22     %3 = call i64 @test_i64_v1i64_helper(<1 x i64> %2)
23     %4 = add i64 %3, %3
24     store i64 %4, i64* %q
25     ret void
26 }
27
28 ; CHECK-LABEL: test_i64_v2f32:
29 declare i64 @test_i64_v2f32_helper(<2 x float> %p)
30 define void @test_i64_v2f32(<2 x float>* %p, i64* %q) {
31 ; CHECK: rev64 v{{[0-9]+}}.2s
32     %1 = load <2 x float>* %p
33     %2 = fadd <2 x float> %1, %1
34     %3 = call i64 @test_i64_v2f32_helper(<2 x float> %2)
35     %4 = add i64 %3, %3
36     store i64 %4, i64* %q
37     ret void
38 }
39
40 ; CHECK-LABEL: test_i64_v2i32:
41 declare i64 @test_i64_v2i32_helper(<2 x i32> %p)
42 define void @test_i64_v2i32(<2 x i32>* %p, i64* %q) {
43 ; CHECK: rev64 v{{[0-9]+}}.2s
44     %1 = load <2 x i32>* %p
45     %2 = add <2 x i32> %1, %1
46     %3 = call i64 @test_i64_v2i32_helper(<2 x i32> %2)
47     %4 = add i64 %3, %3
48     store i64 %4, i64* %q
49     ret void
50 }
51
52 ; CHECK-LABEL: test_i64_v4i16:
53 declare i64 @test_i64_v4i16_helper(<4 x i16> %p)
54 define void @test_i64_v4i16(<4 x i16>* %p, i64* %q) {
55 ; CHECK: rev64 v{{[0-9]+}}.4h
56     %1 = load <4 x i16>* %p
57     %2 = add <4 x i16> %1, %1
58     %3 = call i64 @test_i64_v4i16_helper(<4 x i16> %2)
59     %4 = add i64 %3, %3
60     store i64 %4, i64* %q
61     ret void
62 }
63
64 ; CHECK-LABEL: test_i64_v8i8:
65 declare i64 @test_i64_v8i8_helper(<8 x i8> %p)
66 define void @test_i64_v8i8(<8 x i8>* %p, i64* %q) {
67 ; CHECK: rev64 v{{[0-9]+}}.8b
68     %1 = load <8 x i8>* %p
69     %2 = add <8 x i8> %1, %1
70     %3 = call i64 @test_i64_v8i8_helper(<8 x i8> %2)
71     %4 = add i64 %3, %3
72     store i64 %4, i64* %q
73     ret void
74 }
75
76 ; CHECK-LABEL: test_f64_i64:
77 declare double @test_f64_i64_helper(i64 %p)
78 define void @test_f64_i64(i64* %p, double* %q) {
79 ; CHECK-NOT: rev
80     %1 = load i64* %p
81     %2 = add i64 %1, %1
82     %3 = call double @test_f64_i64_helper(i64 %2)
83     %4 = fadd double %3, %3
84     store double %4, double* %q
85     ret void
86 }
87
88 ; CHECK-LABEL: test_f64_v1i64:
89 declare double @test_f64_v1i64_helper(<1 x i64> %p)
90 define void @test_f64_v1i64(<1 x i64>* %p, double* %q) {
91 ; CHECK-NOT: rev
92     %1 = load <1 x i64>* %p
93     %2 = add <1 x i64> %1, %1
94     %3 = call double @test_f64_v1i64_helper(<1 x i64> %2)
95     %4 = fadd double %3, %3
96     store double %4, double* %q
97     ret void
98 }
99
100 ; CHECK-LABEL: test_f64_v2f32:
101 declare double @test_f64_v2f32_helper(<2 x float> %p)
102 define void @test_f64_v2f32(<2 x float>* %p, double* %q) {
103 ; CHECK: rev64 v{{[0-9]+}}.2s
104     %1 = load <2 x float>* %p
105     %2 = fadd <2 x float> %1, %1
106     %3 = call double @test_f64_v2f32_helper(<2 x float> %2)
107     %4 = fadd double %3, %3
108     store double %4, double* %q
109     ret void
110 }
111
112 ; CHECK-LABEL: test_f64_v2i32:
113 declare double @test_f64_v2i32_helper(<2 x i32> %p)
114 define void @test_f64_v2i32(<2 x i32>* %p, double* %q) {
115 ; CHECK: rev64 v{{[0-9]+}}.2s
116     %1 = load <2 x i32>* %p
117     %2 = add <2 x i32> %1, %1
118     %3 = call double @test_f64_v2i32_helper(<2 x i32> %2)
119     %4 = fadd double %3, %3
120     store double %4, double* %q
121     ret void
122 }
123
124 ; CHECK-LABEL: test_f64_v4i16:
125 declare double @test_f64_v4i16_helper(<4 x i16> %p)
126 define void @test_f64_v4i16(<4 x i16>* %p, double* %q) {
127 ; CHECK: rev64 v{{[0-9]+}}.4h
128     %1 = load <4 x i16>* %p
129     %2 = add <4 x i16> %1, %1
130     %3 = call double @test_f64_v4i16_helper(<4 x i16> %2)
131     %4 = fadd double %3, %3
132     store double %4, double* %q
133     ret void
134 }
135
136 ; CHECK-LABEL: test_f64_v8i8:
137 declare double @test_f64_v8i8_helper(<8 x i8> %p)
138 define void @test_f64_v8i8(<8 x i8>* %p, double* %q) {
139 ; CHECK: rev64 v{{[0-9]+}}.8b
140     %1 = load <8 x i8>* %p
141     %2 = add <8 x i8> %1, %1
142     %3 = call double @test_f64_v8i8_helper(<8 x i8> %2)
143     %4 = fadd double %3, %3
144     store double %4, double* %q
145     ret void
146 }
147
148 ; CHECK-LABEL: test_v1i64_i64:
149 declare <1 x i64> @test_v1i64_i64_helper(i64 %p)
150 define void @test_v1i64_i64(i64* %p, <1 x i64>* %q) {
151 ; CHECK-NOT: rev
152     %1 = load i64* %p
153     %2 = add i64 %1, %1
154     %3 = call <1 x i64> @test_v1i64_i64_helper(i64 %2)
155     %4 = add <1 x i64> %3, %3
156     store <1 x i64> %4, <1 x i64>* %q
157     ret void
158 }
159
160 ; CHECK-LABEL: test_v1i64_f64:
161 declare <1 x i64> @test_v1i64_f64_helper(double %p)
162 define void @test_v1i64_f64(double* %p, <1 x i64>* %q) {
163 ; CHECK-NOT: rev
164     %1 = load double* %p
165     %2 = fadd double %1, %1
166     %3 = call <1 x i64> @test_v1i64_f64_helper(double %2)
167     %4 = add <1 x i64> %3, %3
168     store <1 x i64> %4, <1 x i64>* %q
169     ret void
170 }
171
172 ; CHECK-LABEL: test_v1i64_v2f32:
173 declare <1 x i64> @test_v1i64_v2f32_helper(<2 x float> %p)
174 define void @test_v1i64_v2f32(<2 x float>* %p, <1 x i64>* %q) {
175 ; CHECK: rev64 v{{[0-9]+}}.2s
176     %1 = load <2 x float>* %p
177     %2 = fadd <2 x float> %1, %1
178     %3 = call <1 x i64> @test_v1i64_v2f32_helper(<2 x float> %2)
179     %4 = add <1 x i64> %3, %3
180     store <1 x i64> %4, <1 x i64>* %q
181     ret void
182 }
183
184 ; CHECK-LABEL: test_v1i64_v2i32:
185 declare <1 x i64> @test_v1i64_v2i32_helper(<2 x i32> %p)
186 define void @test_v1i64_v2i32(<2 x i32>* %p, <1 x i64>* %q) {
187 ; CHECK: rev64 v{{[0-9]+}}.2s
188     %1 = load <2 x i32>* %p
189     %2 = add <2 x i32> %1, %1
190     %3 = call <1 x i64> @test_v1i64_v2i32_helper(<2 x i32> %2)
191     %4 = add <1 x i64> %3, %3
192     store <1 x i64> %4, <1 x i64>* %q
193     ret void
194 }
195
196 ; CHECK-LABEL: test_v1i64_v4i16:
197 declare <1 x i64> @test_v1i64_v4i16_helper(<4 x i16> %p)
198 define void @test_v1i64_v4i16(<4 x i16>* %p, <1 x i64>* %q) {
199 ; CHECK: rev64 v{{[0-9]+}}.4h
200     %1 = load <4 x i16>* %p
201     %2 = add <4 x i16> %1, %1
202     %3 = call <1 x i64> @test_v1i64_v4i16_helper(<4 x i16> %2)
203     %4 = add <1 x i64> %3, %3
204     store <1 x i64> %4, <1 x i64>* %q
205     ret void
206 }
207
208 ; CHECK-LABEL: test_v1i64_v8i8:
209 declare <1 x i64> @test_v1i64_v8i8_helper(<8 x i8> %p)
210 define void @test_v1i64_v8i8(<8 x i8>* %p, <1 x i64>* %q) {
211 ; CHECK: rev64 v{{[0-9]+}}.8b
212     %1 = load <8 x i8>* %p
213     %2 = add <8 x i8> %1, %1
214     %3 = call <1 x i64> @test_v1i64_v8i8_helper(<8 x i8> %2)
215     %4 = add <1 x i64> %3, %3
216     store <1 x i64> %4, <1 x i64>* %q
217     ret void
218 }
219
220 ; CHECK-LABEL: test_v2f32_i64:
221 declare <2 x float> @test_v2f32_i64_helper(i64 %p)
222 define void @test_v2f32_i64(i64* %p, <2 x float>* %q) {
223 ; CHECK: rev64 v{{[0-9]+}}.2s
224     %1 = load i64* %p
225     %2 = add i64 %1, %1
226     %3 = call <2 x float> @test_v2f32_i64_helper(i64 %2)
227     %4 = fadd <2 x float> %3, %3
228     store <2 x float> %4, <2 x float>* %q
229     ret void
230 }
231
232 ; CHECK-LABEL: test_v2f32_f64:
233 declare <2 x float> @test_v2f32_f64_helper(double %p)
234 define void @test_v2f32_f64(double* %p, <2 x float>* %q) {
235 ; CHECK: rev64 v{{[0-9]+}}.2s
236     %1 = load double* %p
237     %2 = fadd double %1, %1
238     %3 = call <2 x float> @test_v2f32_f64_helper(double %2)
239     %4 = fadd <2 x float> %3, %3
240     store <2 x float> %4, <2 x float>* %q
241     ret void
242 }
243
244 ; CHECK-LABEL: test_v2f32_v1i64:
245 declare <2 x float> @test_v2f32_v1i64_helper(<1 x i64> %p)
246 define void @test_v2f32_v1i64(<1 x i64>* %p, <2 x float>* %q) {
247 ; CHECK: rev64 v{{[0-9]+}}.2s
248     %1 = load <1 x i64>* %p
249     %2 = add <1 x i64> %1, %1
250     %3 = call <2 x float> @test_v2f32_v1i64_helper(<1 x i64> %2)
251     %4 = fadd <2 x float> %3, %3
252     store <2 x float> %4, <2 x float>* %q
253     ret void
254 }
255
256 ; CHECK-LABEL: test_v2f32_v2i32:
257 declare <2 x float> @test_v2f32_v2i32_helper(<2 x i32> %p)
258 define void @test_v2f32_v2i32(<2 x i32>* %p, <2 x float>* %q) {
259 ; CHECK: rev64 v{{[0-9]+}}.2s
260 ; CHECK: rev64 v{{[0-9]+}}.2s
261     %1 = load <2 x i32>* %p
262     %2 = add <2 x i32> %1, %1
263     %3 = call <2 x float> @test_v2f32_v2i32_helper(<2 x i32> %2)
264     %4 = fadd <2 x float> %3, %3
265     store <2 x float> %4, <2 x float>* %q
266     ret void
267 }
268
269 ; CHECK-LABEL: test_v2f32_v4i16:
270 declare <2 x float> @test_v2f32_v4i16_helper(<4 x i16> %p)
271 define void @test_v2f32_v4i16(<4 x i16>* %p, <2 x float>* %q) {
272 ; CHECK: rev64 v{{[0-9]+}}.4h
273 ; CHECK: rev64 v{{[0-9]+}}.2s
274     %1 = load <4 x i16>* %p
275     %2 = add <4 x i16> %1, %1
276     %3 = call <2 x float> @test_v2f32_v4i16_helper(<4 x i16> %2)
277     %4 = fadd <2 x float> %3, %3
278     store <2 x float> %4, <2 x float>* %q
279     ret void
280 }
281
282 ; CHECK-LABEL: test_v2f32_v8i8:
283 declare <2 x float> @test_v2f32_v8i8_helper(<8 x i8> %p)
284 define void @test_v2f32_v8i8(<8 x i8>* %p, <2 x float>* %q) {
285 ; CHECK: rev64 v{{[0-9]+}}.8b
286 ; CHECK: rev64 v{{[0-9]+}}.2s
287     %1 = load <8 x i8>* %p
288     %2 = add <8 x i8> %1, %1
289     %3 = call <2 x float> @test_v2f32_v8i8_helper(<8 x i8> %2)
290     %4 = fadd <2 x float> %3, %3
291     store <2 x float> %4, <2 x float>* %q
292     ret void
293 }
294
295 ; CHECK-LABEL: test_v2i32_i64:
296 declare <2 x i32> @test_v2i32_i64_helper(i64 %p)
297 define void @test_v2i32_i64(i64* %p, <2 x i32>* %q) {
298 ; CHECK: rev64 v{{[0-9]+}}.2s
299     %1 = load i64* %p
300     %2 = add i64 %1, %1
301     %3 = call <2 x i32> @test_v2i32_i64_helper(i64 %2)
302     %4 = add <2 x i32> %3, %3
303     store <2 x i32> %4, <2 x i32>* %q
304     ret void
305 }
306
307 ; CHECK-LABEL: test_v2i32_f64:
308 declare <2 x i32> @test_v2i32_f64_helper(double %p)
309 define void @test_v2i32_f64(double* %p, <2 x i32>* %q) {
310 ; CHECK: rev64 v{{[0-9]+}}.2s
311     %1 = load double* %p
312     %2 = fadd double %1, %1
313     %3 = call <2 x i32> @test_v2i32_f64_helper(double %2)
314     %4 = add <2 x i32> %3, %3
315     store <2 x i32> %4, <2 x i32>* %q
316     ret void
317 }
318
319 ; CHECK-LABEL: test_v2i32_v1i64:
320 declare <2 x i32> @test_v2i32_v1i64_helper(<1 x i64> %p)
321 define void @test_v2i32_v1i64(<1 x i64>* %p, <2 x i32>* %q) {
322 ; CHECK: rev64 v{{[0-9]+}}.2s
323     %1 = load <1 x i64>* %p
324     %2 = add <1 x i64> %1, %1
325     %3 = call <2 x i32> @test_v2i32_v1i64_helper(<1 x i64> %2)
326     %4 = add <2 x i32> %3, %3
327     store <2 x i32> %4, <2 x i32>* %q
328     ret void
329 }
330
331 ; CHECK-LABEL: test_v2i32_v2f32:
332 declare <2 x i32> @test_v2i32_v2f32_helper(<2 x float> %p)
333 define void @test_v2i32_v2f32(<2 x float>* %p, <2 x i32>* %q) {
334 ; CHECK: rev64 v{{[0-9]+}}.2s
335 ; CHECK: rev64 v{{[0-9]+}}.2s
336     %1 = load <2 x float>* %p
337     %2 = fadd <2 x float> %1, %1
338     %3 = call <2 x i32> @test_v2i32_v2f32_helper(<2 x float> %2)
339     %4 = add <2 x i32> %3, %3
340     store <2 x i32> %4, <2 x i32>* %q
341     ret void
342 }
343
344 ; CHECK-LABEL: test_v2i32_v4i16:
345 declare <2 x i32> @test_v2i32_v4i16_helper(<4 x i16> %p)
346 define void @test_v2i32_v4i16(<4 x i16>* %p, <2 x i32>* %q) {
347 ; CHECK: rev64 v{{[0-9]+}}.4h
348 ; CHECK: rev64 v{{[0-9]+}}.2s
349     %1 = load <4 x i16>* %p
350     %2 = add <4 x i16> %1, %1
351     %3 = call <2 x i32> @test_v2i32_v4i16_helper(<4 x i16> %2)
352     %4 = add <2 x i32> %3, %3
353     store <2 x i32> %4, <2 x i32>* %q
354     ret void
355 }
356
357 ; CHECK-LABEL: test_v2i32_v8i8:
358 declare <2 x i32> @test_v2i32_v8i8_helper(<8 x i8> %p)
359 define void @test_v2i32_v8i8(<8 x i8>* %p, <2 x i32>* %q) {
360 ; CHECK: rev64 v{{[0-9]+}}.8b
361 ; CHECK: rev64 v{{[0-9]+}}.2s
362     %1 = load <8 x i8>* %p
363     %2 = add <8 x i8> %1, %1
364     %3 = call <2 x i32> @test_v2i32_v8i8_helper(<8 x i8> %2)
365     %4 = add <2 x i32> %3, %3
366     store <2 x i32> %4, <2 x i32>* %q
367     ret void
368 }
369
370 ; CHECK-LABEL: test_v4i16_i64:
371 declare <4 x i16> @test_v4i16_i64_helper(i64 %p)
372 define void @test_v4i16_i64(i64* %p, <4 x i16>* %q) {
373 ; CHECK: rev64 v{{[0-9]+}}.4h
374     %1 = load i64* %p
375     %2 = add i64 %1, %1
376     %3 = call <4 x i16> @test_v4i16_i64_helper(i64 %2)
377     %4 = add <4 x i16> %3, %3
378     store <4 x i16> %4, <4 x i16>* %q
379     ret void
380 }
381
382 ; CHECK-LABEL: test_v4i16_f64:
383 declare <4 x i16> @test_v4i16_f64_helper(double %p)
384 define void @test_v4i16_f64(double* %p, <4 x i16>* %q) {
385 ; CHECK: rev64 v{{[0-9]+}}.4h
386     %1 = load double* %p
387     %2 = fadd double %1, %1
388     %3 = call <4 x i16> @test_v4i16_f64_helper(double %2)
389     %4 = add <4 x i16> %3, %3
390     store <4 x i16> %4, <4 x i16>* %q
391     ret void
392 }
393
394 ; CHECK-LABEL: test_v4i16_v1i64:
395 declare <4 x i16> @test_v4i16_v1i64_helper(<1 x i64> %p)
396 define void @test_v4i16_v1i64(<1 x i64>* %p, <4 x i16>* %q) {
397 ; CHECK: rev64 v{{[0-9]+}}.4h
398     %1 = load <1 x i64>* %p
399     %2 = add <1 x i64> %1, %1
400     %3 = call <4 x i16> @test_v4i16_v1i64_helper(<1 x i64> %2)
401     %4 = add <4 x i16> %3, %3
402     store <4 x i16> %4, <4 x i16>* %q
403     ret void
404 }
405
406 ; CHECK-LABEL: test_v4i16_v2f32:
407 declare <4 x i16> @test_v4i16_v2f32_helper(<2 x float> %p)
408 define void @test_v4i16_v2f32(<2 x float>* %p, <4 x i16>* %q) {
409 ; CHECK: rev64 v{{[0-9]+}}.2s
410 ; CHECK: rev64 v{{[0-9]+}}.4h
411     %1 = load <2 x float>* %p
412     %2 = fadd <2 x float> %1, %1
413     %3 = call <4 x i16> @test_v4i16_v2f32_helper(<2 x float> %2)
414     %4 = add <4 x i16> %3, %3
415     store <4 x i16> %4, <4 x i16>* %q
416     ret void
417 }
418
419 ; CHECK-LABEL: test_v4i16_v2i32:
420 declare <4 x i16> @test_v4i16_v2i32_helper(<2 x i32> %p)
421 define void @test_v4i16_v2i32(<2 x i32>* %p, <4 x i16>* %q) {
422 ; CHECK: rev64 v{{[0-9]+}}.2s
423 ; CHECK: rev64 v{{[0-9]+}}.4h
424     %1 = load <2 x i32>* %p
425     %2 = add <2 x i32> %1, %1
426     %3 = call <4 x i16> @test_v4i16_v2i32_helper(<2 x i32> %2)
427     %4 = add <4 x i16> %3, %3
428     store <4 x i16> %4, <4 x i16>* %q
429     ret void
430 }
431
432 ; CHECK-LABEL: test_v4i16_v8i8:
433 declare <4 x i16> @test_v4i16_v8i8_helper(<8 x i8> %p)
434 define void @test_v4i16_v8i8(<8 x i8>* %p, <4 x i16>* %q) {
435 ; CHECK: rev64 v{{[0-9]+}}.8b
436 ; CHECK: rev64 v{{[0-9]+}}.4h
437     %1 = load <8 x i8>* %p
438     %2 = add <8 x i8> %1, %1
439     %3 = call <4 x i16> @test_v4i16_v8i8_helper(<8 x i8> %2)
440     %4 = add <4 x i16> %3, %3
441     store <4 x i16> %4, <4 x i16>* %q
442     ret void
443 }
444
445 ; CHECK-LABEL: test_v8i8_i64:
446 declare <8 x i8> @test_v8i8_i64_helper(i64 %p)
447 define void @test_v8i8_i64(i64* %p, <8 x i8>* %q) {
448 ; CHECK: rev64 v{{[0-9]+}}.8b
449     %1 = load i64* %p
450     %2 = add i64 %1, %1
451     %3 = call <8 x i8> @test_v8i8_i64_helper(i64 %2)
452     %4 = add <8 x i8> %3, %3
453     store <8 x i8> %4, <8 x i8>* %q
454     ret void
455 }
456
457 ; CHECK-LABEL: test_v8i8_f64:
458 declare <8 x i8> @test_v8i8_f64_helper(double %p)
459 define void @test_v8i8_f64(double* %p, <8 x i8>* %q) {
460 ; CHECK: rev64 v{{[0-9]+}}.8b
461     %1 = load double* %p
462     %2 = fadd double %1, %1
463     %3 = call <8 x i8> @test_v8i8_f64_helper(double %2)
464     %4 = add <8 x i8> %3, %3
465     store <8 x i8> %4, <8 x i8>* %q
466     ret void
467 }
468
469 ; CHECK-LABEL: test_v8i8_v1i64:
470 declare <8 x i8> @test_v8i8_v1i64_helper(<1 x i64> %p)
471 define void @test_v8i8_v1i64(<1 x i64>* %p, <8 x i8>* %q) {
472 ; CHECK: rev64 v{{[0-9]+}}.8b
473     %1 = load <1 x i64>* %p
474     %2 = add <1 x i64> %1, %1
475     %3 = call <8 x i8> @test_v8i8_v1i64_helper(<1 x i64> %2)
476     %4 = add <8 x i8> %3, %3
477     store <8 x i8> %4, <8 x i8>* %q
478     ret void
479 }
480
481 ; CHECK-LABEL: test_v8i8_v2f32:
482 declare <8 x i8> @test_v8i8_v2f32_helper(<2 x float> %p)
483 define void @test_v8i8_v2f32(<2 x float>* %p, <8 x i8>* %q) {
484 ; CHECK: rev64 v{{[0-9]+}}.2s
485 ; CHECK: rev64 v{{[0-9]+}}.8b
486     %1 = load <2 x float>* %p
487     %2 = fadd <2 x float> %1, %1
488     %3 = call <8 x i8> @test_v8i8_v2f32_helper(<2 x float> %2)
489     %4 = add <8 x i8> %3, %3
490     store <8 x i8> %4, <8 x i8>* %q
491     ret void
492 }
493
494 ; CHECK-LABEL: test_v8i8_v2i32:
495 declare <8 x i8> @test_v8i8_v2i32_helper(<2 x i32> %p)
496 define void @test_v8i8_v2i32(<2 x i32>* %p, <8 x i8>* %q) {
497 ; CHECK: rev64 v{{[0-9]+}}.2s
498 ; CHECK: rev64 v{{[0-9]+}}.8b
499     %1 = load <2 x i32>* %p
500     %2 = add <2 x i32> %1, %1
501     %3 = call <8 x i8> @test_v8i8_v2i32_helper(<2 x i32> %2)
502     %4 = add <8 x i8> %3, %3
503     store <8 x i8> %4, <8 x i8>* %q
504     ret void
505 }
506
507 ; CHECK-LABEL: test_v8i8_v4i16:
508 declare <8 x i8> @test_v8i8_v4i16_helper(<4 x i16> %p)
509 define void @test_v8i8_v4i16(<4 x i16>* %p, <8 x i8>* %q) {
510 ; CHECK: rev64 v{{[0-9]+}}.4h
511 ; CHECK: rev64 v{{[0-9]+}}.8b
512     %1 = load <4 x i16>* %p
513     %2 = add <4 x i16> %1, %1
514     %3 = call <8 x i8> @test_v8i8_v4i16_helper(<4 x i16> %2)
515     %4 = add <8 x i8> %3, %3
516     store <8 x i8> %4, <8 x i8>* %q
517     ret void
518 }
519
520 ; CHECK-LABEL: test_f128_v2f64:
521 declare fp128 @test_f128_v2f64_helper(<2 x double> %p)
522 define void @test_f128_v2f64(<2 x double>* %p, fp128* %q) {
523 ; CHECK: ext
524     %1 = load <2 x double>* %p
525     %2 = fadd <2 x double> %1, %1
526     %3 = call fp128 @test_f128_v2f64_helper(<2 x double> %2)
527     %4 = fadd fp128 %3, %3
528     store fp128 %4, fp128* %q
529     ret void
530 }
531
532 ; CHECK-LABEL: test_f128_v2i64:
533 declare fp128 @test_f128_v2i64_helper(<2 x i64> %p)
534 define void @test_f128_v2i64(<2 x i64>* %p, fp128* %q) {
535 ; CHECK: ext
536     %1 = load <2 x i64>* %p
537     %2 = add <2 x i64> %1, %1
538     %3 = call fp128 @test_f128_v2i64_helper(<2 x i64> %2)
539     %4 = fadd fp128 %3, %3
540     store fp128 %4, fp128* %q
541     ret void
542 }
543
544 ; CHECK-LABEL: test_f128_v4f32:
545 declare fp128 @test_f128_v4f32_helper(<4 x float> %p)
546 define void @test_f128_v4f32(<4 x float>* %p, fp128* %q) {
547 ; CHECK: rev64 v{{[0-9]+}}.4s
548 ; CHECK: ext
549     %1 = load <4 x float>* %p
550     %2 = fadd <4 x float> %1, %1
551     %3 = call fp128 @test_f128_v4f32_helper(<4 x float> %2)
552     %4 = fadd fp128 %3, %3
553     store fp128 %4, fp128* %q
554     ret void
555 }
556
557 ; CHECK-LABEL: test_f128_v4i32:
558 declare fp128 @test_f128_v4i32_helper(<4 x i32> %p)
559 define void @test_f128_v4i32(<4 x i32>* %p, fp128* %q) {
560 ; CHECK: rev64 v{{[0-9]+}}.4s
561 ; CHECK: ext
562     %1 = load <4 x i32>* %p
563     %2 = add <4 x i32> %1, %1
564     %3 = call fp128 @test_f128_v4i32_helper(<4 x i32> %2)
565     %4 = fadd fp128 %3, %3
566     store fp128 %4, fp128* %q
567     ret void
568 }
569
570 ; CHECK-LABEL: test_f128_v8i16:
571 declare fp128 @test_f128_v8i16_helper(<8 x i16> %p)
572 define void @test_f128_v8i16(<8 x i16>* %p, fp128* %q) {
573 ; CHECK: rev64 v{{[0-9]+}}.8h
574 ; CHECK: ext
575     %1 = load <8 x i16>* %p
576     %2 = add <8 x i16> %1, %1
577     %3 = call fp128 @test_f128_v8i16_helper(<8 x i16> %2)
578     %4 = fadd fp128 %3, %3
579     store fp128 %4, fp128* %q
580     ret void
581 }
582
583 ; CHECK-LABEL: test_f128_v16i8:
584 declare fp128 @test_f128_v16i8_helper(<16 x i8> %p)
585 define void @test_f128_v16i8(<16 x i8>* %p, fp128* %q) {
586 ; CHECK: rev64 v{{[0-9]+}}.16b
587 ; CHECK: ext
588     %1 = load <16 x i8>* %p
589     %2 = add <16 x i8> %1, %1
590     %3 = call fp128 @test_f128_v16i8_helper(<16 x i8> %2)
591     %4 = fadd fp128 %3, %3
592     store fp128 %4, fp128* %q
593     ret void
594 }
595
596 ; CHECK-LABEL: test_v2f64_f128:
597 declare <2 x double> @test_v2f64_f128_helper(fp128 %p)
598 define void @test_v2f64_f128(fp128* %p, <2 x double>* %q) {
599 ; CHECK: ext
600     %1 = load fp128* %p
601     %2 = fadd fp128 %1, %1
602     %3 = call <2 x double> @test_v2f64_f128_helper(fp128 %2)
603     %4 = fadd <2 x double> %3, %3
604     store <2 x double> %4, <2 x double>* %q
605     ret void
606 }
607
608 ; CHECK-LABEL: test_v2f64_v2i64:
609 declare <2 x double> @test_v2f64_v2i64_helper(<2 x i64> %p)
610 define void @test_v2f64_v2i64(<2 x i64>* %p, <2 x double>* %q) {
611 ; CHECK: ext
612 ; CHECK: ext
613     %1 = load <2 x i64>* %p
614     %2 = add <2 x i64> %1, %1
615     %3 = call <2 x double> @test_v2f64_v2i64_helper(<2 x i64> %2)
616     %4 = fadd <2 x double> %3, %3
617     store <2 x double> %4, <2 x double>* %q
618     ret void
619 }
620
621 ; CHECK-LABEL: test_v2f64_v4f32:
622 declare <2 x double> @test_v2f64_v4f32_helper(<4 x float> %p)
623 define void @test_v2f64_v4f32(<4 x float>* %p, <2 x double>* %q) {
624 ; CHECK: rev64 v{{[0-9]+}}.4s
625 ; CHECK: ext
626 ; CHECK: ext
627     %1 = load <4 x float>* %p
628     %2 = fadd <4 x float> %1, %1
629     %3 = call <2 x double> @test_v2f64_v4f32_helper(<4 x float> %2)
630     %4 = fadd <2 x double> %3, %3
631     store <2 x double> %4, <2 x double>* %q
632     ret void
633 }
634
635 ; CHECK-LABEL: test_v2f64_v4i32:
636 declare <2 x double> @test_v2f64_v4i32_helper(<4 x i32> %p)
637 define void @test_v2f64_v4i32(<4 x i32>* %p, <2 x double>* %q) {
638 ; CHECK: rev64 v{{[0-9]+}}.4s
639 ; CHECK: ext
640 ; CHECK: ext
641     %1 = load <4 x i32>* %p
642     %2 = add <4 x i32> %1, %1
643     %3 = call <2 x double> @test_v2f64_v4i32_helper(<4 x i32> %2)
644     %4 = fadd <2 x double> %3, %3
645     store <2 x double> %4, <2 x double>* %q
646     ret void
647 }
648
649 ; CHECK-LABEL: test_v2f64_v8i16:
650 declare <2 x double> @test_v2f64_v8i16_helper(<8 x i16> %p)
651 define void @test_v2f64_v8i16(<8 x i16>* %p, <2 x double>* %q) {
652 ; CHECK: rev64 v{{[0-9]+}}.8h
653 ; CHECK: ext
654 ; CHECK: ext
655     %1 = load <8 x i16>* %p
656     %2 = add <8 x i16> %1, %1
657     %3 = call <2 x double> @test_v2f64_v8i16_helper(<8 x i16> %2)
658     %4 = fadd <2 x double> %3, %3
659     store <2 x double> %4, <2 x double>* %q
660     ret void
661 }
662
663 ; CHECK-LABEL: test_v2f64_v16i8:
664 declare <2 x double> @test_v2f64_v16i8_helper(<16 x i8> %p)
665 define void @test_v2f64_v16i8(<16 x i8>* %p, <2 x double>* %q) {
666 ; CHECK: rev64 v{{[0-9]+}}.16b
667 ; CHECK: ext
668 ; CHECK: ext
669     %1 = load <16 x i8>* %p
670     %2 = add <16 x i8> %1, %1
671     %3 = call <2 x double> @test_v2f64_v16i8_helper(<16 x i8> %2)
672     %4 = fadd <2 x double> %3, %3
673     store <2 x double> %4, <2 x double>* %q
674     ret void
675 }
676
677 ; CHECK-LABEL: test_v2i64_f128:
678 declare <2 x i64> @test_v2i64_f128_helper(fp128 %p)
679 define void @test_v2i64_f128(fp128* %p, <2 x i64>* %q) {
680 ; CHECK: ext
681     %1 = load fp128* %p
682     %2 = fadd fp128 %1, %1
683     %3 = call <2 x i64> @test_v2i64_f128_helper(fp128 %2)
684     %4 = add <2 x i64> %3, %3
685     store <2 x i64> %4, <2 x i64>* %q
686     ret void
687 }
688
689 ; CHECK-LABEL: test_v2i64_v2f64:
690 declare <2 x i64> @test_v2i64_v2f64_helper(<2 x double> %p)
691 define void @test_v2i64_v2f64(<2 x double>* %p, <2 x i64>* %q) {
692 ; CHECK: ext
693 ; CHECK: ext
694     %1 = load <2 x double>* %p
695     %2 = fadd <2 x double> %1, %1
696     %3 = call <2 x i64> @test_v2i64_v2f64_helper(<2 x double> %2)
697     %4 = add <2 x i64> %3, %3
698     store <2 x i64> %4, <2 x i64>* %q
699     ret void
700 }
701
702 ; CHECK-LABEL: test_v2i64_v4f32:
703 declare <2 x i64> @test_v2i64_v4f32_helper(<4 x float> %p)
704 define void @test_v2i64_v4f32(<4 x float>* %p, <2 x i64>* %q) {
705 ; CHECK: rev64 v{{[0-9]+}}.4s
706 ; CHECK: ext
707 ; CHECK: ext
708     %1 = load <4 x float>* %p
709     %2 = fadd <4 x float> %1, %1
710     %3 = call <2 x i64> @test_v2i64_v4f32_helper(<4 x float> %2)
711     %4 = add <2 x i64> %3, %3
712     store <2 x i64> %4, <2 x i64>* %q
713     ret void
714 }
715
716 ; CHECK-LABEL: test_v2i64_v4i32:
717 declare <2 x i64> @test_v2i64_v4i32_helper(<4 x i32> %p)
718 define void @test_v2i64_v4i32(<4 x i32>* %p, <2 x i64>* %q) {
719 ; CHECK: rev64 v{{[0-9]+}}.4s
720 ; CHECK: ext
721 ; CHECK: ext
722     %1 = load <4 x i32>* %p
723     %2 = add <4 x i32> %1, %1
724     %3 = call <2 x i64> @test_v2i64_v4i32_helper(<4 x i32> %2)
725     %4 = add <2 x i64> %3, %3
726     store <2 x i64> %4, <2 x i64>* %q
727     ret void
728 }
729
730 ; CHECK-LABEL: test_v2i64_v8i16:
731 declare <2 x i64> @test_v2i64_v8i16_helper(<8 x i16> %p)
732 define void @test_v2i64_v8i16(<8 x i16>* %p, <2 x i64>* %q) {
733 ; CHECK: rev64 v{{[0-9]+}}.8h
734 ; CHECK: ext
735 ; CHECK: ext
736     %1 = load <8 x i16>* %p
737     %2 = add <8 x i16> %1, %1
738     %3 = call <2 x i64> @test_v2i64_v8i16_helper(<8 x i16> %2)
739     %4 = add <2 x i64> %3, %3
740     store <2 x i64> %4, <2 x i64>* %q
741     ret void
742 }
743
744 ; CHECK-LABEL: test_v2i64_v16i8:
745 declare <2 x i64> @test_v2i64_v16i8_helper(<16 x i8> %p)
746 define void @test_v2i64_v16i8(<16 x i8>* %p, <2 x i64>* %q) {
747 ; CHECK: rev64 v{{[0-9]+}}.16b
748 ; CHECK: ext
749 ; CHECK: ext
750     %1 = load <16 x i8>* %p
751     %2 = add <16 x i8> %1, %1
752     %3 = call <2 x i64> @test_v2i64_v16i8_helper(<16 x i8> %2)
753     %4 = add <2 x i64> %3, %3
754     store <2 x i64> %4, <2 x i64>* %q
755     ret void
756 }
757
758 ; CHECK-LABEL: test_v4f32_f128:
759 declare <4 x float> @test_v4f32_f128_helper(fp128 %p)
760 define void @test_v4f32_f128(fp128* %p, <4 x float>* %q) {
761 ; CHECK: rev64 v{{[0-9]+}}.4s
762 ; CHECK: ext
763     %1 = load fp128* %p
764     %2 = fadd fp128 %1, %1
765     %3 = call <4 x float> @test_v4f32_f128_helper(fp128 %2)
766     %4 = fadd <4 x float> %3, %3
767     store <4 x float> %4, <4 x float>* %q
768     ret void
769 }
770
771 ; CHECK-LABEL: test_v4f32_v2f64:
772 declare <4 x float> @test_v4f32_v2f64_helper(<2 x double> %p)
773 define void @test_v4f32_v2f64(<2 x double>* %p, <4 x float>* %q) {
774 ; CHECK: ext
775 ; CHECK: rev64 v{{[0-9]+}}.4s
776 ; CHECK: ext
777     %1 = load <2 x double>* %p
778     %2 = fadd <2 x double> %1, %1
779     %3 = call <4 x float> @test_v4f32_v2f64_helper(<2 x double> %2)
780     %4 = fadd <4 x float> %3, %3
781     store <4 x float> %4, <4 x float>* %q
782     ret void
783 }
784
785 ; CHECK-LABEL: test_v4f32_v2i64:
786 declare <4 x float> @test_v4f32_v2i64_helper(<2 x i64> %p)
787 define void @test_v4f32_v2i64(<2 x i64>* %p, <4 x float>* %q) {
788 ; CHECK: ext
789 ; CHECK: rev64 v{{[0-9]+}}.4s
790 ; CHECK: ext
791     %1 = load <2 x i64>* %p
792     %2 = add <2 x i64> %1, %1
793     %3 = call <4 x float> @test_v4f32_v2i64_helper(<2 x i64> %2)
794     %4 = fadd <4 x float> %3, %3
795     store <4 x float> %4, <4 x float>* %q
796     ret void
797 }
798
799 ; CHECK-LABEL: test_v4f32_v4i32:
800 declare <4 x float> @test_v4f32_v4i32_helper(<4 x i32> %p)
801 define void @test_v4f32_v4i32(<4 x i32>* %p, <4 x float>* %q) {
802 ; CHECK: rev64 v{{[0-9]+}}.4s
803 ; CHECK: ext
804 ; CHECK: rev64 v{{[0-9]+}}.4s
805 ; CHECK: ext
806     %1 = load <4 x i32>* %p
807     %2 = add <4 x i32> %1, %1
808     %3 = call <4 x float> @test_v4f32_v4i32_helper(<4 x i32> %2)
809     %4 = fadd <4 x float> %3, %3
810     store <4 x float> %4, <4 x float>* %q
811     ret void
812 }
813
814 ; CHECK-LABEL: test_v4f32_v8i16:
815 declare <4 x float> @test_v4f32_v8i16_helper(<8 x i16> %p)
816 define void @test_v4f32_v8i16(<8 x i16>* %p, <4 x float>* %q) {
817 ; CHECK: rev64 v{{[0-9]+}}.8h
818 ; CHECK: ext
819 ; CHECK: rev64 v{{[0-9]+}}.4s
820 ; CHECK: ext
821     %1 = load <8 x i16>* %p
822     %2 = add <8 x i16> %1, %1
823     %3 = call <4 x float> @test_v4f32_v8i16_helper(<8 x i16> %2)
824     %4 = fadd <4 x float> %3, %3
825     store <4 x float> %4, <4 x float>* %q
826     ret void
827 }
828
829 ; CHECK-LABEL: test_v4f32_v16i8:
830 declare <4 x float> @test_v4f32_v16i8_helper(<16 x i8> %p)
831 define void @test_v4f32_v16i8(<16 x i8>* %p, <4 x float>* %q) {
832 ; CHECK: rev64 v{{[0-9]+}}.16b
833 ; CHECK: ext
834 ; CHECK: rev64 v{{[0-9]+}}.4s
835 ; CHECK: ext
836     %1 = load <16 x i8>* %p
837     %2 = add <16 x i8> %1, %1
838     %3 = call <4 x float> @test_v4f32_v16i8_helper(<16 x i8> %2)
839     %4 = fadd <4 x float> %3, %3
840     store <4 x float> %4, <4 x float>* %q
841     ret void
842 }
843
844 ; CHECK-LABEL: test_v4i32_f128:
845 declare <4 x i32> @test_v4i32_f128_helper(fp128 %p)
846 define void @test_v4i32_f128(fp128* %p, <4 x i32>* %q) {
847 ; CHECK: rev64 v{{[0-9]+}}.4s
848 ; CHECK: ext
849     %1 = load fp128* %p
850     %2 = fadd fp128 %1, %1
851     %3 = call <4 x i32> @test_v4i32_f128_helper(fp128 %2)
852     %4 = add <4 x i32> %3, %3
853     store <4 x i32> %4, <4 x i32>* %q
854     ret void
855 }
856
857 ; CHECK-LABEL: test_v4i32_v2f64:
858 declare <4 x i32> @test_v4i32_v2f64_helper(<2 x double> %p)
859 define void @test_v4i32_v2f64(<2 x double>* %p, <4 x i32>* %q) {
860 ; CHECK: ext
861 ; CHECK: rev64 v{{[0-9]+}}.4s
862 ; CHECK: ext
863     %1 = load <2 x double>* %p
864     %2 = fadd <2 x double> %1, %1
865     %3 = call <4 x i32> @test_v4i32_v2f64_helper(<2 x double> %2)
866     %4 = add <4 x i32> %3, %3
867     store <4 x i32> %4, <4 x i32>* %q
868     ret void
869 }
870
871 ; CHECK-LABEL: test_v4i32_v2i64:
872 declare <4 x i32> @test_v4i32_v2i64_helper(<2 x i64> %p)
873 define void @test_v4i32_v2i64(<2 x i64>* %p, <4 x i32>* %q) {
874 ; CHECK: ext
875 ; CHECK: rev64 v{{[0-9]+}}.4s
876 ; CHECK: ext
877     %1 = load <2 x i64>* %p
878     %2 = add <2 x i64> %1, %1
879     %3 = call <4 x i32> @test_v4i32_v2i64_helper(<2 x i64> %2)
880     %4 = add <4 x i32> %3, %3
881     store <4 x i32> %4, <4 x i32>* %q
882     ret void
883 }
884
885 ; CHECK-LABEL: test_v4i32_v4f32:
886 declare <4 x i32> @test_v4i32_v4f32_helper(<4 x float> %p)
887 define void @test_v4i32_v4f32(<4 x float>* %p, <4 x i32>* %q) {
888 ; CHECK: rev64 v{{[0-9]+}}.4s
889 ; CHECK: ext
890 ; CHECK: rev64 v{{[0-9]+}}.4s
891 ; CHECK: ext
892     %1 = load <4 x float>* %p
893     %2 = fadd <4 x float> %1, %1
894     %3 = call <4 x i32> @test_v4i32_v4f32_helper(<4 x float> %2)
895     %4 = add <4 x i32> %3, %3
896     store <4 x i32> %4, <4 x i32>* %q
897     ret void
898 }
899
900 ; CHECK-LABEL: test_v4i32_v8i16:
901 declare <4 x i32> @test_v4i32_v8i16_helper(<8 x i16> %p)
902 define void @test_v4i32_v8i16(<8 x i16>* %p, <4 x i32>* %q) {
903 ; CHECK: rev64 v{{[0-9]+}}.8h
904 ; CHECK: ext
905 ; CHECK: rev64 v{{[0-9]+}}.4s
906 ; CHECK: ext
907     %1 = load <8 x i16>* %p
908     %2 = add <8 x i16> %1, %1
909     %3 = call <4 x i32> @test_v4i32_v8i16_helper(<8 x i16> %2)
910     %4 = add <4 x i32> %3, %3
911     store <4 x i32> %4, <4 x i32>* %q
912     ret void
913 }
914
915 ; CHECK-LABEL: test_v4i32_v16i8:
916 declare <4 x i32> @test_v4i32_v16i8_helper(<16 x i8> %p)
917 define void @test_v4i32_v16i8(<16 x i8>* %p, <4 x i32>* %q) {
918 ; CHECK: rev64 v{{[0-9]+}}.16b
919 ; CHECK: ext
920 ; CHECK: rev64 v{{[0-9]+}}.4s
921 ; CHECK: ext
922     %1 = load <16 x i8>* %p
923     %2 = add <16 x i8> %1, %1
924     %3 = call <4 x i32> @test_v4i32_v16i8_helper(<16 x i8> %2)
925     %4 = add <4 x i32> %3, %3
926     store <4 x i32> %4, <4 x i32>* %q
927     ret void
928 }
929
930 ; CHECK-LABEL: test_v8i16_f128:
931 declare <8 x i16> @test_v8i16_f128_helper(fp128 %p)
932 define void @test_v8i16_f128(fp128* %p, <8 x i16>* %q) {
933 ; CHECK: rev64 v{{[0-9]+}}.8h
934 ; CHECK: ext
935     %1 = load fp128* %p
936     %2 = fadd fp128 %1, %1
937     %3 = call <8 x i16> @test_v8i16_f128_helper(fp128 %2)
938     %4 = add <8 x i16> %3, %3
939     store <8 x i16> %4, <8 x i16>* %q
940     ret void
941 }
942
943 ; CHECK-LABEL: test_v8i16_v2f64:
944 declare <8 x i16> @test_v8i16_v2f64_helper(<2 x double> %p)
945 define void @test_v8i16_v2f64(<2 x double>* %p, <8 x i16>* %q) {
946 ; CHECK: ext
947 ; CHECK: rev64 v{{[0-9]+}}.8h
948 ; CHECK: ext
949     %1 = load <2 x double>* %p
950     %2 = fadd <2 x double> %1, %1
951     %3 = call <8 x i16> @test_v8i16_v2f64_helper(<2 x double> %2)
952     %4 = add <8 x i16> %3, %3
953     store <8 x i16> %4, <8 x i16>* %q
954     ret void
955 }
956
957 ; CHECK-LABEL: test_v8i16_v2i64:
958 declare <8 x i16> @test_v8i16_v2i64_helper(<2 x i64> %p)
959 define void @test_v8i16_v2i64(<2 x i64>* %p, <8 x i16>* %q) {
960 ; CHECK: ext
961 ; CHECK: rev64 v{{[0-9]+}}.8h
962 ; CHECK: ext
963     %1 = load <2 x i64>* %p
964     %2 = add <2 x i64> %1, %1
965     %3 = call <8 x i16> @test_v8i16_v2i64_helper(<2 x i64> %2)
966     %4 = add <8 x i16> %3, %3
967     store <8 x i16> %4, <8 x i16>* %q
968     ret void
969 }
970
971 ; CHECK-LABEL: test_v8i16_v4f32:
972 declare <8 x i16> @test_v8i16_v4f32_helper(<4 x float> %p)
973 define void @test_v8i16_v4f32(<4 x float>* %p, <8 x i16>* %q) {
974 ; CHECK: rev64 v{{[0-9]+}}.4s
975 ; CHECK: ext
976 ; CHECK: rev64 v{{[0-9]+}}.8h
977 ; CHECK: ext
978     %1 = load <4 x float>* %p
979     %2 = fadd <4 x float> %1, %1
980     %3 = call <8 x i16> @test_v8i16_v4f32_helper(<4 x float> %2)
981     %4 = add <8 x i16> %3, %3
982     store <8 x i16> %4, <8 x i16>* %q
983     ret void
984 }
985
986 ; CHECK-LABEL: test_v8i16_v4i32:
987 declare <8 x i16> @test_v8i16_v4i32_helper(<4 x i32> %p)
988 define void @test_v8i16_v4i32(<4 x i32>* %p, <8 x i16>* %q) {
989 ; CHECK: rev64 v{{[0-9]+}}.4s
990 ; CHECK: ext
991 ; CHECK: rev64 v{{[0-9]+}}.8h
992 ; CHECK: ext
993     %1 = load <4 x i32>* %p
994     %2 = add <4 x i32> %1, %1
995     %3 = call <8 x i16> @test_v8i16_v4i32_helper(<4 x i32> %2)
996     %4 = add <8 x i16> %3, %3
997     store <8 x i16> %4, <8 x i16>* %q
998     ret void
999 }
1000
1001 ; CHECK-LABEL: test_v8i16_v16i8:
1002 declare <8 x i16> @test_v8i16_v16i8_helper(<16 x i8> %p)
1003 define void @test_v8i16_v16i8(<16 x i8>* %p, <8 x i16>* %q) {
1004 ; CHECK: rev64 v{{[0-9]+}}.16b
1005 ; CHECK: ext
1006 ; CHECK: rev64 v{{[0-9]+}}.8h
1007 ; CHECK: ext
1008     %1 = load <16 x i8>* %p
1009     %2 = add <16 x i8> %1, %1
1010     %3 = call <8 x i16> @test_v8i16_v16i8_helper(<16 x i8> %2)
1011     %4 = add <8 x i16> %3, %3
1012     store <8 x i16> %4, <8 x i16>* %q
1013     ret void
1014 }
1015
1016 ; CHECK-LABEL: test_v16i8_f128:
1017 declare <16 x i8> @test_v16i8_f128_helper(fp128 %p)
1018 define void @test_v16i8_f128(fp128* %p, <16 x i8>* %q) {
1019 ; CHECK: rev64 v{{[0-9]+}}.16b
1020 ; CHECK: ext
1021     %1 = load fp128* %p
1022     %2 = fadd fp128 %1, %1
1023     %3 = call <16 x i8> @test_v16i8_f128_helper(fp128 %2)
1024     %4 = add <16 x i8> %3, %3
1025     store <16 x i8> %4, <16 x i8>* %q
1026     ret void
1027 }
1028
1029 ; CHECK-LABEL: test_v16i8_v2f64:
1030 declare <16 x i8> @test_v16i8_v2f64_helper(<2 x double> %p)
1031 define void @test_v16i8_v2f64(<2 x double>* %p, <16 x i8>* %q) {
1032 ; CHECK: ext
1033 ; CHECK: rev64 v{{[0-9]+}}.16b
1034 ; CHECK: ext
1035     %1 = load <2 x double>* %p
1036     %2 = fadd <2 x double> %1, %1
1037     %3 = call <16 x i8> @test_v16i8_v2f64_helper(<2 x double> %2)
1038     %4 = add <16 x i8> %3, %3
1039     store <16 x i8> %4, <16 x i8>* %q
1040     ret void
1041 }
1042
1043 ; CHECK-LABEL: test_v16i8_v2i64:
1044 declare <16 x i8> @test_v16i8_v2i64_helper(<2 x i64> %p)
1045 define void @test_v16i8_v2i64(<2 x i64>* %p, <16 x i8>* %q) {
1046 ; CHECK: ext
1047 ; CHECK: rev64 v{{[0-9]+}}.16b
1048 ; CHECK: ext
1049     %1 = load <2 x i64>* %p
1050     %2 = add <2 x i64> %1, %1
1051     %3 = call <16 x i8> @test_v16i8_v2i64_helper(<2 x i64> %2)
1052     %4 = add <16 x i8> %3, %3
1053     store <16 x i8> %4, <16 x i8>* %q
1054     ret void
1055 }
1056
1057 ; CHECK-LABEL: test_v16i8_v4f32:
1058 declare <16 x i8> @test_v16i8_v4f32_helper(<4 x float> %p)
1059 define void @test_v16i8_v4f32(<4 x float>* %p, <16 x i8>* %q) {
1060 ; CHECK: rev64 v{{[0-9]+}}.4s
1061 ; CHECK: ext
1062 ; CHECK: rev64 v{{[0-9]+}}.16b
1063 ; CHECK: ext
1064     %1 = load <4 x float>* %p
1065     %2 = fadd <4 x float> %1, %1
1066     %3 = call <16 x i8> @test_v16i8_v4f32_helper(<4 x float> %2)
1067     %4 = add <16 x i8> %3, %3
1068     store <16 x i8> %4, <16 x i8>* %q
1069     ret void
1070 }
1071
1072 ; CHECK-LABEL: test_v16i8_v4i32:
1073 declare <16 x i8> @test_v16i8_v4i32_helper(<4 x i32> %p)
1074 define void @test_v16i8_v4i32(<4 x i32>* %p, <16 x i8>* %q) {
1075 ; CHECK: rev64 v{{[0-9]+}}.4s
1076 ; CHECK: ext
1077 ; CHECK: rev64 v{{[0-9]+}}.16b
1078 ; CHECK: ext
1079     %1 = load <4 x i32>* %p
1080     %2 = add <4 x i32> %1, %1
1081     %3 = call <16 x i8> @test_v16i8_v4i32_helper(<4 x i32> %2)
1082     %4 = add <16 x i8> %3, %3
1083     store <16 x i8> %4, <16 x i8>* %q
1084     ret void
1085 }
1086
1087 ; CHECK-LABEL: test_v16i8_v8i16:
1088 declare <16 x i8> @test_v16i8_v8i16_helper(<8 x i16> %p)
1089 define void @test_v16i8_v8i16(<8 x i16>* %p, <16 x i8>* %q) {
1090 ; CHECK: rev64 v{{[0-9]+}}.8h
1091 ; CHECK: ext
1092 ; CHECK: rev64 v{{[0-9]+}}.16b
1093 ; CHECK: ext
1094     %1 = load <8 x i16>* %p
1095     %2 = add <8 x i16> %1, %1
1096     %3 = call <16 x i8> @test_v16i8_v8i16_helper(<8 x i16> %2)
1097     %4 = add <16 x i8> %3, %3
1098     store <16 x i8> %4, <16 x i8>* %q
1099     ret void
1100 }