diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-02-04 15:51:55 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-02-04 15:51:55 +0000 |
commit | 528e94e9a2849035b6f4b1175fcbbe528426f6f4 (patch) | |
tree | e37e9f5bfa57cc186cbb9846c8a3d38cd9ea000e | |
parent | 25bfa7859c90c77ef82ae8083df16c0e872248ca (diff) | |
download | bcm5719-llvm-528e94e9a2849035b6f4b1175fcbbe528426f6f4.tar.gz bcm5719-llvm-528e94e9a2849035b6f4b1175fcbbe528426f6f4.zip |
[X86][SSE] Added i686 target tests to make sure we are correctly loading consecutive entries as 64-bit integers
llvm-svn: 259794
-rw-r--r-- | llvm/test/CodeGen/X86/merge-consecutive-loads-128.ll | 125 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/merge-consecutive-loads-256.ll | 191 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/merge-consecutive-loads-512.ll | 188 |
3 files changed, 504 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/merge-consecutive-loads-128.ll b/llvm/test/CodeGen/X86/merge-consecutive-loads-128.ll index 459ec10e4e5..6f1daad843f 100644 --- a/llvm/test/CodeGen/X86/merge-consecutive-loads-128.ll +++ b/llvm/test/CodeGen/X86/merge-consecutive-loads-128.ll @@ -4,6 +4,9 @@ ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512F +; +; Just one 32-bit run to make sure we do reasonable things. +; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X32-SSE define <2 x double> @merge_2f64_f64_23(double* %ptr) nounwind uwtable noinline ssp { ; SSE-LABEL: merge_2f64_f64_23: @@ -15,6 +18,12 @@ define <2 x double> @merge_2f64_f64_23(double* %ptr) nounwind uwtable noinline s ; AVX: # BB#0: ; AVX-NEXT: vmovups 16(%rdi), %xmm0 ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_2f64_f64_23: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movups 16(%eax), %xmm0 +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds double, double* %ptr, i64 2 %ptr1 = getelementptr inbounds double, double* %ptr, i64 3 %val0 = load double, double* %ptr0 @@ -34,6 +43,12 @@ define <2 x i64> @merge_2i64_i64_12(i64* %ptr) nounwind uwtable noinline ssp { ; AVX: # BB#0: ; AVX-NEXT: vmovups 8(%rdi), %xmm0 ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_2i64_i64_12: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movups 8(%eax), %xmm0 +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds i64, i64* %ptr, i64 1 %ptr1 = getelementptr inbounds i64, i64* %ptr, i64 2 %val0 = load i64, i64* %ptr0 @@ -53,6 +68,12 @@ define <4 x float> @merge_4f32_f32_2345(float* %ptr) nounwind uwtable noinline s ; AVX: # BB#0: ; AVX-NEXT: vmovups 8(%rdi), %xmm0 ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_4f32_f32_2345: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movups 8(%eax), %xmm0 +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds float, float* %ptr, i64 2 %ptr1 = getelementptr inbounds float, float* %ptr, i64 3 %ptr2 = getelementptr inbounds float, float* %ptr, i64 4 @@ -78,6 +99,12 @@ define <4 x float> @merge_4f32_f32_3zuu(float* %ptr) nounwind uwtable noinline s ; AVX: # BB#0: ; AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_4f32_f32_3zuu: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds float, float* %ptr, i64 3 %val0 = load float, float* %ptr0 %res0 = insertelement <4 x float> undef, float %val0, i32 0 @@ -95,6 +122,12 @@ define <4 x float> @merge_4f32_f32_34uu(float* %ptr) nounwind uwtable noinline s ; AVX: # BB#0: ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_4f32_f32_34uu: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds float, float* %ptr, i64 3 %ptr1 = getelementptr inbounds float, float* %ptr, i64 4 %val0 = load float, float* %ptr0 @@ -118,6 +151,14 @@ define <4 x float> @merge_4f32_f32_34z6(float* %ptr) nounwind uwtable noinline s ; AVX-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero ; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[1,0] ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_4f32_f32_34z6: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero +; X32-SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero +; X32-SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[1,0] +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds float, float* %ptr, i64 3 %ptr1 = getelementptr inbounds float, float* %ptr, i64 4 %ptr3 = getelementptr inbounds float, float* %ptr, i64 6 @@ -140,6 +181,12 @@ define <4 x float> @merge_4f32_f32_45zz(float* %ptr) nounwind uwtable noinline s ; AVX: # BB#0: ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_4f32_f32_45zz: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds float, float* %ptr, i64 4 %ptr1 = getelementptr inbounds float, float* %ptr, i64 5 %val0 = load float, float* %ptr0 @@ -169,6 +216,13 @@ define <4 x float> @merge_4f32_f32_012u(float* %ptr) nounwind uwtable noinline s ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; AVX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3] ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_4f32_f32_012u: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero +; X32-SSE-NEXT: insertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3] +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds float, float* %ptr, i64 0 %ptr1 = getelementptr inbounds float, float* %ptr, i64 1 %ptr2 = getelementptr inbounds float, float* %ptr, i64 2 @@ -203,6 +257,13 @@ define <4 x float> @merge_4f32_f32_019u(float* %ptr) nounwind uwtable noinline s ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; AVX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3] ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_4f32_f32_019u: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero +; X32-SSE-NEXT: insertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3] +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds float, float* %ptr, i64 0 %ptr1 = getelementptr inbounds float, float* %ptr, i64 1 %ptr2 = getelementptr inbounds float, float* %ptr, i64 9 @@ -226,6 +287,12 @@ define <4 x i32> @merge_4i32_i32_23u5(i32* %ptr) nounwind uwtable noinline ssp { ; AVX: # BB#0: ; AVX-NEXT: vmovups 8(%rdi), %xmm0 ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_4i32_i32_23u5: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movups 8(%eax), %xmm0 +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds i32, i32* %ptr, i64 2 %ptr1 = getelementptr inbounds i32, i32* %ptr, i64 3 %ptr3 = getelementptr inbounds i32, i32* %ptr, i64 5 @@ -248,6 +315,12 @@ define <4 x i32> @merge_4i32_i32_3zuu(i32* %ptr) nounwind uwtable noinline ssp { ; AVX: # BB#0: ; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_4i32_i32_3zuu: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds i32, i32* %ptr, i64 3 %val0 = load i32, i32* %ptr0 %res0 = insertelement <4 x i32> undef, i32 %val0, i32 0 @@ -265,6 +338,12 @@ define <4 x i32> @merge_4i32_i32_34uu(i32* %ptr) nounwind uwtable noinline ssp { ; AVX: # BB#0: ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_4i32_i32_34uu: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds i32, i32* %ptr, i64 3 %ptr1 = getelementptr inbounds i32, i32* %ptr, i64 4 %val0 = load i32, i32* %ptr0 @@ -284,6 +363,12 @@ define <4 x i32> @merge_4i32_i32_45zz(i32* %ptr) nounwind uwtable noinline ssp { ; AVX: # BB#0: ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_4i32_i32_45zz: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds i32, i32* %ptr, i64 4 %ptr1 = getelementptr inbounds i32, i32* %ptr, i64 5 %val0 = load i32, i32* %ptr0 @@ -303,6 +388,12 @@ define <8 x i16> @merge_8i16_i16_23u567u9(i16* %ptr) nounwind uwtable noinline s ; AVX: # BB#0: ; AVX-NEXT: vmovups 4(%rdi), %xmm0 ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_8i16_i16_23u567u9: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movups 4(%eax), %xmm0 +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 2 %ptr1 = getelementptr inbounds i16, i16* %ptr, i64 3 %ptr3 = getelementptr inbounds i16, i16* %ptr, i64 5 @@ -336,6 +427,13 @@ define <8 x i16> @merge_8i16_i16_34uuuuuu(i16* %ptr) nounwind uwtable noinline s ; AVX-NEXT: vpinsrw $0, 6(%rdi), %xmm0, %xmm0 ; AVX-NEXT: vpinsrw $1, 8(%rdi), %xmm0, %xmm0 ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_8i16_i16_34uuuuuu: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: pinsrw $0, 6(%eax), %xmm0 +; X32-SSE-NEXT: pinsrw $1, 8(%eax), %xmm0 +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 3 %ptr1 = getelementptr inbounds i16, i16* %ptr, i64 4 %val0 = load i16, i16* %ptr0 @@ -355,6 +453,12 @@ define <8 x i16> @merge_8i16_i16_45u7zzzz(i16* %ptr) nounwind uwtable noinline s ; AVX: # BB#0: ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_8i16_i16_45u7zzzz: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 4 %ptr1 = getelementptr inbounds i16, i16* %ptr, i64 5 %ptr3 = getelementptr inbounds i16, i16* %ptr, i64 7 @@ -381,6 +485,12 @@ define <16 x i8> @merge_16i8_i8_01u3456789ABCDuF(i8* %ptr) nounwind uwtable noin ; AVX: # BB#0: ; AVX-NEXT: vmovups (%rdi), %xmm0 ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_16i8_i8_01u3456789ABCDuF: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movups (%eax), %xmm0 +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds i8, i8* %ptr, i64 0 %ptr1 = getelementptr inbounds i8, i8* %ptr, i64 1 %ptr3 = getelementptr inbounds i8, i8* %ptr, i64 3 @@ -455,6 +565,15 @@ define <16 x i8> @merge_16i8_i8_01u3uuzzuuuuuzzz(i8* %ptr) nounwind uwtable noin ; AVX-NEXT: vpinsrb $1, 1(%rdi), %xmm0, %xmm0 ; AVX-NEXT: vpinsrb $3, 3(%rdi), %xmm0, %xmm0 ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_16i8_i8_01u3uuzzuuuuuzzz: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: pxor %xmm0, %xmm0 +; X32-SSE-NEXT: pinsrb $0, (%eax), %xmm0 +; X32-SSE-NEXT: pinsrb $1, 1(%eax), %xmm0 +; X32-SSE-NEXT: pinsrb $3, 3(%eax), %xmm0 +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds i8, i8* %ptr, i64 0 %ptr1 = getelementptr inbounds i8, i8* %ptr, i64 1 %ptr3 = getelementptr inbounds i8, i8* %ptr, i64 3 @@ -482,6 +601,12 @@ define <16 x i8> @merge_16i8_i8_0123uu67uuuuuzzz(i8* %ptr) nounwind uwtable noin ; AVX: # BB#0: ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; AVX-NEXT: retq +; +; X32-SSE-LABEL: merge_16i8_i8_0123uu67uuuuuzzz: +; X32-SSE: # BB#0: +; X32-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero +; X32-SSE-NEXT: retl %ptr0 = getelementptr inbounds i8, i8* %ptr, i64 0 %ptr1 = getelementptr inbounds i8, i8* %ptr, i64 1 %ptr2 = getelementptr inbounds i8, i8* %ptr, i64 2 diff --git a/llvm/test/CodeGen/X86/merge-consecutive-loads-256.ll b/llvm/test/CodeGen/X86/merge-consecutive-loads-256.ll index 2f43adaf300..3106939c2bb 100644 --- a/llvm/test/CodeGen/X86/merge-consecutive-loads-256.ll +++ b/llvm/test/CodeGen/X86/merge-consecutive-loads-256.ll @@ -2,12 +2,21 @@ ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512F +; +; Just one 32-bit run to make sure we do reasonable things. +; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=X32-AVX define <4 x double> @merge_4f64_2f64_23(<2 x double>* %ptr) nounwind uwtable noinline ssp { ; AVX-LABEL: merge_4f64_2f64_23: ; AVX: # BB#0: ; AVX-NEXT: vmovups 32(%rdi), %ymm0 ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_4f64_2f64_23: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovups 32(%eax), %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds <2 x double>, <2 x double>* %ptr, i64 2 %ptr1 = getelementptr inbounds <2 x double>, <2 x double>* %ptr, i64 3 %val0 = load <2 x double>, <2 x double>* %ptr0 @@ -23,6 +32,14 @@ define <4 x double> @merge_4f64_2f64_2z(<2 x double>* %ptr) nounwind uwtable noi ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_4f64_2f64_2z: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovaps 32(%eax), %xmm0 +; X32-AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 +; X32-AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds <2 x double>, <2 x double>* %ptr, i64 2 %val0 = load <2 x double>, <2 x double>* %ptr0 %res = shufflevector <2 x double> %val0, <2 x double> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3> @@ -34,6 +51,12 @@ define <4 x double> @merge_4f64_f64_2345(double* %ptr) nounwind uwtable noinline ; AVX: # BB#0: ; AVX-NEXT: vmovups 16(%rdi), %ymm0 ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_4f64_f64_2345: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovups 16(%eax), %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds double, double* %ptr, i64 2 %ptr1 = getelementptr inbounds double, double* %ptr, i64 3 %ptr2 = getelementptr inbounds double, double* %ptr, i64 4 @@ -54,6 +77,12 @@ define <4 x double> @merge_4f64_f64_3zuu(double* %ptr) nounwind uwtable noinline ; AVX: # BB#0: ; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_4f64_f64_3zuu: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds double, double* %ptr, i64 3 %val0 = load double, double* %ptr0 %res0 = insertelement <4 x double> undef, double %val0, i32 0 @@ -66,6 +95,12 @@ define <4 x double> @merge_4f64_f64_34uu(double* %ptr) nounwind uwtable noinline ; AVX: # BB#0: ; AVX-NEXT: vmovups 24(%rdi), %xmm0 ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_4f64_f64_34uu: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovups 24(%eax), %xmm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds double, double* %ptr, i64 3 %ptr1 = getelementptr inbounds double, double* %ptr, i64 4 %val0 = load double, double* %ptr0 @@ -82,6 +117,14 @@ define <4 x double> @merge_4f64_f64_45zz(double* %ptr) nounwind uwtable noinline ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_4f64_f64_45zz: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovups 32(%eax), %xmm0 +; X32-AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 +; X32-AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds double, double* %ptr, i64 4 %ptr1 = getelementptr inbounds double, double* %ptr, i64 5 %val0 = load double, double* %ptr0 @@ -115,6 +158,15 @@ define <4 x double> @merge_4f64_f64_34z6(double* %ptr) nounwind uwtable noinline ; AVX512F-NEXT: vpslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5,6,7] ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 ; AVX512F-NEXT: retq +; +; X32-AVX-LABEL: merge_4f64_f64_34z6: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovups 24(%eax), %xmm0 +; X32-AVX-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero +; X32-AVX-NEXT: vpslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5,6,7] +; X32-AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds double, double* %ptr, i64 3 %ptr1 = getelementptr inbounds double, double* %ptr, i64 4 %ptr3 = getelementptr inbounds double, double* %ptr, i64 6 @@ -135,6 +187,14 @@ define <4 x i64> @merge_4i64_2i64_3z(<2 x i64>* %ptr) nounwind uwtable noinline ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_4i64_2i64_3z: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovaps 48(%eax), %xmm0 +; X32-AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 +; X32-AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds <2 x i64>, <2 x i64>* %ptr, i64 3 %val0 = load <2 x i64>, <2 x i64>* %ptr0 %res = shufflevector <2 x i64> %val0, <2 x i64> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3> @@ -146,6 +206,12 @@ define <4 x i64> @merge_4i64_i64_1234(i64* %ptr) nounwind uwtable noinline ssp { ; AVX: # BB#0: ; AVX-NEXT: vmovups 8(%rdi), %ymm0 ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_4i64_i64_1234: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovups 8(%eax), %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds i64, i64* %ptr, i64 1 %ptr1 = getelementptr inbounds i64, i64* %ptr, i64 2 %ptr2 = getelementptr inbounds i64, i64* %ptr, i64 3 @@ -166,6 +232,12 @@ define <4 x i64> @merge_4i64_i64_1zzu(i64* %ptr) nounwind uwtable noinline ssp { ; AVX: # BB#0: ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_4i64_i64_1zzu: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds i64, i64* %ptr, i64 1 %val0 = load i64, i64* %ptr0 %res0 = insertelement <4 x i64> undef, i64 %val0, i32 0 @@ -181,6 +253,14 @@ define <4 x i64> @merge_4i64_i64_23zz(i64* %ptr) nounwind uwtable noinline ssp { ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_4i64_i64_23zz: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovups 16(%eax), %xmm0 +; X32-AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 +; X32-AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds i64, i64* %ptr, i64 2 %ptr1 = getelementptr inbounds i64, i64* %ptr, i64 3 %val0 = load i64, i64* %ptr0 @@ -214,6 +294,16 @@ define <8 x float> @merge_8f32_2f32_23z5(<2 x float>* %ptr) nounwind uwtable noi ; AVX512F-NEXT: vmovhpd 40(%rdi), %xmm1, %xmm1 ; AVX512F-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 ; AVX512F-NEXT: retq +; +; X32-AVX-LABEL: merge_8f32_2f32_23z5: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero +; X32-AVX-NEXT: vxorpd %xmm1, %xmm1, %xmm1 +; X32-AVX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0] +; X32-AVX-NEXT: vmovupd 16(%eax), %xmm1 +; X32-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds <2 x float>, <2 x float>* %ptr, i64 2 %ptr1 = getelementptr inbounds <2 x float>, <2 x float>* %ptr, i64 3 %ptr3 = getelementptr inbounds <2 x float>, <2 x float>* %ptr, i64 5 @@ -232,6 +322,13 @@ define <8 x float> @merge_8f32_4f32_z2(<4 x float>* %ptr) nounwind uwtable noinl ; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0 ; AVX-NEXT: vinsertf128 $1, 32(%rdi), %ymm0, %ymm0 ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_8f32_4f32_z2: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0 +; X32-AVX-NEXT: vinsertf128 $1, 32(%eax), %ymm0, %ymm0 +; X32-AVX-NEXT: retl %ptr1 = getelementptr inbounds <4 x float>, <4 x float>* %ptr, i64 2 %val1 = load <4 x float>, <4 x float>* %ptr1 %res = shufflevector <4 x float> zeroinitializer, <4 x float> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> @@ -243,6 +340,12 @@ define <8 x float> @merge_8f32_f32_12zzuuzz(float* %ptr) nounwind uwtable noinli ; AVX: # BB#0: ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_8f32_f32_12zzuuzz: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds float, float* %ptr, i64 1 %ptr1 = getelementptr inbounds float, float* %ptr, i64 2 %val0 = load float, float* %ptr0 @@ -286,6 +389,17 @@ define <8 x float> @merge_8f32_f32_1u3u5zu8(float* %ptr) nounwind uwtable noinli ; AVX512F-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],mem[0],xmm1[3] ; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 ; AVX512F-NEXT: retq +; +; X32-AVX-LABEL: merge_8f32_f32_1u3u5zu8: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X32-AVX-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero +; X32-AVX-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero +; X32-AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm2[0,1],xmm0[1,0] +; X32-AVX-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],mem[0],xmm1[3] +; X32-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds float, float* %ptr, i64 1 %ptr2 = getelementptr inbounds float, float* %ptr, i64 3 %ptr4 = getelementptr inbounds float, float* %ptr, i64 5 @@ -308,6 +422,13 @@ define <8 x i32> @merge_8i32_4i32_z3(<4 x i32>* %ptr) nounwind uwtable noinline ; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0 ; AVX-NEXT: vinsertf128 $1, 48(%rdi), %ymm0, %ymm0 ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_8i32_4i32_z3: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0 +; X32-AVX-NEXT: vinsertf128 $1, 48(%eax), %ymm0, %ymm0 +; X32-AVX-NEXT: retl %ptr1 = getelementptr inbounds <4 x i32>, <4 x i32>* %ptr, i64 3 %val1 = load <4 x i32>, <4 x i32>* %ptr1 %res = shufflevector <4 x i32> zeroinitializer, <4 x i32> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> @@ -335,6 +456,14 @@ define <8 x i32> @merge_8i32_i32_56zz9uzz(i32* %ptr) nounwind uwtable noinline s ; AVX512F-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 ; AVX512F-NEXT: retq +; +; X32-AVX-LABEL: merge_8i32_i32_56zz9uzz: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero +; X32-AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero +; X32-AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds i32, i32* %ptr, i64 5 %ptr1 = getelementptr inbounds i32, i32* %ptr, i64 6 %ptr4 = getelementptr inbounds i32, i32* %ptr, i64 9 @@ -384,6 +513,18 @@ define <8 x i32> @merge_8i32_i32_1u3u5zu8(i32* %ptr) nounwind uwtable noinline s ; AVX512F-NEXT: vpinsrd $2, 12(%rdi), %xmm1, %xmm1 ; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 ; AVX512F-NEXT: retq +; +; X32-AVX-LABEL: merge_8i32_i32_1u3u5zu8: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X32-AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero +; X32-AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,1,0] +; X32-AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] +; X32-AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero +; X32-AVX-NEXT: vpinsrd $2, 12(%eax), %xmm1, %xmm1 +; X32-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds i32, i32* %ptr, i64 1 %ptr2 = getelementptr inbounds i32, i32* %ptr, i64 3 %ptr4 = getelementptr inbounds i32, i32* %ptr, i64 5 @@ -424,6 +565,15 @@ define <16 x i16> @merge_16i16_i16_89zzzuuuuuuuuuuuz(i16* %ptr) nounwind uwtable ; AVX512F-NEXT: vpinsrw $1, 18(%rdi), %xmm1, %xmm1 ; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 ; AVX512F-NEXT: retq +; +; X32-AVX-LABEL: merge_16i16_i16_89zzzuuuuuuuuuuuz: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vpxor %xmm0, %xmm0, %xmm0 +; X32-AVX-NEXT: vpinsrw $0, 16(%eax), %xmm0, %xmm1 +; X32-AVX-NEXT: vpinsrw $1, 18(%eax), %xmm1, %xmm1 +; X32-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 8 %ptr1 = getelementptr inbounds i16, i16* %ptr, i64 9 %val0 = load i16, i16* %ptr0 @@ -442,6 +592,12 @@ define <16 x i16> @merge_16i16_i16_45u7uuuuuuuuuuuu(i16* %ptr) nounwind uwtable ; AVX: # BB#0: ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_16i16_i16_45u7uuuuuuuuuuuu: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 4 %ptr1 = getelementptr inbounds i16, i16* %ptr, i64 5 %ptr3 = getelementptr inbounds i16, i16* %ptr, i64 7 @@ -459,6 +615,12 @@ define <16 x i16> @merge_16i16_i16_0uu3uuuuuuuuCuEF(i16* %ptr) nounwind uwtable ; AVX: # BB#0: ; AVX-NEXT: vmovups (%rdi), %ymm0 ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_16i16_i16_0uu3uuuuuuuuCuEF: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovups (%eax), %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 0 %ptr3 = getelementptr inbounds i16, i16* %ptr, i64 3 %ptrC = getelementptr inbounds i16, i16* %ptr, i64 12 @@ -507,6 +669,17 @@ define <16 x i16> @merge_16i16_i16_0uu3zzuuuuuzCuEF(i16* %ptr) nounwind uwtable ; AVX512F-NEXT: vpinsrw $7, 30(%rdi), %xmm1, %xmm1 ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 ; AVX512F-NEXT: retq +; +; X32-AVX-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero +; X32-AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1 +; X32-AVX-NEXT: vpinsrw $4, 24(%eax), %xmm1, %xmm1 +; X32-AVX-NEXT: vpinsrw $6, 28(%eax), %xmm1, %xmm1 +; X32-AVX-NEXT: vpinsrw $7, 30(%eax), %xmm1, %xmm1 +; X32-AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 0 %ptr3 = getelementptr inbounds i16, i16* %ptr, i64 3 %ptrC = getelementptr inbounds i16, i16* %ptr, i64 12 @@ -535,6 +708,14 @@ define <32 x i8> @merge_32i8_i8_45u7uuuuuuuuuuuuuuuuuuuuuuuuuuuu(i8* %ptr) nounw ; AVX-NEXT: vpinsrb $1, 5(%rdi), %xmm0, %xmm0 ; AVX-NEXT: vpinsrb $3, 7(%rdi), %xmm0, %xmm0 ; AVX-NEXT: retq +; +; X32-AVX-LABEL: merge_32i8_i8_45u7uuuuuuuuuuuuuuuuuuuuuuuuuuuu: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vpinsrb $0, 4(%eax), %xmm0, %xmm0 +; X32-AVX-NEXT: vpinsrb $1, 5(%eax), %xmm0, %xmm0 +; X32-AVX-NEXT: vpinsrb $3, 7(%eax), %xmm0, %xmm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds i8, i8* %ptr, i64 4 %ptr1 = getelementptr inbounds i8, i8* %ptr, i64 5 %ptr3 = getelementptr inbounds i8, i8* %ptr, i64 7 @@ -574,6 +755,16 @@ define <32 x i8> @merge_32i8_i8_23u5uuuuuuuuuuzzzzuuuuuuuuuuuuuu(i8* %ptr) nounw ; AVX512F-NEXT: vpinsrb $3, 5(%rdi), %xmm1, %xmm1 ; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 ; AVX512F-NEXT: retq +; +; X32-AVX-LABEL: merge_32i8_i8_23u5uuuuuuuuuuzzzzuuuuuuuuuuuuuu: +; X32-AVX: # BB#0: +; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX-NEXT: vpxor %xmm0, %xmm0, %xmm0 +; X32-AVX-NEXT: vpinsrb $0, 2(%eax), %xmm0, %xmm1 +; X32-AVX-NEXT: vpinsrb $1, 3(%eax), %xmm1, %xmm1 +; X32-AVX-NEXT: vpinsrb $3, 5(%eax), %xmm1, %xmm1 +; X32-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 +; X32-AVX-NEXT: retl %ptr0 = getelementptr inbounds i8, i8* %ptr, i64 2 %ptr1 = getelementptr inbounds i8, i8* %ptr, i64 3 %ptr3 = getelementptr inbounds i8, i8* %ptr, i64 5 diff --git a/llvm/test/CodeGen/X86/merge-consecutive-loads-512.ll b/llvm/test/CodeGen/X86/merge-consecutive-loads-512.ll index 811d3da005f..9ce19ab1236 100644 --- a/llvm/test/CodeGen/X86/merge-consecutive-loads-512.ll +++ b/llvm/test/CodeGen/X86/merge-consecutive-loads-512.ll @@ -1,6 +1,9 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX512F ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512BW +; +; Just one 32-bit run to make sure we do reasonable things. +; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=X32-AVX512F define <8 x double> @merge_8f64_2f64_12u4(<2 x double>* %ptr) nounwind uwtable noinline ssp { ; ALL-LABEL: merge_8f64_2f64_12u4: @@ -9,6 +12,14 @@ define <8 x double> @merge_8f64_2f64_12u4(<2 x double>* %ptr) nounwind uwtable n ; ALL-NEXT: vinsertf64x4 $0, 16(%rdi), %zmm0, %zmm1 ; ALL-NEXT: vinsertf64x4 $1, %ymm0, %zmm1, %zmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_8f64_2f64_12u4: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vinsertf128 $1, 64(%eax), %ymm0, %ymm0 +; X32-AVX512F-NEXT: vinsertf64x4 $0, 16(%eax), %zmm0, %zmm1 +; X32-AVX512F-NEXT: vinsertf64x4 $1, %ymm0, %zmm1, %zmm0 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds <2 x double>, <2 x double>* %ptr, i64 1 %ptr1 = getelementptr inbounds <2 x double>, <2 x double>* %ptr, i64 2 %ptr3 = getelementptr inbounds <2 x double>, <2 x double>* %ptr, i64 4 @@ -29,6 +40,15 @@ define <8 x double> @merge_8f64_2f64_23z5(<2 x double>* %ptr) nounwind uwtable n ; ALL-NEXT: vinsertf64x4 $0, 32(%rdi), %zmm0, %zmm1 ; ALL-NEXT: vinsertf64x4 $1, %ymm0, %zmm1, %zmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_8f64_2f64_23z5: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vxorpd %xmm0, %xmm0, %xmm0 +; X32-AVX512F-NEXT: vinsertf128 $1, 80(%eax), %ymm0, %ymm0 +; X32-AVX512F-NEXT: vinsertf64x4 $0, 32(%eax), %zmm0, %zmm1 +; X32-AVX512F-NEXT: vinsertf64x4 $1, %ymm0, %zmm1, %zmm0 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds <2 x double>, <2 x double>* %ptr, i64 2 %ptr1 = getelementptr inbounds <2 x double>, <2 x double>* %ptr, i64 3 %ptr3 = getelementptr inbounds <2 x double>, <2 x double>* %ptr, i64 5 @@ -47,6 +67,13 @@ define <8 x double> @merge_8f64_4f64_z2(<4 x double>* %ptr) nounwind uwtable noi ; ALL-NEXT: vxorpd %ymm0, %ymm0, %ymm0 ; ALL-NEXT: vinsertf64x4 $1, 64(%rdi), %zmm0, %zmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_8f64_4f64_z2: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vxorpd %ymm0, %ymm0, %ymm0 +; X32-AVX512F-NEXT: vinsertf64x4 $1, 64(%eax), %zmm0, %zmm0 +; X32-AVX512F-NEXT: retl %ptr1 = getelementptr inbounds <4 x double>, <4 x double>* %ptr, i64 2 %val1 = load <4 x double>, <4 x double>* %ptr1 %res = shufflevector <4 x double> zeroinitializer, <4 x double> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> @@ -58,6 +85,12 @@ define <8 x double> @merge_8f64_f64_23uuuuu9(double* %ptr) nounwind uwtable noin ; ALL: # BB#0: ; ALL-NEXT: vmovupd 16(%rdi), %zmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_8f64_f64_23uuuuu9: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovupd 16(%eax), %zmm0 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds double, double* %ptr, i64 2 %ptr1 = getelementptr inbounds double, double* %ptr, i64 3 %ptr7 = getelementptr inbounds double, double* %ptr, i64 9 @@ -79,6 +112,16 @@ define <8 x double> @merge_8f64_f64_12zzuuzz(double* %ptr) nounwind uwtable noin ; ALL-NEXT: vxorpd %ymm1, %ymm1, %ymm1 ; ALL-NEXT: vinsertf64x4 $1, %ymm1, %zmm0, %zmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_8f64_f64_12zzuuzz: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovupd 8(%eax), %xmm0 +; X32-AVX512F-NEXT: vxorpd %xmm1, %xmm1, %xmm1 +; X32-AVX512F-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 +; X32-AVX512F-NEXT: vxorpd %ymm1, %ymm1, %ymm1 +; X32-AVX512F-NEXT: vinsertf64x4 $1, %ymm1, %zmm0, %zmm0 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds double, double* %ptr, i64 1 %ptr1 = getelementptr inbounds double, double* %ptr, i64 2 %val0 = load double, double* %ptr0 @@ -103,6 +146,18 @@ define <8 x double> @merge_8f64_f64_1u3u5zu8(double* %ptr) nounwind uwtable noin ; ALL-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 ; ALL-NEXT: vinsertf64x4 $1, %ymm0, %zmm1, %zmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_8f64_f64_1u3u5zu8: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero +; X32-AVX512F-NEXT: vmovddup {{.*#+}} xmm1 = mem[0,0] +; X32-AVX512F-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 +; X32-AVX512F-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero +; X32-AVX512F-NEXT: vmovsd {{.*#+}} xmm2 = mem[0],zero +; X32-AVX512F-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 +; X32-AVX512F-NEXT: vinsertf64x4 $1, %ymm0, %zmm1, %zmm0 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds double, double* %ptr, i64 1 %ptr2 = getelementptr inbounds double, double* %ptr, i64 3 %ptr4 = getelementptr inbounds double, double* %ptr, i64 5 @@ -125,6 +180,13 @@ define <8 x i64> @merge_8i64_4i64_z3(<4 x i64>* %ptr) nounwind uwtable noinline ; ALL-NEXT: vpxor %ymm0, %ymm0, %ymm0 ; ALL-NEXT: vinserti64x4 $1, 96(%rdi), %zmm0, %zmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_8i64_4i64_z3: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vpxor %ymm0, %ymm0, %ymm0 +; X32-AVX512F-NEXT: vinserti64x4 $1, 96(%eax), %zmm0, %zmm0 +; X32-AVX512F-NEXT: retl %ptr1 = getelementptr inbounds <4 x i64>, <4 x i64>* %ptr, i64 3 %val1 = load <4 x i64>, <4 x i64>* %ptr1 %res = shufflevector <4 x i64> zeroinitializer, <4 x i64> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> @@ -140,6 +202,16 @@ define <8 x i64> @merge_8i64_i64_56zz9uzz(i64* %ptr) nounwind uwtable noinline s ; ALL-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero ; ALL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_8i64_i64_56zz9uzz: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovdqu 40(%eax), %xmm0 +; X32-AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 +; X32-AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 +; X32-AVX512F-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero +; X32-AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds i64, i64* %ptr, i64 5 %ptr1 = getelementptr inbounds i64, i64* %ptr, i64 6 %ptr4 = getelementptr inbounds i64, i64* %ptr, i64 9 @@ -167,6 +239,19 @@ define <8 x i64> @merge_8i64_i64_1u3u5zu8(i64* %ptr) nounwind uwtable noinline s ; ALL-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 ; ALL-NEXT: vinserti64x4 $1, %ymm0, %zmm1, %zmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_8i64_i64_1u3u5zu8: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vpinsrd $2, 64(%eax), %xmm0, %xmm0 +; X32-AVX512F-NEXT: vpinsrd $3, 68(%eax), %xmm0, %xmm0 +; X32-AVX512F-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero +; X32-AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 +; X32-AVX512F-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero +; X32-AVX512F-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero +; X32-AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; X32-AVX512F-NEXT: vinserti64x4 $1, %ymm0, %zmm1, %zmm0 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds i64, i64* %ptr, i64 1 %ptr2 = getelementptr inbounds i64, i64* %ptr, i64 3 %ptr4 = getelementptr inbounds i64, i64* %ptr, i64 5 @@ -188,6 +273,12 @@ define <16 x float> @merge_16f32_f32_89zzzuuuuuuuuuuuz(float* %ptr) nounwind uwt ; ALL: # BB#0: ; ALL-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_16f32_f32_89zzzuuuuuuuuuuuz: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds float, float* %ptr, i64 8 %ptr1 = getelementptr inbounds float, float* %ptr, i64 9 %val0 = load float, float* %ptr0 @@ -206,6 +297,12 @@ define <16 x float> @merge_16f32_f32_45u7uuuuuuuuuuuu(float* %ptr) nounwind uwta ; ALL: # BB#0: ; ALL-NEXT: vmovups 16(%rdi), %xmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_16f32_f32_45u7uuuuuuuuuuuu: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovups 16(%eax), %xmm0 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds float, float* %ptr, i64 4 %ptr1 = getelementptr inbounds float, float* %ptr, i64 5 %ptr3 = getelementptr inbounds float, float* %ptr, i64 7 @@ -223,6 +320,12 @@ define <16 x float> @merge_16f32_f32_0uu3uuuuuuuuCuEF(float* %ptr) nounwind uwta ; ALL: # BB#0: ; ALL-NEXT: vmovups (%rdi), %zmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_16f32_f32_0uu3uuuuuuuuCuEF: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovups (%eax), %zmm0 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds float, float* %ptr, i64 0 %ptr3 = getelementptr inbounds float, float* %ptr, i64 3 %ptrC = getelementptr inbounds float, float* %ptr, i64 12 @@ -253,6 +356,19 @@ define <16 x float> @merge_16f32_f32_0uu3zzuuuuuzCuEF(float* %ptr) nounwind uwta ; ALL-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 ; ALL-NEXT: vinsertf64x4 $1, %ymm0, %zmm1, %zmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_16f32_f32_0uu3zzuuuuuzCuEF: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero +; X32-AVX512F-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero +; X32-AVX512F-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0] +; X32-AVX512F-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 +; X32-AVX512F-NEXT: vmovupd (%eax), %xmm1 +; X32-AVX512F-NEXT: vxorpd %xmm2, %xmm2, %xmm2 +; X32-AVX512F-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 +; X32-AVX512F-NEXT: vinsertf64x4 $1, %ymm0, %zmm1, %zmm0 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds float, float* %ptr, i64 0 %ptr3 = getelementptr inbounds float, float* %ptr, i64 3 %ptrC = getelementptr inbounds float, float* %ptr, i64 12 @@ -279,6 +395,12 @@ define <16 x i32> @merge_16i32_i32_12zzzuuuuuuuuuuuz(i32* %ptr) nounwind uwtable ; ALL: # BB#0: ; ALL-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_16i32_i32_12zzzuuuuuuuuuuuz: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds i32, i32* %ptr, i64 1 %ptr1 = getelementptr inbounds i32, i32* %ptr, i64 2 %val0 = load i32, i32* %ptr0 @@ -297,6 +419,12 @@ define <16 x i32> @merge_16i32_i32_23u5uuuuuuuuuuuu(i32* %ptr) nounwind uwtable ; ALL: # BB#0: ; ALL-NEXT: vmovups 8(%rdi), %xmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_16i32_i32_23u5uuuuuuuuuuuu: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovups 8(%eax), %xmm0 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds i32, i32* %ptr, i64 2 %ptr1 = getelementptr inbounds i32, i32* %ptr, i64 3 %ptr3 = getelementptr inbounds i32, i32* %ptr, i64 5 @@ -314,6 +442,12 @@ define <16 x i32> @merge_16i32_i32_0uu3uuuuuuuuCuEF(i32* %ptr) nounwind uwtable ; ALL: # BB#0: ; ALL-NEXT: vmovdqu32 (%rdi), %zmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_16i32_i32_0uu3uuuuuuuuCuEF: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovdqu32 (%eax), %zmm0 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds i32, i32* %ptr, i64 0 %ptr3 = getelementptr inbounds i32, i32* %ptr, i64 3 %ptrC = getelementptr inbounds i32, i32* %ptr, i64 12 @@ -344,6 +478,19 @@ define <16 x i32> @merge_16i32_i32_0uu3zzuuuuuzCuEF(i32* %ptr) nounwind uwtable ; ALL-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 ; ALL-NEXT: vinserti64x4 $1, %ymm0, %zmm1, %zmm0 ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_16i32_i32_0uu3zzuuuuuzCuEF: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero +; X32-AVX512F-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero +; X32-AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] +; X32-AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0 +; X32-AVX512F-NEXT: vmovdqu (%eax), %xmm1 +; X32-AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; X32-AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; X32-AVX512F-NEXT: vinserti64x4 $1, %ymm0, %zmm1, %zmm0 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds i32, i32* %ptr, i64 0 %ptr3 = getelementptr inbounds i32, i32* %ptr, i64 3 %ptrC = getelementptr inbounds i32, i32* %ptr, i64 12 @@ -376,6 +523,13 @@ define <32 x i16> @merge_32i16_i16_12u4uuuuuuuuuuuuuuuuuuuuuuuuuuzz(i16* %ptr) n ; AVX512BW: # BB#0: ; AVX512BW-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; AVX512BW-NEXT: retq +; +; X32-AVX512F-LABEL: merge_32i16_i16_12u4uuuuuuuuuuuuuuuuuuuuuuuuuuzz: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero +; X32-AVX512F-NEXT: vxorps %ymm1, %ymm1, %ymm1 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 1 %ptr1 = getelementptr inbounds i16, i16* %ptr, i64 2 %ptr3 = getelementptr inbounds i16, i16* %ptr, i64 4 @@ -395,6 +549,12 @@ define <32 x i16> @merge_32i16_i16_45u7uuuuuuuuuuuuuuuuuuuuuuuuuuuu(i16* %ptr) n ; ALL: # BB#0: ; ALL-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; ALL-NEXT: retq +; +; X32-AVX512F-LABEL: merge_32i16_i16_45u7uuuuuuuuuuuuuuuuuuuuuuuuuuuu: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 4 %ptr1 = getelementptr inbounds i16, i16* %ptr, i64 5 %ptr3 = getelementptr inbounds i16, i16* %ptr, i64 7 @@ -426,6 +586,16 @@ define <32 x i16> @merge_32i16_i16_23uzuuuuuuuuuuzzzzuuuuuuuuuuuuuu(i16* %ptr) n ; AVX512BW-NEXT: vpxor %ymm1, %ymm1, %ymm1 ; AVX512BW-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 ; AVX512BW-NEXT: retq +; +; X32-AVX512F-LABEL: merge_32i16_i16_23uzuuuuuuuuuuzzzzuuuuuuuuuuuuuu: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vpxor %xmm0, %xmm0, %xmm0 +; X32-AVX512F-NEXT: vpinsrw $0, 4(%eax), %xmm0, %xmm1 +; X32-AVX512F-NEXT: vpinsrw $1, 6(%eax), %xmm1, %xmm1 +; X32-AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 +; X32-AVX512F-NEXT: vpxor %ymm1, %ymm1, %ymm1 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds i16, i16* %ptr, i64 2 %ptr1 = getelementptr inbounds i16, i16* %ptr, i64 3 %val0 = load i16, i16* %ptr0 @@ -451,6 +621,13 @@ define <64 x i8> @merge_64i8_i8_12u4uuu8uuuuuuzzzzuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu ; AVX512BW: # BB#0: ; AVX512BW-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero ; AVX512BW-NEXT: retq +; +; X32-AVX512F-LABEL: merge_64i8_i8_12u4uuu8uuuuuuzzzzuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuz: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero +; X32-AVX512F-NEXT: vxorps %ymm1, %ymm1, %ymm1 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds i8, i8* %ptr, i64 1 %ptr1 = getelementptr inbounds i8, i8* %ptr, i64 2 %ptr3 = getelementptr inbounds i8, i8* %ptr, i64 4 @@ -492,6 +669,17 @@ define <64 x i8> @merge_64i8_i8_12u4uuuuuuuuuuzzzzuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu ; AVX512BW-NEXT: vpxor %ymm1, %ymm1, %ymm1 ; AVX512BW-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 ; AVX512BW-NEXT: retq +; +; X32-AVX512F-LABEL: merge_64i8_i8_12u4uuuuuuuuuuzzzzuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuz: +; X32-AVX512F: # BB#0: +; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax +; X32-AVX512F-NEXT: vpxor %xmm0, %xmm0, %xmm0 +; X32-AVX512F-NEXT: vpinsrb $0, 1(%eax), %xmm0, %xmm1 +; X32-AVX512F-NEXT: vpinsrb $1, 2(%eax), %xmm1, %xmm1 +; X32-AVX512F-NEXT: vpinsrb $3, 4(%eax), %xmm1, %xmm1 +; X32-AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 +; X32-AVX512F-NEXT: vpxor %ymm1, %ymm1, %ymm1 +; X32-AVX512F-NEXT: retl %ptr0 = getelementptr inbounds i8, i8* %ptr, i64 1 %ptr1 = getelementptr inbounds i8, i8* %ptr, i64 2 %ptr3 = getelementptr inbounds i8, i8* %ptr, i64 4 |