@@ -753,3 +753,95 @@ define <4 x i1> @load_large_vector(ptr %p) {
753753 %ret = icmp ne <4 x ptr > %s1 , %s2
754754 ret <4 x i1 > %ret
755755}
756+
757+ define void @store_factor8_with_undef (ptr %ptr , <4 x i32 > %a0 , <4 x i32 > %a1 , <4 x i32 > %a2 , <4 x i32 > %a3 ){
758+ ; NEON-LABEL: define void @store_factor8_with_undef(
759+ ; NEON: [[TMP1:%.*]] = shufflevector <4 x i32> [[A0:%.*]], <4 x i32> poison, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
760+ ; NEON-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> [[A0]], <4 x i32> poison, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
761+ ; NEON-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[A1:%.*]], <4 x i32> poison, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
762+ ; NEON-NEXT: [[TMP4:%.*]] = shufflevector <4 x i32> [[A1]], <4 x i32> poison, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
763+ ; NEON-NEXT: [[TMP5:%.*]] = shufflevector <4 x i32> [[A2:%.*]], <4 x i32> poison, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
764+ ; NEON-NEXT: [[TMP6:%.*]] = shufflevector <4 x i32> [[A2]], <4 x i32> poison, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
765+ ; NEON-NEXT: [[TMP7:%.*]] = shufflevector <4 x i32> [[A3:%.*]], <4 x i32> poison, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
766+ ; NEON-NEXT: [[TMP8:%.*]] = shufflevector <4 x i32> [[A3]], <4 x i32> poison, <4 x i32> <i32 2, i32 6, i32 3, i32 7>
767+ ; NEON-NEXT: call void @llvm.aarch64.neon.st4.v4i32.p0(<4 x i32> [[TMP1]], <4 x i32> [[TMP3]], <4 x i32> [[TMP5]], <4 x i32> [[TMP7]], ptr [[PTR]])
768+ ; NEON-NEXT: [[TMP9:%.*]] = getelementptr i32, ptr [[PTR]], i32 16
769+ ; NEON-NEXT: call void @llvm.aarch64.neon.st4.v4i32.p0(<4 x i32> [[TMP2]], <4 x i32> [[TMP4]], <4 x i32> [[TMP6]], <4 x i32> [[TMP8]], ptr [[TMP9]])
770+ ; NEON-NEXT: ret void
771+ ; NO_NEON-LABEL: @store_factor8_with_undef(
772+ ; NO_NEON-NOT: @llvm.aarch64.neon
773+ ; NO_NEON: ret void
774+ ;
775+ %v0 = shufflevector <4 x i32 > %a0 , <4 x i32 > %a1 , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
776+ %v1 = shufflevector <4 x i32 > %a2 , <4 x i32 > %a3 , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
777+ %s0 = shufflevector <8 x i32 > %v0 , <8 x i32 > %v1 , <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 >
778+ %interleaved.vec = shufflevector <16 x i32 > %s0 , <16 x i32 > poison, <32 x i32 > <i32 0 , i32 4 , i32 8 , i32 12 , i32 16 , i32 20 , i32 24 , i32 28 , i32 1 , i32 5 , i32 9 , i32 13 , i32 17 , i32 21 , i32 25 , i32 29 , i32 2 , i32 6 , i32 10 , i32 14 , i32 18 , i32 22 , i32 26 , i32 30 , i32 3 , i32 7 , i32 11 , i32 15 , i32 19 , i32 23 , i32 27 , i32 undef >
779+ store <32 x i32 > %interleaved.vec , ptr %ptr , align 4
780+ ret void
781+ }
782+
783+ define void @store_general_mask_factor8_undef_fail (ptr %ptr , <4 x i32 > %a0 , <4 x i32 > %a1 , <4 x i32 > %a2 , <4 x i32 > %a3 ,
784+ <4 x i32 > %a4 , <4 x i32 > %a5 , <4 x i32 > %a6 , <4 x i32 > %a7 ){
785+ ; NEON-LABEL: @store_general_mask_factor8_undef_fail(
786+ ; NEON-NOT: @llvm.aarch64.neon
787+ ; NEON: ret void
788+ ; NO_NEON-LABEL: @store_general_mask_factor8_undef_fail(
789+ ; NO_NEON-NOT: @llvm.aarch64.neon
790+ ; NO_NEON: ret void
791+ ;
792+ %v0 = shufflevector <4 x i32 > %a0 , <4 x i32 > %a1 , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
793+ %v1 = shufflevector <4 x i32 > %a2 , <4 x i32 > %a3 , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
794+ %v2 = shufflevector <4 x i32 > %a4 , <4 x i32 > %a5 , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
795+ %v3 = shufflevector <4 x i32 > %a6 , <4 x i32 > %a7 , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
796+
797+ %s0 = shufflevector <8 x i32 > %v0 , <8 x i32 > %v1 , <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 >
798+ %s1 = shufflevector <8 x i32 > %v2 , <8 x i32 > %v3 , <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 >
799+
800+ %interleaved.vec = shufflevector <16 x i32 > %s0 , <16 x i32 > %s1 , <32 x i32 > <i32 0 , i32 4 , i32 8 , i32 9 , i32 16 , i32 20 , i32 24 , i32 10 , i32 1 , i32 5 , i32 9 , i32 13 , i32 17 , i32 21 , i32 25 , i32 29 , i32 2 , i32 6 , i32 10 , i32 14 , i32 18 , i32 22 , i32 26 , i32 30 , i32 3 , i32 7 , i32 11 , i32 15 , i32 19 , i32 23 , i32 27 , i32 undef >
801+ store <32 x i32 > %interleaved.vec , ptr %ptr , align 4
802+ ret void
803+ }
804+
805+ define void @store_general_invalid_concat_mask (ptr %ptr , <4 x i32 > %a0 , <4 x i32 > %a1 , <4 x i32 > %a2 , <4 x i32 > %a3 ,
806+ <4 x i32 > %a4 , <4 x i32 > %a5 , <4 x i32 > %a6 , <4 x i32 > %a7 ){
807+ ; NEON-LABEL: @store_general_invalid_concat_mask(
808+ ; NEON-NOT: @llvm.aarch64.neon
809+ ; NEON: ret void
810+ ; NO_NEON-LABEL: @store_general_invalid_concat_mask(
811+ ; NO_NEON-NOT: @llvm.aarch64.neon
812+ ; NO_NEON: ret void
813+ ;
814+ %v0 = shufflevector <4 x i32 > %a0 , <4 x i32 > %a1 , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 0 >
815+ %v1 = shufflevector <4 x i32 > %a2 , <4 x i32 > %a3 , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
816+ %v2 = shufflevector <4 x i32 > %a4 , <4 x i32 > %a5 , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
817+ %v3 = shufflevector <4 x i32 > %a6 , <4 x i32 > %a7 , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
818+
819+ %s0 = shufflevector <8 x i32 > %v0 , <8 x i32 > %v1 , <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 >
820+ %s1 = shufflevector <8 x i32 > %v2 , <8 x i32 > %v3 , <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 >
821+
822+ %interleaved.vec = shufflevector <16 x i32 > %s0 , <16 x i32 > %s1 , <32 x i32 > <i32 0 , i32 4 , i32 8 , i32 12 , i32 16 , i32 20 , i32 24 , i32 28 , i32 1 , i32 5 , i32 9 , i32 13 , i32 17 , i32 21 , i32 25 , i32 29 , i32 2 , i32 6 , i32 10 , i32 14 , i32 18 , i32 22 , i32 26 , i32 30 , i32 3 , i32 7 , i32 11 , i32 15 , i32 19 , i32 23 , i32 27 , i32 31 >
823+ store <32 x i32 > %interleaved.vec , ptr %ptr , align 4
824+ ret void
825+ }
826+
827+ define void @store_no_interleave_factor8 (ptr %ptr , <4 x i32 > %a0 , <4 x i32 > %a1 , <4 x i32 > %a2 , <4 x i32 > %a3 ,
828+ <4 x i32 > %a4 , <4 x i32 > %a5 , <4 x i32 > %a6 , <4 x i32 > %a7 ){
829+ ; NEON-LABEL: @store_no_interleave_factor8(
830+ ; NEON-NOT: @llvm.aarch64.neon
831+ ; NEON: ret void
832+ ; NO_NEON-LABEL: @store_no_interleave_factor8(
833+ ; NO_NEON-NOT: @llvm.aarch64.neon
834+ ; NO_NEON: ret void
835+ ;
836+ %v0 = shufflevector <4 x i32 > %a0 , <4 x i32 > %a1 , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
837+ %v1 = shufflevector <4 x i32 > %a2 , <4 x i32 > %a3 , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
838+ %v2 = shufflevector <4 x i32 > %a4 , <4 x i32 > %a5 , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
839+ %v3 = shufflevector <4 x i32 > %a6 , <4 x i32 > %a7 , <8 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 , i32 4 , i32 5 , i32 6 , i32 7 >
840+
841+ %s0 = shufflevector <8 x i32 > %v0 , <8 x i32 > %v1 , <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 >
842+ %s1 = shufflevector <8 x i32 > %v2 , <8 x i32 > %v3 , <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 >
843+
844+ %interleaved.vec = shufflevector <16 x i32 > %s0 , <16 x i32 > %s1 , <16 x i32 > <i32 0 , i32 2 , i32 4 , i32 6 , i32 8 , i32 10 , i32 12 , i32 14 , i32 1 , i32 3 , i32 5 , i32 7 , i32 9 , i32 11 , i32 13 , i32 15 >
845+ store <16 x i32 > %interleaved.vec , ptr %ptr , align 4
846+ ret void
847+ }
0 commit comments