@@ -334,3 +334,210 @@ define <4 x i16> @concat_undef_first_use_undef(ptr %p1, ptr %p2) {
334
334
%t = shufflevector <8 x i16 > %ext1 , <8 x i16 > %ext2 , <4 x i32 > <i32 poison, i32 poison, i32 2 , i32 3 >
335
335
ret <4 x i16 > %t
336
336
}
337
+
338
+ define <8 x i16 > @concat_low_low_v8i16 (<8 x i16 > %a_vec , <8 x i16 > %b_vec ) {
339
+ ; CHECK-LABEL: concat_low_low_v8i16:
340
+ ; CHECK: // %bb.0: // %entry
341
+ ; CHECK-NEXT: mov v0.d[1], v1.d[0]
342
+ ; CHECK-NEXT: ret
343
+ entry:
344
+ %shuffle.i3 = shufflevector <8 x i16 > %a_vec , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
345
+ %shuffle.i = shufflevector <8 x i16 > %b_vec , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
346
+ %shuffle.i4 = shufflevector <4 x i16 > %shuffle.i3 , <4 x i16 > %shuffle.i , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
347
+ ret <8 x i16 > %shuffle.i4
348
+ }
349
+
350
+ define <8 x i16 > @concat_high_low_v8i16 (<8 x i16 > %a_vec , <8 x i16 > %b_vec ) {
351
+ ; CHECK-SD-LABEL: concat_high_low_v8i16:
352
+ ; CHECK-SD: // %bb.0: // %entry
353
+ ; CHECK-SD-NEXT: ext v0.16b, v0.16b, v1.16b, #8
354
+ ; CHECK-SD-NEXT: ret
355
+ ;
356
+ ; CHECK-GI-LABEL: concat_high_low_v8i16:
357
+ ; CHECK-GI: // %bb.0: // %entry
358
+ ; CHECK-GI-NEXT: mov d0, v0.d[1]
359
+ ; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]
360
+ ; CHECK-GI-NEXT: ret
361
+ entry:
362
+ %shuffle.i3 = shufflevector <8 x i16 > %a_vec , <8 x i16 > poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
363
+ %shuffle.i = shufflevector <8 x i16 > %b_vec , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
364
+ %shuffle.i4 = shufflevector <4 x i16 > %shuffle.i3 , <4 x i16 > %shuffle.i , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
365
+ ret <8 x i16 > %shuffle.i4
366
+ }
367
+
368
+ define <8 x i16 > @concat_low_high_v8i16 (<8 x i16 > %a_vec , <8 x i16 > %b_vec ) {
369
+ ; CHECK-SD-LABEL: concat_low_high_v8i16:
370
+ ; CHECK-SD: // %bb.0: // %entry
371
+ ; CHECK-SD-NEXT: ext v1.16b, v1.16b, v1.16b, #8
372
+ ; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]
373
+ ; CHECK-SD-NEXT: ret
374
+ ;
375
+ ; CHECK-GI-LABEL: concat_low_high_v8i16:
376
+ ; CHECK-GI: // %bb.0: // %entry
377
+ ; CHECK-GI-NEXT: mov d1, v1.d[1]
378
+ ; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]
379
+ ; CHECK-GI-NEXT: ret
380
+ entry:
381
+ %shuffle.i3 = shufflevector <8 x i16 > %a_vec , <8 x i16 > poison, <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
382
+ %shuffle.i = shufflevector <8 x i16 > %b_vec , <8 x i16 > poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
383
+ %shuffle.i4 = shufflevector <4 x i16 > %shuffle.i3 , <4 x i16 > %shuffle.i , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
384
+ ret <8 x i16 > %shuffle.i4
385
+ }
386
+
387
+ define <8 x i16 > @concat_high_high_v8i16 (<8 x i16 > %a_vec , <8 x i16 > %b_vec ) {
388
+ ; CHECK-SD-LABEL: concat_high_high_v8i16:
389
+ ; CHECK-SD: // %bb.0: // %entry
390
+ ; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8
391
+ ; CHECK-SD-NEXT: ext v1.16b, v1.16b, v1.16b, #8
392
+ ; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]
393
+ ; CHECK-SD-NEXT: ret
394
+ ;
395
+ ; CHECK-GI-LABEL: concat_high_high_v8i16:
396
+ ; CHECK-GI: // %bb.0: // %entry
397
+ ; CHECK-GI-NEXT: mov d0, v0.d[1]
398
+ ; CHECK-GI-NEXT: mov d1, v1.d[1]
399
+ ; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]
400
+ ; CHECK-GI-NEXT: ret
401
+ entry:
402
+ %shuffle.i3 = shufflevector <8 x i16 > %a_vec , <8 x i16 > poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
403
+ %shuffle.i = shufflevector <8 x i16 > %b_vec , <8 x i16 > poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
404
+ %shuffle.i4 = shufflevector <4 x i16 > %shuffle.i3 , <4 x i16 > %shuffle.i , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
405
+ ret <8 x i16 > %shuffle.i4
406
+ }
407
+
408
+ define <8 x half > @concat_high_high_v8f16 (<8 x half > %a_vec , <8 x half > %b_vec ) {
409
+ ; CHECK-SD-LABEL: concat_high_high_v8f16:
410
+ ; CHECK-SD: // %bb.0: // %entry
411
+ ; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8
412
+ ; CHECK-SD-NEXT: ext v1.16b, v1.16b, v1.16b, #8
413
+ ; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]
414
+ ; CHECK-SD-NEXT: ret
415
+ ;
416
+ ; CHECK-GI-LABEL: concat_high_high_v8f16:
417
+ ; CHECK-GI: // %bb.0: // %entry
418
+ ; CHECK-GI-NEXT: mov d0, v0.d[1]
419
+ ; CHECK-GI-NEXT: mov d1, v1.d[1]
420
+ ; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]
421
+ ; CHECK-GI-NEXT: ret
422
+ entry:
423
+ %shuffle.i3 = shufflevector <8 x half > %a_vec , <8 x half > poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
424
+ %shuffle.i = shufflevector <8 x half > %b_vec , <8 x half > poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
425
+ %shuffle.i4 = shufflevector <4 x half > %shuffle.i3 , <4 x half > %shuffle.i , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
426
+ ret <8 x half > %shuffle.i4
427
+ }
428
+
429
+ define <8 x bfloat> @concat_high_high_v8bf16 (<8 x bfloat> %a_vec , <8 x bfloat> %b_vec ) {
430
+ ; CHECK-SD-LABEL: concat_high_high_v8bf16:
431
+ ; CHECK-SD: // %bb.0: // %entry
432
+ ; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8
433
+ ; CHECK-SD-NEXT: ext v1.16b, v1.16b, v1.16b, #8
434
+ ; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]
435
+ ; CHECK-SD-NEXT: ret
436
+ ;
437
+ ; CHECK-GI-LABEL: concat_high_high_v8bf16:
438
+ ; CHECK-GI: // %bb.0: // %entry
439
+ ; CHECK-GI-NEXT: mov d0, v0.d[1]
440
+ ; CHECK-GI-NEXT: mov d1, v1.d[1]
441
+ ; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]
442
+ ; CHECK-GI-NEXT: ret
443
+ entry:
444
+ %shuffle.i3 = shufflevector <8 x bfloat> %a_vec , <8 x bfloat> poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
445
+ %shuffle.i = shufflevector <8 x bfloat> %b_vec , <8 x bfloat> poison, <4 x i32 > <i32 4 , i32 5 , i32 6 , i32 7 >
446
+ %shuffle.i4 = shufflevector <4 x bfloat> %shuffle.i3 , <4 x bfloat> %shuffle.i , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
447
+ ret <8 x bfloat> %shuffle.i4
448
+ }
449
+
450
+ define <4 x i32 > @concat_high_high_v4i32 (<4 x i32 > %a_vec , <4 x i32 > %b_vec ) {
451
+ ; CHECK-SD-LABEL: concat_high_high_v4i32:
452
+ ; CHECK-SD: // %bb.0: // %entry
453
+ ; CHECK-SD-NEXT: zip2 v0.2d, v0.2d, v1.2d
454
+ ; CHECK-SD-NEXT: ret
455
+ ;
456
+ ; CHECK-GI-LABEL: concat_high_high_v4i32:
457
+ ; CHECK-GI: // %bb.0: // %entry
458
+ ; CHECK-GI-NEXT: mov d0, v0.d[1]
459
+ ; CHECK-GI-NEXT: mov d1, v1.d[1]
460
+ ; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]
461
+ ; CHECK-GI-NEXT: ret
462
+ entry:
463
+ %shuffle.i3 = shufflevector <4 x i32 > %a_vec , <4 x i32 > poison, <2 x i32 > <i32 2 , i32 3 >
464
+ %shuffle.i = shufflevector <4 x i32 > %b_vec , <4 x i32 > poison, <2 x i32 > <i32 2 , i32 3 >
465
+ %shuffle.i4 = shufflevector <2 x i32 > %shuffle.i3 , <2 x i32 > %shuffle.i , <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
466
+ ret <4 x i32 > %shuffle.i4
467
+ }
468
+
469
+ define <4 x float > @concat_high_high_v4f32 (<4 x float > %a_vec , <4 x float > %b_vec ) {
470
+ ; CHECK-SD-LABEL: concat_high_high_v4f32:
471
+ ; CHECK-SD: // %bb.0: // %entry
472
+ ; CHECK-SD-NEXT: zip2 v0.2d, v0.2d, v1.2d
473
+ ; CHECK-SD-NEXT: ret
474
+ ;
475
+ ; CHECK-GI-LABEL: concat_high_high_v4f32:
476
+ ; CHECK-GI: // %bb.0: // %entry
477
+ ; CHECK-GI-NEXT: mov d0, v0.d[1]
478
+ ; CHECK-GI-NEXT: mov d1, v1.d[1]
479
+ ; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]
480
+ ; CHECK-GI-NEXT: ret
481
+ entry:
482
+ %shuffle.i3 = shufflevector <4 x float > %a_vec , <4 x float > poison, <2 x i32 > <i32 2 , i32 3 >
483
+ %shuffle.i = shufflevector <4 x float > %b_vec , <4 x float > poison, <2 x i32 > <i32 2 , i32 3 >
484
+ %shuffle.i4 = shufflevector <2 x float > %shuffle.i3 , <2 x float > %shuffle.i , <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
485
+ ret <4 x float > %shuffle.i4
486
+ }
487
+
488
+ define <16 x i8 > @concat_high_high_v16i8 (<16 x i8 > %a_vec , <16 x i8 > %b_vec ) {
489
+ ; CHECK-SD-LABEL: concat_high_high_v16i8:
490
+ ; CHECK-SD: // %bb.0: // %entry
491
+ ; CHECK-SD-NEXT: ext v0.16b, v0.16b, v0.16b, #8
492
+ ; CHECK-SD-NEXT: ext v1.16b, v1.16b, v1.16b, #8
493
+ ; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]
494
+ ; CHECK-SD-NEXT: ret
495
+ ;
496
+ ; CHECK-GI-LABEL: concat_high_high_v16i8:
497
+ ; CHECK-GI: // %bb.0: // %entry
498
+ ; CHECK-GI-NEXT: mov d0, v0.d[1]
499
+ ; CHECK-GI-NEXT: mov d1, v1.d[1]
500
+ ; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]
501
+ ; CHECK-GI-NEXT: ret
502
+ entry:
503
+ %shuffle.i3 = shufflevector <16 x i8 > %a_vec , <16 x i8 > poison, <8 x i32 > <i32 8 , i32 9 , i32 10 , i32 11 , i32 12 , i32 13 , i32 14 , i32 15 >
504
+ %shuffle.i = shufflevector <16 x i8 > %b_vec , <16 x i8 > poison, <8 x i32 > <i32 8 , i32 9 , i32 10 , i32 11 , i32 12 , i32 13 , i32 14 , i32 15 >
505
+ %shuffle.i4 = shufflevector <8 x i8 > %shuffle.i3 , <8 x i8 > %shuffle.i , <16 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 , i32 8 , i32 9 , i32 10 , i32 11 , i32 12 , i32 13 , i32 14 , i32 15 >
506
+ ret <16 x i8 > %shuffle.i4
507
+ }
508
+
509
+ define <2 x i64 > @concat_high_high_v2i64 (<2 x i64 > %a_vec , <2 x i64 > %b_vec ) {
510
+ ; CHECK-SD-LABEL: concat_high_high_v2i64:
511
+ ; CHECK-SD: // %bb.0: // %entry
512
+ ; CHECK-SD-NEXT: zip2 v0.2d, v0.2d, v1.2d
513
+ ; CHECK-SD-NEXT: ret
514
+ ;
515
+ ; CHECK-GI-LABEL: concat_high_high_v2i64:
516
+ ; CHECK-GI: // %bb.0: // %entry
517
+ ; CHECK-GI-NEXT: mov v0.d[0], v0.d[1]
518
+ ; CHECK-GI-NEXT: mov v0.d[1], v1.d[1]
519
+ ; CHECK-GI-NEXT: ret
520
+ entry:
521
+ %shuffle.i3 = shufflevector <2 x i64 > %a_vec , <2 x i64 > poison, <1 x i32 > <i32 1 >
522
+ %shuffle.i = shufflevector <2 x i64 > %b_vec , <2 x i64 > poison, <1 x i32 > <i32 1 >
523
+ %shuffle.i4 = shufflevector <1 x i64 > %shuffle.i3 , <1 x i64 > %shuffle.i , <2 x i32 > <i32 0 , i32 1 >
524
+ ret <2 x i64 > %shuffle.i4
525
+ }
526
+
527
+ define <2 x double > @concat_high_high_v2f64 (<2 x double > %a_vec , <2 x double > %b_vec ) {
528
+ ; CHECK-SD-LABEL: concat_high_high_v2f64:
529
+ ; CHECK-SD: // %bb.0: // %entry
530
+ ; CHECK-SD-NEXT: zip2 v0.2d, v0.2d, v1.2d
531
+ ; CHECK-SD-NEXT: ret
532
+ ;
533
+ ; CHECK-GI-LABEL: concat_high_high_v2f64:
534
+ ; CHECK-GI: // %bb.0: // %entry
535
+ ; CHECK-GI-NEXT: mov v0.d[0], v0.d[1]
536
+ ; CHECK-GI-NEXT: mov v0.d[1], v1.d[1]
537
+ ; CHECK-GI-NEXT: ret
538
+ entry:
539
+ %shuffle.i3 = shufflevector <2 x double > %a_vec , <2 x double > poison, <1 x i32 > <i32 1 >
540
+ %shuffle.i = shufflevector <2 x double > %b_vec , <2 x double > poison, <1 x i32 > <i32 1 >
541
+ %shuffle.i4 = shufflevector <1 x double > %shuffle.i3 , <1 x double > %shuffle.i , <2 x i32 > <i32 0 , i32 1 >
542
+ ret <2 x double > %shuffle.i4
543
+ }
0 commit comments