@@ -334,3 +334,210 @@ define <4 x i16> @concat_undef_first_use_undef(ptr %p1, ptr %p2) {
334334 %t = shufflevector <8 x i16 > %ext1 , <8 x i16 > %ext2 , <4 x i32 > <i32 poison, i32 poison, i32 2 , i32 3 >
335335 ret <4 x i16 > %t
336336}
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