@@ -456,3 +456,131 @@ define <vscale x 2 x i64> @zext_i18_i64(<vscale x 2 x i18> %a) {
456456 %r = zext <vscale x 2 x i18 > %a to <vscale x 2 x i64 >
457457 ret <vscale x 2 x i64 > %r
458458}
459+
460+ define <vscale x 8 x i16 > @sext_inreg_i16_from_i8 (<vscale x 16 x i8 > %a ) {
461+ ; CHECK-LABEL: sext_inreg_i16_from_i8:
462+ ; CHECK: // %bb.0:
463+ ; CHECK-NEXT: sunpklo z0.h, z0.b
464+ ; CHECK-NEXT: ret
465+ %subvec = call <vscale x 8 x i8 > @llvm.vector.extract.nxv8i8.nxv16i8 (<vscale x 16 x i8 > %a , i64 0 )
466+ %sext = sext <vscale x 8 x i8 > %subvec to <vscale x 8 x i16 >
467+ ret <vscale x 8 x i16 > %sext
468+ }
469+
470+ define <vscale x 4 x i32 > @sext_inreg_i32_from_i8 (<vscale x 16 x i8 > %a ) {
471+ ; CHECK-LABEL: sext_inreg_i32_from_i8:
472+ ; CHECK: // %bb.0:
473+ ; CHECK-NEXT: sunpklo z0.h, z0.b
474+ ; CHECK-NEXT: sunpklo z0.s, z0.h
475+ ; CHECK-NEXT: ret
476+ %subvec = call <vscale x 4 x i8 > @llvm.vector.extract.nxv4i8.nxv16i8 (<vscale x 16 x i8 > %a , i64 0 )
477+ %sext = sext <vscale x 4 x i8 > %subvec to <vscale x 4 x i32 >
478+ ret <vscale x 4 x i32 > %sext
479+ }
480+
481+ define <vscale x 4 x i32 > @sext_inreg_i32_from_i16 (<vscale x 8 x i16 > %a ) {
482+ ; CHECK-LABEL: sext_inreg_i32_from_i16:
483+ ; CHECK: // %bb.0:
484+ ; CHECK-NEXT: sunpklo z0.s, z0.h
485+ ; CHECK-NEXT: ret
486+ %subvec = call <vscale x 4 x i16 > @llvm.vector.extract.nxv4i16.nxv8i16 (<vscale x 8 x i16 > %a , i64 0 )
487+ %sext = sext <vscale x 4 x i16 > %subvec to <vscale x 4 x i32 >
488+ ret <vscale x 4 x i32 > %sext
489+ }
490+
491+ define <vscale x 2 x i64 > @sext_inreg_i64_from_i8 (<vscale x 16 x i8 > %a ) {
492+ ; CHECK-LABEL: sext_inreg_i64_from_i8:
493+ ; CHECK: // %bb.0:
494+ ; CHECK-NEXT: sunpklo z0.h, z0.b
495+ ; CHECK-NEXT: sunpklo z0.s, z0.h
496+ ; CHECK-NEXT: sunpklo z0.d, z0.s
497+ ; CHECK-NEXT: ret
498+ %subvec = call <vscale x 2 x i8 > @llvm.vector.extract.nxv2i8.nxv16i8 (<vscale x 16 x i8 > %a , i64 0 )
499+ %sext = sext <vscale x 2 x i8 > %subvec to <vscale x 2 x i64 >
500+ ret <vscale x 2 x i64 > %sext
501+ }
502+
503+ define <vscale x 2 x i64 > @sext_inreg_i64_from_i16 (<vscale x 8 x i16 > %a ) {
504+ ; CHECK-LABEL: sext_inreg_i64_from_i16:
505+ ; CHECK: // %bb.0:
506+ ; CHECK-NEXT: sunpklo z0.s, z0.h
507+ ; CHECK-NEXT: sunpklo z0.d, z0.s
508+ ; CHECK-NEXT: ret
509+ %subvec = call <vscale x 2 x i16 > @llvm.vector.extract.nxv2i16.nxv8i16 (<vscale x 8 x i16 > %a , i64 0 )
510+ %sext = sext <vscale x 2 x i16 > %subvec to <vscale x 2 x i64 >
511+ ret <vscale x 2 x i64 > %sext
512+ }
513+
514+ define <vscale x 2 x i64 > @sext_inreg_i64_from_i32 (<vscale x 4 x i32 > %a ) {
515+ ; CHECK-LABEL: sext_inreg_i64_from_i32:
516+ ; CHECK: // %bb.0:
517+ ; CHECK-NEXT: sunpklo z0.d, z0.s
518+ ; CHECK-NEXT: ret
519+ %subvec = call <vscale x 2 x i32 > @llvm.vector.extract.nxv2i32.nxv4i32 (<vscale x 4 x i32 > %a , i64 0 )
520+ %sext = sext <vscale x 2 x i32 > %subvec to <vscale x 2 x i64 >
521+ ret <vscale x 2 x i64 > %sext
522+ }
523+
524+ define <vscale x 8 x i16 > @zext_inreg_i16_from_i8 (<vscale x 16 x i8 > %a ) {
525+ ; CHECK-LABEL: zext_inreg_i16_from_i8:
526+ ; CHECK: // %bb.0:
527+ ; CHECK-NEXT: uunpklo z0.h, z0.b
528+ ; CHECK-NEXT: ret
529+ %subvec = call <vscale x 8 x i8 > @llvm.vector.extract.nxv8i8.nxv16i8 (<vscale x 16 x i8 > %a , i64 0 )
530+ %zext = zext <vscale x 8 x i8 > %subvec to <vscale x 8 x i16 >
531+ ret <vscale x 8 x i16 > %zext
532+ }
533+
534+ define <vscale x 4 x i32 > @zext_inreg_i32_from_i8 (<vscale x 16 x i8 > %a ) {
535+ ; CHECK-LABEL: zext_inreg_i32_from_i8:
536+ ; CHECK: // %bb.0:
537+ ; CHECK-NEXT: uunpklo z0.h, z0.b
538+ ; CHECK-NEXT: uunpklo z0.s, z0.h
539+ ; CHECK-NEXT: ret
540+ %subvec = call <vscale x 4 x i8 > @llvm.vector.extract.nxv4i8.nxv16i8 (<vscale x 16 x i8 > %a , i64 0 )
541+ %zext = zext <vscale x 4 x i8 > %subvec to <vscale x 4 x i32 >
542+ ret <vscale x 4 x i32 > %zext
543+ }
544+
545+ define <vscale x 4 x i32 > @zext_inreg_i32_from_i16 (<vscale x 8 x i16 > %a ) {
546+ ; CHECK-LABEL: zext_inreg_i32_from_i16:
547+ ; CHECK: // %bb.0:
548+ ; CHECK-NEXT: uunpklo z0.s, z0.h
549+ ; CHECK-NEXT: ret
550+ %subvec = call <vscale x 4 x i16 > @llvm.vector.extract.nxv4i16.nxv8i16 (<vscale x 8 x i16 > %a , i64 0 )
551+ %zext = zext <vscale x 4 x i16 > %subvec to <vscale x 4 x i32 >
552+ ret <vscale x 4 x i32 > %zext
553+ }
554+
555+ define <vscale x 2 x i64 > @zext_inreg_i64_from_i8 (<vscale x 16 x i8 > %a ) {
556+ ; CHECK-LABEL: zext_inreg_i64_from_i8:
557+ ; CHECK: // %bb.0:
558+ ; CHECK-NEXT: uunpklo z0.h, z0.b
559+ ; CHECK-NEXT: uunpklo z0.s, z0.h
560+ ; CHECK-NEXT: uunpklo z0.d, z0.s
561+ ; CHECK-NEXT: ret
562+ %subvec = call <vscale x 2 x i8 > @llvm.vector.extract.nxv2i8.nxv16i8 (<vscale x 16 x i8 > %a , i64 0 )
563+ %zext = zext <vscale x 2 x i8 > %subvec to <vscale x 2 x i64 >
564+ ret <vscale x 2 x i64 > %zext
565+ }
566+
567+ define <vscale x 2 x i64 > @zext_inreg_i64_from_i16 (<vscale x 8 x i16 > %a ) {
568+ ; CHECK-LABEL: zext_inreg_i64_from_i16:
569+ ; CHECK: // %bb.0:
570+ ; CHECK-NEXT: uunpklo z0.s, z0.h
571+ ; CHECK-NEXT: uunpklo z0.d, z0.s
572+ ; CHECK-NEXT: ret
573+ %subvec = call <vscale x 2 x i16 > @llvm.vector.extract.nxv2i16.nxv8i16 (<vscale x 8 x i16 > %a , i64 0 )
574+ %zext = zext <vscale x 2 x i16 > %subvec to <vscale x 2 x i64 >
575+ ret <vscale x 2 x i64 > %zext
576+ }
577+
578+ define <vscale x 2 x i64 > @zext_inreg_i64_from_i32 (<vscale x 4 x i32 > %a ) {
579+ ; CHECK-LABEL: zext_inreg_i64_from_i32:
580+ ; CHECK: // %bb.0:
581+ ; CHECK-NEXT: uunpklo z0.d, z0.s
582+ ; CHECK-NEXT: ret
583+ %subvec = call <vscale x 2 x i32 > @llvm.vector.extract.nxv2i32.nxv4i32 (<vscale x 4 x i32 > %a , i64 0 )
584+ %zext = zext <vscale x 2 x i32 > %subvec to <vscale x 2 x i64 >
585+ ret <vscale x 2 x i64 > %zext
586+ }
0 commit comments