[llvm] r322449 - [X86] Add an avx512bw command line to the avx512-vec-cmp.ll test. Add some additional test cases.

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Sat Jan 13 18:05:49 PST 2018


Author: ctopper
Date: Sat Jan 13 18:05:49 2018
New Revision: 322449

URL: http://llvm.org/viewvc/llvm-project?rev=322449&view=rev
Log:
[X86] Add an avx512bw command line to the avx512-vec-cmp.ll test. Add some additional test cases.

Additional test cases cover selects with i16/i8 conditions that are only 128/256-bits wide, but the compares are 512-bits wide and can only produce k-registers. We should be able to artificially widen the selects to avoid moving the k-register to an xmm/ymm register.

Modified:
    llvm/trunk/test/CodeGen/X86/avx512-vec-cmp.ll

Modified: llvm/trunk/test/CodeGen/X86/avx512-vec-cmp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512-vec-cmp.ll?rev=322449&r1=322448&r2=322449&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/avx512-vec-cmp.ll (original)
+++ llvm/trunk/test/CodeGen/X86/avx512-vec-cmp.ll Sat Jan 13 18:05:49 2018
@@ -1,5 +1,6 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=KNL
+; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512 --check-prefix=KNL
+; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512 --check-prefix=AVX512BW
 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq | FileCheck %s --check-prefix=CHECK --check-prefix=SKX
 
 define <16 x float> @test1(<16 x float> %x, <16 x float> %y) nounwind {
@@ -70,16 +71,16 @@ define <8 x i64> @test6_unsigned(<8 x i6
 }
 
 define <4 x float> @test7(<4 x float> %a, <4 x float> %b) {
-; KNL-LABEL: test7:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    ## kill: def %xmm1 killed %xmm1 def %zmm1
-; KNL-NEXT:    ## kill: def %xmm0 killed %xmm0 def %zmm0
-; KNL-NEXT:    vxorps %xmm2, %xmm2, %xmm2
-; KNL-NEXT:    vcmpltps %zmm2, %zmm0, %k1
-; KNL-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
-; KNL-NEXT:    ## kill: def %xmm0 killed %xmm0 killed %zmm0
-; KNL-NEXT:    vzeroupper
-; KNL-NEXT:    retq
+; AVX512-LABEL: test7:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    ## kill: def %xmm1 killed %xmm1 def %zmm1
+; AVX512-NEXT:    ## kill: def %xmm0 killed %xmm0 def %zmm0
+; AVX512-NEXT:    vxorps %xmm2, %xmm2, %xmm2
+; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1
+; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
+; AVX512-NEXT:    ## kill: def %xmm0 killed %xmm0 killed %zmm0
+; AVX512-NEXT:    vzeroupper
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test7:
 ; SKX:       ## %bb.0:
@@ -94,16 +95,16 @@ define <4 x float> @test7(<4 x float> %a
 }
 
 define <2 x double> @test8(<2 x double> %a, <2 x double> %b) {
-; KNL-LABEL: test8:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    ## kill: def %xmm1 killed %xmm1 def %zmm1
-; KNL-NEXT:    ## kill: def %xmm0 killed %xmm0 def %zmm0
-; KNL-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
-; KNL-NEXT:    vcmpltpd %zmm2, %zmm0, %k1
-; KNL-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
-; KNL-NEXT:    ## kill: def %xmm0 killed %xmm0 killed %zmm0
-; KNL-NEXT:    vzeroupper
-; KNL-NEXT:    retq
+; AVX512-LABEL: test8:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    ## kill: def %xmm1 killed %xmm1 def %zmm1
+; AVX512-NEXT:    ## kill: def %xmm0 killed %xmm0 def %zmm0
+; AVX512-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
+; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1
+; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
+; AVX512-NEXT:    ## kill: def %xmm0 killed %xmm0 killed %zmm0
+; AVX512-NEXT:    vzeroupper
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test8:
 ; SKX:       ## %bb.0:
@@ -117,14 +118,14 @@ define <2 x double> @test8(<2 x double>
 }
 
 define <8 x i32> @test9(<8 x i32> %x, <8 x i32> %y) nounwind {
-; KNL-LABEL: test9:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    ## kill: def %ymm1 killed %ymm1 def %zmm1
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 def %zmm0
-; KNL-NEXT:    vpcmpeqd %zmm1, %zmm0, %k1
-; KNL-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
-; KNL-NEXT:    retq
+; AVX512-LABEL: test9:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    ## kill: def %ymm1 killed %ymm1 def %zmm1
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 def %zmm0
+; AVX512-NEXT:    vpcmpeqd %zmm1, %zmm0, %k1
+; AVX512-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test9:
 ; SKX:       ## %bb.0:
@@ -137,14 +138,14 @@ define <8 x i32> @test9(<8 x i32> %x, <8
 }
 
 define <8 x float> @test10(<8 x float> %x, <8 x float> %y) nounwind {
-; KNL-LABEL: test10:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    ## kill: def %ymm1 killed %ymm1 def %zmm1
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 def %zmm0
-; KNL-NEXT:    vcmpeqps %zmm1, %zmm0, %k1
-; KNL-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
-; KNL-NEXT:    retq
+; AVX512-LABEL: test10:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    ## kill: def %ymm1 killed %ymm1 def %zmm1
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 def %zmm0
+; AVX512-NEXT:    vcmpeqps %zmm1, %zmm0, %k1
+; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test10:
 ; SKX:       ## %bb.0:
@@ -178,6 +179,16 @@ define i16 @test12(<16 x i64> %a, <16 x
 ; KNL-NEXT:    vzeroupper
 ; KNL-NEXT:    retq
 ;
+; AVX512BW-LABEL: test12:
+; AVX512BW:       ## %bb.0:
+; AVX512BW-NEXT:    vpcmpeqq %zmm2, %zmm0, %k0
+; AVX512BW-NEXT:    vpcmpeqq %zmm3, %zmm1, %k1
+; AVX512BW-NEXT:    kunpckbw %k0, %k1, %k0
+; AVX512BW-NEXT:    kmovd %k0, %eax
+; AVX512BW-NEXT:    ## kill: def %ax killed %ax killed %eax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
 ; SKX-LABEL: test12:
 ; SKX:       ## %bb.0:
 ; SKX-NEXT:    vpcmpeqq %zmm2, %zmm0, %k0
@@ -217,6 +228,15 @@ define i32 @test12_v32i32(<32 x i32> %a,
 ; KNL-NEXT:    vzeroupper
 ; KNL-NEXT:    retq
 ;
+; AVX512BW-LABEL: test12_v32i32:
+; AVX512BW:       ## %bb.0:
+; AVX512BW-NEXT:    vpcmpeqd %zmm2, %zmm0, %k0
+; AVX512BW-NEXT:    vpcmpeqd %zmm3, %zmm1, %k1
+; AVX512BW-NEXT:    kunpckwd %k0, %k1, %k0
+; AVX512BW-NEXT:    kmovd %k0, %eax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
 ; SKX-LABEL: test12_v32i32:
 ; SKX:       ## %bb.0:
 ; SKX-NEXT:    vpcmpeqd %zmm2, %zmm0, %k0
@@ -270,6 +290,15 @@ define i64 @test12_v64i16(<64 x i16> %a,
 ; KNL-NEXT:    vzeroupper
 ; KNL-NEXT:    retq
 ;
+; AVX512BW-LABEL: test12_v64i16:
+; AVX512BW:       ## %bb.0:
+; AVX512BW-NEXT:    vpcmpeqw %zmm2, %zmm0, %k0
+; AVX512BW-NEXT:    vpcmpeqw %zmm3, %zmm1, %k1
+; AVX512BW-NEXT:    kunpckdq %k0, %k1, %k0
+; AVX512BW-NEXT:    kmovq %k0, %rax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
 ; SKX-LABEL: test12_v64i16:
 ; SKX:       ## %bb.0:
 ; SKX-NEXT:    vpcmpeqw %zmm2, %zmm0, %k0
@@ -493,14 +522,14 @@ define <8 x i64> @test27(<8 x i64> %x, i
 }
 
 define <8 x i32>@test28(<8 x i64> %x, <8 x i64> %y, <8 x i64> %x1, <8 x i64> %y1) {
-; KNL-LABEL: test28:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    vpcmpgtq %zmm1, %zmm0, %k0
-; KNL-NEXT:    vpcmpgtq %zmm3, %zmm2, %k1
-; KNL-NEXT:    kxnorw %k1, %k0, %k1
-; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
-; KNL-NEXT:    retq
+; AVX512-LABEL: test28:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    vpcmpgtq %zmm1, %zmm0, %k0
+; AVX512-NEXT:    vpcmpgtq %zmm3, %zmm2, %k1
+; AVX512-NEXT:    kxnorw %k1, %k0, %k1
+; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test28:
 ; SKX:       ## %bb.0:
@@ -527,6 +556,16 @@ define <16 x i8>@test29(<16 x i32> %x, <
 ; KNL-NEXT:    vzeroupper
 ; KNL-NEXT:    retq
 ;
+; AVX512BW-LABEL: test29:
+; AVX512BW:       ## %bb.0:
+; AVX512BW-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0
+; AVX512BW-NEXT:    vpcmpgtd %zmm3, %zmm2, %k1
+; AVX512BW-NEXT:    kxorw %k1, %k0, %k0
+; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
+; AVX512BW-NEXT:    ## kill: def %xmm0 killed %xmm0 killed %zmm0
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
 ; SKX-LABEL: test29:
 ; SKX:       ## %bb.0:
 ; SKX-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0
@@ -543,14 +582,14 @@ define <16 x i8>@test29(<16 x i32> %x, <
 }
 
 define <4 x double> @test30(<4 x double> %x, <4 x double> %y) nounwind {
-; KNL-LABEL: test30:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    ## kill: def %ymm1 killed %ymm1 def %zmm1
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 def %zmm0
-; KNL-NEXT:    vcmpeqpd %zmm1, %zmm0, %k1
-; KNL-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
-; KNL-NEXT:    retq
+; AVX512-LABEL: test30:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    ## kill: def %ymm1 killed %ymm1 def %zmm1
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 def %zmm0
+; AVX512-NEXT:    vcmpeqpd %zmm1, %zmm0, %k1
+; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test30:
 ; SKX:       ## %bb.0:
@@ -564,16 +603,16 @@ define <4 x double> @test30(<4 x double>
 }
 
 define <2 x double> @test31(<2 x double> %x, <2 x double> %x1, <2 x double>* %yp) nounwind {
-; KNL-LABEL: test31:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    ## kill: def %xmm1 killed %xmm1 def %zmm1
-; KNL-NEXT:    ## kill: def %xmm0 killed %xmm0 def %zmm0
-; KNL-NEXT:    vmovupd (%rdi), %xmm2
-; KNL-NEXT:    vcmpltpd %zmm2, %zmm0, %k1
-; KNL-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
-; KNL-NEXT:    ## kill: def %xmm0 killed %xmm0 killed %zmm0
-; KNL-NEXT:    vzeroupper
-; KNL-NEXT:    retq
+; AVX512-LABEL: test31:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    ## kill: def %xmm1 killed %xmm1 def %zmm1
+; AVX512-NEXT:    ## kill: def %xmm0 killed %xmm0 def %zmm0
+; AVX512-NEXT:    vmovupd (%rdi), %xmm2
+; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1
+; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
+; AVX512-NEXT:    ## kill: def %xmm0 killed %xmm0 killed %zmm0
+; AVX512-NEXT:    vzeroupper
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test31:
 ; SKX:       ## %bb.0:
@@ -588,15 +627,15 @@ define <2 x double> @test31(<2 x double>
 }
 
 define <4 x double> @test32(<4 x double> %x, <4 x double> %x1, <4 x double>* %yp) nounwind {
-; KNL-LABEL: test32:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    ## kill: def %ymm1 killed %ymm1 def %zmm1
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 def %zmm0
-; KNL-NEXT:    vmovupd (%rdi), %ymm2
-; KNL-NEXT:    vcmpltpd %zmm2, %zmm0, %k1
-; KNL-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
-; KNL-NEXT:    retq
+; AVX512-LABEL: test32:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    ## kill: def %ymm1 killed %ymm1 def %zmm1
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 def %zmm0
+; AVX512-NEXT:    vmovupd (%rdi), %ymm2
+; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1
+; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test32:
 ; SKX:       ## %bb.0:
@@ -623,16 +662,16 @@ define <8 x double> @test33(<8 x double>
 }
 
 define <4 x float> @test34(<4 x float> %x, <4 x float> %x1, <4 x float>* %yp) nounwind {
-; KNL-LABEL: test34:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    ## kill: def %xmm1 killed %xmm1 def %zmm1
-; KNL-NEXT:    ## kill: def %xmm0 killed %xmm0 def %zmm0
-; KNL-NEXT:    vmovups (%rdi), %xmm2
-; KNL-NEXT:    vcmpltps %zmm2, %zmm0, %k1
-; KNL-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
-; KNL-NEXT:    ## kill: def %xmm0 killed %xmm0 killed %zmm0
-; KNL-NEXT:    vzeroupper
-; KNL-NEXT:    retq
+; AVX512-LABEL: test34:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    ## kill: def %xmm1 killed %xmm1 def %zmm1
+; AVX512-NEXT:    ## kill: def %xmm0 killed %xmm0 def %zmm0
+; AVX512-NEXT:    vmovups (%rdi), %xmm2
+; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1
+; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
+; AVX512-NEXT:    ## kill: def %xmm0 killed %xmm0 killed %zmm0
+; AVX512-NEXT:    vzeroupper
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test34:
 ; SKX:       ## %bb.0:
@@ -646,15 +685,15 @@ define <4 x float> @test34(<4 x float> %
 }
 
 define <8 x float> @test35(<8 x float> %x, <8 x float> %x1, <8 x float>* %yp) nounwind {
-; KNL-LABEL: test35:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    ## kill: def %ymm1 killed %ymm1 def %zmm1
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 def %zmm0
-; KNL-NEXT:    vmovups (%rdi), %ymm2
-; KNL-NEXT:    vcmpltps %zmm2, %zmm0, %k1
-; KNL-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
-; KNL-NEXT:    retq
+; AVX512-LABEL: test35:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    ## kill: def %ymm1 killed %ymm1 def %zmm1
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 def %zmm0
+; AVX512-NEXT:    vmovups (%rdi), %ymm2
+; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1
+; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test35:
 ; SKX:       ## %bb.0:
@@ -697,15 +736,15 @@ define <8 x double> @test37(<8 x double>
 }
 
 define <4 x double> @test38(<4 x double> %x, <4 x double> %x1, double* %ptr) nounwind {
-; KNL-LABEL: test38:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    ## kill: def %ymm1 killed %ymm1 def %zmm1
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 def %zmm0
-; KNL-NEXT:    vbroadcastsd (%rdi), %ymm2
-; KNL-NEXT:    vcmpltpd %zmm2, %zmm0, %k1
-; KNL-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
-; KNL-NEXT:    retq
+; AVX512-LABEL: test38:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    ## kill: def %ymm1 killed %ymm1 def %zmm1
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 def %zmm0
+; AVX512-NEXT:    vbroadcastsd (%rdi), %ymm2
+; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1
+; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test38:
 ; SKX:       ## %bb.0:
@@ -723,16 +762,16 @@ define <4 x double> @test38(<4 x double>
 }
 
 define <2 x double> @test39(<2 x double> %x, <2 x double> %x1, double* %ptr) nounwind {
-; KNL-LABEL: test39:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    ## kill: def %xmm1 killed %xmm1 def %zmm1
-; KNL-NEXT:    ## kill: def %xmm0 killed %xmm0 def %zmm0
-; KNL-NEXT:    vmovddup {{.*#+}} xmm2 = mem[0,0]
-; KNL-NEXT:    vcmpltpd %zmm2, %zmm0, %k1
-; KNL-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
-; KNL-NEXT:    ## kill: def %xmm0 killed %xmm0 killed %zmm0
-; KNL-NEXT:    vzeroupper
-; KNL-NEXT:    retq
+; AVX512-LABEL: test39:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    ## kill: def %xmm1 killed %xmm1 def %zmm1
+; AVX512-NEXT:    ## kill: def %xmm0 killed %xmm0 def %zmm0
+; AVX512-NEXT:    vmovddup {{.*#+}} xmm2 = mem[0,0]
+; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1
+; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
+; AVX512-NEXT:    ## kill: def %xmm0 killed %xmm0 killed %zmm0
+; AVX512-NEXT:    vzeroupper
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test39:
 ; SKX:       ## %bb.0:
@@ -767,15 +806,15 @@ define <16  x float> @test40(<16  x floa
 }
 
 define <8  x float> @test41(<8  x float> %x, <8  x float> %x1, float* %ptr) nounwind {
-; KNL-LABEL: test41:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    ## kill: def %ymm1 killed %ymm1 def %zmm1
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 def %zmm0
-; KNL-NEXT:    vbroadcastss (%rdi), %ymm2
-; KNL-NEXT:    vcmpltps %zmm2, %zmm0, %k1
-; KNL-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
-; KNL-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
-; KNL-NEXT:    retq
+; AVX512-LABEL: test41:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    ## kill: def %ymm1 killed %ymm1 def %zmm1
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 def %zmm0
+; AVX512-NEXT:    vbroadcastss (%rdi), %ymm2
+; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1
+; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
+; AVX512-NEXT:    ## kill: def %ymm0 killed %ymm0 killed %zmm0
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test41:
 ; SKX:       ## %bb.0:
@@ -793,16 +832,16 @@ define <8  x float> @test41(<8  x float>
 }
 
 define <4  x float> @test42(<4  x float> %x, <4  x float> %x1, float* %ptr) nounwind {
-; KNL-LABEL: test42:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    ## kill: def %xmm1 killed %xmm1 def %zmm1
-; KNL-NEXT:    ## kill: def %xmm0 killed %xmm0 def %zmm0
-; KNL-NEXT:    vbroadcastss (%rdi), %xmm2
-; KNL-NEXT:    vcmpltps %zmm2, %zmm0, %k1
-; KNL-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
-; KNL-NEXT:    ## kill: def %xmm0 killed %xmm0 killed %zmm0
-; KNL-NEXT:    vzeroupper
-; KNL-NEXT:    retq
+; AVX512-LABEL: test42:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    ## kill: def %xmm1 killed %xmm1 def %zmm1
+; AVX512-NEXT:    ## kill: def %xmm0 killed %xmm0 def %zmm0
+; AVX512-NEXT:    vbroadcastss (%rdi), %xmm2
+; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1
+; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
+; AVX512-NEXT:    ## kill: def %xmm0 killed %xmm0 killed %zmm0
+; AVX512-NEXT:    vzeroupper
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test42:
 ; SKX:       ## %bb.0:
@@ -829,6 +868,14 @@ define <8 x double> @test43(<8 x double>
 ; KNL-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
 ; KNL-NEXT:    retq
 ;
+; AVX512BW-LABEL: test43:
+; AVX512BW:       ## %bb.0:
+; AVX512BW-NEXT:    vpsllw $15, %xmm2, %xmm2
+; AVX512BW-NEXT:    vpmovw2m %zmm2, %k1
+; AVX512BW-NEXT:    vcmpltpd (%rdi){1to8}, %zmm0, %k1 {%k1}
+; AVX512BW-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
+; AVX512BW-NEXT:    retq
+;
 ; SKX-LABEL: test43:
 ; SKX:       ## %bb.0:
 ; SKX-NEXT:    vpsllw $15, %xmm2, %xmm2
@@ -861,14 +908,14 @@ define <4 x i32> @test44(<4 x i16> %x, <
 }
 
 define <2 x i64> @test45(<2 x i16> %x, <2 x i16> %y) #0 {
-; KNL-LABEL: test45:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
-; KNL-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3],xmm1[4],xmm2[5,6,7]
-; KNL-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3],xmm0[4],xmm2[5,6,7]
-; KNL-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
-; KNL-NEXT:    vpsrlq $63, %xmm0, %xmm0
-; KNL-NEXT:    retq
+; AVX512-LABEL: test45:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
+; AVX512-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3],xmm1[4],xmm2[5,6,7]
+; AVX512-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3],xmm0[4],xmm2[5,6,7]
+; AVX512-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vpsrlq $63, %xmm0, %xmm0
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test45:
 ; SKX:       ## %bb.0:
@@ -884,12 +931,12 @@ define <2 x i64> @test45(<2 x i16> %x, <
 }
 
 define <2 x i64> @test46(<2 x float> %x, <2 x float> %y) #0 {
-; KNL-LABEL: test46:
-; KNL:       ## %bb.0:
-; KNL-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm0
-; KNL-NEXT:    vpmovsxdq %xmm0, %xmm0
-; KNL-NEXT:    vpsrlq $63, %xmm0, %xmm0
-; KNL-NEXT:    retq
+; AVX512-LABEL: test46:
+; AVX512:       ## %bb.0:
+; AVX512-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vpmovsxdq %xmm0, %xmm0
+; AVX512-NEXT:    vpsrlq $63, %xmm0, %xmm0
+; AVX512-NEXT:    retq
 ;
 ; SKX-LABEL: test46:
 ; SKX:       ## %bb.0:
@@ -900,3 +947,96 @@ define <2 x i64> @test46(<2 x float> %x,
   %1 = zext <2 x i1> %mask to <2 x i64>
   ret <2 x i64> %1
 }
+
+define <16 x i8> @test47(<16 x i32> %a, <16 x i8> %b, <16 x i8> %c) {
+; KNL-LABEL: test47:
+; KNL:       ## %bb.0:
+; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
+; KNL-NEXT:    vpcmpeqd %zmm3, %zmm0, %k1
+; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
+; KNL-NEXT:    vpmovdb %zmm0, %xmm0
+; KNL-NEXT:    vpblendvb %xmm0, %xmm1, %xmm2, %xmm0
+; KNL-NEXT:    vzeroupper
+; KNL-NEXT:    retq
+;
+; AVX512BW-LABEL: test47:
+; AVX512BW:       ## %bb.0:
+; AVX512BW-NEXT:    vpxor %xmm3, %xmm3, %xmm3
+; AVX512BW-NEXT:    vpcmpeqd %zmm3, %zmm0, %k0
+; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
+; AVX512BW-NEXT:    vpblendvb %xmm0, %xmm1, %xmm2, %xmm0
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; SKX-LABEL: test47:
+; SKX:       ## %bb.0:
+; SKX-NEXT:    vpxor %xmm3, %xmm3, %xmm3
+; SKX-NEXT:    vpcmpeqd %zmm3, %zmm0, %k1
+; SKX-NEXT:    vpblendmb %xmm1, %xmm2, %xmm0 {%k1}
+; SKX-NEXT:    vzeroupper
+; SKX-NEXT:    retq
+  %cmp = icmp eq <16 x i32> %a, zeroinitializer
+  %res = select <16 x i1> %cmp, <16 x i8> %b, <16 x i8> %c
+  ret <16 x i8> %res
+}
+
+define <16 x i16> @test48(<16 x i32> %a, <16 x i16> %b, <16 x i16> %c) {
+; KNL-LABEL: test48:
+; KNL:       ## %bb.0:
+; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
+; KNL-NEXT:    vpcmpeqd %zmm3, %zmm0, %k1
+; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
+; KNL-NEXT:    vpmovdw %zmm0, %ymm0
+; KNL-NEXT:    vpblendvb %ymm0, %ymm1, %ymm2, %ymm0
+; KNL-NEXT:    retq
+;
+; AVX512BW-LABEL: test48:
+; AVX512BW:       ## %bb.0:
+; AVX512BW-NEXT:    vpxor %xmm3, %xmm3, %xmm3
+; AVX512BW-NEXT:    vpcmpeqd %zmm3, %zmm0, %k0
+; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
+; AVX512BW-NEXT:    vpblendvb %ymm0, %ymm1, %ymm2, %ymm0
+; AVX512BW-NEXT:    retq
+;
+; SKX-LABEL: test48:
+; SKX:       ## %bb.0:
+; SKX-NEXT:    vpxor %xmm3, %xmm3, %xmm3
+; SKX-NEXT:    vpcmpeqd %zmm3, %zmm0, %k1
+; SKX-NEXT:    vpblendmw %ymm1, %ymm2, %ymm0 {%k1}
+; SKX-NEXT:    retq
+  %cmp = icmp eq <16 x i32> %a, zeroinitializer
+  %res = select <16 x i1> %cmp, <16 x i16> %b, <16 x i16> %c
+  ret <16 x i16> %res
+}
+
+define <8 x i16> @test49(<8 x i64> %a, <8 x i16> %b, <8 x i16> %c) {
+; KNL-LABEL: test49:
+; KNL:       ## %bb.0:
+; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
+; KNL-NEXT:    vpcmpeqq %zmm3, %zmm0, %k1
+; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
+; KNL-NEXT:    vpmovdw %zmm0, %ymm0
+; KNL-NEXT:    vpblendvb %xmm0, %xmm1, %xmm2, %xmm0
+; KNL-NEXT:    vzeroupper
+; KNL-NEXT:    retq
+;
+; AVX512BW-LABEL: test49:
+; AVX512BW:       ## %bb.0:
+; AVX512BW-NEXT:    vpxor %xmm3, %xmm3, %xmm3
+; AVX512BW-NEXT:    vpcmpeqq %zmm3, %zmm0, %k0
+; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
+; AVX512BW-NEXT:    vpblendvb %xmm0, %xmm1, %xmm2, %xmm0
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; SKX-LABEL: test49:
+; SKX:       ## %bb.0:
+; SKX-NEXT:    vpxor %xmm3, %xmm3, %xmm3
+; SKX-NEXT:    vpcmpeqq %zmm3, %zmm0, %k1
+; SKX-NEXT:    vpblendmw %xmm1, %xmm2, %xmm0 {%k1}
+; SKX-NEXT:    vzeroupper
+; SKX-NEXT:    retq
+  %cmp = icmp eq <8 x i64> %a, zeroinitializer
+  %res = select <8 x i1> %cmp, <8 x i16> %b, <8 x i16> %c
+  ret <8 x i16> %res
+}




More information about the llvm-commits mailing list