1 ; RUN: llc -mtriple aarch64_be < %s -aarch64-enable-ldst-opt=false -o - | FileCheck %s
2 ; RUN: llc -mtriple aarch64_be < %s -aarch64-enable-ldst-opt=false -fast-isel=true -O0 -o - | FileCheck %s
4 ; Note, we split the functions in to multiple BBs below to isolate the call
5 ; instruction we want to test, from fast-isel failing to select instructions
8 ; CHECK-LABEL: test_i64_f64:
9 declare i64 @test_i64_f64_helper(double %p)
10 define void @test_i64_f64(ptr %p, ptr %q) {
12 %1 = load double, ptr %p
13 %2 = fadd double %1, %1
14 %3 = call i64 @test_i64_f64_helper(double %2)
22 ; CHECK-LABEL: test_i64_v1i64:
23 declare i64 @test_i64_v1i64_helper(<1 x i64> %p)
24 define void @test_i64_v1i64(ptr %p, ptr %q) {
26 %1 = load <1 x i64>, ptr %p
27 %2 = add <1 x i64> %1, %1
28 %3 = call i64 @test_i64_v1i64_helper(<1 x i64> %2)
36 ; CHECK-LABEL: test_i64_v2f32:
37 declare i64 @test_i64_v2f32_helper(<2 x float> %p)
38 define void @test_i64_v2f32(ptr %p, ptr %q) {
39 ; CHECK: rev64 v{{[0-9]+}}.2s
40 %1 = load <2 x float>, ptr %p
41 %2 = fadd <2 x float> %1, %1
42 %3 = call i64 @test_i64_v2f32_helper(<2 x float> %2)
50 ; CHECK-LABEL: test_i64_v2i32:
51 declare i64 @test_i64_v2i32_helper(<2 x i32> %p)
52 define void @test_i64_v2i32(ptr %p, ptr %q) {
53 ; CHECK: rev64 v{{[0-9]+}}.2s
54 %1 = load <2 x i32>, ptr %p
55 %2 = add <2 x i32> %1, %1
56 %3 = call i64 @test_i64_v2i32_helper(<2 x i32> %2)
64 ; CHECK-LABEL: test_i64_v4i16:
65 declare i64 @test_i64_v4i16_helper(<4 x i16> %p)
66 define void @test_i64_v4i16(ptr %p, ptr %q) {
67 ; CHECK: rev64 v{{[0-9]+}}.4h
68 %1 = load <4 x i16>, ptr %p
69 %2 = add <4 x i16> %1, %1
70 %3 = call i64 @test_i64_v4i16_helper(<4 x i16> %2)
78 ; CHECK-LABEL: test_i64_v8i8:
79 declare i64 @test_i64_v8i8_helper(<8 x i8> %p)
80 define void @test_i64_v8i8(ptr %p, ptr %q) {
81 ; CHECK: rev64 v{{[0-9]+}}.8b
82 %1 = load <8 x i8>, ptr %p
83 %2 = add <8 x i8> %1, %1
84 %3 = call i64 @test_i64_v8i8_helper(<8 x i8> %2)
92 ; CHECK-LABEL: test_f64_i64:
93 declare double @test_f64_i64_helper(i64 %p)
94 define void @test_f64_i64(ptr %p, ptr %q) {
98 %3 = call double @test_f64_i64_helper(i64 %2)
101 %4 = fadd double %3, %3
102 store double %4, ptr %q
106 ; CHECK-LABEL: test_f64_v1i64:
107 declare double @test_f64_v1i64_helper(<1 x i64> %p)
108 define void @test_f64_v1i64(ptr %p, ptr %q) {
110 %1 = load <1 x i64>, ptr %p
111 %2 = add <1 x i64> %1, %1
112 %3 = call double @test_f64_v1i64_helper(<1 x i64> %2)
115 %4 = fadd double %3, %3
116 store double %4, ptr %q
120 ; CHECK-LABEL: test_f64_v2f32:
121 declare double @test_f64_v2f32_helper(<2 x float> %p)
122 define void @test_f64_v2f32(ptr %p, ptr %q) {
123 ; CHECK: rev64 v{{[0-9]+}}.2s
124 %1 = load <2 x float>, ptr %p
125 %2 = fadd <2 x float> %1, %1
126 %3 = call double @test_f64_v2f32_helper(<2 x float> %2)
129 %4 = fadd double %3, %3
130 store double %4, ptr %q
134 ; CHECK-LABEL: test_f64_v2i32:
135 declare double @test_f64_v2i32_helper(<2 x i32> %p)
136 define void @test_f64_v2i32(ptr %p, ptr %q) {
137 ; CHECK: rev64 v{{[0-9]+}}.2s
138 %1 = load <2 x i32>, ptr %p
139 %2 = add <2 x i32> %1, %1
140 %3 = call double @test_f64_v2i32_helper(<2 x i32> %2)
143 %4 = fadd double %3, %3
144 store double %4, ptr %q
148 ; CHECK-LABEL: test_f64_v4i16:
149 declare double @test_f64_v4i16_helper(<4 x i16> %p)
150 define void @test_f64_v4i16(ptr %p, ptr %q) {
151 ; CHECK: rev64 v{{[0-9]+}}.4h
152 %1 = load <4 x i16>, ptr %p
153 %2 = add <4 x i16> %1, %1
154 %3 = call double @test_f64_v4i16_helper(<4 x i16> %2)
157 %4 = fadd double %3, %3
158 store double %4, ptr %q
162 ; CHECK-LABEL: test_f64_v8i8:
163 declare double @test_f64_v8i8_helper(<8 x i8> %p)
164 define void @test_f64_v8i8(ptr %p, ptr %q) {
165 ; CHECK: rev64 v{{[0-9]+}}.8b
166 %1 = load <8 x i8>, ptr %p
167 %2 = add <8 x i8> %1, %1
168 %3 = call double @test_f64_v8i8_helper(<8 x i8> %2)
171 %4 = fadd double %3, %3
172 store double %4, ptr %q
176 ; CHECK-LABEL: test_v1i64_i64:
177 declare <1 x i64> @test_v1i64_i64_helper(i64 %p)
178 define void @test_v1i64_i64(ptr %p, ptr %q) {
180 %1 = load i64, ptr %p
182 %3 = call <1 x i64> @test_v1i64_i64_helper(i64 %2)
185 %4 = add <1 x i64> %3, %3
186 store <1 x i64> %4, ptr %q
190 ; CHECK-LABEL: test_v1i64_f64:
191 declare <1 x i64> @test_v1i64_f64_helper(double %p)
192 define void @test_v1i64_f64(ptr %p, ptr %q) {
194 %1 = load double, ptr %p
195 %2 = fadd double %1, %1
196 %3 = call <1 x i64> @test_v1i64_f64_helper(double %2)
199 %4 = add <1 x i64> %3, %3
200 store <1 x i64> %4, ptr %q
204 ; CHECK-LABEL: test_v1i64_v2f32:
205 declare <1 x i64> @test_v1i64_v2f32_helper(<2 x float> %p)
206 define void @test_v1i64_v2f32(ptr %p, ptr %q) {
207 ; CHECK: rev64 v{{[0-9]+}}.2s
208 %1 = load <2 x float>, ptr %p
209 %2 = fadd <2 x float> %1, %1
210 %3 = call <1 x i64> @test_v1i64_v2f32_helper(<2 x float> %2)
213 %4 = add <1 x i64> %3, %3
214 store <1 x i64> %4, ptr %q
218 ; CHECK-LABEL: test_v1i64_v2i32:
219 declare <1 x i64> @test_v1i64_v2i32_helper(<2 x i32> %p)
220 define void @test_v1i64_v2i32(ptr %p, ptr %q) {
221 ; CHECK: rev64 v{{[0-9]+}}.2s
222 %1 = load <2 x i32>, ptr %p
223 %2 = add <2 x i32> %1, %1
224 %3 = call <1 x i64> @test_v1i64_v2i32_helper(<2 x i32> %2)
227 %4 = add <1 x i64> %3, %3
228 store <1 x i64> %4, ptr %q
232 ; CHECK-LABEL: test_v1i64_v4i16:
233 declare <1 x i64> @test_v1i64_v4i16_helper(<4 x i16> %p)
234 define void @test_v1i64_v4i16(ptr %p, ptr %q) {
235 ; CHECK: rev64 v{{[0-9]+}}.4h
236 %1 = load <4 x i16>, ptr %p
237 %2 = add <4 x i16> %1, %1
238 %3 = call <1 x i64> @test_v1i64_v4i16_helper(<4 x i16> %2)
241 %4 = add <1 x i64> %3, %3
242 store <1 x i64> %4, ptr %q
246 ; CHECK-LABEL: test_v1i64_v8i8:
247 declare <1 x i64> @test_v1i64_v8i8_helper(<8 x i8> %p)
248 define void @test_v1i64_v8i8(ptr %p, ptr %q) {
249 ; CHECK: rev64 v{{[0-9]+}}.8b
250 %1 = load <8 x i8>, ptr %p
251 %2 = add <8 x i8> %1, %1
252 %3 = call <1 x i64> @test_v1i64_v8i8_helper(<8 x i8> %2)
255 %4 = add <1 x i64> %3, %3
256 store <1 x i64> %4, ptr %q
260 ; CHECK-LABEL: test_v2f32_i64:
261 declare <2 x float> @test_v2f32_i64_helper(i64 %p)
262 define void @test_v2f32_i64(ptr %p, ptr %q) {
263 ; CHECK: rev64 v{{[0-9]+}}.2s
264 %1 = load i64, ptr %p
266 %3 = call <2 x float> @test_v2f32_i64_helper(i64 %2)
269 %4 = fadd <2 x float> %3, %3
270 store <2 x float> %4, ptr %q
274 ; CHECK-LABEL: test_v2f32_f64:
275 declare <2 x float> @test_v2f32_f64_helper(double %p)
276 define void @test_v2f32_f64(ptr %p, ptr %q) {
277 ; CHECK: rev64 v{{[0-9]+}}.2s
278 %1 = load double, ptr %p
279 %2 = fadd double %1, %1
280 %3 = call <2 x float> @test_v2f32_f64_helper(double %2)
283 %4 = fadd <2 x float> %3, %3
284 store <2 x float> %4, ptr %q
288 ; CHECK-LABEL: test_v2f32_v1i64:
289 declare <2 x float> @test_v2f32_v1i64_helper(<1 x i64> %p)
290 define void @test_v2f32_v1i64(ptr %p, ptr %q) {
291 ; CHECK: rev64 v{{[0-9]+}}.2s
292 %1 = load <1 x i64>, ptr %p
293 %2 = add <1 x i64> %1, %1
294 %3 = call <2 x float> @test_v2f32_v1i64_helper(<1 x i64> %2)
297 %4 = fadd <2 x float> %3, %3
298 store <2 x float> %4, ptr %q
302 ; CHECK-LABEL: test_v2f32_v2i32:
303 declare <2 x float> @test_v2f32_v2i32_helper(<2 x i32> %p)
304 define void @test_v2f32_v2i32(ptr %p, ptr %q) {
305 ; CHECK: rev64 v{{[0-9]+}}.2s
306 ; CHECK: rev64 v{{[0-9]+}}.2s
307 %1 = load <2 x i32>, ptr %p
308 %2 = add <2 x i32> %1, %1
309 %3 = call <2 x float> @test_v2f32_v2i32_helper(<2 x i32> %2)
312 %4 = fadd <2 x float> %3, %3
313 store <2 x float> %4, ptr %q
317 ; CHECK-LABEL: test_v2f32_v4i16:
318 declare <2 x float> @test_v2f32_v4i16_helper(<4 x i16> %p)
319 define void @test_v2f32_v4i16(ptr %p, ptr %q) {
320 ; CHECK: rev64 v{{[0-9]+}}.4h
321 ; CHECK: rev64 v{{[0-9]+}}.2s
322 %1 = load <4 x i16>, ptr %p
323 %2 = add <4 x i16> %1, %1
324 %3 = call <2 x float> @test_v2f32_v4i16_helper(<4 x i16> %2)
327 %4 = fadd <2 x float> %3, %3
328 store <2 x float> %4, ptr %q
332 ; CHECK-LABEL: test_v2f32_v8i8:
333 declare <2 x float> @test_v2f32_v8i8_helper(<8 x i8> %p)
334 define void @test_v2f32_v8i8(ptr %p, ptr %q) {
335 ; CHECK: rev64 v{{[0-9]+}}.8b
336 ; CHECK: rev64 v{{[0-9]+}}.2s
337 %1 = load <8 x i8>, ptr %p
338 %2 = add <8 x i8> %1, %1
339 %3 = call <2 x float> @test_v2f32_v8i8_helper(<8 x i8> %2)
342 %4 = fadd <2 x float> %3, %3
343 store <2 x float> %4, ptr %q
347 ; CHECK-LABEL: test_v2i32_i64:
348 declare <2 x i32> @test_v2i32_i64_helper(i64 %p)
349 define void @test_v2i32_i64(ptr %p, ptr %q) {
350 ; CHECK: rev64 v{{[0-9]+}}.2s
351 %1 = load i64, ptr %p
353 %3 = call <2 x i32> @test_v2i32_i64_helper(i64 %2)
356 %4 = add <2 x i32> %3, %3
357 store <2 x i32> %4, ptr %q
361 ; CHECK-LABEL: test_v2i32_f64:
362 declare <2 x i32> @test_v2i32_f64_helper(double %p)
363 define void @test_v2i32_f64(ptr %p, ptr %q) {
364 ; CHECK: rev64 v{{[0-9]+}}.2s
365 %1 = load double, ptr %p
366 %2 = fadd double %1, %1
367 %3 = call <2 x i32> @test_v2i32_f64_helper(double %2)
370 %4 = add <2 x i32> %3, %3
371 store <2 x i32> %4, ptr %q
375 ; CHECK-LABEL: test_v2i32_v1i64:
376 declare <2 x i32> @test_v2i32_v1i64_helper(<1 x i64> %p)
377 define void @test_v2i32_v1i64(ptr %p, ptr %q) {
378 ; CHECK: rev64 v{{[0-9]+}}.2s
379 %1 = load <1 x i64>, ptr %p
380 %2 = add <1 x i64> %1, %1
381 %3 = call <2 x i32> @test_v2i32_v1i64_helper(<1 x i64> %2)
384 %4 = add <2 x i32> %3, %3
385 store <2 x i32> %4, ptr %q
389 ; CHECK-LABEL: test_v2i32_v2f32:
390 declare <2 x i32> @test_v2i32_v2f32_helper(<2 x float> %p)
391 define void @test_v2i32_v2f32(ptr %p, ptr %q) {
392 ; CHECK: rev64 v{{[0-9]+}}.2s
393 ; CHECK: rev64 v{{[0-9]+}}.2s
394 %1 = load <2 x float>, ptr %p
395 %2 = fadd <2 x float> %1, %1
396 %3 = call <2 x i32> @test_v2i32_v2f32_helper(<2 x float> %2)
399 %4 = add <2 x i32> %3, %3
400 store <2 x i32> %4, ptr %q
404 ; CHECK-LABEL: test_v2i32_v4i16:
405 declare <2 x i32> @test_v2i32_v4i16_helper(<4 x i16> %p)
406 define void @test_v2i32_v4i16(ptr %p, ptr %q) {
407 ; CHECK: rev64 v{{[0-9]+}}.4h
408 ; CHECK: rev64 v{{[0-9]+}}.2s
409 %1 = load <4 x i16>, ptr %p
410 %2 = add <4 x i16> %1, %1
411 %3 = call <2 x i32> @test_v2i32_v4i16_helper(<4 x i16> %2)
414 %4 = add <2 x i32> %3, %3
415 store <2 x i32> %4, ptr %q
419 ; CHECK-LABEL: test_v2i32_v8i8:
420 declare <2 x i32> @test_v2i32_v8i8_helper(<8 x i8> %p)
421 define void @test_v2i32_v8i8(ptr %p, ptr %q) {
422 ; CHECK: rev64 v{{[0-9]+}}.8b
423 ; CHECK: rev64 v{{[0-9]+}}.2s
424 %1 = load <8 x i8>, ptr %p
425 %2 = add <8 x i8> %1, %1
426 %3 = call <2 x i32> @test_v2i32_v8i8_helper(<8 x i8> %2)
429 %4 = add <2 x i32> %3, %3
430 store <2 x i32> %4, ptr %q
434 ; CHECK-LABEL: test_v4i16_i64:
435 declare <4 x i16> @test_v4i16_i64_helper(i64 %p)
436 define void @test_v4i16_i64(ptr %p, ptr %q) {
437 ; CHECK: rev64 v{{[0-9]+}}.4h
438 %1 = load i64, ptr %p
440 %3 = call <4 x i16> @test_v4i16_i64_helper(i64 %2)
443 %4 = add <4 x i16> %3, %3
444 store <4 x i16> %4, ptr %q
448 ; CHECK-LABEL: test_v4i16_f64:
449 declare <4 x i16> @test_v4i16_f64_helper(double %p)
450 define void @test_v4i16_f64(ptr %p, ptr %q) {
451 ; CHECK: rev64 v{{[0-9]+}}.4h
452 %1 = load double, ptr %p
453 %2 = fadd double %1, %1
454 %3 = call <4 x i16> @test_v4i16_f64_helper(double %2)
457 %4 = add <4 x i16> %3, %3
458 store <4 x i16> %4, ptr %q
462 ; CHECK-LABEL: test_v4i16_v1i64:
463 declare <4 x i16> @test_v4i16_v1i64_helper(<1 x i64> %p)
464 define void @test_v4i16_v1i64(ptr %p, ptr %q) {
465 ; CHECK: rev64 v{{[0-9]+}}.4h
466 %1 = load <1 x i64>, ptr %p
467 %2 = add <1 x i64> %1, %1
468 %3 = call <4 x i16> @test_v4i16_v1i64_helper(<1 x i64> %2)
471 %4 = add <4 x i16> %3, %3
472 store <4 x i16> %4, ptr %q
476 ; CHECK-LABEL: test_v4i16_v2f32:
477 declare <4 x i16> @test_v4i16_v2f32_helper(<2 x float> %p)
478 define void @test_v4i16_v2f32(ptr %p, ptr %q) {
479 ; CHECK: rev64 v{{[0-9]+}}.2s
480 ; CHECK: rev64 v{{[0-9]+}}.4h
481 %1 = load <2 x float>, ptr %p
482 %2 = fadd <2 x float> %1, %1
483 %3 = call <4 x i16> @test_v4i16_v2f32_helper(<2 x float> %2)
486 %4 = add <4 x i16> %3, %3
487 store <4 x i16> %4, ptr %q
491 ; CHECK-LABEL: test_v4i16_v2i32:
492 declare <4 x i16> @test_v4i16_v2i32_helper(<2 x i32> %p)
493 define void @test_v4i16_v2i32(ptr %p, ptr %q) {
494 ; CHECK: rev64 v{{[0-9]+}}.2s
495 ; CHECK: rev64 v{{[0-9]+}}.4h
496 %1 = load <2 x i32>, ptr %p
497 %2 = add <2 x i32> %1, %1
498 %3 = call <4 x i16> @test_v4i16_v2i32_helper(<2 x i32> %2)
501 %4 = add <4 x i16> %3, %3
502 store <4 x i16> %4, ptr %q
506 ; CHECK-LABEL: test_v4i16_v8i8:
507 declare <4 x i16> @test_v4i16_v8i8_helper(<8 x i8> %p)
508 define void @test_v4i16_v8i8(ptr %p, ptr %q) {
509 ; CHECK: rev64 v{{[0-9]+}}.8b
510 ; CHECK: rev64 v{{[0-9]+}}.4h
511 %1 = load <8 x i8>, ptr %p
512 %2 = add <8 x i8> %1, %1
513 %3 = call <4 x i16> @test_v4i16_v8i8_helper(<8 x i8> %2)
516 %4 = add <4 x i16> %3, %3
517 store <4 x i16> %4, ptr %q
521 ; CHECK-LABEL: test_v8i8_i64:
522 declare <8 x i8> @test_v8i8_i64_helper(i64 %p)
523 define void @test_v8i8_i64(ptr %p, ptr %q) {
524 ; CHECK: rev64 v{{[0-9]+}}.8b
525 %1 = load i64, ptr %p
527 %3 = call <8 x i8> @test_v8i8_i64_helper(i64 %2)
530 %4 = add <8 x i8> %3, %3
531 store <8 x i8> %4, ptr %q
535 ; CHECK-LABEL: test_v8i8_f64:
536 declare <8 x i8> @test_v8i8_f64_helper(double %p)
537 define void @test_v8i8_f64(ptr %p, ptr %q) {
538 ; CHECK: rev64 v{{[0-9]+}}.8b
539 %1 = load double, ptr %p
540 %2 = fadd double %1, %1
541 %3 = call <8 x i8> @test_v8i8_f64_helper(double %2)
544 %4 = add <8 x i8> %3, %3
545 store <8 x i8> %4, ptr %q
549 ; CHECK-LABEL: test_v8i8_v1i64:
550 declare <8 x i8> @test_v8i8_v1i64_helper(<1 x i64> %p)
551 define void @test_v8i8_v1i64(ptr %p, ptr %q) {
552 ; CHECK: rev64 v{{[0-9]+}}.8b
553 %1 = load <1 x i64>, ptr %p
554 %2 = add <1 x i64> %1, %1
555 %3 = call <8 x i8> @test_v8i8_v1i64_helper(<1 x i64> %2)
558 %4 = add <8 x i8> %3, %3
559 store <8 x i8> %4, ptr %q
563 ; CHECK-LABEL: test_v8i8_v2f32:
564 declare <8 x i8> @test_v8i8_v2f32_helper(<2 x float> %p)
565 define void @test_v8i8_v2f32(ptr %p, ptr %q) {
566 ; CHECK: rev64 v{{[0-9]+}}.2s
567 ; CHECK: rev64 v{{[0-9]+}}.8b
568 %1 = load <2 x float>, ptr %p
569 %2 = fadd <2 x float> %1, %1
570 %3 = call <8 x i8> @test_v8i8_v2f32_helper(<2 x float> %2)
573 %4 = add <8 x i8> %3, %3
574 store <8 x i8> %4, ptr %q
578 ; CHECK-LABEL: test_v8i8_v2i32:
579 declare <8 x i8> @test_v8i8_v2i32_helper(<2 x i32> %p)
580 define void @test_v8i8_v2i32(ptr %p, ptr %q) {
581 ; CHECK: rev64 v{{[0-9]+}}.2s
582 ; CHECK: rev64 v{{[0-9]+}}.8b
583 %1 = load <2 x i32>, ptr %p
584 %2 = add <2 x i32> %1, %1
585 %3 = call <8 x i8> @test_v8i8_v2i32_helper(<2 x i32> %2)
588 %4 = add <8 x i8> %3, %3
589 store <8 x i8> %4, ptr %q
593 ; CHECK-LABEL: test_v8i8_v4i16:
594 declare <8 x i8> @test_v8i8_v4i16_helper(<4 x i16> %p)
595 define void @test_v8i8_v4i16(ptr %p, ptr %q) {
596 ; CHECK: rev64 v{{[0-9]+}}.4h
597 ; CHECK: rev64 v{{[0-9]+}}.8b
598 %1 = load <4 x i16>, ptr %p
599 %2 = add <4 x i16> %1, %1
600 %3 = call <8 x i8> @test_v8i8_v4i16_helper(<4 x i16> %2)
603 %4 = add <8 x i8> %3, %3
604 store <8 x i8> %4, ptr %q
608 ; CHECK-LABEL: test_f128_v2f64:
609 declare fp128 @test_f128_v2f64_helper(<2 x double> %p)
610 define void @test_f128_v2f64(ptr %p, ptr %q) {
612 %1 = load <2 x double>, ptr %p
613 %2 = fadd <2 x double> %1, %1
614 %3 = call fp128 @test_f128_v2f64_helper(<2 x double> %2)
617 %4 = fadd fp128 %3, %3
618 store fp128 %4, ptr %q
622 ; CHECK-LABEL: test_f128_v2i64:
623 declare fp128 @test_f128_v2i64_helper(<2 x i64> %p)
624 define void @test_f128_v2i64(ptr %p, ptr %q) {
626 %1 = load <2 x i64>, ptr %p
627 %2 = add <2 x i64> %1, %1
628 %3 = call fp128 @test_f128_v2i64_helper(<2 x i64> %2)
631 %4 = fadd fp128 %3, %3
632 store fp128 %4, ptr %q
636 ; CHECK-LABEL: test_f128_v4f32:
637 declare fp128 @test_f128_v4f32_helper(<4 x float> %p)
638 define void @test_f128_v4f32(ptr %p, ptr %q) {
639 ; CHECK: rev64 v{{[0-9]+}}.4s
641 %1 = load <4 x float>, ptr %p
642 %2 = fadd <4 x float> %1, %1
643 %3 = call fp128 @test_f128_v4f32_helper(<4 x float> %2)
646 %4 = fadd fp128 %3, %3
647 store fp128 %4, ptr %q
651 ; CHECK-LABEL: test_f128_v4i32:
652 declare fp128 @test_f128_v4i32_helper(<4 x i32> %p)
653 define void @test_f128_v4i32(ptr %p, ptr %q) {
654 ; CHECK: rev64 v{{[0-9]+}}.4s
656 %1 = load <4 x i32>, ptr %p
657 %2 = add <4 x i32> %1, %1
658 %3 = call fp128 @test_f128_v4i32_helper(<4 x i32> %2)
661 %4 = fadd fp128 %3, %3
662 store fp128 %4, ptr %q
666 ; CHECK-LABEL: test_f128_v8i16:
667 declare fp128 @test_f128_v8i16_helper(<8 x i16> %p)
668 define void @test_f128_v8i16(ptr %p, ptr %q) {
669 ; CHECK: rev64 v{{[0-9]+}}.8h
671 %1 = load <8 x i16>, ptr %p
672 %2 = add <8 x i16> %1, %1
673 %3 = call fp128 @test_f128_v8i16_helper(<8 x i16> %2)
676 %4 = fadd fp128 %3, %3
677 store fp128 %4, ptr %q
681 ; CHECK-LABEL: test_f128_v16i8:
682 declare fp128 @test_f128_v16i8_helper(<16 x i8> %p)
683 define void @test_f128_v16i8(ptr %p, ptr %q) {
684 ; CHECK: rev64 v{{[0-9]+}}.16b
686 %1 = load <16 x i8>, ptr %p
687 %2 = add <16 x i8> %1, %1
688 %3 = call fp128 @test_f128_v16i8_helper(<16 x i8> %2)
691 %4 = fadd fp128 %3, %3
692 store fp128 %4, ptr %q
696 ; CHECK-LABEL: test_v2f64_f128:
697 declare <2 x double> @test_v2f64_f128_helper(fp128 %p)
698 define void @test_v2f64_f128(ptr %p, ptr %q) {
700 %1 = load fp128, ptr %p
701 %2 = fadd fp128 %1, %1
702 %3 = call <2 x double> @test_v2f64_f128_helper(fp128 %2)
705 %4 = fadd <2 x double> %3, %3
706 store <2 x double> %4, ptr %q
710 ; CHECK-LABEL: test_v2f64_v2i64:
711 declare <2 x double> @test_v2f64_v2i64_helper(<2 x i64> %p)
712 define void @test_v2f64_v2i64(ptr %p, ptr %q) {
715 %1 = load <2 x i64>, ptr %p
716 %2 = add <2 x i64> %1, %1
717 %3 = call <2 x double> @test_v2f64_v2i64_helper(<2 x i64> %2)
720 %4 = fadd <2 x double> %3, %3
721 store <2 x double> %4, ptr %q
725 ; CHECK-LABEL: test_v2f64_v4f32:
726 declare <2 x double> @test_v2f64_v4f32_helper(<4 x float> %p)
727 define void @test_v2f64_v4f32(ptr %p, ptr %q) {
728 ; CHECK: rev64 v{{[0-9]+}}.4s
731 %1 = load <4 x float>, ptr %p
732 %2 = fadd <4 x float> %1, %1
733 %3 = call <2 x double> @test_v2f64_v4f32_helper(<4 x float> %2)
736 %4 = fadd <2 x double> %3, %3
737 store <2 x double> %4, ptr %q
741 ; CHECK-LABEL: test_v2f64_v4i32:
742 declare <2 x double> @test_v2f64_v4i32_helper(<4 x i32> %p)
743 define void @test_v2f64_v4i32(ptr %p, ptr %q) {
744 ; CHECK: rev64 v{{[0-9]+}}.4s
747 %1 = load <4 x i32>, ptr %p
748 %2 = add <4 x i32> %1, %1
749 %3 = call <2 x double> @test_v2f64_v4i32_helper(<4 x i32> %2)
752 %4 = fadd <2 x double> %3, %3
753 store <2 x double> %4, ptr %q
757 ; CHECK-LABEL: test_v2f64_v8i16:
758 declare <2 x double> @test_v2f64_v8i16_helper(<8 x i16> %p)
759 define void @test_v2f64_v8i16(ptr %p, ptr %q) {
760 ; CHECK: rev64 v{{[0-9]+}}.8h
763 %1 = load <8 x i16>, ptr %p
764 %2 = add <8 x i16> %1, %1
765 %3 = call <2 x double> @test_v2f64_v8i16_helper(<8 x i16> %2)
768 %4 = fadd <2 x double> %3, %3
769 store <2 x double> %4, ptr %q
773 ; CHECK-LABEL: test_v2f64_v16i8:
774 declare <2 x double> @test_v2f64_v16i8_helper(<16 x i8> %p)
775 define void @test_v2f64_v16i8(ptr %p, ptr %q) {
776 ; CHECK: rev64 v{{[0-9]+}}.16b
779 %1 = load <16 x i8>, ptr %p
780 %2 = add <16 x i8> %1, %1
781 %3 = call <2 x double> @test_v2f64_v16i8_helper(<16 x i8> %2)
784 %4 = fadd <2 x double> %3, %3
785 store <2 x double> %4, ptr %q
789 ; CHECK-LABEL: test_v2i64_f128:
790 declare <2 x i64> @test_v2i64_f128_helper(fp128 %p)
791 define void @test_v2i64_f128(ptr %p, ptr %q) {
793 %1 = load fp128, ptr %p
794 %2 = fadd fp128 %1, %1
795 %3 = call <2 x i64> @test_v2i64_f128_helper(fp128 %2)
798 %4 = add <2 x i64> %3, %3
799 store <2 x i64> %4, ptr %q
803 ; CHECK-LABEL: test_v2i64_v2f64:
804 declare <2 x i64> @test_v2i64_v2f64_helper(<2 x double> %p)
805 define void @test_v2i64_v2f64(ptr %p, ptr %q) {
808 %1 = load <2 x double>, ptr %p
809 %2 = fadd <2 x double> %1, %1
810 %3 = call <2 x i64> @test_v2i64_v2f64_helper(<2 x double> %2)
813 %4 = add <2 x i64> %3, %3
814 store <2 x i64> %4, ptr %q
818 ; CHECK-LABEL: test_v2i64_v4f32:
819 declare <2 x i64> @test_v2i64_v4f32_helper(<4 x float> %p)
820 define void @test_v2i64_v4f32(ptr %p, ptr %q) {
821 ; CHECK: rev64 v{{[0-9]+}}.4s
824 %1 = load <4 x float>, ptr %p
825 %2 = fadd <4 x float> %1, %1
826 %3 = call <2 x i64> @test_v2i64_v4f32_helper(<4 x float> %2)
829 %4 = add <2 x i64> %3, %3
830 store <2 x i64> %4, ptr %q
834 ; CHECK-LABEL: test_v2i64_v4i32:
835 declare <2 x i64> @test_v2i64_v4i32_helper(<4 x i32> %p)
836 define void @test_v2i64_v4i32(ptr %p, ptr %q) {
837 ; CHECK: rev64 v{{[0-9]+}}.4s
840 %1 = load <4 x i32>, ptr %p
841 %2 = add <4 x i32> %1, %1
842 %3 = call <2 x i64> @test_v2i64_v4i32_helper(<4 x i32> %2)
845 %4 = add <2 x i64> %3, %3
846 store <2 x i64> %4, ptr %q
850 ; CHECK-LABEL: test_v2i64_v8i16:
851 declare <2 x i64> @test_v2i64_v8i16_helper(<8 x i16> %p)
852 define void @test_v2i64_v8i16(ptr %p, ptr %q) {
853 ; CHECK: rev64 v{{[0-9]+}}.8h
856 %1 = load <8 x i16>, ptr %p
857 %2 = add <8 x i16> %1, %1
858 %3 = call <2 x i64> @test_v2i64_v8i16_helper(<8 x i16> %2)
861 %4 = add <2 x i64> %3, %3
862 store <2 x i64> %4, ptr %q
866 ; CHECK-LABEL: test_v2i64_v16i8:
867 declare <2 x i64> @test_v2i64_v16i8_helper(<16 x i8> %p)
868 define void @test_v2i64_v16i8(ptr %p, ptr %q) {
869 ; CHECK: rev64 v{{[0-9]+}}.16b
872 %1 = load <16 x i8>, ptr %p
873 %2 = add <16 x i8> %1, %1
874 %3 = call <2 x i64> @test_v2i64_v16i8_helper(<16 x i8> %2)
877 %4 = add <2 x i64> %3, %3
878 store <2 x i64> %4, ptr %q
882 ; CHECK-LABEL: test_v4f32_f128:
883 declare <4 x float> @test_v4f32_f128_helper(fp128 %p)
884 define void @test_v4f32_f128(ptr %p, ptr %q) {
885 ; CHECK: rev64 v{{[0-9]+}}.4s
887 %1 = load fp128, ptr %p
888 %2 = fadd fp128 %1, %1
889 %3 = call <4 x float> @test_v4f32_f128_helper(fp128 %2)
892 %4 = fadd <4 x float> %3, %3
893 store <4 x float> %4, ptr %q
897 ; CHECK-LABEL: test_v4f32_v2f64:
898 declare <4 x float> @test_v4f32_v2f64_helper(<2 x double> %p)
899 define void @test_v4f32_v2f64(ptr %p, ptr %q) {
901 ; CHECK: rev64 v{{[0-9]+}}.4s
903 %1 = load <2 x double>, ptr %p
904 %2 = fadd <2 x double> %1, %1
905 %3 = call <4 x float> @test_v4f32_v2f64_helper(<2 x double> %2)
908 %4 = fadd <4 x float> %3, %3
909 store <4 x float> %4, ptr %q
913 ; CHECK-LABEL: test_v4f32_v2i64:
914 declare <4 x float> @test_v4f32_v2i64_helper(<2 x i64> %p)
915 define void @test_v4f32_v2i64(ptr %p, ptr %q) {
917 ; CHECK: rev64 v{{[0-9]+}}.4s
919 %1 = load <2 x i64>, ptr %p
920 %2 = add <2 x i64> %1, %1
921 %3 = call <4 x float> @test_v4f32_v2i64_helper(<2 x i64> %2)
924 %4 = fadd <4 x float> %3, %3
925 store <4 x float> %4, ptr %q
929 ; CHECK-LABEL: test_v4f32_v4i32:
930 declare <4 x float> @test_v4f32_v4i32_helper(<4 x i32> %p)
931 define void @test_v4f32_v4i32(ptr %p, ptr %q) {
932 ; CHECK: rev64 v{{[0-9]+}}.4s
934 ; CHECK: rev64 v{{[0-9]+}}.4s
936 %1 = load <4 x i32>, ptr %p
937 %2 = add <4 x i32> %1, %1
938 %3 = call <4 x float> @test_v4f32_v4i32_helper(<4 x i32> %2)
941 %4 = fadd <4 x float> %3, %3
942 store <4 x float> %4, ptr %q
946 ; CHECK-LABEL: test_v4f32_v8i16:
947 declare <4 x float> @test_v4f32_v8i16_helper(<8 x i16> %p)
948 define void @test_v4f32_v8i16(ptr %p, ptr %q) {
949 ; CHECK: rev64 v{{[0-9]+}}.8h
951 ; CHECK: rev64 v{{[0-9]+}}.4s
953 %1 = load <8 x i16>, ptr %p
954 %2 = add <8 x i16> %1, %1
955 %3 = call <4 x float> @test_v4f32_v8i16_helper(<8 x i16> %2)
958 %4 = fadd <4 x float> %3, %3
959 store <4 x float> %4, ptr %q
963 ; CHECK-LABEL: test_v4f32_v16i8:
964 declare <4 x float> @test_v4f32_v16i8_helper(<16 x i8> %p)
965 define void @test_v4f32_v16i8(ptr %p, ptr %q) {
966 ; CHECK: rev64 v{{[0-9]+}}.16b
968 ; CHECK: rev64 v{{[0-9]+}}.4s
970 %1 = load <16 x i8>, ptr %p
971 %2 = add <16 x i8> %1, %1
972 %3 = call <4 x float> @test_v4f32_v16i8_helper(<16 x i8> %2)
975 %4 = fadd <4 x float> %3, %3
976 store <4 x float> %4, ptr %q
980 ; CHECK-LABEL: test_v4i32_f128:
981 declare <4 x i32> @test_v4i32_f128_helper(fp128 %p)
982 define void @test_v4i32_f128(ptr %p, ptr %q) {
983 ; CHECK: rev64 v{{[0-9]+}}.4s
985 %1 = load fp128, ptr %p
986 %2 = fadd fp128 %1, %1
987 %3 = call <4 x i32> @test_v4i32_f128_helper(fp128 %2)
990 %4 = add <4 x i32> %3, %3
991 store <4 x i32> %4, ptr %q
995 ; CHECK-LABEL: test_v4i32_v2f64:
996 declare <4 x i32> @test_v4i32_v2f64_helper(<2 x double> %p)
997 define void @test_v4i32_v2f64(ptr %p, ptr %q) {
999 ; CHECK: rev64 v{{[0-9]+}}.4s
1001 %1 = load <2 x double>, ptr %p
1002 %2 = fadd <2 x double> %1, %1
1003 %3 = call <4 x i32> @test_v4i32_v2f64_helper(<2 x double> %2)
1006 %4 = add <4 x i32> %3, %3
1007 store <4 x i32> %4, ptr %q
1011 ; CHECK-LABEL: test_v4i32_v2i64:
1012 declare <4 x i32> @test_v4i32_v2i64_helper(<2 x i64> %p)
1013 define void @test_v4i32_v2i64(ptr %p, ptr %q) {
1015 ; CHECK: rev64 v{{[0-9]+}}.4s
1017 %1 = load <2 x i64>, ptr %p
1018 %2 = add <2 x i64> %1, %1
1019 %3 = call <4 x i32> @test_v4i32_v2i64_helper(<2 x i64> %2)
1022 %4 = add <4 x i32> %3, %3
1023 store <4 x i32> %4, ptr %q
1027 ; CHECK-LABEL: test_v4i32_v4f32:
1028 declare <4 x i32> @test_v4i32_v4f32_helper(<4 x float> %p)
1029 define void @test_v4i32_v4f32(ptr %p, ptr %q) {
1030 ; CHECK: rev64 v{{[0-9]+}}.4s
1032 ; CHECK: rev64 v{{[0-9]+}}.4s
1034 %1 = load <4 x float>, ptr %p
1035 %2 = fadd <4 x float> %1, %1
1036 %3 = call <4 x i32> @test_v4i32_v4f32_helper(<4 x float> %2)
1039 %4 = add <4 x i32> %3, %3
1040 store <4 x i32> %4, ptr %q
1044 ; CHECK-LABEL: test_v4i32_v8i16:
1045 declare <4 x i32> @test_v4i32_v8i16_helper(<8 x i16> %p)
1046 define void @test_v4i32_v8i16(ptr %p, ptr %q) {
1047 ; CHECK: rev64 v{{[0-9]+}}.8h
1049 ; CHECK: rev64 v{{[0-9]+}}.4s
1051 %1 = load <8 x i16>, ptr %p
1052 %2 = add <8 x i16> %1, %1
1053 %3 = call <4 x i32> @test_v4i32_v8i16_helper(<8 x i16> %2)
1056 %4 = add <4 x i32> %3, %3
1057 store <4 x i32> %4, ptr %q
1061 ; CHECK-LABEL: test_v4i32_v16i8:
1062 declare <4 x i32> @test_v4i32_v16i8_helper(<16 x i8> %p)
1063 define void @test_v4i32_v16i8(ptr %p, ptr %q) {
1064 ; CHECK: rev64 v{{[0-9]+}}.16b
1066 ; CHECK: rev64 v{{[0-9]+}}.4s
1068 %1 = load <16 x i8>, ptr %p
1069 %2 = add <16 x i8> %1, %1
1070 %3 = call <4 x i32> @test_v4i32_v16i8_helper(<16 x i8> %2)
1073 %4 = add <4 x i32> %3, %3
1074 store <4 x i32> %4, ptr %q
1078 ; CHECK-LABEL: test_v8i16_f128:
1079 declare <8 x i16> @test_v8i16_f128_helper(fp128 %p)
1080 define void @test_v8i16_f128(ptr %p, ptr %q) {
1081 ; CHECK: rev64 v{{[0-9]+}}.8h
1083 %1 = load fp128, ptr %p
1084 %2 = fadd fp128 %1, %1
1085 %3 = call <8 x i16> @test_v8i16_f128_helper(fp128 %2)
1088 %4 = add <8 x i16> %3, %3
1089 store <8 x i16> %4, ptr %q
1093 ; CHECK-LABEL: test_v8i16_v2f64:
1094 declare <8 x i16> @test_v8i16_v2f64_helper(<2 x double> %p)
1095 define void @test_v8i16_v2f64(ptr %p, ptr %q) {
1097 ; CHECK: rev64 v{{[0-9]+}}.8h
1099 %1 = load <2 x double>, ptr %p
1100 %2 = fadd <2 x double> %1, %1
1101 %3 = call <8 x i16> @test_v8i16_v2f64_helper(<2 x double> %2)
1104 %4 = add <8 x i16> %3, %3
1105 store <8 x i16> %4, ptr %q
1109 ; CHECK-LABEL: test_v8i16_v2i64:
1110 declare <8 x i16> @test_v8i16_v2i64_helper(<2 x i64> %p)
1111 define void @test_v8i16_v2i64(ptr %p, ptr %q) {
1113 ; CHECK: rev64 v{{[0-9]+}}.8h
1115 %1 = load <2 x i64>, ptr %p
1116 %2 = add <2 x i64> %1, %1
1117 %3 = call <8 x i16> @test_v8i16_v2i64_helper(<2 x i64> %2)
1120 %4 = add <8 x i16> %3, %3
1121 store <8 x i16> %4, ptr %q
1125 ; CHECK-LABEL: test_v8i16_v4f32:
1126 declare <8 x i16> @test_v8i16_v4f32_helper(<4 x float> %p)
1127 define void @test_v8i16_v4f32(ptr %p, ptr %q) {
1128 ; CHECK: rev64 v{{[0-9]+}}.4s
1130 ; CHECK: rev64 v{{[0-9]+}}.8h
1132 %1 = load <4 x float>, ptr %p
1133 %2 = fadd <4 x float> %1, %1
1134 %3 = call <8 x i16> @test_v8i16_v4f32_helper(<4 x float> %2)
1137 %4 = add <8 x i16> %3, %3
1138 store <8 x i16> %4, ptr %q
1142 ; CHECK-LABEL: test_v8i16_v4i32:
1143 declare <8 x i16> @test_v8i16_v4i32_helper(<4 x i32> %p)
1144 define void @test_v8i16_v4i32(ptr %p, ptr %q) {
1145 ; CHECK: rev64 v{{[0-9]+}}.4s
1147 ; CHECK: rev64 v{{[0-9]+}}.8h
1149 %1 = load <4 x i32>, ptr %p
1150 %2 = add <4 x i32> %1, %1
1151 %3 = call <8 x i16> @test_v8i16_v4i32_helper(<4 x i32> %2)
1154 %4 = add <8 x i16> %3, %3
1155 store <8 x i16> %4, ptr %q
1159 ; CHECK-LABEL: test_v8i16_v16i8:
1160 declare <8 x i16> @test_v8i16_v16i8_helper(<16 x i8> %p)
1161 define void @test_v8i16_v16i8(ptr %p, ptr %q) {
1162 ; CHECK: rev64 v{{[0-9]+}}.16b
1164 ; CHECK: rev64 v{{[0-9]+}}.8h
1166 %1 = load <16 x i8>, ptr %p
1167 %2 = add <16 x i8> %1, %1
1168 %3 = call <8 x i16> @test_v8i16_v16i8_helper(<16 x i8> %2)
1171 %4 = add <8 x i16> %3, %3
1172 store <8 x i16> %4, ptr %q
1176 ; CHECK-LABEL: test_v16i8_f128:
1177 declare <16 x i8> @test_v16i8_f128_helper(fp128 %p)
1178 define void @test_v16i8_f128(ptr %p, ptr %q) {
1179 ; CHECK: rev64 v{{[0-9]+}}.16b
1181 %1 = load fp128, ptr %p
1182 %2 = fadd fp128 %1, %1
1183 %3 = call <16 x i8> @test_v16i8_f128_helper(fp128 %2)
1186 %4 = add <16 x i8> %3, %3
1187 store <16 x i8> %4, ptr %q
1191 ; CHECK-LABEL: test_v16i8_v2f64:
1192 declare <16 x i8> @test_v16i8_v2f64_helper(<2 x double> %p)
1193 define void @test_v16i8_v2f64(ptr %p, ptr %q) {
1195 ; CHECK: rev64 v{{[0-9]+}}.16b
1197 %1 = load <2 x double>, ptr %p
1198 %2 = fadd <2 x double> %1, %1
1199 %3 = call <16 x i8> @test_v16i8_v2f64_helper(<2 x double> %2)
1202 %4 = add <16 x i8> %3, %3
1203 store <16 x i8> %4, ptr %q
1207 ; CHECK-LABEL: test_v16i8_v2i64:
1208 declare <16 x i8> @test_v16i8_v2i64_helper(<2 x i64> %p)
1209 define void @test_v16i8_v2i64(ptr %p, ptr %q) {
1211 ; CHECK: rev64 v{{[0-9]+}}.16b
1213 %1 = load <2 x i64>, ptr %p
1214 %2 = add <2 x i64> %1, %1
1215 %3 = call <16 x i8> @test_v16i8_v2i64_helper(<2 x i64> %2)
1218 %4 = add <16 x i8> %3, %3
1219 store <16 x i8> %4, ptr %q
1223 ; CHECK-LABEL: test_v16i8_v4f32:
1224 declare <16 x i8> @test_v16i8_v4f32_helper(<4 x float> %p)
1225 define void @test_v16i8_v4f32(ptr %p, ptr %q) {
1226 ; CHECK: rev64 v{{[0-9]+}}.4s
1228 ; CHECK: rev64 v{{[0-9]+}}.16b
1230 %1 = load <4 x float>, ptr %p
1231 %2 = fadd <4 x float> %1, %1
1232 %3 = call <16 x i8> @test_v16i8_v4f32_helper(<4 x float> %2)
1235 %4 = add <16 x i8> %3, %3
1236 store <16 x i8> %4, ptr %q
1240 ; CHECK-LABEL: test_v16i8_v4i32:
1241 declare <16 x i8> @test_v16i8_v4i32_helper(<4 x i32> %p)
1242 define void @test_v16i8_v4i32(ptr %p, ptr %q) {
1243 ; CHECK: rev64 v{{[0-9]+}}.4s
1245 ; CHECK: rev64 v{{[0-9]+}}.16b
1247 %1 = load <4 x i32>, ptr %p
1248 %2 = add <4 x i32> %1, %1
1249 %3 = call <16 x i8> @test_v16i8_v4i32_helper(<4 x i32> %2)
1252 %4 = add <16 x i8> %3, %3
1253 store <16 x i8> %4, ptr %q
1257 ; CHECK-LABEL: test_v16i8_v8i16:
1258 declare <16 x i8> @test_v16i8_v8i16_helper(<8 x i16> %p)
1259 define void @test_v16i8_v8i16(ptr %p, ptr %q) {
1260 ; CHECK: rev64 v{{[0-9]+}}.8h
1262 ; CHECK: rev64 v{{[0-9]+}}.16b
1264 %1 = load <8 x i16>, ptr %p
1265 %2 = add <8 x i16> %1, %1
1266 %3 = call <16 x i8> @test_v16i8_v8i16_helper(<8 x i16> %2)
1269 %4 = add <16 x i8> %3, %3
1270 store <16 x i8> %4, ptr %q