diff options
Diffstat (limited to 'llvm/test/CodeGen/X86/compress_expand.ll')
-rw-r--r-- | llvm/test/CodeGen/X86/compress_expand.ll | 163 |
1 files changed, 161 insertions, 2 deletions
diff --git a/llvm/test/CodeGen/X86/compress_expand.ll b/llvm/test/CodeGen/X86/compress_expand.ll index 555d998eddb..1e34c1aa098 100644 --- a/llvm/test/CodeGen/X86/compress_expand.ll +++ b/llvm/test/CodeGen/X86/compress_expand.ll @@ -1,6 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc -mattr=+avx512vl,+avx512dq,+avx512bw < %s | FileCheck %s --check-prefix=ALL --check-prefix=SKX -; RUN: llc -mattr=+avx512f < %s | FileCheck %s --check-prefix=ALL --check-prefix=KNL +; RUN: llc -mcpu=skylake-avx512 < %s | FileCheck %s --check-prefix=ALL --check-prefix=SKX +; RUN: llc -mcpu=knl < %s | FileCheck %s --check-prefix=ALL --check-prefix=KNL target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @@ -235,6 +235,157 @@ define void @test12(float* %base, <4 x float> %V, <4 x i1> %mask) { ret void } +define <2 x float> @test13(float* %base, <2 x float> %src0, <2 x i32> %trigger) { +; SKX-LABEL: test13: +; SKX: # BB#0: +; SKX-NEXT: vpxord %xmm2, %xmm2, %xmm2 +; SKX-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3] +; SKX-NEXT: vpcmpeqq %xmm2, %xmm1, %k0 +; SKX-NEXT: kshiftlb $6, %k0, %k0 +; SKX-NEXT: kshiftrb $6, %k0, %k1 +; SKX-NEXT: vexpandps (%rdi), %xmm0 {%k1} +; SKX-NEXT: retq +; +; KNL-LABEL: test13: +; KNL: # BB#0: +; KNL-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> +; KNL-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; KNL-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3] +; KNL-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 +; KNL-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] +; KNL-NEXT: vmovq {{.*#+}} xmm1 = xmm1[0],zero +; KNL-NEXT: vpxord %zmm2, %zmm2, %zmm2 +; KNL-NEXT: vinserti32x4 $0, %xmm1, %zmm2, %zmm1 +; KNL-NEXT: vpslld $31, %zmm1, %zmm1 +; KNL-NEXT: vptestmd %zmm1, %zmm1, %k1 +; KNL-NEXT: vexpandps (%rdi), %zmm0 {%k1} +; KNL-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> +; KNL-NEXT: retq + %mask = icmp eq <2 x i32> %trigger, zeroinitializer + %res = call <2 x float> @llvm.masked.expandload.v2f32(float* %base, <2 x i1> %mask, <2 x float> %src0) + ret <2 x float> %res +} + +define void @test14(float* %base, <2 x float> %V, <2 x i32> %trigger) { +; SKX-LABEL: test14: +; SKX: # BB#0: +; SKX-NEXT: vpxord %xmm2, %xmm2, %xmm2 +; SKX-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3] +; SKX-NEXT: vpcmpeqq %xmm2, %xmm1, %k0 +; SKX-NEXT: kshiftlb $6, %k0, %k0 +; SKX-NEXT: kshiftrb $6, %k0, %k1 +; SKX-NEXT: vcompressps %xmm0, (%rdi) {%k1} +; SKX-NEXT: retq +; +; KNL-LABEL: test14: +; KNL: # BB#0: +; KNL-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> +; KNL-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; KNL-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3] +; KNL-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 +; KNL-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] +; KNL-NEXT: vmovq {{.*#+}} xmm1 = xmm1[0],zero +; KNL-NEXT: vpxord %zmm2, %zmm2, %zmm2 +; KNL-NEXT: vinserti32x4 $0, %xmm1, %zmm2, %zmm1 +; KNL-NEXT: vpslld $31, %zmm1, %zmm1 +; KNL-NEXT: vptestmd %zmm1, %zmm1, %k1 +; KNL-NEXT: vcompressps %zmm0, (%rdi) {%k1} +; KNL-NEXT: retq + %mask = icmp eq <2 x i32> %trigger, zeroinitializer + call void @llvm.masked.compressstore.v2f32(<2 x float> %V, float* %base, <2 x i1> %mask) + ret void +} + +define <32 x float> @test15(float* %base, <32 x float> %src0, <32 x i32> %trigger) { +; ALL-LABEL: test15: +; ALL: # BB#0: +; ALL-NEXT: vpxord %zmm4, %zmm4, %zmm4 +; ALL-NEXT: vpcmpeqd %zmm4, %zmm3, %k1 +; ALL-NEXT: vpcmpeqd %zmm4, %zmm2, %k2 +; ALL-NEXT: kmovw %k2, %eax +; ALL-NEXT: popcntl %eax, %eax +; ALL-NEXT: vexpandps (%rdi,%rax,4), %zmm1 {%k1} +; ALL-NEXT: vexpandps (%rdi), %zmm0 {%k2} +; ALL-NEXT: retq + %mask = icmp eq <32 x i32> %trigger, zeroinitializer + %res = call <32 x float> @llvm.masked.expandload.v32f32(float* %base, <32 x i1> %mask, <32 x float> %src0) + ret <32 x float> %res +} + +define <16 x double> @test16(double* %base, <16 x double> %src0, <16 x i32> %trigger) { +; SKX-LABEL: test16: +; SKX: # BB#0: +; SKX-NEXT: vextracti32x8 $1, %zmm2, %ymm3 +; SKX-NEXT: vpxord %ymm4, %ymm4, %ymm4 +; SKX-NEXT: vpcmpeqd %ymm4, %ymm3, %k1 +; SKX-NEXT: vpcmpeqd %ymm4, %ymm2, %k2 +; SKX-NEXT: kmovb %k2, %eax +; SKX-NEXT: popcntl %eax, %eax +; SKX-NEXT: vexpandpd (%rdi,%rax,8), %zmm1 {%k1} +; SKX-NEXT: vexpandpd (%rdi), %zmm0 {%k2} +; SKX-NEXT: retq +; +; KNL-LABEL: test16: +; KNL: # BB#0: +; KNL-NEXT: vpxor %ymm3, %ymm3, %ymm3 +; KNL-NEXT: vextracti64x4 $1, %zmm2, %ymm4 +; KNL-NEXT: vpcmpeqd %zmm3, %zmm4, %k1 +; KNL-NEXT: vpcmpeqd %zmm3, %zmm2, %k2 +; KNL-NEXT: vexpandpd (%rdi), %zmm0 {%k2} +; KNL-NEXT: kmovw %k2, %eax +; KNL-NEXT: movzbl %al, %eax +; KNL-NEXT: popcntl %eax, %eax +; KNL-NEXT: vexpandpd (%rdi,%rax,8), %zmm1 {%k1} +; KNL-NEXT: retq + %mask = icmp eq <16 x i32> %trigger, zeroinitializer + %res = call <16 x double> @llvm.masked.expandload.v16f64(double* %base, <16 x i1> %mask, <16 x double> %src0) + ret <16 x double> %res +} + +define void @test17(float* %base, <32 x float> %V, <32 x i32> %trigger) { +; ALL-LABEL: test17: +; ALL: # BB#0: +; ALL-NEXT: vpxord %zmm4, %zmm4, %zmm4 +; ALL-NEXT: vpcmpeqd %zmm4, %zmm3, %k1 +; ALL-NEXT: vpcmpeqd %zmm4, %zmm2, %k2 +; ALL-NEXT: kmovw %k2, %eax +; ALL-NEXT: popcntl %eax, %eax +; ALL-NEXT: vcompressps %zmm1, (%rdi,%rax,4) {%k1} +; ALL-NEXT: vcompressps %zmm0, (%rdi) {%k2} +; ALL-NEXT: retq + %mask = icmp eq <32 x i32> %trigger, zeroinitializer + call void @llvm.masked.compressstore.v32f32(<32 x float> %V, float* %base, <32 x i1> %mask) + ret void +} + +define void @test18(double* %base, <16 x double> %V, <16 x i1> %mask) { +; SKX-LABEL: test18: +; SKX: # BB#0: +; SKX-NEXT: vpsllw $7, %xmm2, %xmm2 +; SKX-NEXT: vpmovb2m %xmm2, %k1 +; SKX-NEXT: kshiftrw $8, %k1, %k2 +; SKX-NEXT: kmovb %k1, %eax +; SKX-NEXT: popcntl %eax, %eax +; SKX-NEXT: vcompresspd %zmm1, (%rdi,%rax,8) {%k2} +; SKX-NEXT: vcompresspd %zmm0, (%rdi) {%k1} +; SKX-NEXT: retq +; +; KNL-LABEL: test18: +; KNL: # BB#0: +; KNL-NEXT: vpmovsxbd %xmm2, %zmm2 +; KNL-NEXT: vpslld $31, %zmm2, %zmm2 +; KNL-NEXT: vptestmd %zmm2, %zmm2, %k1 +; KNL-NEXT: kshiftrw $8, %k1, %k2 +; KNL-NEXT: kmovw %k1, %eax +; KNL-NEXT: movzbl %al, %eax +; KNL-NEXT: popcntl %eax, %eax +; KNL-NEXT: vcompresspd %zmm1, (%rdi,%rax,8) {%k2} +; KNL-NEXT: vcompresspd %zmm0, (%rdi) {%k1} +; KNL-NEXT: retq + call void @llvm.masked.compressstore.v16f64(<16 x double> %V, double* %base, <16 x i1> %mask) + ret void +} + declare void @llvm.masked.compressstore.v16f32(<16 x float>, float* , <16 x i1>) declare void @llvm.masked.compressstore.v8f32(<8 x float>, float* , <8 x i1>) declare void @llvm.masked.compressstore.v8f64(<8 x double>, double* , <8 x i1>) @@ -245,3 +396,11 @@ declare void @llvm.masked.compressstore.v4i32(<4 x i32>, i32* , <4 x i1>) declare void @llvm.masked.compressstore.v4f32(<4 x float>, float* , <4 x i1>) declare void @llvm.masked.compressstore.v4i64(<4 x i64>, i64* , <4 x i1>) declare void @llvm.masked.compressstore.v2i64(<2 x i64>, i64* , <2 x i1>) +declare void @llvm.masked.compressstore.v2f32(<2 x float>, float* , <2 x i1>) +declare void @llvm.masked.compressstore.v32f32(<32 x float>, float* , <32 x i1>) +declare void @llvm.masked.compressstore.v16f64(<16 x double>, double* , <16 x i1>) +declare void @llvm.masked.compressstore.v32f64(<32 x double>, double* , <32 x i1>) + +declare <2 x float> @llvm.masked.expandload.v2f32(float* , <2 x i1> , <2 x float> ) +declare <32 x float> @llvm.masked.expandload.v32f32(float* , <32 x i1> , <32 x float> ) +declare <16 x double> @llvm.masked.expandload.v16f64(double* , <16 x i1> , <16 x double> ) |