; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s --check-prefix=KNL ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s --check-prefix=SKX ; RUN: llc < %s -mtriple=i686-apple-darwin -mcpu=knl | FileCheck %s --check-prefix=KNL_X32 ; KNL-LABEL: test1 ; KNL: vxorps define <16 x i1> @test1() { ret <16 x i1> zeroinitializer } ; SKX-LABEL: test2 ; SKX: vpmovb2m ; SKX: vpmovb2m ; SKX: kandw ; SKX: vpmovm2b ; KNL-LABEL: test2 ; KNL: vpmovsxbd ; KNL: vpmovsxbd ; KNL: vpandd ; KNL: vpmovdb define <16 x i1> @test2(<16 x i1>%a, <16 x i1>%b) { %c = and <16 x i1>%a, %b ret <16 x i1> %c } ; SKX-LABEL: test3 ; SKX: vpmovw2m ; SKX: vpmovw2m ; SKX: kandb ; SKX: vpmovm2w define <8 x i1> @test3(<8 x i1>%a, <8 x i1>%b) { %c = and <8 x i1>%a, %b ret <8 x i1> %c } ; SKX-LABEL: test4 ; SKX: vpmovd2m ; SKX: vpmovd2m ; SKX: kandw ; SKX: vpmovm2d define <4 x i1> @test4(<4 x i1>%a, <4 x i1>%b) { %c = and <4 x i1>%a, %b ret <4 x i1> %c } ; SKX-LABEL: test5 ; SKX: vpcmpgtd ; SKX: vpmovm2w ; SKX: call ; SKX: vpmovzxwd declare <8 x i1> @func8xi1(<8 x i1> %a) define <8 x i32> @test5(<8 x i32>%a, <8 x i32>%b) { %cmpRes = icmp sgt <8 x i32>%a, %b %resi = call <8 x i1> @func8xi1(<8 x i1> %cmpRes) %res = sext <8 x i1>%resi to <8 x i32> ret <8 x i32> %res } declare <16 x i1> @func16xi1(<16 x i1> %a) ; KNL-LABEL: test6 ; KNL: vpbroadcastd ; KNL: vpmovdb ; KNL: call ; KNL: vpmovzxbd ; KNL: vpslld $31, %zmm ; KNL: vpsrad $31, %zmm define <16 x i32> @test6(<16 x i32>%a, <16 x i32>%b) { %cmpRes = icmp sgt <16 x i32>%a, %b %resi = call <16 x i1> @func16xi1(<16 x i1> %cmpRes) %res = sext <16 x i1>%resi to <16 x i32> ret <16 x i32> %res } declare <4 x i1> @func4xi1(<4 x i1> %a) ; SKX-LABEL: test7 ; SKX: vpmovm2d ; SKX: call ; SKX: vpslld $31, %xmm ; SKX: vpsrad $31, %xmm define <4 x i32> @test7(<4 x i32>%a, <4 x i32>%b) { %cmpRes = icmp sgt <4 x i32>%a, %b %resi = call <4 x i1> @func4xi1(<4 x i1> %cmpRes) %res = sext <4 x i1>%resi to <4 x i32> ret <4 x i32> %res } ; SKX-LABEL: test7a ; SKX: call ; SKX: vpmovw2m %xmm0, %k0 ; SKX: kandb define <8 x i1> @test7a(<8 x i32>%a, <8 x i32>%b) { %cmpRes = icmp sgt <8 x i32>%a, %b %resi = call <8 x i1> @func8xi1(<8 x i1> %cmpRes) %res = and <8 x i1>%resi, ret <8 x i1> %res } ; KNL_X32-LABEL: test8 ; KNL_X32: testb $1, 4(%esp) ; KNL_X32:jne ; KNL-LABEL: test8 ; KNL: testb $1, %dil ; KNL:jne define <16 x i8> @test8(<16 x i8> %a1, <16 x i8> %a2, i1 %cond) { %res = select i1 %cond, <16 x i8> %a1, <16 x i8> %a2 ret <16 x i8> %res } ; KNL-LABEL: test9 ; KNL: vucomisd ; KNL: setb define i1 @test9(double %a, double %b) { %c = fcmp ugt double %a, %b ret i1 %c } ; KNL_X32-LABEL: test10 ; KNL_X32: testb $1, 12(%esp) ; KNL_X32: cmovnel ; KNL-LABEL: test10 ; KNL: testb $1, %dl ; KNL: cmovel define i32 @test10(i32 %a, i32 %b, i1 %cond) { %c = select i1 %cond, i32 %a, i32 %b ret i32 %c } ; KNL-LABEL: test11 ; KNL: cmp ; KNL: setg define i1 @test11(i32 %a, i32 %b) { %c = icmp sgt i32 %a, %b ret i1 %c } ; KNL-LABEL: test12 ; KNL: callq _test11 ;; return value in %al ; KNL: movzbl %al, %ebx ; KNL: callq _test10 ; KNL: testb $1, %bl define i32 @test12(i32 %a1, i32 %a2, i32 %b1) { %cond = call i1 @test11(i32 %a1, i32 %b1) %res = call i32 @test10(i32 %a1, i32 %a2, i1 %cond) %res1 = select i1 %cond, i32 %res, i32 0 ret i32 %res1 }