[ARM64-BE] Implement the lane-twiddling logic at AAPCS boundaries for big endian.
[oota-llvm.git] / test / CodeGen / ARM64 / big-endian-vector-callee.ll
1 ; RUN: llc -mtriple arm64_be < %s -arm64-load-store-opt=false -o - | FileCheck %s
2
3 ; CHECK-LABEL: test_i64_f64:
4 define i64 @test_i64_f64(double %p) {
5 ; CHECK-NOT: rev
6     %1 = fadd double %p, %p
7     %2 = bitcast double %1 to i64
8     %3 = add i64 %2, %2
9     ret i64 %3
10 }
11
12 ; CHECK-LABEL: test_i64_v1i64:
13 define i64 @test_i64_v1i64(<1 x i64> %p) {
14 ; CHECK-NOT: rev
15     %1 = add <1 x i64> %p, %p
16     %2 = bitcast <1 x i64> %1 to i64
17     %3 = add i64 %2, %2
18     ret i64 %3
19 }
20
21 ; CHECK-LABEL: test_i64_v2f32:
22 define i64 @test_i64_v2f32(<2 x float> %p) {
23 ; CHECK: rev64 v{{[0-9]+}}.2s
24     %1 = fadd <2 x float> %p, %p
25     %2 = bitcast <2 x float> %1 to i64
26     %3 = add i64 %2, %2
27     ret i64 %3
28 }
29
30 ; CHECK-LABEL: test_i64_v2i32:
31 define i64 @test_i64_v2i32(<2 x i32> %p) {
32 ; CHECK: rev64 v{{[0-9]+}}.2s
33     %1 = add <2 x i32> %p, %p
34     %2 = bitcast <2 x i32> %1 to i64
35     %3 = add i64 %2, %2
36     ret i64 %3
37 }
38
39 ; CHECK-LABEL: test_i64_v4i16:
40 define i64 @test_i64_v4i16(<4 x i16> %p) {
41 ; CHECK: rev64 v{{[0-9]+}}.4h
42     %1 = add <4 x i16> %p, %p
43     %2 = bitcast <4 x i16> %1 to i64
44     %3 = add i64 %2, %2
45     ret i64 %3
46 }
47
48 ; CHECK-LABEL: test_i64_v8i8:
49 define i64 @test_i64_v8i8(<8 x i8> %p) {
50 ; CHECK: rev64 v{{[0-9]+}}.8b
51     %1 = add <8 x i8> %p, %p
52     %2 = bitcast <8 x i8> %1 to i64
53     %3 = add i64 %2, %2
54     ret i64 %3
55 }
56
57 ; CHECK-LABEL: test_f64_i64:
58 define double @test_f64_i64(i64 %p) {
59 ; CHECK-NOT: rev
60     %1 = add i64 %p, %p
61     %2 = bitcast i64 %1 to double
62     %3 = fadd double %2, %2
63     ret double %3
64 }
65
66 ; CHECK-LABEL: test_f64_v1i64:
67 define double @test_f64_v1i64(<1 x i64> %p) {
68 ; CHECK-NOT: rev
69     %1 = add <1 x i64> %p, %p
70     %2 = bitcast <1 x i64> %1 to double
71     %3 = fadd double %2, %2
72     ret double %3
73 }
74
75 ; CHECK-LABEL: test_f64_v2f32:
76 define double @test_f64_v2f32(<2 x float> %p) {
77 ; CHECK: rev64 v{{[0-9]+}}.2s
78     %1 = fadd <2 x float> %p, %p
79     %2 = bitcast <2 x float> %1 to double
80     %3 = fadd double %2, %2
81     ret double %3
82 }
83
84 ; CHECK-LABEL: test_f64_v2i32:
85 define double @test_f64_v2i32(<2 x i32> %p) {
86 ; CHECK: rev64 v{{[0-9]+}}.2s
87     %1 = add <2 x i32> %p, %p
88     %2 = bitcast <2 x i32> %1 to double
89     %3 = fadd double %2, %2
90     ret double %3
91 }
92
93 ; CHECK-LABEL: test_f64_v4i16:
94 define double @test_f64_v4i16(<4 x i16> %p) {
95 ; CHECK: rev64 v{{[0-9]+}}.4h
96     %1 = add <4 x i16> %p, %p
97     %2 = bitcast <4 x i16> %1 to double
98     %3 = fadd double %2, %2
99     ret double %3
100 }
101
102 ; CHECK-LABEL: test_f64_v8i8:
103 define double @test_f64_v8i8(<8 x i8> %p) {
104 ; CHECK: rev64 v{{[0-9]+}}.8b
105     %1 = add <8 x i8> %p, %p
106     %2 = bitcast <8 x i8> %1 to double
107     %3 = fadd double %2, %2
108     ret double %3
109 }
110
111 ; CHECK-LABEL: test_v1i64_i64:
112 define <1 x i64> @test_v1i64_i64(i64 %p) {
113 ; CHECK-NOT: rev
114     %1 = add i64 %p, %p
115     %2 = bitcast i64 %1 to <1 x i64>
116     %3 = add <1 x i64> %2, %2
117     ret <1 x i64> %3
118 }
119
120 ; CHECK-LABEL: test_v1i64_f64:
121 define <1 x i64> @test_v1i64_f64(double %p) {
122 ; CHECK-NOT: rev
123     %1 = fadd double %p, %p
124     %2 = bitcast double %1 to <1 x i64>
125     %3 = add <1 x i64> %2, %2
126     ret <1 x i64> %3
127 }
128
129 ; CHECK-LABEL: test_v1i64_v2f32:
130 define <1 x i64> @test_v1i64_v2f32(<2 x float> %p) {
131 ; CHECK: rev64 v{{[0-9]+}}.2s
132     %1 = fadd <2 x float> %p, %p
133     %2 = bitcast <2 x float> %1 to <1 x i64>
134     %3 = add <1 x i64> %2, %2
135     ret <1 x i64> %3
136 }
137
138 ; CHECK-LABEL: test_v1i64_v2i32:
139 define <1 x i64> @test_v1i64_v2i32(<2 x i32> %p) {
140 ; CHECK: rev64 v{{[0-9]+}}.2s
141     %1 = add <2 x i32> %p, %p
142     %2 = bitcast <2 x i32> %1 to <1 x i64>
143     %3 = add <1 x i64> %2, %2
144     ret <1 x i64> %3
145 }
146
147 ; CHECK-LABEL: test_v1i64_v4i16:
148 define <1 x i64> @test_v1i64_v4i16(<4 x i16> %p) {
149 ; CHECK: rev64 v{{[0-9]+}}.4h
150     %1 = add <4 x i16> %p, %p
151     %2 = bitcast <4 x i16> %1 to <1 x i64>
152     %3 = add <1 x i64> %2, %2
153     ret <1 x i64> %3
154 }
155
156 ; CHECK-LABEL: test_v1i64_v8i8:
157 define <1 x i64> @test_v1i64_v8i8(<8 x i8> %p) {
158 ; CHECK: rev64 v{{[0-9]+}}.8b
159     %1 = add <8 x i8> %p, %p
160     %2 = bitcast <8 x i8> %1 to <1 x i64>
161     %3 = add <1 x i64> %2, %2
162     ret <1 x i64> %3
163 }
164
165 ; CHECK-LABEL: test_v2f32_i64:
166 define <2 x float> @test_v2f32_i64(i64 %p) {
167 ; CHECK: rev64 v{{[0-9]+}}.2s
168     %1 = add i64 %p, %p
169     %2 = bitcast i64 %1 to <2 x float>
170     %3 = fadd <2 x float> %2, %2
171     ret <2 x float> %3
172 }
173
174 ; CHECK-LABEL: test_v2f32_f64:
175 define <2 x float> @test_v2f32_f64(double %p) {
176 ; CHECK: rev64 v{{[0-9]+}}.2s
177     %1 = fadd double %p, %p
178     %2 = bitcast double %1 to <2 x float>
179     %3 = fadd <2 x float> %2, %2
180     ret <2 x float> %3
181 }
182
183 ; CHECK-LABEL: test_v2f32_v1i64:
184 define <2 x float> @test_v2f32_v1i64(<1 x i64> %p) {
185 ; CHECK: rev64 v{{[0-9]+}}.2s
186     %1 = add <1 x i64> %p, %p
187     %2 = bitcast <1 x i64> %1 to <2 x float>
188     %3 = fadd <2 x float> %2, %2
189     ret <2 x float> %3
190 }
191
192 ; CHECK-LABEL: test_v2f32_v2i32:
193 define <2 x float> @test_v2f32_v2i32(<2 x i32> %p) {
194 ; CHECK: rev64 v{{[0-9]+}}.2s
195 ; CHECK: rev64 v{{[0-9]+}}.2s
196     %1 = add <2 x i32> %p, %p
197     %2 = bitcast <2 x i32> %1 to <2 x float>
198     %3 = fadd <2 x float> %2, %2
199     ret <2 x float> %3
200 }
201
202 ; CHECK-LABEL: test_v2f32_v4i16:
203 define <2 x float> @test_v2f32_v4i16(<4 x i16> %p) {
204 ; CHECK: rev64 v{{[0-9]+}}.4h
205 ; CHECK: rev64 v{{[0-9]+}}.2s
206     %1 = add <4 x i16> %p, %p
207     %2 = bitcast <4 x i16> %1 to <2 x float>
208     %3 = fadd <2 x float> %2, %2
209     ret <2 x float> %3
210 }
211
212 ; CHECK-LABEL: test_v2f32_v8i8:
213 define <2 x float> @test_v2f32_v8i8(<8 x i8> %p) {
214 ; CHECK: rev64 v{{[0-9]+}}.8b
215 ; CHECK: rev64 v{{[0-9]+}}.2s
216     %1 = add <8 x i8> %p, %p
217     %2 = bitcast <8 x i8> %1 to <2 x float>
218     %3 = fadd <2 x float> %2, %2
219     ret <2 x float> %3
220 }
221
222 ; CHECK-LABEL: test_v2i32_i64:
223 define <2 x i32> @test_v2i32_i64(i64 %p) {
224 ; CHECK: rev64 v{{[0-9]+}}.2s
225     %1 = add i64 %p, %p
226     %2 = bitcast i64 %1 to <2 x i32>
227     %3 = add <2 x i32> %2, %2
228     ret <2 x i32> %3
229 }
230
231 ; CHECK-LABEL: test_v2i32_f64:
232 define <2 x i32> @test_v2i32_f64(double %p) {
233 ; CHECK: rev64 v{{[0-9]+}}.2s
234     %1 = fadd double %p, %p
235     %2 = bitcast double %1 to <2 x i32>
236     %3 = add <2 x i32> %2, %2
237     ret <2 x i32> %3
238 }
239
240 ; CHECK-LABEL: test_v2i32_v1i64:
241 define <2 x i32> @test_v2i32_v1i64(<1 x i64> %p) {
242 ; CHECK: rev64 v{{[0-9]+}}.2s
243     %1 = add <1 x i64> %p, %p
244     %2 = bitcast <1 x i64> %1 to <2 x i32>
245     %3 = add <2 x i32> %2, %2
246     ret <2 x i32> %3
247 }
248
249 ; CHECK-LABEL: test_v2i32_v2f32:
250 define <2 x i32> @test_v2i32_v2f32(<2 x float> %p) {
251 ; CHECK: rev64 v{{[0-9]+}}.2s
252 ; CHECK: rev64 v{{[0-9]+}}.2s
253     %1 = fadd <2 x float> %p, %p
254     %2 = bitcast <2 x float> %1 to <2 x i32>
255     %3 = add <2 x i32> %2, %2
256     ret <2 x i32> %3
257 }
258
259 ; CHECK-LABEL: test_v2i32_v4i16:
260 define <2 x i32> @test_v2i32_v4i16(<4 x i16> %p) {
261 ; CHECK: rev64 v{{[0-9]+}}.4h
262 ; CHECK: rev64 v{{[0-9]+}}.2s
263     %1 = add <4 x i16> %p, %p
264     %2 = bitcast <4 x i16> %1 to <2 x i32>
265     %3 = add <2 x i32> %2, %2
266     ret <2 x i32> %3
267 }
268
269 ; CHECK-LABEL: test_v2i32_v8i8:
270 define <2 x i32> @test_v2i32_v8i8(<8 x i8> %p) {
271 ; CHECK: rev64 v{{[0-9]+}}.8b
272 ; CHECK: rev64 v{{[0-9]+}}.2s
273     %1 = add <8 x i8> %p, %p
274     %2 = bitcast <8 x i8> %1 to <2 x i32>
275     %3 = add <2 x i32> %2, %2
276     ret <2 x i32> %3
277 }
278
279 ; CHECK-LABEL: test_v4i16_i64:
280 define <4 x i16> @test_v4i16_i64(i64 %p) {
281 ; CHECK: rev64 v{{[0-9]+}}.4h
282     %1 = add i64 %p, %p
283     %2 = bitcast i64 %1 to <4 x i16>
284     %3 = add <4 x i16> %2, %2
285     ret <4 x i16> %3
286 }
287
288 ; CHECK-LABEL: test_v4i16_f64:
289 define <4 x i16> @test_v4i16_f64(double %p) {
290 ; CHECK: rev64 v{{[0-9]+}}.4h
291     %1 = fadd double %p, %p
292     %2 = bitcast double %1 to <4 x i16>
293     %3 = add <4 x i16> %2, %2
294     ret <4 x i16> %3
295 }
296
297 ; CHECK-LABEL: test_v4i16_v1i64:
298 define <4 x i16> @test_v4i16_v1i64(<1 x i64> %p) {
299 ; CHECK: rev64 v{{[0-9]+}}.4h
300     %1 = add <1 x i64> %p, %p
301     %2 = bitcast <1 x i64> %1 to <4 x i16>
302     %3 = add <4 x i16> %2, %2
303     ret <4 x i16> %3
304 }
305
306 ; CHECK-LABEL: test_v4i16_v2f32:
307 define <4 x i16> @test_v4i16_v2f32(<2 x float> %p) {
308 ; CHECK: rev64 v{{[0-9]+}}.2s
309 ; CHECK: rev64 v{{[0-9]+}}.4h
310     %1 = fadd <2 x float> %p, %p
311     %2 = bitcast <2 x float> %1 to <4 x i16>
312     %3 = add <4 x i16> %2, %2
313     ret <4 x i16> %3
314 }
315
316 ; CHECK-LABEL: test_v4i16_v2i32:
317 define <4 x i16> @test_v4i16_v2i32(<2 x i32> %p) {
318 ; CHECK: rev64 v{{[0-9]+}}.2s
319 ; CHECK: rev64 v{{[0-9]+}}.4h
320     %1 = add <2 x i32> %p, %p
321     %2 = bitcast <2 x i32> %1 to <4 x i16>
322     %3 = add <4 x i16> %2, %2
323     ret <4 x i16> %3
324 }
325
326 ; CHECK-LABEL: test_v4i16_v8i8:
327 define <4 x i16> @test_v4i16_v8i8(<8 x i8> %p) {
328 ; CHECK: rev64 v{{[0-9]+}}.8b
329 ; CHECK: rev64 v{{[0-9]+}}.4h
330     %1 = add <8 x i8> %p, %p
331     %2 = bitcast <8 x i8> %1 to <4 x i16>
332     %3 = add <4 x i16> %2, %2
333     ret <4 x i16> %3
334 }
335
336 ; CHECK-LABEL: test_v8i8_i64:
337 define <8 x i8> @test_v8i8_i64(i64 %p) {
338 ; CHECK: rev64 v{{[0-9]+}}.8b
339     %1 = add i64 %p, %p
340     %2 = bitcast i64 %1 to <8 x i8>
341     %3 = add <8 x i8> %2, %2
342     ret <8 x i8> %3
343 }
344
345 ; CHECK-LABEL: test_v8i8_f64:
346 define <8 x i8> @test_v8i8_f64(double %p) {
347 ; CHECK: rev64 v{{[0-9]+}}.8b
348     %1 = fadd double %p, %p
349     %2 = bitcast double %1 to <8 x i8>
350     %3 = add <8 x i8> %2, %2
351     ret <8 x i8> %3
352 }
353
354 ; CHECK-LABEL: test_v8i8_v1i64:
355 define <8 x i8> @test_v8i8_v1i64(<1 x i64> %p) {
356 ; CHECK: rev64 v{{[0-9]+}}.8b
357     %1 = add <1 x i64> %p, %p
358     %2 = bitcast <1 x i64> %1 to <8 x i8>
359     %3 = add <8 x i8> %2, %2
360     ret <8 x i8> %3
361 }
362
363 ; CHECK-LABEL: test_v8i8_v2f32:
364 define <8 x i8> @test_v8i8_v2f32(<2 x float> %p) {
365 ; CHECK: rev64 v{{[0-9]+}}.2s
366 ; CHECK: rev64 v{{[0-9]+}}.8b
367     %1 = fadd <2 x float> %p, %p
368     %2 = bitcast <2 x float> %1 to <8 x i8>
369     %3 = add <8 x i8> %2, %2
370     ret <8 x i8> %3
371 }
372
373 ; CHECK-LABEL: test_v8i8_v2i32:
374 define <8 x i8> @test_v8i8_v2i32(<2 x i32> %p) {
375 ; CHECK: rev64 v{{[0-9]+}}.2s
376 ; CHECK: rev64 v{{[0-9]+}}.8b
377     %1 = add <2 x i32> %p, %p
378     %2 = bitcast <2 x i32> %1 to <8 x i8>
379     %3 = add <8 x i8> %2, %2
380     ret <8 x i8> %3
381 }
382
383 ; CHECK-LABEL: test_v8i8_v4i16:
384 define <8 x i8> @test_v8i8_v4i16(<4 x i16> %p) {
385 ; CHECK: rev64 v{{[0-9]+}}.4h
386 ; CHECK: rev64 v{{[0-9]+}}.8b
387     %1 = add <4 x i16> %p, %p
388     %2 = bitcast <4 x i16> %1 to <8 x i8>
389     %3 = add <8 x i8> %2, %2
390     ret <8 x i8> %3
391 }
392
393 ; CHECK-LABEL: test_f128_v2f64:
394 define fp128 @test_f128_v2f64(<2 x double> %p) {
395 ; CHECK: ext
396     %1 = fadd <2 x double> %p, %p
397     %2 = bitcast <2 x double> %1 to fp128
398     %3 = fadd fp128 %2, %2
399     ret fp128 %3
400 }
401
402 ; CHECK-LABEL: test_f128_v2i64:
403 define fp128 @test_f128_v2i64(<2 x i64> %p) {
404 ; CHECK: ext
405     %1 = add <2 x i64> %p, %p
406     %2 = bitcast <2 x i64> %1 to fp128
407     %3 = fadd fp128 %2, %2
408     ret fp128 %3
409 }
410
411 ; CHECK-LABEL: test_f128_v4f32:
412 define fp128 @test_f128_v4f32(<4 x float> %p) {
413 ; CHECK: rev64 v{{[0-9]+}}.4s
414 ; CHECK: ext
415     %1 = fadd <4 x float> %p, %p
416     %2 = bitcast <4 x float> %1 to fp128
417     %3 = fadd fp128 %2, %2
418     ret fp128 %3
419 }
420
421 ; CHECK-LABEL: test_f128_v4i32:
422 define fp128 @test_f128_v4i32(<4 x i32> %p) {
423 ; CHECK: rev64 v{{[0-9]+}}.4s
424 ; CHECK: ext
425     %1 = add <4 x i32> %p, %p
426     %2 = bitcast <4 x i32> %1 to fp128
427     %3 = fadd fp128 %2, %2
428     ret fp128 %3
429 }
430
431 ; CHECK-LABEL: test_f128_v8i16:
432 define fp128 @test_f128_v8i16(<8 x i16> %p) {
433 ; CHECK: rev64 v{{[0-9]+}}.8h
434 ; CHECK: ext
435     %1 = add <8 x i16> %p, %p
436     %2 = bitcast <8 x i16> %1 to fp128
437     %3 = fadd fp128 %2, %2
438     ret fp128 %3
439 }
440
441 ; CHECK-LABEL: test_f128_v16i8:
442 define fp128 @test_f128_v16i8(<16 x i8> %p) {
443 ; CHECK: rev64 v{{[0-9]+}}.16b
444 ; CHECK: ext
445     %1 = add <16 x i8> %p, %p
446     %2 = bitcast <16 x i8> %1 to fp128
447     %3 = fadd fp128 %2, %2
448     ret fp128 %3
449 }
450
451 ; CHECK-LABEL: test_v2f64_f128:
452 define <2 x double> @test_v2f64_f128(fp128 %p) {
453 ; CHECK: ext
454     %1 = fadd fp128 %p, %p
455     %2 = bitcast fp128 %1 to <2 x double>
456     %3 = fadd <2 x double> %2, %2
457     ret <2 x double> %3
458 }
459
460 ; CHECK-LABEL: test_v2f64_v2i64:
461 define <2 x double> @test_v2f64_v2i64(<2 x i64> %p) {
462 ; CHECK: ext
463 ; CHECK: ext
464     %1 = add <2 x i64> %p, %p
465     %2 = bitcast <2 x i64> %1 to <2 x double>
466     %3 = fadd <2 x double> %2, %2
467     ret <2 x double> %3
468 }
469
470 ; CHECK-LABEL: test_v2f64_v4f32:
471 define <2 x double> @test_v2f64_v4f32(<4 x float> %p) {
472 ; CHECK: rev64 v{{[0-9]+}}.4s
473 ; CHECK: ext
474 ; CHECK: ext
475     %1 = fadd <4 x float> %p, %p
476     %2 = bitcast <4 x float> %1 to <2 x double>
477     %3 = fadd <2 x double> %2, %2
478     ret <2 x double> %3
479 }
480
481 ; CHECK-LABEL: test_v2f64_v4i32:
482 define <2 x double> @test_v2f64_v4i32(<4 x i32> %p) {
483 ; CHECK: rev64 v{{[0-9]+}}.4s
484 ; CHECK: ext
485 ; CHECK: ext
486     %1 = add <4 x i32> %p, %p
487     %2 = bitcast <4 x i32> %1 to <2 x double>
488     %3 = fadd <2 x double> %2, %2
489     ret <2 x double> %3
490 }
491
492 ; CHECK-LABEL: test_v2f64_v8i16:
493 define <2 x double> @test_v2f64_v8i16(<8 x i16> %p) {
494 ; CHECK: rev64 v{{[0-9]+}}.8h
495 ; CHECK: ext
496 ; CHECK: ext
497     %1 = add <8 x i16> %p, %p
498     %2 = bitcast <8 x i16> %1 to <2 x double>
499     %3 = fadd <2 x double> %2, %2
500     ret <2 x double> %3
501 }
502
503 ; CHECK-LABEL: test_v2f64_v16i8:
504 define <2 x double> @test_v2f64_v16i8(<16 x i8> %p) {
505 ; CHECK: rev64 v{{[0-9]+}}.16b
506 ; CHECK: ext
507 ; CHECK: ext
508     %1 = add <16 x i8> %p, %p
509     %2 = bitcast <16 x i8> %1 to <2 x double>
510     %3 = fadd <2 x double> %2, %2
511     ret <2 x double> %3
512 }
513
514 ; CHECK-LABEL: test_v2i64_f128:
515 define <2 x i64> @test_v2i64_f128(fp128 %p) {
516 ; CHECK: ext
517     %1 = fadd fp128 %p, %p
518     %2 = bitcast fp128 %1 to <2 x i64>
519     %3 = add <2 x i64> %2, %2
520     ret <2 x i64> %3
521 }
522
523 ; CHECK-LABEL: test_v2i64_v2f64:
524 define <2 x i64> @test_v2i64_v2f64(<2 x double> %p) {
525 ; CHECK: ext
526 ; CHECK: ext
527     %1 = fadd <2 x double> %p, %p
528     %2 = bitcast <2 x double> %1 to <2 x i64>
529     %3 = add <2 x i64> %2, %2
530     ret <2 x i64> %3
531 }
532
533 ; CHECK-LABEL: test_v2i64_v4f32:
534 define <2 x i64> @test_v2i64_v4f32(<4 x float> %p) {
535 ; CHECK: rev64 v{{[0-9]+}}.4s
536 ; CHECK: ext
537 ; CHECK: ext
538     %1 = fadd <4 x float> %p, %p
539     %2 = bitcast <4 x float> %1 to <2 x i64>
540     %3 = add <2 x i64> %2, %2
541     ret <2 x i64> %3
542 }
543
544 ; CHECK-LABEL: test_v2i64_v4i32:
545 define <2 x i64> @test_v2i64_v4i32(<4 x i32> %p) {
546 ; CHECK: rev64 v{{[0-9]+}}.4s
547 ; CHECK: ext
548 ; CHECK: ext
549     %1 = add <4 x i32> %p, %p
550     %2 = bitcast <4 x i32> %1 to <2 x i64>
551     %3 = add <2 x i64> %2, %2
552     ret <2 x i64> %3
553 }
554
555 ; CHECK-LABEL: test_v2i64_v8i16:
556 define <2 x i64> @test_v2i64_v8i16(<8 x i16> %p) {
557 ; CHECK: rev64 v{{[0-9]+}}.8h
558 ; CHECK: ext
559 ; CHECK: ext
560     %1 = add <8 x i16> %p, %p
561     %2 = bitcast <8 x i16> %1 to <2 x i64>
562     %3 = add <2 x i64> %2, %2
563     ret <2 x i64> %3
564 }
565
566 ; CHECK-LABEL: test_v2i64_v16i8:
567 define <2 x i64> @test_v2i64_v16i8(<16 x i8> %p) {
568 ; CHECK: rev64 v{{[0-9]+}}.16b
569 ; CHECK: ext
570 ; CHECK: ext
571     %1 = add <16 x i8> %p, %p
572     %2 = bitcast <16 x i8> %1 to <2 x i64>
573     %3 = add <2 x i64> %2, %2
574     ret <2 x i64> %3
575 }
576
577 ; CHECK-LABEL: test_v4f32_f128:
578 define <4 x float> @test_v4f32_f128(fp128 %p) {
579 ; CHECK: rev64 v{{[0-9]+}}.4s
580 ; CHECK: ext
581     %1 = fadd fp128 %p, %p
582     %2 = bitcast fp128 %1 to <4 x float>
583     %3 = fadd <4 x float> %2, %2
584     ret <4 x float> %3
585 }
586
587 ; CHECK-LABEL: test_v4f32_v2f64:
588 define <4 x float> @test_v4f32_v2f64(<2 x double> %p) {
589 ; CHECK: ext
590 ; CHECK: rev64 v{{[0-9]+}}.4s
591 ; CHECK: ext
592     %1 = fadd <2 x double> %p, %p
593     %2 = bitcast <2 x double> %1 to <4 x float>
594     %3 = fadd <4 x float> %2, %2
595     ret <4 x float> %3
596 }
597
598 ; CHECK-LABEL: test_v4f32_v2i64:
599 define <4 x float> @test_v4f32_v2i64(<2 x i64> %p) {
600 ; CHECK: ext
601 ; CHECK: rev64 v{{[0-9]+}}.4s
602 ; CHECK: ext
603     %1 = add <2 x i64> %p, %p
604     %2 = bitcast <2 x i64> %1 to <4 x float>
605     %3 = fadd <4 x float> %2, %2
606     ret <4 x float> %3
607 }
608
609 ; CHECK-LABEL: test_v4f32_v4i32:
610 define <4 x float> @test_v4f32_v4i32(<4 x i32> %p) {
611 ; CHECK: rev64 v{{[0-9]+}}.4s
612 ; CHECK: ext
613 ; CHECK: rev64 v{{[0-9]+}}.4s
614 ; CHECK: ext
615     %1 = add <4 x i32> %p, %p
616     %2 = bitcast <4 x i32> %1 to <4 x float>
617     %3 = fadd <4 x float> %2, %2
618     ret <4 x float> %3
619 }
620
621 ; CHECK-LABEL: test_v4f32_v8i16:
622 define <4 x float> @test_v4f32_v8i16(<8 x i16> %p) {
623 ; CHECK: rev64 v{{[0-9]+}}.8h
624 ; CHECK: ext
625 ; CHECK: rev64 v{{[0-9]+}}.4s
626 ; CHECK: ext
627     %1 = add <8 x i16> %p, %p
628     %2 = bitcast <8 x i16> %1 to <4 x float>
629     %3 = fadd <4 x float> %2, %2
630     ret <4 x float> %3
631 }
632
633 ; CHECK-LABEL: test_v4f32_v16i8:
634 define <4 x float> @test_v4f32_v16i8(<16 x i8> %p) {
635 ; CHECK: rev64 v{{[0-9]+}}.16b
636 ; CHECK: ext
637 ; CHECK: rev64 v{{[0-9]+}}.4s
638 ; CHECK: ext
639     %1 = add <16 x i8> %p, %p
640     %2 = bitcast <16 x i8> %1 to <4 x float>
641     %3 = fadd <4 x float> %2, %2
642     ret <4 x float> %3
643 }
644
645 ; CHECK-LABEL: test_v4i32_f128:
646 define <4 x i32> @test_v4i32_f128(fp128 %p) {
647 ; CHECK: rev64 v{{[0-9]+}}.4s
648 ; CHECK: ext
649     %1 = fadd fp128 %p, %p
650     %2 = bitcast fp128 %1 to <4 x i32>
651     %3 = add <4 x i32> %2, %2
652     ret <4 x i32> %3
653 }
654
655 ; CHECK-LABEL: test_v4i32_v2f64:
656 define <4 x i32> @test_v4i32_v2f64(<2 x double> %p) {
657 ; CHECK: ext
658 ; CHECK: rev64 v{{[0-9]+}}.4s
659 ; CHECK: ext
660     %1 = fadd <2 x double> %p, %p
661     %2 = bitcast <2 x double> %1 to <4 x i32>
662     %3 = add <4 x i32> %2, %2
663     ret <4 x i32> %3
664 }
665
666 ; CHECK-LABEL: test_v4i32_v2i64:
667 define <4 x i32> @test_v4i32_v2i64(<2 x i64> %p) {
668 ; CHECK: ext
669 ; CHECK: rev64 v{{[0-9]+}}.4s
670 ; CHECK: ext
671     %1 = add <2 x i64> %p, %p
672     %2 = bitcast <2 x i64> %1 to <4 x i32>
673     %3 = add <4 x i32> %2, %2
674     ret <4 x i32> %3
675 }
676
677 ; CHECK-LABEL: test_v4i32_v4f32:
678 define <4 x i32> @test_v4i32_v4f32(<4 x float> %p) {
679 ; CHECK: rev64 v{{[0-9]+}}.4s
680 ; CHECK: ext
681 ; CHECK: rev64 v{{[0-9]+}}.4s
682 ; CHECK: ext
683     %1 = fadd <4 x float> %p, %p
684     %2 = bitcast <4 x float> %1 to <4 x i32>
685     %3 = add <4 x i32> %2, %2
686     ret <4 x i32> %3
687 }
688
689 ; CHECK-LABEL: test_v4i32_v8i16:
690 define <4 x i32> @test_v4i32_v8i16(<8 x i16> %p) {
691 ; CHECK: rev64 v{{[0-9]+}}.8h
692 ; CHECK: ext
693 ; CHECK: rev64 v{{[0-9]+}}.4s
694 ; CHECK: ext
695     %1 = add <8 x i16> %p, %p
696     %2 = bitcast <8 x i16> %1 to <4 x i32>
697     %3 = add <4 x i32> %2, %2
698     ret <4 x i32> %3
699 }
700
701 ; CHECK-LABEL: test_v4i32_v16i8:
702 define <4 x i32> @test_v4i32_v16i8(<16 x i8> %p) {
703 ; CHECK: rev64 v{{[0-9]+}}.16b
704 ; CHECK: ext
705 ; CHECK: rev64 v{{[0-9]+}}.4s
706 ; CHECK: ext
707     %1 = add <16 x i8> %p, %p
708     %2 = bitcast <16 x i8> %1 to <4 x i32>
709     %3 = add <4 x i32> %2, %2
710     ret <4 x i32> %3
711 }
712
713 ; CHECK-LABEL: test_v8i16_f128:
714 define <8 x i16> @test_v8i16_f128(fp128 %p) {
715 ; CHECK: rev64 v{{[0-9]+}}.8h
716 ; CHECK: ext
717     %1 = fadd fp128 %p, %p
718     %2 = bitcast fp128 %1 to <8 x i16>
719     %3 = add <8 x i16> %2, %2
720     ret <8 x i16> %3
721 }
722
723 ; CHECK-LABEL: test_v8i16_v2f64:
724 define <8 x i16> @test_v8i16_v2f64(<2 x double> %p) {
725 ; CHECK: ext
726 ; CHECK: rev64 v{{[0-9]+}}.8h
727 ; CHECK: ext
728     %1 = fadd <2 x double> %p, %p
729     %2 = bitcast <2 x double> %1 to <8 x i16>
730     %3 = add <8 x i16> %2, %2
731     ret <8 x i16> %3
732 }
733
734 ; CHECK-LABEL: test_v8i16_v2i64:
735 define <8 x i16> @test_v8i16_v2i64(<2 x i64> %p) {
736 ; CHECK: ext
737 ; CHECK: rev64 v{{[0-9]+}}.8h
738 ; CHECK: ext
739     %1 = add <2 x i64> %p, %p
740     %2 = bitcast <2 x i64> %1 to <8 x i16>
741     %3 = add <8 x i16> %2, %2
742     ret <8 x i16> %3
743 }
744
745 ; CHECK-LABEL: test_v8i16_v4f32:
746 define <8 x i16> @test_v8i16_v4f32(<4 x float> %p) {
747 ; CHECK: rev64 v{{[0-9]+}}.4s
748 ; CHECK: ext
749 ; CHECK: rev64 v{{[0-9]+}}.8h
750 ; CHECK: ext
751     %1 = fadd <4 x float> %p, %p
752     %2 = bitcast <4 x float> %1 to <8 x i16>
753     %3 = add <8 x i16> %2, %2
754     ret <8 x i16> %3
755 }
756
757 ; CHECK-LABEL: test_v8i16_v4i32:
758 define <8 x i16> @test_v8i16_v4i32(<4 x i32> %p) {
759 ; CHECK: rev64 v{{[0-9]+}}.4s
760 ; CHECK: ext
761 ; CHECK: rev64 v{{[0-9]+}}.8h
762 ; CHECK: ext
763     %1 = add <4 x i32> %p, %p
764     %2 = bitcast <4 x i32> %1 to <8 x i16>
765     %3 = add <8 x i16> %2, %2
766     ret <8 x i16> %3
767 }
768
769 ; CHECK-LABEL: test_v8i16_v16i8:
770 define <8 x i16> @test_v8i16_v16i8(<16 x i8> %p) {
771 ; CHECK: rev64 v{{[0-9]+}}.16b
772 ; CHECK: ext
773 ; CHECK: rev64 v{{[0-9]+}}.8h
774 ; CHECK: ext
775     %1 = add <16 x i8> %p, %p
776     %2 = bitcast <16 x i8> %1 to <8 x i16>
777     %3 = add <8 x i16> %2, %2
778     ret <8 x i16> %3
779 }
780
781 ; CHECK-LABEL: test_v16i8_f128:
782 define <16 x i8> @test_v16i8_f128(fp128 %p) {
783 ; CHECK: rev64 v{{[0-9]+}}.16b
784 ; CHECK: ext
785     %1 = fadd fp128 %p, %p
786     %2 = bitcast fp128 %1 to <16 x i8>
787     %3 = add <16 x i8> %2, %2
788     ret <16 x i8> %3
789 }
790
791 ; CHECK-LABEL: test_v16i8_v2f64:
792 define <16 x i8> @test_v16i8_v2f64(<2 x double> %p) {
793 ; CHECK: ext
794 ; CHECK: rev64 v{{[0-9]+}}.16b
795 ; CHECK: ext
796     %1 = fadd <2 x double> %p, %p
797     %2 = bitcast <2 x double> %1 to <16 x i8>
798     %3 = add <16 x i8> %2, %2
799     ret <16 x i8> %3
800 }
801
802 ; CHECK-LABEL: test_v16i8_v2i64:
803 define <16 x i8> @test_v16i8_v2i64(<2 x i64> %p) {
804 ; CHECK: ext
805 ; CHECK: rev64 v{{[0-9]+}}.16b
806 ; CHECK: ext
807     %1 = add <2 x i64> %p, %p
808     %2 = bitcast <2 x i64> %1 to <16 x i8>
809     %3 = add <16 x i8> %2, %2
810     ret <16 x i8> %3
811 }
812
813 ; CHECK-LABEL: test_v16i8_v4f32:
814 define <16 x i8> @test_v16i8_v4f32(<4 x float> %p) {
815 ; CHECK: rev64 v{{[0-9]+}}.4s
816 ; CHECK: ext
817 ; CHECK: rev64 v{{[0-9]+}}.16b
818 ; CHECK: ext
819     %1 = fadd <4 x float> %p, %p
820     %2 = bitcast <4 x float> %1 to <16 x i8>
821     %3 = add <16 x i8> %2, %2
822     ret <16 x i8> %3
823 }
824
825 ; CHECK-LABEL: test_v16i8_v4i32:
826 define <16 x i8> @test_v16i8_v4i32(<4 x i32> %p) {
827 ; CHECK: rev64 v{{[0-9]+}}.4s
828 ; CHECK: ext
829 ; CHECK: rev64 v{{[0-9]+}}.16b
830 ; CHECK: ext
831     %1 = add <4 x i32> %p, %p
832     %2 = bitcast <4 x i32> %1 to <16 x i8>
833     %3 = add <16 x i8> %2, %2
834     ret <16 x i8> %3
835 }
836
837 ; CHECK-LABEL: test_v16i8_v8i16:
838 define <16 x i8> @test_v16i8_v8i16(<8 x i16> %p) {
839 ; CHECK: rev64 v{{[0-9]+}}.8h
840 ; CHECK: ext
841 ; CHECK: rev64 v{{[0-9]+}}.16b
842 ; CHECK: ext
843     %1 = add <8 x i16> %p, %p
844     %2 = bitcast <8 x i16> %1 to <16 x i8>
845     %3 = add <16 x i8> %2, %2
846     ret <16 x i8> %3
847 }