3136 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2,X86-SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2,X64-SSE,X64-SSE24; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE415; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL10 11;12; Truncate13;14 15define i1 @trunc_v2i64_v2i1(<2 x i64>) nounwind {16; SSE-LABEL: trunc_v2i64_v2i1:17; SSE: # %bb.0:18; SSE-NEXT: psllq $63, %xmm019; SSE-NEXT: movmskpd %xmm0, %eax20; SSE-NEXT: testb %al, %al21; SSE-NEXT: setnp %al22; SSE-NEXT: ret{{[l|q]}}23;24; AVX-LABEL: trunc_v2i64_v2i1:25; AVX: # %bb.0:26; AVX-NEXT: vpsllq $63, %xmm0, %xmm027; AVX-NEXT: vmovmskpd %xmm0, %eax28; AVX-NEXT: testb %al, %al29; AVX-NEXT: setnp %al30; AVX-NEXT: retq31;32; AVX512F-LABEL: trunc_v2i64_v2i1:33; AVX512F: # %bb.0:34; AVX512F-NEXT: vpsllq $63, %xmm0, %xmm035; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k036; AVX512F-NEXT: kmovw %k0, %eax37; AVX512F-NEXT: testb $3, %al38; AVX512F-NEXT: setnp %al39; AVX512F-NEXT: vzeroupper40; AVX512F-NEXT: retq41;42; AVX512BW-LABEL: trunc_v2i64_v2i1:43; AVX512BW: # %bb.0:44; AVX512BW-NEXT: vpsllq $63, %xmm0, %xmm045; AVX512BW-NEXT: vptestmq %zmm0, %zmm0, %k046; AVX512BW-NEXT: kmovd %k0, %eax47; AVX512BW-NEXT: testb $3, %al48; AVX512BW-NEXT: setnp %al49; AVX512BW-NEXT: vzeroupper50; AVX512BW-NEXT: retq51;52; AVX512VL-LABEL: trunc_v2i64_v2i1:53; AVX512VL: # %bb.0:54; AVX512VL-NEXT: vpsllq $63, %xmm0, %xmm055; AVX512VL-NEXT: vptestmq %xmm0, %xmm0, %k056; AVX512VL-NEXT: kmovd %k0, %eax57; AVX512VL-NEXT: testb %al, %al58; AVX512VL-NEXT: setnp %al59; AVX512VL-NEXT: retq60 %a = trunc <2 x i64> %0 to <2 x i1>61 %b = call i1 @llvm.vector.reduce.xor.v2i1(<2 x i1> %a)62 ret i1 %b63}64 65define i1 @trunc_v4i32_v4i1(<4 x i32>) nounwind {66; SSE-LABEL: trunc_v4i32_v4i1:67; SSE: # %bb.0:68; SSE-NEXT: pslld $31, %xmm069; SSE-NEXT: movmskps %xmm0, %eax70; SSE-NEXT: testb %al, %al71; SSE-NEXT: setnp %al72; SSE-NEXT: ret{{[l|q]}}73;74; AVX-LABEL: trunc_v4i32_v4i1:75; AVX: # %bb.0:76; AVX-NEXT: vpslld $31, %xmm0, %xmm077; AVX-NEXT: vmovmskps %xmm0, %eax78; AVX-NEXT: testb %al, %al79; AVX-NEXT: setnp %al80; AVX-NEXT: retq81;82; AVX512F-LABEL: trunc_v4i32_v4i1:83; AVX512F: # %bb.0:84; AVX512F-NEXT: vpslld $31, %xmm0, %xmm085; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k086; AVX512F-NEXT: kmovw %k0, %eax87; AVX512F-NEXT: testb $15, %al88; AVX512F-NEXT: setnp %al89; AVX512F-NEXT: vzeroupper90; AVX512F-NEXT: retq91;92; AVX512BW-LABEL: trunc_v4i32_v4i1:93; AVX512BW: # %bb.0:94; AVX512BW-NEXT: vpslld $31, %xmm0, %xmm095; AVX512BW-NEXT: vptestmd %zmm0, %zmm0, %k096; AVX512BW-NEXT: kmovd %k0, %eax97; AVX512BW-NEXT: testb $15, %al98; AVX512BW-NEXT: setnp %al99; AVX512BW-NEXT: vzeroupper100; AVX512BW-NEXT: retq101;102; AVX512VL-LABEL: trunc_v4i32_v4i1:103; AVX512VL: # %bb.0:104; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0105; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k0106; AVX512VL-NEXT: kmovd %k0, %eax107; AVX512VL-NEXT: testb %al, %al108; AVX512VL-NEXT: setnp %al109; AVX512VL-NEXT: retq110 %a = trunc <4 x i32> %0 to <4 x i1>111 %b = call i1 @llvm.vector.reduce.xor.v4i1(<4 x i1> %a)112 ret i1 %b113}114 115define i1 @trunc_v8i16_v8i1(<8 x i16>) nounwind {116; SSE-LABEL: trunc_v8i16_v8i1:117; SSE: # %bb.0:118; SSE-NEXT: psllw $15, %xmm0119; SSE-NEXT: packsswb %xmm0, %xmm0120; SSE-NEXT: pmovmskb %xmm0, %eax121; SSE-NEXT: testb %al, %al122; SSE-NEXT: setnp %al123; SSE-NEXT: ret{{[l|q]}}124;125; AVX-LABEL: trunc_v8i16_v8i1:126; AVX: # %bb.0:127; AVX-NEXT: vpsllw $15, %xmm0, %xmm0128; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm0129; AVX-NEXT: vpmovmskb %xmm0, %eax130; AVX-NEXT: testb %al, %al131; AVX-NEXT: setnp %al132; AVX-NEXT: retq133;134; AVX512F-LABEL: trunc_v8i16_v8i1:135; AVX512F: # %bb.0:136; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0137; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0138; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0139; AVX512F-NEXT: kmovw %k0, %eax140; AVX512F-NEXT: testb %al, %al141; AVX512F-NEXT: setnp %al142; AVX512F-NEXT: vzeroupper143; AVX512F-NEXT: retq144;145; AVX512BW-LABEL: trunc_v8i16_v8i1:146; AVX512BW: # %bb.0:147; AVX512BW-NEXT: vpsllw $15, %xmm0, %xmm0148; AVX512BW-NEXT: vpmovw2m %zmm0, %k0149; AVX512BW-NEXT: kmovd %k0, %eax150; AVX512BW-NEXT: testb %al, %al151; AVX512BW-NEXT: setnp %al152; AVX512BW-NEXT: vzeroupper153; AVX512BW-NEXT: retq154;155; AVX512VL-LABEL: trunc_v8i16_v8i1:156; AVX512VL: # %bb.0:157; AVX512VL-NEXT: vpsllw $15, %xmm0, %xmm0158; AVX512VL-NEXT: vpmovw2m %xmm0, %k0159; AVX512VL-NEXT: kmovd %k0, %eax160; AVX512VL-NEXT: testb %al, %al161; AVX512VL-NEXT: setnp %al162; AVX512VL-NEXT: retq163 %a = trunc <8 x i16> %0 to <8 x i1>164 %b = call i1 @llvm.vector.reduce.xor.v8i1(<8 x i1> %a)165 ret i1 %b166}167 168define i1 @trunc_v16i8_v16i1(<16 x i8>) nounwind {169; SSE-LABEL: trunc_v16i8_v16i1:170; SSE: # %bb.0:171; SSE-NEXT: psllw $7, %xmm0172; SSE-NEXT: pmovmskb %xmm0, %eax173; SSE-NEXT: xorb %ah, %al174; SSE-NEXT: setnp %al175; SSE-NEXT: ret{{[l|q]}}176;177; AVX-LABEL: trunc_v16i8_v16i1:178; AVX: # %bb.0:179; AVX-NEXT: vpsllw $7, %xmm0, %xmm0180; AVX-NEXT: vpmovmskb %xmm0, %eax181; AVX-NEXT: xorb %ah, %al182; AVX-NEXT: setnp %al183; AVX-NEXT: retq184;185; AVX512-LABEL: trunc_v16i8_v16i1:186; AVX512: # %bb.0:187; AVX512-NEXT: vpsllw $7, %xmm0, %xmm0188; AVX512-NEXT: vpmovmskb %xmm0, %eax189; AVX512-NEXT: xorb %ah, %al190; AVX512-NEXT: setnp %al191; AVX512-NEXT: retq192 %a = trunc <16 x i8> %0 to <16 x i1>193 %b = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)194 ret i1 %b195}196 197define i1 @trunc_v4i64_v4i1(<4 x i64>) nounwind {198; SSE-LABEL: trunc_v4i64_v4i1:199; SSE: # %bb.0:200; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]201; SSE-NEXT: pslld $31, %xmm0202; SSE-NEXT: movmskps %xmm0, %eax203; SSE-NEXT: testb %al, %al204; SSE-NEXT: setnp %al205; SSE-NEXT: ret{{[l|q]}}206;207; AVX1-LABEL: trunc_v4i64_v4i1:208; AVX1: # %bb.0:209; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1210; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]211; AVX1-NEXT: vpslld $31, %xmm0, %xmm0212; AVX1-NEXT: vmovmskps %xmm0, %eax213; AVX1-NEXT: testb %al, %al214; AVX1-NEXT: setnp %al215; AVX1-NEXT: vzeroupper216; AVX1-NEXT: retq217;218; AVX2-LABEL: trunc_v4i64_v4i1:219; AVX2: # %bb.0:220; AVX2-NEXT: vpsllq $63, %ymm0, %ymm0221; AVX2-NEXT: vmovmskpd %ymm0, %eax222; AVX2-NEXT: testb %al, %al223; AVX2-NEXT: setnp %al224; AVX2-NEXT: vzeroupper225; AVX2-NEXT: retq226;227; AVX512F-LABEL: trunc_v4i64_v4i1:228; AVX512F: # %bb.0:229; AVX512F-NEXT: vpsllq $63, %ymm0, %ymm0230; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0231; AVX512F-NEXT: kmovw %k0, %eax232; AVX512F-NEXT: testb $15, %al233; AVX512F-NEXT: setnp %al234; AVX512F-NEXT: vzeroupper235; AVX512F-NEXT: retq236;237; AVX512BW-LABEL: trunc_v4i64_v4i1:238; AVX512BW: # %bb.0:239; AVX512BW-NEXT: vpsllq $63, %ymm0, %ymm0240; AVX512BW-NEXT: vptestmq %zmm0, %zmm0, %k0241; AVX512BW-NEXT: kmovd %k0, %eax242; AVX512BW-NEXT: testb $15, %al243; AVX512BW-NEXT: setnp %al244; AVX512BW-NEXT: vzeroupper245; AVX512BW-NEXT: retq246;247; AVX512VL-LABEL: trunc_v4i64_v4i1:248; AVX512VL: # %bb.0:249; AVX512VL-NEXT: vpsllq $63, %ymm0, %ymm0250; AVX512VL-NEXT: vptestmq %ymm0, %ymm0, %k0251; AVX512VL-NEXT: kmovd %k0, %eax252; AVX512VL-NEXT: testb %al, %al253; AVX512VL-NEXT: setnp %al254; AVX512VL-NEXT: vzeroupper255; AVX512VL-NEXT: retq256 %a = trunc <4 x i64> %0 to <4 x i1>257 %b = call i1 @llvm.vector.reduce.xor.v4i1(<4 x i1> %a)258 ret i1 %b259}260 261define i1 @trunc_v8i32_v8i1(<8 x i32>) nounwind {262; SSE2-LABEL: trunc_v8i32_v8i1:263; SSE2: # %bb.0:264; SSE2-NEXT: pslld $16, %xmm1265; SSE2-NEXT: psrad $16, %xmm1266; SSE2-NEXT: pslld $16, %xmm0267; SSE2-NEXT: psrad $16, %xmm0268; SSE2-NEXT: packssdw %xmm1, %xmm0269; SSE2-NEXT: psllw $15, %xmm0270; SSE2-NEXT: packsswb %xmm0, %xmm0271; SSE2-NEXT: pmovmskb %xmm0, %eax272; SSE2-NEXT: testb %al, %al273; SSE2-NEXT: setnp %al274; SSE2-NEXT: ret{{[l|q]}}275;276; SSE41-LABEL: trunc_v8i32_v8i1:277; SSE41: # %bb.0:278; SSE41-NEXT: pxor %xmm2, %xmm2279; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]280; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]281; SSE41-NEXT: packusdw %xmm1, %xmm0282; SSE41-NEXT: psllw $15, %xmm0283; SSE41-NEXT: packsswb %xmm0, %xmm0284; SSE41-NEXT: pmovmskb %xmm0, %eax285; SSE41-NEXT: testb %al, %al286; SSE41-NEXT: setnp %al287; SSE41-NEXT: retq288;289; AVX1-LABEL: trunc_v8i32_v8i1:290; AVX1: # %bb.0:291; AVX1-NEXT: vpslld $31, %xmm0, %xmm1292; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0293; AVX1-NEXT: vpslld $31, %xmm0, %xmm0294; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0295; AVX1-NEXT: vmovmskps %ymm0, %eax296; AVX1-NEXT: testb %al, %al297; AVX1-NEXT: setnp %al298; AVX1-NEXT: vzeroupper299; AVX1-NEXT: retq300;301; AVX2-LABEL: trunc_v8i32_v8i1:302; AVX2: # %bb.0:303; AVX2-NEXT: vpslld $31, %ymm0, %ymm0304; AVX2-NEXT: vmovmskps %ymm0, %eax305; AVX2-NEXT: testb %al, %al306; AVX2-NEXT: setnp %al307; AVX2-NEXT: vzeroupper308; AVX2-NEXT: retq309;310; AVX512F-LABEL: trunc_v8i32_v8i1:311; AVX512F: # %bb.0:312; AVX512F-NEXT: vpslld $31, %ymm0, %ymm0313; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0314; AVX512F-NEXT: kmovw %k0, %eax315; AVX512F-NEXT: testb %al, %al316; AVX512F-NEXT: setnp %al317; AVX512F-NEXT: vzeroupper318; AVX512F-NEXT: retq319;320; AVX512BW-LABEL: trunc_v8i32_v8i1:321; AVX512BW: # %bb.0:322; AVX512BW-NEXT: vpslld $31, %ymm0, %ymm0323; AVX512BW-NEXT: vptestmd %zmm0, %zmm0, %k0324; AVX512BW-NEXT: kmovd %k0, %eax325; AVX512BW-NEXT: testb %al, %al326; AVX512BW-NEXT: setnp %al327; AVX512BW-NEXT: vzeroupper328; AVX512BW-NEXT: retq329;330; AVX512VL-LABEL: trunc_v8i32_v8i1:331; AVX512VL: # %bb.0:332; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0333; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k0334; AVX512VL-NEXT: kmovd %k0, %eax335; AVX512VL-NEXT: testb %al, %al336; AVX512VL-NEXT: setnp %al337; AVX512VL-NEXT: vzeroupper338; AVX512VL-NEXT: retq339 %a = trunc <8 x i32> %0 to <8 x i1>340 %b = call i1 @llvm.vector.reduce.xor.v8i1(<8 x i1> %a)341 ret i1 %b342}343 344define i1 @trunc_v16i16_v16i1(<16 x i16>) nounwind {345; SSE2-LABEL: trunc_v16i16_v16i1:346; SSE2: # %bb.0:347; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]348; SSE2-NEXT: pand %xmm2, %xmm1349; SSE2-NEXT: pand %xmm2, %xmm0350; SSE2-NEXT: packuswb %xmm1, %xmm0351; SSE2-NEXT: psllw $7, %xmm0352; SSE2-NEXT: pmovmskb %xmm0, %eax353; SSE2-NEXT: xorb %ah, %al354; SSE2-NEXT: setnp %al355; SSE2-NEXT: ret{{[l|q]}}356;357; SSE41-LABEL: trunc_v16i16_v16i1:358; SSE41: # %bb.0:359; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]360; SSE41-NEXT: pand %xmm2, %xmm1361; SSE41-NEXT: pand %xmm2, %xmm0362; SSE41-NEXT: packuswb %xmm1, %xmm0363; SSE41-NEXT: psllw $7, %xmm0364; SSE41-NEXT: pmovmskb %xmm0, %eax365; SSE41-NEXT: xorb %ah, %al366; SSE41-NEXT: setnp %al367; SSE41-NEXT: retq368;369; AVX1-LABEL: trunc_v16i16_v16i1:370; AVX1: # %bb.0:371; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0372; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1373; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0374; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0375; AVX1-NEXT: vpmovmskb %xmm0, %eax376; AVX1-NEXT: xorb %ah, %al377; AVX1-NEXT: setnp %al378; AVX1-NEXT: vzeroupper379; AVX1-NEXT: retq380;381; AVX2-LABEL: trunc_v16i16_v16i1:382; AVX2: # %bb.0:383; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0384; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1385; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0386; AVX2-NEXT: vpsllw $7, %xmm0, %xmm0387; AVX2-NEXT: vpmovmskb %xmm0, %eax388; AVX2-NEXT: xorb %ah, %al389; AVX2-NEXT: setnp %al390; AVX2-NEXT: vzeroupper391; AVX2-NEXT: retq392;393; AVX512F-LABEL: trunc_v16i16_v16i1:394; AVX512F: # %bb.0:395; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0396; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0397; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0398; AVX512F-NEXT: kmovw %k0, %eax399; AVX512F-NEXT: movl %eax, %ecx400; AVX512F-NEXT: shrl $8, %eax401; AVX512F-NEXT: xorb %cl, %al402; AVX512F-NEXT: setnp %al403; AVX512F-NEXT: vzeroupper404; AVX512F-NEXT: retq405;406; AVX512BW-LABEL: trunc_v16i16_v16i1:407; AVX512BW: # %bb.0:408; AVX512BW-NEXT: vpsllw $15, %ymm0, %ymm0409; AVX512BW-NEXT: vpmovw2m %zmm0, %k0410; AVX512BW-NEXT: kmovd %k0, %eax411; AVX512BW-NEXT: movl %eax, %ecx412; AVX512BW-NEXT: shrl $8, %eax413; AVX512BW-NEXT: xorb %cl, %al414; AVX512BW-NEXT: setnp %al415; AVX512BW-NEXT: vzeroupper416; AVX512BW-NEXT: retq417;418; AVX512VL-LABEL: trunc_v16i16_v16i1:419; AVX512VL: # %bb.0:420; AVX512VL-NEXT: vpsllw $15, %ymm0, %ymm0421; AVX512VL-NEXT: vpmovw2m %ymm0, %k0422; AVX512VL-NEXT: kmovd %k0, %eax423; AVX512VL-NEXT: movl %eax, %ecx424; AVX512VL-NEXT: shrl $8, %eax425; AVX512VL-NEXT: xorb %cl, %al426; AVX512VL-NEXT: setnp %al427; AVX512VL-NEXT: vzeroupper428; AVX512VL-NEXT: retq429 %a = trunc <16 x i16> %0 to <16 x i1>430 %b = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)431 ret i1 %b432}433 434define i1 @trunc_v32i8_v32i1(<32 x i8>) nounwind {435; SSE-LABEL: trunc_v32i8_v32i1:436; SSE: # %bb.0:437; SSE-NEXT: pxor %xmm1, %xmm0438; SSE-NEXT: psllw $7, %xmm0439; SSE-NEXT: pmovmskb %xmm0, %eax440; SSE-NEXT: xorb %ah, %al441; SSE-NEXT: setnp %al442; SSE-NEXT: ret{{[l|q]}}443;444; AVX1-LABEL: trunc_v32i8_v32i1:445; AVX1: # %bb.0:446; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1447; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0448; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0449; AVX1-NEXT: vpmovmskb %xmm0, %eax450; AVX1-NEXT: xorb %ah, %al451; AVX1-NEXT: setnp %al452; AVX1-NEXT: vzeroupper453; AVX1-NEXT: retq454;455; AVX2-LABEL: trunc_v32i8_v32i1:456; AVX2: # %bb.0:457; AVX2-NEXT: vpsllw $7, %ymm0, %ymm0458; AVX2-NEXT: vpmovmskb %ymm0, %eax459; AVX2-NEXT: movl %eax, %ecx460; AVX2-NEXT: shrl $16, %ecx461; AVX2-NEXT: xorl %eax, %ecx462; AVX2-NEXT: xorb %ch, %cl463; AVX2-NEXT: setnp %al464; AVX2-NEXT: vzeroupper465; AVX2-NEXT: retq466;467; AVX512F-LABEL: trunc_v32i8_v32i1:468; AVX512F: # %bb.0:469; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1470; AVX512F-NEXT: vpxor %xmm1, %xmm0, %xmm0471; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0472; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0473; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0474; AVX512F-NEXT: kshiftrw $8, %k0, %k1475; AVX512F-NEXT: kxorw %k1, %k0, %k0476; AVX512F-NEXT: kshiftrw $4, %k0, %k1477; AVX512F-NEXT: kxorw %k1, %k0, %k0478; AVX512F-NEXT: kshiftrw $2, %k0, %k1479; AVX512F-NEXT: kxorw %k1, %k0, %k0480; AVX512F-NEXT: kshiftrw $1, %k0, %k1481; AVX512F-NEXT: kxorw %k1, %k0, %k0482; AVX512F-NEXT: kmovw %k0, %eax483; AVX512F-NEXT: # kill: def $al killed $al killed $eax484; AVX512F-NEXT: vzeroupper485; AVX512F-NEXT: retq486;487; AVX512BW-LABEL: trunc_v32i8_v32i1:488; AVX512BW: # %bb.0:489; AVX512BW-NEXT: vpsllw $7, %ymm0, %ymm0490; AVX512BW-NEXT: vpmovmskb %ymm0, %eax491; AVX512BW-NEXT: movl %eax, %ecx492; AVX512BW-NEXT: shrl $16, %ecx493; AVX512BW-NEXT: xorl %eax, %ecx494; AVX512BW-NEXT: xorb %ch, %cl495; AVX512BW-NEXT: setnp %al496; AVX512BW-NEXT: vzeroupper497; AVX512BW-NEXT: retq498;499; AVX512VL-LABEL: trunc_v32i8_v32i1:500; AVX512VL: # %bb.0:501; AVX512VL-NEXT: vpsllw $7, %ymm0, %ymm0502; AVX512VL-NEXT: vpmovmskb %ymm0, %eax503; AVX512VL-NEXT: movl %eax, %ecx504; AVX512VL-NEXT: shrl $16, %ecx505; AVX512VL-NEXT: xorl %eax, %ecx506; AVX512VL-NEXT: xorb %ch, %cl507; AVX512VL-NEXT: setnp %al508; AVX512VL-NEXT: vzeroupper509; AVX512VL-NEXT: retq510 %a = trunc <32 x i8> %0 to <32 x i1>511 %b = call i1 @llvm.vector.reduce.xor.v32i1(<32 x i1> %a)512 ret i1 %b513}514 515define i1 @trunc_v8i64_v8i1(<8 x i64>) nounwind {516; X86-SSE2-LABEL: trunc_v8i64_v8i1:517; X86-SSE2: # %bb.0:518; X86-SSE2-NEXT: pushl %ebp519; X86-SSE2-NEXT: movl %esp, %ebp520; X86-SSE2-NEXT: andl $-16, %esp521; X86-SSE2-NEXT: subl $16, %esp522; X86-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]523; X86-SSE2-NEXT: pslld $16, %xmm0524; X86-SSE2-NEXT: psrad $16, %xmm0525; X86-SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],mem[0,2]526; X86-SSE2-NEXT: pslld $16, %xmm2527; X86-SSE2-NEXT: psrad $16, %xmm2528; X86-SSE2-NEXT: packssdw %xmm2, %xmm0529; X86-SSE2-NEXT: psllw $15, %xmm0530; X86-SSE2-NEXT: packsswb %xmm0, %xmm0531; X86-SSE2-NEXT: pmovmskb %xmm0, %eax532; X86-SSE2-NEXT: testb %al, %al533; X86-SSE2-NEXT: setnp %al534; X86-SSE2-NEXT: movl %ebp, %esp535; X86-SSE2-NEXT: popl %ebp536; X86-SSE2-NEXT: retl537;538; X64-SSE2-LABEL: trunc_v8i64_v8i1:539; X64-SSE2: # %bb.0:540; X64-SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]541; X64-SSE2-NEXT: pslld $16, %xmm2542; X64-SSE2-NEXT: psrad $16, %xmm2543; X64-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]544; X64-SSE2-NEXT: pslld $16, %xmm0545; X64-SSE2-NEXT: psrad $16, %xmm0546; X64-SSE2-NEXT: packssdw %xmm2, %xmm0547; X64-SSE2-NEXT: psllw $15, %xmm0548; X64-SSE2-NEXT: packsswb %xmm0, %xmm0549; X64-SSE2-NEXT: pmovmskb %xmm0, %eax550; X64-SSE2-NEXT: testb %al, %al551; X64-SSE2-NEXT: setnp %al552; X64-SSE2-NEXT: retq553;554; SSE41-LABEL: trunc_v8i64_v8i1:555; SSE41: # %bb.0:556; SSE41-NEXT: pxor %xmm4, %xmm4557; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1,2,3],xmm3[4],xmm4[5,6,7]558; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1,2,3],xmm2[4],xmm4[5,6,7]559; SSE41-NEXT: packusdw %xmm3, %xmm2560; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1,2,3],xmm1[4],xmm4[5,6,7]561; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1,2,3],xmm0[4],xmm4[5,6,7]562; SSE41-NEXT: packusdw %xmm1, %xmm0563; SSE41-NEXT: packusdw %xmm2, %xmm0564; SSE41-NEXT: psllw $15, %xmm0565; SSE41-NEXT: packsswb %xmm0, %xmm0566; SSE41-NEXT: pmovmskb %xmm0, %eax567; SSE41-NEXT: testb %al, %al568; SSE41-NEXT: setnp %al569; SSE41-NEXT: retq570;571; AVX1-LABEL: trunc_v8i64_v8i1:572; AVX1: # %bb.0:573; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2574; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]575; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2576; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]577; AVX1-NEXT: vpslld $31, %xmm0, %xmm0578; AVX1-NEXT: vpslld $31, %xmm1, %xmm1579; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0580; AVX1-NEXT: vmovmskps %ymm0, %eax581; AVX1-NEXT: testb %al, %al582; AVX1-NEXT: setnp %al583; AVX1-NEXT: vzeroupper584; AVX1-NEXT: retq585;586; AVX2-LABEL: trunc_v8i64_v8i1:587; AVX2: # %bb.0:588; AVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]589; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]590; AVX2-NEXT: vpslld $31, %ymm0, %ymm0591; AVX2-NEXT: vmovmskps %ymm0, %eax592; AVX2-NEXT: testb %al, %al593; AVX2-NEXT: setnp %al594; AVX2-NEXT: vzeroupper595; AVX2-NEXT: retq596;597; AVX512F-LABEL: trunc_v8i64_v8i1:598; AVX512F: # %bb.0:599; AVX512F-NEXT: vpsllq $63, %zmm0, %zmm0600; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0601; AVX512F-NEXT: kmovw %k0, %eax602; AVX512F-NEXT: testb %al, %al603; AVX512F-NEXT: setnp %al604; AVX512F-NEXT: vzeroupper605; AVX512F-NEXT: retq606;607; AVX512BW-LABEL: trunc_v8i64_v8i1:608; AVX512BW: # %bb.0:609; AVX512BW-NEXT: vpsllq $63, %zmm0, %zmm0610; AVX512BW-NEXT: vptestmq %zmm0, %zmm0, %k0611; AVX512BW-NEXT: kmovd %k0, %eax612; AVX512BW-NEXT: testb %al, %al613; AVX512BW-NEXT: setnp %al614; AVX512BW-NEXT: vzeroupper615; AVX512BW-NEXT: retq616;617; AVX512VL-LABEL: trunc_v8i64_v8i1:618; AVX512VL: # %bb.0:619; AVX512VL-NEXT: vpsllq $63, %zmm0, %zmm0620; AVX512VL-NEXT: vptestmq %zmm0, %zmm0, %k0621; AVX512VL-NEXT: kmovd %k0, %eax622; AVX512VL-NEXT: testb %al, %al623; AVX512VL-NEXT: setnp %al624; AVX512VL-NEXT: vzeroupper625; AVX512VL-NEXT: retq626 %a = trunc <8 x i64> %0 to <8 x i1>627 %b = call i1 @llvm.vector.reduce.xor.v8i1(<8 x i1> %a)628 ret i1 %b629}630 631define i1 @trunc_v16i32_v16i1(<16 x i32>) nounwind {632; X86-SSE2-LABEL: trunc_v16i32_v16i1:633; X86-SSE2: # %bb.0:634; X86-SSE2-NEXT: pushl %ebp635; X86-SSE2-NEXT: movl %esp, %ebp636; X86-SSE2-NEXT: andl $-16, %esp637; X86-SSE2-NEXT: subl $16, %esp638; X86-SSE2-NEXT: movdqa {{.*#+}} xmm3 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]639; X86-SSE2-NEXT: pand %xmm3, %xmm1640; X86-SSE2-NEXT: pand %xmm3, %xmm0641; X86-SSE2-NEXT: packuswb %xmm1, %xmm0642; X86-SSE2-NEXT: pand %xmm3, %xmm2643; X86-SSE2-NEXT: pand 8(%ebp), %xmm3644; X86-SSE2-NEXT: packuswb %xmm3, %xmm2645; X86-SSE2-NEXT: packuswb %xmm2, %xmm0646; X86-SSE2-NEXT: psllw $7, %xmm0647; X86-SSE2-NEXT: pmovmskb %xmm0, %eax648; X86-SSE2-NEXT: xorb %ah, %al649; X86-SSE2-NEXT: setnp %al650; X86-SSE2-NEXT: movl %ebp, %esp651; X86-SSE2-NEXT: popl %ebp652; X86-SSE2-NEXT: retl653;654; X64-SSE2-LABEL: trunc_v16i32_v16i1:655; X64-SSE2: # %bb.0:656; X64-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]657; X64-SSE2-NEXT: pand %xmm4, %xmm3658; X64-SSE2-NEXT: pand %xmm4, %xmm2659; X64-SSE2-NEXT: packuswb %xmm3, %xmm2660; X64-SSE2-NEXT: pand %xmm4, %xmm1661; X64-SSE2-NEXT: pand %xmm4, %xmm0662; X64-SSE2-NEXT: packuswb %xmm1, %xmm0663; X64-SSE2-NEXT: packuswb %xmm2, %xmm0664; X64-SSE2-NEXT: psllw $7, %xmm0665; X64-SSE2-NEXT: pmovmskb %xmm0, %eax666; X64-SSE2-NEXT: xorb %ah, %al667; X64-SSE2-NEXT: setnp %al668; X64-SSE2-NEXT: retq669;670; SSE41-LABEL: trunc_v16i32_v16i1:671; SSE41: # %bb.0:672; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = [255,255,255,255]673; SSE41-NEXT: pand %xmm4, %xmm3674; SSE41-NEXT: pand %xmm4, %xmm2675; SSE41-NEXT: packusdw %xmm3, %xmm2676; SSE41-NEXT: pand %xmm4, %xmm1677; SSE41-NEXT: pand %xmm4, %xmm0678; SSE41-NEXT: packusdw %xmm1, %xmm0679; SSE41-NEXT: packuswb %xmm2, %xmm0680; SSE41-NEXT: psllw $7, %xmm0681; SSE41-NEXT: pmovmskb %xmm0, %eax682; SSE41-NEXT: xorb %ah, %al683; SSE41-NEXT: setnp %al684; SSE41-NEXT: retq685;686; AVX1-LABEL: trunc_v16i32_v16i1:687; AVX1: # %bb.0:688; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]689; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1690; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3691; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1692; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0693; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2694; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0695; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0696; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0697; AVX1-NEXT: vpmovmskb %xmm0, %eax698; AVX1-NEXT: xorb %ah, %al699; AVX1-NEXT: setnp %al700; AVX1-NEXT: vzeroupper701; AVX1-NEXT: retq702;703; AVX2-LABEL: trunc_v16i32_v16i1:704; AVX2: # %bb.0:705; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]706; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1707; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0708; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0709; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1710; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0711; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]712; AVX2-NEXT: vpsllw $7, %xmm0, %xmm0713; AVX2-NEXT: vpmovmskb %xmm0, %eax714; AVX2-NEXT: xorb %ah, %al715; AVX2-NEXT: setnp %al716; AVX2-NEXT: vzeroupper717; AVX2-NEXT: retq718;719; AVX512F-LABEL: trunc_v16i32_v16i1:720; AVX512F: # %bb.0:721; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0722; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0723; AVX512F-NEXT: kmovw %k0, %eax724; AVX512F-NEXT: movl %eax, %ecx725; AVX512F-NEXT: shrl $8, %eax726; AVX512F-NEXT: xorb %cl, %al727; AVX512F-NEXT: setnp %al728; AVX512F-NEXT: vzeroupper729; AVX512F-NEXT: retq730;731; AVX512BW-LABEL: trunc_v16i32_v16i1:732; AVX512BW: # %bb.0:733; AVX512BW-NEXT: vpslld $31, %zmm0, %zmm0734; AVX512BW-NEXT: vptestmd %zmm0, %zmm0, %k0735; AVX512BW-NEXT: kmovd %k0, %eax736; AVX512BW-NEXT: movl %eax, %ecx737; AVX512BW-NEXT: shrl $8, %eax738; AVX512BW-NEXT: xorb %cl, %al739; AVX512BW-NEXT: setnp %al740; AVX512BW-NEXT: vzeroupper741; AVX512BW-NEXT: retq742;743; AVX512VL-LABEL: trunc_v16i32_v16i1:744; AVX512VL: # %bb.0:745; AVX512VL-NEXT: vpslld $31, %zmm0, %zmm0746; AVX512VL-NEXT: vptestmd %zmm0, %zmm0, %k0747; AVX512VL-NEXT: kmovd %k0, %eax748; AVX512VL-NEXT: movl %eax, %ecx749; AVX512VL-NEXT: shrl $8, %eax750; AVX512VL-NEXT: xorb %cl, %al751; AVX512VL-NEXT: setnp %al752; AVX512VL-NEXT: vzeroupper753; AVX512VL-NEXT: retq754 %a = trunc <16 x i32> %0 to <16 x i1>755 %b = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)756 ret i1 %b757}758 759define i1 @trunc_v32i16_v32i1(<32 x i16>) nounwind {760; X86-SSE2-LABEL: trunc_v32i16_v32i1:761; X86-SSE2: # %bb.0:762; X86-SSE2-NEXT: pushl %ebp763; X86-SSE2-NEXT: movl %esp, %ebp764; X86-SSE2-NEXT: andl $-16, %esp765; X86-SSE2-NEXT: subl $16, %esp766; X86-SSE2-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]767; X86-SSE2-NEXT: pand %xmm3, %xmm1768; X86-SSE2-NEXT: pand %xmm3, %xmm0769; X86-SSE2-NEXT: packuswb %xmm1, %xmm0770; X86-SSE2-NEXT: pand %xmm3, %xmm2771; X86-SSE2-NEXT: pand 8(%ebp), %xmm3772; X86-SSE2-NEXT: packuswb %xmm3, %xmm2773; X86-SSE2-NEXT: pxor %xmm0, %xmm2774; X86-SSE2-NEXT: psllw $7, %xmm2775; X86-SSE2-NEXT: pmovmskb %xmm2, %eax776; X86-SSE2-NEXT: xorb %ah, %al777; X86-SSE2-NEXT: setnp %al778; X86-SSE2-NEXT: movl %ebp, %esp779; X86-SSE2-NEXT: popl %ebp780; X86-SSE2-NEXT: retl781;782; X64-SSE2-LABEL: trunc_v32i16_v32i1:783; X64-SSE2: # %bb.0:784; X64-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]785; X64-SSE2-NEXT: pand %xmm4, %xmm3786; X64-SSE2-NEXT: pand %xmm4, %xmm2787; X64-SSE2-NEXT: packuswb %xmm3, %xmm2788; X64-SSE2-NEXT: pand %xmm4, %xmm1789; X64-SSE2-NEXT: pand %xmm4, %xmm0790; X64-SSE2-NEXT: packuswb %xmm1, %xmm0791; X64-SSE2-NEXT: pxor %xmm2, %xmm0792; X64-SSE2-NEXT: psllw $7, %xmm0793; X64-SSE2-NEXT: pmovmskb %xmm0, %eax794; X64-SSE2-NEXT: xorb %ah, %al795; X64-SSE2-NEXT: setnp %al796; X64-SSE2-NEXT: retq797;798; SSE41-LABEL: trunc_v32i16_v32i1:799; SSE41: # %bb.0:800; SSE41-NEXT: pmovzxbw {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]801; SSE41-NEXT: pand %xmm4, %xmm3802; SSE41-NEXT: pand %xmm4, %xmm2803; SSE41-NEXT: packuswb %xmm3, %xmm2804; SSE41-NEXT: pand %xmm4, %xmm1805; SSE41-NEXT: pand %xmm4, %xmm0806; SSE41-NEXT: packuswb %xmm1, %xmm0807; SSE41-NEXT: pxor %xmm2, %xmm0808; SSE41-NEXT: psllw $7, %xmm0809; SSE41-NEXT: pmovmskb %xmm0, %eax810; SSE41-NEXT: xorb %ah, %al811; SSE41-NEXT: setnp %al812; SSE41-NEXT: retq813;814; AVX1-LABEL: trunc_v32i16_v32i1:815; AVX1: # %bb.0:816; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0817; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0818; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1819; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0820; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0821; AVX1-NEXT: vpmovmskb %xmm0, %eax822; AVX1-NEXT: xorb %ah, %al823; AVX1-NEXT: setnp %al824; AVX1-NEXT: vzeroupper825; AVX1-NEXT: retq826;827; AVX2-LABEL: trunc_v32i16_v32i1:828; AVX2: # %bb.0:829; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]830; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1831; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0832; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0833; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]834; AVX2-NEXT: vpsllw $7, %ymm0, %ymm0835; AVX2-NEXT: vpmovmskb %ymm0, %eax836; AVX2-NEXT: movl %eax, %ecx837; AVX2-NEXT: shrl $16, %ecx838; AVX2-NEXT: xorl %eax, %ecx839; AVX2-NEXT: xorb %ch, %cl840; AVX2-NEXT: setnp %al841; AVX2-NEXT: vzeroupper842; AVX2-NEXT: retq843;844; AVX512F-LABEL: trunc_v32i16_v32i1:845; AVX512F: # %bb.0:846; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1847; AVX512F-NEXT: vpxor %ymm1, %ymm0, %ymm0848; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0849; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0850; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0851; AVX512F-NEXT: kshiftrw $8, %k0, %k1852; AVX512F-NEXT: kxorw %k1, %k0, %k0853; AVX512F-NEXT: kshiftrw $4, %k0, %k1854; AVX512F-NEXT: kxorw %k1, %k0, %k0855; AVX512F-NEXT: kshiftrw $2, %k0, %k1856; AVX512F-NEXT: kxorw %k1, %k0, %k0857; AVX512F-NEXT: kshiftrw $1, %k0, %k1858; AVX512F-NEXT: kxorw %k1, %k0, %k0859; AVX512F-NEXT: kmovw %k0, %eax860; AVX512F-NEXT: # kill: def $al killed $al killed $eax861; AVX512F-NEXT: vzeroupper862; AVX512F-NEXT: retq863;864; AVX512BW-LABEL: trunc_v32i16_v32i1:865; AVX512BW: # %bb.0:866; AVX512BW-NEXT: vpsllw $15, %zmm0, %zmm0867; AVX512BW-NEXT: vpmovw2m %zmm0, %k0868; AVX512BW-NEXT: kmovd %k0, %eax869; AVX512BW-NEXT: movl %eax, %ecx870; AVX512BW-NEXT: shrl $16, %ecx871; AVX512BW-NEXT: xorl %eax, %ecx872; AVX512BW-NEXT: xorb %ch, %cl873; AVX512BW-NEXT: setnp %al874; AVX512BW-NEXT: vzeroupper875; AVX512BW-NEXT: retq876;877; AVX512VL-LABEL: trunc_v32i16_v32i1:878; AVX512VL: # %bb.0:879; AVX512VL-NEXT: vpsllw $15, %zmm0, %zmm0880; AVX512VL-NEXT: vpmovw2m %zmm0, %k0881; AVX512VL-NEXT: kmovd %k0, %eax882; AVX512VL-NEXT: movl %eax, %ecx883; AVX512VL-NEXT: shrl $16, %ecx884; AVX512VL-NEXT: xorl %eax, %ecx885; AVX512VL-NEXT: xorb %ch, %cl886; AVX512VL-NEXT: setnp %al887; AVX512VL-NEXT: vzeroupper888; AVX512VL-NEXT: retq889 %a = trunc <32 x i16> %0 to <32 x i1>890 %b = call i1 @llvm.vector.reduce.xor.v32i1(<32 x i1> %a)891 ret i1 %b892}893 894define i1 @trunc_v64i8_v64i1(<64 x i8>) nounwind {895; X86-SSE2-LABEL: trunc_v64i8_v64i1:896; X86-SSE2: # %bb.0:897; X86-SSE2-NEXT: pushl %ebp898; X86-SSE2-NEXT: movl %esp, %ebp899; X86-SSE2-NEXT: andl $-16, %esp900; X86-SSE2-NEXT: subl $16, %esp901; X86-SSE2-NEXT: pxor %xmm2, %xmm0902; X86-SSE2-NEXT: pxor 8(%ebp), %xmm1903; X86-SSE2-NEXT: pxor %xmm0, %xmm1904; X86-SSE2-NEXT: psllw $7, %xmm1905; X86-SSE2-NEXT: pmovmskb %xmm1, %eax906; X86-SSE2-NEXT: xorb %ah, %al907; X86-SSE2-NEXT: setnp %al908; X86-SSE2-NEXT: movl %ebp, %esp909; X86-SSE2-NEXT: popl %ebp910; X86-SSE2-NEXT: retl911;912; X64-SSE-LABEL: trunc_v64i8_v64i1:913; X64-SSE: # %bb.0:914; X64-SSE-NEXT: pxor %xmm3, %xmm1915; X64-SSE-NEXT: pxor %xmm2, %xmm0916; X64-SSE-NEXT: pxor %xmm1, %xmm0917; X64-SSE-NEXT: psllw $7, %xmm0918; X64-SSE-NEXT: pmovmskb %xmm0, %eax919; X64-SSE-NEXT: xorb %ah, %al920; X64-SSE-NEXT: setnp %al921; X64-SSE-NEXT: retq922;923; AVX1-LABEL: trunc_v64i8_v64i1:924; AVX1: # %bb.0:925; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0926; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1927; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0928; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0929; AVX1-NEXT: vpmovmskb %xmm0, %eax930; AVX1-NEXT: xorb %ah, %al931; AVX1-NEXT: setnp %al932; AVX1-NEXT: vzeroupper933; AVX1-NEXT: retq934;935; AVX2-LABEL: trunc_v64i8_v64i1:936; AVX2: # %bb.0:937; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0938; AVX2-NEXT: vpsllw $7, %ymm0, %ymm0939; AVX2-NEXT: vpmovmskb %ymm0, %eax940; AVX2-NEXT: movl %eax, %ecx941; AVX2-NEXT: shrl $16, %ecx942; AVX2-NEXT: xorl %eax, %ecx943; AVX2-NEXT: xorb %ch, %cl944; AVX2-NEXT: setnp %al945; AVX2-NEXT: vzeroupper946; AVX2-NEXT: retq947;948; AVX512F-LABEL: trunc_v64i8_v64i1:949; AVX512F: # %bb.0:950; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm1951; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2952; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3953; AVX512F-NEXT: vpxor %xmm2, %xmm3, %xmm2954; AVX512F-NEXT: vpxor %xmm1, %xmm0, %xmm0955; AVX512F-NEXT: vpxor %xmm2, %xmm0, %xmm0956; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0957; AVX512F-NEXT: vpslld $31, %zmm0, %zmm0958; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0959; AVX512F-NEXT: kshiftrw $8, %k0, %k1960; AVX512F-NEXT: kxorw %k1, %k0, %k0961; AVX512F-NEXT: kshiftrw $4, %k0, %k1962; AVX512F-NEXT: kxorw %k1, %k0, %k0963; AVX512F-NEXT: kshiftrw $2, %k0, %k1964; AVX512F-NEXT: kxorw %k1, %k0, %k0965; AVX512F-NEXT: kshiftrw $1, %k0, %k1966; AVX512F-NEXT: kxorw %k1, %k0, %k0967; AVX512F-NEXT: kmovw %k0, %eax968; AVX512F-NEXT: # kill: def $al killed $al killed $eax969; AVX512F-NEXT: vzeroupper970; AVX512F-NEXT: retq971;972; AVX512BW-LABEL: trunc_v64i8_v64i1:973; AVX512BW: # %bb.0:974; AVX512BW-NEXT: vpsllw $7, %zmm0, %zmm0975; AVX512BW-NEXT: vpmovb2m %zmm0, %k0976; AVX512BW-NEXT: kmovq %k0, %rax977; AVX512BW-NEXT: movl %eax, %ecx978; AVX512BW-NEXT: shrq $32, %rax979; AVX512BW-NEXT: xorl %ecx, %eax980; AVX512BW-NEXT: movl %eax, %ecx981; AVX512BW-NEXT: shrl $16, %ecx982; AVX512BW-NEXT: xorl %eax, %ecx983; AVX512BW-NEXT: xorb %ch, %cl984; AVX512BW-NEXT: setnp %al985; AVX512BW-NEXT: vzeroupper986; AVX512BW-NEXT: retq987;988; AVX512VL-LABEL: trunc_v64i8_v64i1:989; AVX512VL: # %bb.0:990; AVX512VL-NEXT: vpsllw $7, %zmm0, %zmm0991; AVX512VL-NEXT: vpmovb2m %zmm0, %k0992; AVX512VL-NEXT: kmovq %k0, %rax993; AVX512VL-NEXT: movl %eax, %ecx994; AVX512VL-NEXT: shrq $32, %rax995; AVX512VL-NEXT: xorl %ecx, %eax996; AVX512VL-NEXT: movl %eax, %ecx997; AVX512VL-NEXT: shrl $16, %ecx998; AVX512VL-NEXT: xorl %eax, %ecx999; AVX512VL-NEXT: xorb %ch, %cl1000; AVX512VL-NEXT: setnp %al1001; AVX512VL-NEXT: vzeroupper1002; AVX512VL-NEXT: retq1003 %a = trunc <64 x i8> %0 to <64 x i1>1004 %b = call i1 @llvm.vector.reduce.xor.v64i1(<64 x i1> %a)1005 ret i1 %b1006}1007 1008;1009; Comparison With Zero1010;1011 1012define i1 @icmp0_v2i64_v2i1(<2 x i64>) nounwind {1013; SSE2-LABEL: icmp0_v2i64_v2i1:1014; SSE2: # %bb.0:1015; SSE2-NEXT: pxor %xmm1, %xmm11016; SSE2-NEXT: pcmpeqd %xmm0, %xmm11017; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]1018; SSE2-NEXT: pand %xmm1, %xmm01019; SSE2-NEXT: movmskpd %xmm0, %eax1020; SSE2-NEXT: testb %al, %al1021; SSE2-NEXT: setnp %al1022; SSE2-NEXT: ret{{[l|q]}}1023;1024; SSE41-LABEL: icmp0_v2i64_v2i1:1025; SSE41: # %bb.0:1026; SSE41-NEXT: pxor %xmm1, %xmm11027; SSE41-NEXT: pcmpeqq %xmm0, %xmm11028; SSE41-NEXT: movmskpd %xmm1, %eax1029; SSE41-NEXT: testb %al, %al1030; SSE41-NEXT: setnp %al1031; SSE41-NEXT: retq1032;1033; AVX-LABEL: icmp0_v2i64_v2i1:1034; AVX: # %bb.0:1035; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm11036; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm01037; AVX-NEXT: vmovmskpd %xmm0, %eax1038; AVX-NEXT: testb %al, %al1039; AVX-NEXT: setnp %al1040; AVX-NEXT: retq1041;1042; AVX512F-LABEL: icmp0_v2i64_v2i1:1043; AVX512F: # %bb.0:1044; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01045; AVX512F-NEXT: vptestnmq %zmm0, %zmm0, %k01046; AVX512F-NEXT: kmovw %k0, %eax1047; AVX512F-NEXT: testb $3, %al1048; AVX512F-NEXT: setnp %al1049; AVX512F-NEXT: vzeroupper1050; AVX512F-NEXT: retq1051;1052; AVX512BW-LABEL: icmp0_v2i64_v2i1:1053; AVX512BW: # %bb.0:1054; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01055; AVX512BW-NEXT: vptestnmq %zmm0, %zmm0, %k01056; AVX512BW-NEXT: kmovd %k0, %eax1057; AVX512BW-NEXT: testb $3, %al1058; AVX512BW-NEXT: setnp %al1059; AVX512BW-NEXT: vzeroupper1060; AVX512BW-NEXT: retq1061;1062; AVX512VL-LABEL: icmp0_v2i64_v2i1:1063; AVX512VL: # %bb.0:1064; AVX512VL-NEXT: vptestnmq %xmm0, %xmm0, %k01065; AVX512VL-NEXT: kmovd %k0, %eax1066; AVX512VL-NEXT: testb %al, %al1067; AVX512VL-NEXT: setnp %al1068; AVX512VL-NEXT: retq1069 %a = icmp eq <2 x i64> %0, zeroinitializer1070 %b = call i1 @llvm.vector.reduce.xor.v2i1(<2 x i1> %a)1071 ret i1 %b1072}1073 1074define i1 @icmp0_v4i32_v4i1(<4 x i32>) nounwind {1075; SSE-LABEL: icmp0_v4i32_v4i1:1076; SSE: # %bb.0:1077; SSE-NEXT: pxor %xmm1, %xmm11078; SSE-NEXT: pcmpeqd %xmm0, %xmm11079; SSE-NEXT: movmskps %xmm1, %eax1080; SSE-NEXT: testb %al, %al1081; SSE-NEXT: setnp %al1082; SSE-NEXT: ret{{[l|q]}}1083;1084; AVX-LABEL: icmp0_v4i32_v4i1:1085; AVX: # %bb.0:1086; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm11087; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01088; AVX-NEXT: vmovmskps %xmm0, %eax1089; AVX-NEXT: testb %al, %al1090; AVX-NEXT: setnp %al1091; AVX-NEXT: retq1092;1093; AVX512F-LABEL: icmp0_v4i32_v4i1:1094; AVX512F: # %bb.0:1095; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01096; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k01097; AVX512F-NEXT: kmovw %k0, %eax1098; AVX512F-NEXT: testb $15, %al1099; AVX512F-NEXT: setnp %al1100; AVX512F-NEXT: vzeroupper1101; AVX512F-NEXT: retq1102;1103; AVX512BW-LABEL: icmp0_v4i32_v4i1:1104; AVX512BW: # %bb.0:1105; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01106; AVX512BW-NEXT: vptestnmd %zmm0, %zmm0, %k01107; AVX512BW-NEXT: kmovd %k0, %eax1108; AVX512BW-NEXT: testb $15, %al1109; AVX512BW-NEXT: setnp %al1110; AVX512BW-NEXT: vzeroupper1111; AVX512BW-NEXT: retq1112;1113; AVX512VL-LABEL: icmp0_v4i32_v4i1:1114; AVX512VL: # %bb.0:1115; AVX512VL-NEXT: vptestnmd %xmm0, %xmm0, %k01116; AVX512VL-NEXT: kmovd %k0, %eax1117; AVX512VL-NEXT: testb %al, %al1118; AVX512VL-NEXT: setnp %al1119; AVX512VL-NEXT: retq1120 %a = icmp eq <4 x i32> %0, zeroinitializer1121 %b = call i1 @llvm.vector.reduce.xor.v4i1(<4 x i1> %a)1122 ret i1 %b1123}1124 1125define i1 @icmp0_v8i16_v8i1(<8 x i16>) nounwind {1126; SSE-LABEL: icmp0_v8i16_v8i1:1127; SSE: # %bb.0:1128; SSE-NEXT: pxor %xmm1, %xmm11129; SSE-NEXT: pcmpeqw %xmm0, %xmm11130; SSE-NEXT: packsswb %xmm1, %xmm11131; SSE-NEXT: pmovmskb %xmm1, %eax1132; SSE-NEXT: testb %al, %al1133; SSE-NEXT: setnp %al1134; SSE-NEXT: ret{{[l|q]}}1135;1136; AVX-LABEL: icmp0_v8i16_v8i1:1137; AVX: # %bb.0:1138; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm11139; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm01140; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm01141; AVX-NEXT: vpmovmskb %xmm0, %eax1142; AVX-NEXT: testb %al, %al1143; AVX-NEXT: setnp %al1144; AVX-NEXT: retq1145;1146; AVX512F-LABEL: icmp0_v8i16_v8i1:1147; AVX512F: # %bb.0:1148; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm11149; AVX512F-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm01150; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm01151; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k01152; AVX512F-NEXT: kmovw %k0, %eax1153; AVX512F-NEXT: testb %al, %al1154; AVX512F-NEXT: setnp %al1155; AVX512F-NEXT: vzeroupper1156; AVX512F-NEXT: retq1157;1158; AVX512BW-LABEL: icmp0_v8i16_v8i1:1159; AVX512BW: # %bb.0:1160; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01161; AVX512BW-NEXT: vptestnmw %zmm0, %zmm0, %k01162; AVX512BW-NEXT: kmovd %k0, %eax1163; AVX512BW-NEXT: testb %al, %al1164; AVX512BW-NEXT: setnp %al1165; AVX512BW-NEXT: vzeroupper1166; AVX512BW-NEXT: retq1167;1168; AVX512VL-LABEL: icmp0_v8i16_v8i1:1169; AVX512VL: # %bb.0:1170; AVX512VL-NEXT: vptestnmw %xmm0, %xmm0, %k01171; AVX512VL-NEXT: kmovd %k0, %eax1172; AVX512VL-NEXT: testb %al, %al1173; AVX512VL-NEXT: setnp %al1174; AVX512VL-NEXT: retq1175 %a = icmp eq <8 x i16> %0, zeroinitializer1176 %b = call i1 @llvm.vector.reduce.xor.v8i1(<8 x i1> %a)1177 ret i1 %b1178}1179 1180define i1 @icmp0_v16i8_v16i1(<16 x i8>) nounwind {1181; SSE-LABEL: icmp0_v16i8_v16i1:1182; SSE: # %bb.0:1183; SSE-NEXT: pxor %xmm1, %xmm11184; SSE-NEXT: pcmpeqb %xmm0, %xmm11185; SSE-NEXT: pmovmskb %xmm1, %eax1186; SSE-NEXT: xorb %ah, %al1187; SSE-NEXT: setnp %al1188; SSE-NEXT: ret{{[l|q]}}1189;1190; AVX-LABEL: icmp0_v16i8_v16i1:1191; AVX: # %bb.0:1192; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm11193; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm01194; AVX-NEXT: vpmovmskb %xmm0, %eax1195; AVX-NEXT: xorb %ah, %al1196; AVX-NEXT: setnp %al1197; AVX-NEXT: retq1198;1199; AVX512F-LABEL: icmp0_v16i8_v16i1:1200; AVX512F: # %bb.0:1201; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm11202; AVX512F-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm01203; AVX512F-NEXT: vpmovmskb %xmm0, %eax1204; AVX512F-NEXT: xorb %ah, %al1205; AVX512F-NEXT: setnp %al1206; AVX512F-NEXT: retq1207;1208; AVX512BW-LABEL: icmp0_v16i8_v16i1:1209; AVX512BW: # %bb.0:1210; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01211; AVX512BW-NEXT: vptestnmb %zmm0, %zmm0, %k01212; AVX512BW-NEXT: kmovd %k0, %eax1213; AVX512BW-NEXT: movl %eax, %ecx1214; AVX512BW-NEXT: shrl $8, %eax1215; AVX512BW-NEXT: xorb %cl, %al1216; AVX512BW-NEXT: setnp %al1217; AVX512BW-NEXT: vzeroupper1218; AVX512BW-NEXT: retq1219;1220; AVX512VL-LABEL: icmp0_v16i8_v16i1:1221; AVX512VL: # %bb.0:1222; AVX512VL-NEXT: vptestnmb %xmm0, %xmm0, %k01223; AVX512VL-NEXT: kmovd %k0, %eax1224; AVX512VL-NEXT: movl %eax, %ecx1225; AVX512VL-NEXT: shrl $8, %eax1226; AVX512VL-NEXT: xorb %cl, %al1227; AVX512VL-NEXT: setnp %al1228; AVX512VL-NEXT: retq1229 %a = icmp eq <16 x i8> %0, zeroinitializer1230 %b = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)1231 ret i1 %b1232}1233 1234define i1 @icmp0_v4i64_v4i1(<4 x i64>) nounwind {1235; SSE2-LABEL: icmp0_v4i64_v4i1:1236; SSE2: # %bb.0:1237; SSE2-NEXT: pxor %xmm2, %xmm21238; SSE2-NEXT: pcmpeqd %xmm2, %xmm11239; SSE2-NEXT: pcmpeqd %xmm2, %xmm01240; SSE2-NEXT: movdqa %xmm0, %xmm21241; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm1[1,3]1242; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1243; SSE2-NEXT: andps %xmm2, %xmm01244; SSE2-NEXT: movmskps %xmm0, %eax1245; SSE2-NEXT: testb %al, %al1246; SSE2-NEXT: setnp %al1247; SSE2-NEXT: ret{{[l|q]}}1248;1249; SSE41-LABEL: icmp0_v4i64_v4i1:1250; SSE41: # %bb.0:1251; SSE41-NEXT: pxor %xmm2, %xmm21252; SSE41-NEXT: pcmpeqq %xmm2, %xmm11253; SSE41-NEXT: pcmpeqq %xmm2, %xmm01254; SSE41-NEXT: packssdw %xmm1, %xmm01255; SSE41-NEXT: movmskps %xmm0, %eax1256; SSE41-NEXT: testb %al, %al1257; SSE41-NEXT: setnp %al1258; SSE41-NEXT: retq1259;1260; AVX1-LABEL: icmp0_v4i64_v4i1:1261; AVX1: # %bb.0:1262; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11263; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21264; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm11265; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm01266; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01267; AVX1-NEXT: vmovmskpd %ymm0, %eax1268; AVX1-NEXT: testb %al, %al1269; AVX1-NEXT: setnp %al1270; AVX1-NEXT: vzeroupper1271; AVX1-NEXT: retq1272;1273; AVX2-LABEL: icmp0_v4i64_v4i1:1274; AVX2: # %bb.0:1275; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11276; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm01277; AVX2-NEXT: vmovmskpd %ymm0, %eax1278; AVX2-NEXT: testb %al, %al1279; AVX2-NEXT: setnp %al1280; AVX2-NEXT: vzeroupper1281; AVX2-NEXT: retq1282;1283; AVX512F-LABEL: icmp0_v4i64_v4i1:1284; AVX512F: # %bb.0:1285; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01286; AVX512F-NEXT: vptestnmq %zmm0, %zmm0, %k01287; AVX512F-NEXT: kmovw %k0, %eax1288; AVX512F-NEXT: testb $15, %al1289; AVX512F-NEXT: setnp %al1290; AVX512F-NEXT: vzeroupper1291; AVX512F-NEXT: retq1292;1293; AVX512BW-LABEL: icmp0_v4i64_v4i1:1294; AVX512BW: # %bb.0:1295; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01296; AVX512BW-NEXT: vptestnmq %zmm0, %zmm0, %k01297; AVX512BW-NEXT: kmovd %k0, %eax1298; AVX512BW-NEXT: testb $15, %al1299; AVX512BW-NEXT: setnp %al1300; AVX512BW-NEXT: vzeroupper1301; AVX512BW-NEXT: retq1302;1303; AVX512VL-LABEL: icmp0_v4i64_v4i1:1304; AVX512VL: # %bb.0:1305; AVX512VL-NEXT: vptestnmq %ymm0, %ymm0, %k01306; AVX512VL-NEXT: kmovd %k0, %eax1307; AVX512VL-NEXT: testb %al, %al1308; AVX512VL-NEXT: setnp %al1309; AVX512VL-NEXT: vzeroupper1310; AVX512VL-NEXT: retq1311 %a = icmp eq <4 x i64> %0, zeroinitializer1312 %b = call i1 @llvm.vector.reduce.xor.v4i1(<4 x i1> %a)1313 ret i1 %b1314}1315 1316define i1 @icmp0_v8i32_v8i1(<8 x i32>) nounwind {1317; SSE-LABEL: icmp0_v8i32_v8i1:1318; SSE: # %bb.0:1319; SSE-NEXT: pxor %xmm2, %xmm21320; SSE-NEXT: pcmpeqd %xmm2, %xmm11321; SSE-NEXT: pcmpeqd %xmm2, %xmm01322; SSE-NEXT: packssdw %xmm1, %xmm01323; SSE-NEXT: packsswb %xmm0, %xmm01324; SSE-NEXT: pmovmskb %xmm0, %eax1325; SSE-NEXT: testb %al, %al1326; SSE-NEXT: setnp %al1327; SSE-NEXT: ret{{[l|q]}}1328;1329; AVX1-LABEL: icmp0_v8i32_v8i1:1330; AVX1: # %bb.0:1331; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11332; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21333; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm11334; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm01335; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01336; AVX1-NEXT: vmovmskps %ymm0, %eax1337; AVX1-NEXT: testb %al, %al1338; AVX1-NEXT: setnp %al1339; AVX1-NEXT: vzeroupper1340; AVX1-NEXT: retq1341;1342; AVX2-LABEL: icmp0_v8i32_v8i1:1343; AVX2: # %bb.0:1344; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11345; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm01346; AVX2-NEXT: vmovmskps %ymm0, %eax1347; AVX2-NEXT: testb %al, %al1348; AVX2-NEXT: setnp %al1349; AVX2-NEXT: vzeroupper1350; AVX2-NEXT: retq1351;1352; AVX512F-LABEL: icmp0_v8i32_v8i1:1353; AVX512F: # %bb.0:1354; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01355; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k01356; AVX512F-NEXT: kmovw %k0, %eax1357; AVX512F-NEXT: testb %al, %al1358; AVX512F-NEXT: setnp %al1359; AVX512F-NEXT: vzeroupper1360; AVX512F-NEXT: retq1361;1362; AVX512BW-LABEL: icmp0_v8i32_v8i1:1363; AVX512BW: # %bb.0:1364; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01365; AVX512BW-NEXT: vptestnmd %zmm0, %zmm0, %k01366; AVX512BW-NEXT: kmovd %k0, %eax1367; AVX512BW-NEXT: testb %al, %al1368; AVX512BW-NEXT: setnp %al1369; AVX512BW-NEXT: vzeroupper1370; AVX512BW-NEXT: retq1371;1372; AVX512VL-LABEL: icmp0_v8i32_v8i1:1373; AVX512VL: # %bb.0:1374; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k01375; AVX512VL-NEXT: kmovd %k0, %eax1376; AVX512VL-NEXT: testb %al, %al1377; AVX512VL-NEXT: setnp %al1378; AVX512VL-NEXT: vzeroupper1379; AVX512VL-NEXT: retq1380 %a = icmp eq <8 x i32> %0, zeroinitializer1381 %b = call i1 @llvm.vector.reduce.xor.v8i1(<8 x i1> %a)1382 ret i1 %b1383}1384 1385define i1 @icmp0_v16i16_v16i1(<16 x i16>) nounwind {1386; SSE-LABEL: icmp0_v16i16_v16i1:1387; SSE: # %bb.0:1388; SSE-NEXT: pxor %xmm2, %xmm21389; SSE-NEXT: pcmpeqw %xmm2, %xmm11390; SSE-NEXT: pcmpeqw %xmm2, %xmm01391; SSE-NEXT: packsswb %xmm1, %xmm01392; SSE-NEXT: pmovmskb %xmm0, %eax1393; SSE-NEXT: xorb %ah, %al1394; SSE-NEXT: setnp %al1395; SSE-NEXT: ret{{[l|q]}}1396;1397; AVX1-LABEL: icmp0_v16i16_v16i1:1398; AVX1: # %bb.0:1399; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11400; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21401; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm11402; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm01403; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm01404; AVX1-NEXT: vpmovmskb %xmm0, %eax1405; AVX1-NEXT: xorb %ah, %al1406; AVX1-NEXT: setnp %al1407; AVX1-NEXT: vzeroupper1408; AVX1-NEXT: retq1409;1410; AVX2-LABEL: icmp0_v16i16_v16i1:1411; AVX2: # %bb.0:1412; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11413; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm01414; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11415; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm01416; AVX2-NEXT: vpmovmskb %xmm0, %eax1417; AVX2-NEXT: xorb %ah, %al1418; AVX2-NEXT: setnp %al1419; AVX2-NEXT: vzeroupper1420; AVX2-NEXT: retq1421;1422; AVX512F-LABEL: icmp0_v16i16_v16i1:1423; AVX512F: # %bb.0:1424; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm11425; AVX512F-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm01426; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm01427; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k01428; AVX512F-NEXT: kmovw %k0, %eax1429; AVX512F-NEXT: movl %eax, %ecx1430; AVX512F-NEXT: shrl $8, %eax1431; AVX512F-NEXT: xorb %cl, %al1432; AVX512F-NEXT: setnp %al1433; AVX512F-NEXT: vzeroupper1434; AVX512F-NEXT: retq1435;1436; AVX512BW-LABEL: icmp0_v16i16_v16i1:1437; AVX512BW: # %bb.0:1438; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01439; AVX512BW-NEXT: vptestnmw %zmm0, %zmm0, %k01440; AVX512BW-NEXT: kmovd %k0, %eax1441; AVX512BW-NEXT: movl %eax, %ecx1442; AVX512BW-NEXT: shrl $8, %eax1443; AVX512BW-NEXT: xorb %cl, %al1444; AVX512BW-NEXT: setnp %al1445; AVX512BW-NEXT: vzeroupper1446; AVX512BW-NEXT: retq1447;1448; AVX512VL-LABEL: icmp0_v16i16_v16i1:1449; AVX512VL: # %bb.0:1450; AVX512VL-NEXT: vptestnmw %ymm0, %ymm0, %k01451; AVX512VL-NEXT: kmovd %k0, %eax1452; AVX512VL-NEXT: movl %eax, %ecx1453; AVX512VL-NEXT: shrl $8, %eax1454; AVX512VL-NEXT: xorb %cl, %al1455; AVX512VL-NEXT: setnp %al1456; AVX512VL-NEXT: vzeroupper1457; AVX512VL-NEXT: retq1458 %a = icmp eq <16 x i16> %0, zeroinitializer1459 %b = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)1460 ret i1 %b1461}1462 1463define i1 @icmp0_v32i8_v32i1(<32 x i8>) nounwind {1464; SSE-LABEL: icmp0_v32i8_v32i1:1465; SSE: # %bb.0:1466; SSE-NEXT: pxor %xmm2, %xmm21467; SSE-NEXT: pcmpeqb %xmm2, %xmm11468; SSE-NEXT: pcmpeqb %xmm2, %xmm01469; SSE-NEXT: pxor %xmm1, %xmm01470; SSE-NEXT: pmovmskb %xmm0, %eax1471; SSE-NEXT: xorb %ah, %al1472; SSE-NEXT: setnp %al1473; SSE-NEXT: ret{{[l|q]}}1474;1475; AVX1-LABEL: icmp0_v32i8_v32i1:1476; AVX1: # %bb.0:1477; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11478; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21479; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm11480; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm01481; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm01482; AVX1-NEXT: vpmovmskb %xmm0, %eax1483; AVX1-NEXT: xorb %ah, %al1484; AVX1-NEXT: setnp %al1485; AVX1-NEXT: vzeroupper1486; AVX1-NEXT: retq1487;1488; AVX2-LABEL: icmp0_v32i8_v32i1:1489; AVX2: # %bb.0:1490; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11491; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm01492; AVX2-NEXT: vpmovmskb %ymm0, %eax1493; AVX2-NEXT: movl %eax, %ecx1494; AVX2-NEXT: shrl $16, %ecx1495; AVX2-NEXT: xorl %eax, %ecx1496; AVX2-NEXT: xorb %ch, %cl1497; AVX2-NEXT: setnp %al1498; AVX2-NEXT: vzeroupper1499; AVX2-NEXT: retq1500;1501; AVX512F-LABEL: icmp0_v32i8_v32i1:1502; AVX512F: # %bb.0:1503; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm11504; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm01505; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm11506; AVX512F-NEXT: vpxor %xmm1, %xmm0, %xmm01507; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm01508; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k01509; AVX512F-NEXT: kshiftrw $8, %k0, %k11510; AVX512F-NEXT: kxorw %k1, %k0, %k01511; AVX512F-NEXT: kshiftrw $4, %k0, %k11512; AVX512F-NEXT: kxorw %k1, %k0, %k01513; AVX512F-NEXT: kshiftrw $2, %k0, %k11514; AVX512F-NEXT: kxorw %k1, %k0, %k01515; AVX512F-NEXT: kshiftrw $1, %k0, %k11516; AVX512F-NEXT: kxorw %k1, %k0, %k01517; AVX512F-NEXT: kmovw %k0, %eax1518; AVX512F-NEXT: # kill: def $al killed $al killed $eax1519; AVX512F-NEXT: vzeroupper1520; AVX512F-NEXT: retq1521;1522; AVX512BW-LABEL: icmp0_v32i8_v32i1:1523; AVX512BW: # %bb.0:1524; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01525; AVX512BW-NEXT: vptestnmb %zmm0, %zmm0, %k01526; AVX512BW-NEXT: kmovd %k0, %eax1527; AVX512BW-NEXT: movl %eax, %ecx1528; AVX512BW-NEXT: shrl $16, %ecx1529; AVX512BW-NEXT: xorl %eax, %ecx1530; AVX512BW-NEXT: xorb %ch, %cl1531; AVX512BW-NEXT: setnp %al1532; AVX512BW-NEXT: vzeroupper1533; AVX512BW-NEXT: retq1534;1535; AVX512VL-LABEL: icmp0_v32i8_v32i1:1536; AVX512VL: # %bb.0:1537; AVX512VL-NEXT: vptestnmb %ymm0, %ymm0, %k01538; AVX512VL-NEXT: kmovd %k0, %eax1539; AVX512VL-NEXT: movl %eax, %ecx1540; AVX512VL-NEXT: shrl $16, %ecx1541; AVX512VL-NEXT: xorl %eax, %ecx1542; AVX512VL-NEXT: xorb %ch, %cl1543; AVX512VL-NEXT: setnp %al1544; AVX512VL-NEXT: vzeroupper1545; AVX512VL-NEXT: retq1546 %a = icmp eq <32 x i8> %0, zeroinitializer1547 %b = call i1 @llvm.vector.reduce.xor.v32i1(<32 x i1> %a)1548 ret i1 %b1549}1550 1551define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {1552; X86-SSE2-LABEL: icmp0_v8i64_v8i1:1553; X86-SSE2: # %bb.0:1554; X86-SSE2-NEXT: pushl %ebp1555; X86-SSE2-NEXT: movl %esp, %ebp1556; X86-SSE2-NEXT: andl $-16, %esp1557; X86-SSE2-NEXT: subl $16, %esp1558; X86-SSE2-NEXT: pxor %xmm3, %xmm31559; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm11560; X86-SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,0,3,2]1561; X86-SSE2-NEXT: pand %xmm1, %xmm41562; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm01563; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]1564; X86-SSE2-NEXT: pand %xmm0, %xmm11565; X86-SSE2-NEXT: packssdw %xmm4, %xmm11566; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm21567; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2]1568; X86-SSE2-NEXT: pand %xmm2, %xmm01569; X86-SSE2-NEXT: pcmpeqd 8(%ebp), %xmm31570; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,0,3,2]1571; X86-SSE2-NEXT: pand %xmm3, %xmm21572; X86-SSE2-NEXT: packssdw %xmm2, %xmm01573; X86-SSE2-NEXT: packssdw %xmm0, %xmm11574; X86-SSE2-NEXT: packsswb %xmm1, %xmm11575; X86-SSE2-NEXT: pmovmskb %xmm1, %eax1576; X86-SSE2-NEXT: testb %al, %al1577; X86-SSE2-NEXT: setnp %al1578; X86-SSE2-NEXT: movl %ebp, %esp1579; X86-SSE2-NEXT: popl %ebp1580; X86-SSE2-NEXT: retl1581;1582; X64-SSE2-LABEL: icmp0_v8i64_v8i1:1583; X64-SSE2: # %bb.0:1584; X64-SSE2-NEXT: pxor %xmm4, %xmm41585; X64-SSE2-NEXT: pcmpeqd %xmm4, %xmm31586; X64-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,0,3,2]1587; X64-SSE2-NEXT: pand %xmm3, %xmm51588; X64-SSE2-NEXT: pcmpeqd %xmm4, %xmm21589; X64-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]1590; X64-SSE2-NEXT: pand %xmm2, %xmm31591; X64-SSE2-NEXT: packssdw %xmm5, %xmm31592; X64-SSE2-NEXT: pcmpeqd %xmm4, %xmm11593; X64-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]1594; X64-SSE2-NEXT: pand %xmm1, %xmm21595; X64-SSE2-NEXT: pcmpeqd %xmm4, %xmm01596; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]1597; X64-SSE2-NEXT: pand %xmm0, %xmm11598; X64-SSE2-NEXT: packssdw %xmm2, %xmm11599; X64-SSE2-NEXT: packssdw %xmm3, %xmm11600; X64-SSE2-NEXT: packsswb %xmm1, %xmm11601; X64-SSE2-NEXT: pmovmskb %xmm1, %eax1602; X64-SSE2-NEXT: testb %al, %al1603; X64-SSE2-NEXT: setnp %al1604; X64-SSE2-NEXT: retq1605;1606; SSE41-LABEL: icmp0_v8i64_v8i1:1607; SSE41: # %bb.0:1608; SSE41-NEXT: pxor %xmm4, %xmm41609; SSE41-NEXT: pcmpeqq %xmm4, %xmm31610; SSE41-NEXT: pcmpeqq %xmm4, %xmm21611; SSE41-NEXT: packssdw %xmm3, %xmm21612; SSE41-NEXT: pcmpeqq %xmm4, %xmm11613; SSE41-NEXT: pcmpeqq %xmm4, %xmm01614; SSE41-NEXT: packssdw %xmm1, %xmm01615; SSE41-NEXT: packssdw %xmm2, %xmm01616; SSE41-NEXT: packsswb %xmm0, %xmm01617; SSE41-NEXT: pmovmskb %xmm0, %eax1618; SSE41-NEXT: testb %al, %al1619; SSE41-NEXT: setnp %al1620; SSE41-NEXT: retq1621;1622; AVX1-LABEL: icmp0_v8i64_v8i1:1623; AVX1: # %bb.0:1624; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21625; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm31626; AVX1-NEXT: vpcmpeqq %xmm3, %xmm2, %xmm21627; AVX1-NEXT: vpcmpeqq %xmm3, %xmm1, %xmm11628; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm11629; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21630; AVX1-NEXT: vpcmpeqq %xmm3, %xmm2, %xmm21631; AVX1-NEXT: vpcmpeqq %xmm3, %xmm0, %xmm01632; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm01633; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01634; AVX1-NEXT: vmovmskps %ymm0, %eax1635; AVX1-NEXT: testb %al, %al1636; AVX1-NEXT: setnp %al1637; AVX1-NEXT: vzeroupper1638; AVX1-NEXT: retq1639;1640; AVX2-LABEL: icmp0_v8i64_v8i1:1641; AVX2: # %bb.0:1642; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21643; AVX2-NEXT: vpcmpeqq %ymm2, %ymm1, %ymm11644; AVX2-NEXT: vpcmpeqq %ymm2, %ymm0, %ymm01645; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm01646; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1647; AVX2-NEXT: vmovmskps %ymm0, %eax1648; AVX2-NEXT: testb %al, %al1649; AVX2-NEXT: setnp %al1650; AVX2-NEXT: vzeroupper1651; AVX2-NEXT: retq1652;1653; AVX512F-LABEL: icmp0_v8i64_v8i1:1654; AVX512F: # %bb.0:1655; AVX512F-NEXT: vptestnmq %zmm0, %zmm0, %k01656; AVX512F-NEXT: kmovw %k0, %eax1657; AVX512F-NEXT: testb %al, %al1658; AVX512F-NEXT: setnp %al1659; AVX512F-NEXT: vzeroupper1660; AVX512F-NEXT: retq1661;1662; AVX512BW-LABEL: icmp0_v8i64_v8i1:1663; AVX512BW: # %bb.0:1664; AVX512BW-NEXT: vptestnmq %zmm0, %zmm0, %k01665; AVX512BW-NEXT: kmovd %k0, %eax1666; AVX512BW-NEXT: testb %al, %al1667; AVX512BW-NEXT: setnp %al1668; AVX512BW-NEXT: vzeroupper1669; AVX512BW-NEXT: retq1670;1671; AVX512VL-LABEL: icmp0_v8i64_v8i1:1672; AVX512VL: # %bb.0:1673; AVX512VL-NEXT: vptestnmq %zmm0, %zmm0, %k01674; AVX512VL-NEXT: kmovd %k0, %eax1675; AVX512VL-NEXT: testb %al, %al1676; AVX512VL-NEXT: setnp %al1677; AVX512VL-NEXT: vzeroupper1678; AVX512VL-NEXT: retq1679 %a = icmp eq <8 x i64> %0, zeroinitializer1680 %b = call i1 @llvm.vector.reduce.xor.v8i1(<8 x i1> %a)1681 ret i1 %b1682}1683 1684define i1 @icmp0_v16i32_v16i1(<16 x i32>) nounwind {1685; X86-SSE2-LABEL: icmp0_v16i32_v16i1:1686; X86-SSE2: # %bb.0:1687; X86-SSE2-NEXT: pushl %ebp1688; X86-SSE2-NEXT: movl %esp, %ebp1689; X86-SSE2-NEXT: andl $-16, %esp1690; X86-SSE2-NEXT: subl $16, %esp1691; X86-SSE2-NEXT: pxor %xmm3, %xmm31692; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm11693; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm01694; X86-SSE2-NEXT: packssdw %xmm1, %xmm01695; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm21696; X86-SSE2-NEXT: pcmpeqd 8(%ebp), %xmm31697; X86-SSE2-NEXT: packssdw %xmm3, %xmm21698; X86-SSE2-NEXT: packsswb %xmm2, %xmm01699; X86-SSE2-NEXT: pmovmskb %xmm0, %eax1700; X86-SSE2-NEXT: xorb %ah, %al1701; X86-SSE2-NEXT: setnp %al1702; X86-SSE2-NEXT: movl %ebp, %esp1703; X86-SSE2-NEXT: popl %ebp1704; X86-SSE2-NEXT: retl1705;1706; X64-SSE-LABEL: icmp0_v16i32_v16i1:1707; X64-SSE: # %bb.0:1708; X64-SSE-NEXT: pxor %xmm4, %xmm41709; X64-SSE-NEXT: pcmpeqd %xmm4, %xmm31710; X64-SSE-NEXT: pcmpeqd %xmm4, %xmm21711; X64-SSE-NEXT: packssdw %xmm3, %xmm21712; X64-SSE-NEXT: pcmpeqd %xmm4, %xmm11713; X64-SSE-NEXT: pcmpeqd %xmm4, %xmm01714; X64-SSE-NEXT: packssdw %xmm1, %xmm01715; X64-SSE-NEXT: packsswb %xmm2, %xmm01716; X64-SSE-NEXT: pmovmskb %xmm0, %eax1717; X64-SSE-NEXT: xorb %ah, %al1718; X64-SSE-NEXT: setnp %al1719; X64-SSE-NEXT: retq1720;1721; AVX1-LABEL: icmp0_v16i32_v16i1:1722; AVX1: # %bb.0:1723; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21724; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm31725; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm21726; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm11727; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm11728; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21729; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm21730; AVX1-NEXT: vpcmpeqd %xmm3, %xmm0, %xmm01731; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm01732; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm01733; AVX1-NEXT: vpmovmskb %xmm0, %eax1734; AVX1-NEXT: xorb %ah, %al1735; AVX1-NEXT: setnp %al1736; AVX1-NEXT: vzeroupper1737; AVX1-NEXT: retq1738;1739; AVX2-LABEL: icmp0_v16i32_v16i1:1740; AVX2: # %bb.0:1741; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21742; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm11743; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm01744; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm01745; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11746; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm01747; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]1748; AVX2-NEXT: vpmovmskb %xmm0, %eax1749; AVX2-NEXT: xorb %ah, %al1750; AVX2-NEXT: setnp %al1751; AVX2-NEXT: vzeroupper1752; AVX2-NEXT: retq1753;1754; AVX512F-LABEL: icmp0_v16i32_v16i1:1755; AVX512F: # %bb.0:1756; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k01757; AVX512F-NEXT: kmovw %k0, %eax1758; AVX512F-NEXT: movl %eax, %ecx1759; AVX512F-NEXT: shrl $8, %eax1760; AVX512F-NEXT: xorb %cl, %al1761; AVX512F-NEXT: setnp %al1762; AVX512F-NEXT: vzeroupper1763; AVX512F-NEXT: retq1764;1765; AVX512BW-LABEL: icmp0_v16i32_v16i1:1766; AVX512BW: # %bb.0:1767; AVX512BW-NEXT: vptestnmd %zmm0, %zmm0, %k01768; AVX512BW-NEXT: kmovd %k0, %eax1769; AVX512BW-NEXT: movl %eax, %ecx1770; AVX512BW-NEXT: shrl $8, %eax1771; AVX512BW-NEXT: xorb %cl, %al1772; AVX512BW-NEXT: setnp %al1773; AVX512BW-NEXT: vzeroupper1774; AVX512BW-NEXT: retq1775;1776; AVX512VL-LABEL: icmp0_v16i32_v16i1:1777; AVX512VL: # %bb.0:1778; AVX512VL-NEXT: vptestnmd %zmm0, %zmm0, %k01779; AVX512VL-NEXT: kmovd %k0, %eax1780; AVX512VL-NEXT: movl %eax, %ecx1781; AVX512VL-NEXT: shrl $8, %eax1782; AVX512VL-NEXT: xorb %cl, %al1783; AVX512VL-NEXT: setnp %al1784; AVX512VL-NEXT: vzeroupper1785; AVX512VL-NEXT: retq1786 %a = icmp eq <16 x i32> %0, zeroinitializer1787 %b = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)1788 ret i1 %b1789}1790 1791define i1 @icmp0_v32i16_v32i1(<32 x i16>) nounwind {1792; X86-SSE2-LABEL: icmp0_v32i16_v32i1:1793; X86-SSE2: # %bb.0:1794; X86-SSE2-NEXT: pushl %ebp1795; X86-SSE2-NEXT: movl %esp, %ebp1796; X86-SSE2-NEXT: andl $-16, %esp1797; X86-SSE2-NEXT: subl $16, %esp1798; X86-SSE2-NEXT: pxor %xmm3, %xmm31799; X86-SSE2-NEXT: pcmpeqw %xmm3, %xmm11800; X86-SSE2-NEXT: pcmpeqw %xmm3, %xmm21801; X86-SSE2-NEXT: pcmpeqw %xmm3, %xmm01802; X86-SSE2-NEXT: pxor %xmm2, %xmm01803; X86-SSE2-NEXT: pcmpeqw 8(%ebp), %xmm31804; X86-SSE2-NEXT: pxor %xmm1, %xmm31805; X86-SSE2-NEXT: packsswb %xmm3, %xmm01806; X86-SSE2-NEXT: pmovmskb %xmm0, %eax1807; X86-SSE2-NEXT: xorb %ah, %al1808; X86-SSE2-NEXT: setnp %al1809; X86-SSE2-NEXT: movl %ebp, %esp1810; X86-SSE2-NEXT: popl %ebp1811; X86-SSE2-NEXT: retl1812;1813; X64-SSE-LABEL: icmp0_v32i16_v32i1:1814; X64-SSE: # %bb.0:1815; X64-SSE-NEXT: pxor %xmm4, %xmm41816; X64-SSE-NEXT: pcmpeqw %xmm4, %xmm21817; X64-SSE-NEXT: pcmpeqw %xmm4, %xmm01818; X64-SSE-NEXT: pxor %xmm2, %xmm01819; X64-SSE-NEXT: pcmpeqw %xmm4, %xmm31820; X64-SSE-NEXT: pcmpeqw %xmm4, %xmm11821; X64-SSE-NEXT: pxor %xmm3, %xmm11822; X64-SSE-NEXT: packsswb %xmm1, %xmm01823; X64-SSE-NEXT: pmovmskb %xmm0, %eax1824; X64-SSE-NEXT: xorb %ah, %al1825; X64-SSE-NEXT: setnp %al1826; X64-SSE-NEXT: retq1827;1828; AVX1-LABEL: icmp0_v32i16_v32i1:1829; AVX1: # %bb.0:1830; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21831; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm31832; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm41833; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm31834; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11835; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm11836; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01837; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm01838; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm01839; AVX1-NEXT: vpacksswb %xmm0, %xmm3, %xmm01840; AVX1-NEXT: vpmovmskb %xmm0, %eax1841; AVX1-NEXT: xorb %ah, %al1842; AVX1-NEXT: setnp %al1843; AVX1-NEXT: vzeroupper1844; AVX1-NEXT: retq1845;1846; AVX2-LABEL: icmp0_v32i16_v32i1:1847; AVX2: # %bb.0:1848; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21849; AVX2-NEXT: vpcmpeqw %ymm2, %ymm1, %ymm11850; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm01851; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm01852; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1853; AVX2-NEXT: vpmovmskb %ymm0, %eax1854; AVX2-NEXT: movl %eax, %ecx1855; AVX2-NEXT: shrl $16, %ecx1856; AVX2-NEXT: xorl %eax, %ecx1857; AVX2-NEXT: xorb %ch, %cl1858; AVX2-NEXT: setnp %al1859; AVX2-NEXT: vzeroupper1860; AVX2-NEXT: retq1861;1862; AVX512F-LABEL: icmp0_v32i16_v32i1:1863; AVX512F: # %bb.0:1864; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm11865; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm21866; AVX512F-NEXT: vpcmpeqw %ymm2, %ymm1, %ymm11867; AVX512F-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm01868; AVX512F-NEXT: vpxor %ymm1, %ymm0, %ymm01869; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm01870; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k01871; AVX512F-NEXT: kshiftrw $8, %k0, %k11872; AVX512F-NEXT: kxorw %k1, %k0, %k01873; AVX512F-NEXT: kshiftrw $4, %k0, %k11874; AVX512F-NEXT: kxorw %k1, %k0, %k01875; AVX512F-NEXT: kshiftrw $2, %k0, %k11876; AVX512F-NEXT: kxorw %k1, %k0, %k01877; AVX512F-NEXT: kshiftrw $1, %k0, %k11878; AVX512F-NEXT: kxorw %k1, %k0, %k01879; AVX512F-NEXT: kmovw %k0, %eax1880; AVX512F-NEXT: # kill: def $al killed $al killed $eax1881; AVX512F-NEXT: vzeroupper1882; AVX512F-NEXT: retq1883;1884; AVX512BW-LABEL: icmp0_v32i16_v32i1:1885; AVX512BW: # %bb.0:1886; AVX512BW-NEXT: vptestnmw %zmm0, %zmm0, %k01887; AVX512BW-NEXT: kmovd %k0, %eax1888; AVX512BW-NEXT: movl %eax, %ecx1889; AVX512BW-NEXT: shrl $16, %ecx1890; AVX512BW-NEXT: xorl %eax, %ecx1891; AVX512BW-NEXT: xorb %ch, %cl1892; AVX512BW-NEXT: setnp %al1893; AVX512BW-NEXT: vzeroupper1894; AVX512BW-NEXT: retq1895;1896; AVX512VL-LABEL: icmp0_v32i16_v32i1:1897; AVX512VL: # %bb.0:1898; AVX512VL-NEXT: vptestnmw %zmm0, %zmm0, %k01899; AVX512VL-NEXT: kmovd %k0, %eax1900; AVX512VL-NEXT: movl %eax, %ecx1901; AVX512VL-NEXT: shrl $16, %ecx1902; AVX512VL-NEXT: xorl %eax, %ecx1903; AVX512VL-NEXT: xorb %ch, %cl1904; AVX512VL-NEXT: setnp %al1905; AVX512VL-NEXT: vzeroupper1906; AVX512VL-NEXT: retq1907 %a = icmp eq <32 x i16> %0, zeroinitializer1908 %b = call i1 @llvm.vector.reduce.xor.v32i1(<32 x i1> %a)1909 ret i1 %b1910}1911 1912define i1 @icmp0_v64i8_v64i1(<64 x i8>) nounwind {1913; X86-SSE2-LABEL: icmp0_v64i8_v64i1:1914; X86-SSE2: # %bb.0:1915; X86-SSE2-NEXT: pushl %ebp1916; X86-SSE2-NEXT: movl %esp, %ebp1917; X86-SSE2-NEXT: andl $-16, %esp1918; X86-SSE2-NEXT: subl $16, %esp1919; X86-SSE2-NEXT: pxor %xmm3, %xmm31920; X86-SSE2-NEXT: pcmpeqb %xmm3, %xmm11921; X86-SSE2-NEXT: pcmpeqb %xmm3, %xmm21922; X86-SSE2-NEXT: pcmpeqb %xmm3, %xmm01923; X86-SSE2-NEXT: pxor %xmm2, %xmm01924; X86-SSE2-NEXT: pcmpeqb 8(%ebp), %xmm31925; X86-SSE2-NEXT: pxor %xmm1, %xmm31926; X86-SSE2-NEXT: pxor %xmm0, %xmm31927; X86-SSE2-NEXT: pmovmskb %xmm3, %eax1928; X86-SSE2-NEXT: xorb %ah, %al1929; X86-SSE2-NEXT: setnp %al1930; X86-SSE2-NEXT: movl %ebp, %esp1931; X86-SSE2-NEXT: popl %ebp1932; X86-SSE2-NEXT: retl1933;1934; X64-SSE-LABEL: icmp0_v64i8_v64i1:1935; X64-SSE: # %bb.0:1936; X64-SSE-NEXT: pxor %xmm4, %xmm41937; X64-SSE-NEXT: pcmpeqb %xmm4, %xmm21938; X64-SSE-NEXT: pcmpeqb %xmm4, %xmm01939; X64-SSE-NEXT: pxor %xmm2, %xmm01940; X64-SSE-NEXT: pcmpeqb %xmm4, %xmm31941; X64-SSE-NEXT: pcmpeqb %xmm4, %xmm11942; X64-SSE-NEXT: pxor %xmm3, %xmm11943; X64-SSE-NEXT: pxor %xmm0, %xmm11944; X64-SSE-NEXT: pmovmskb %xmm1, %eax1945; X64-SSE-NEXT: xorb %ah, %al1946; X64-SSE-NEXT: setnp %al1947; X64-SSE-NEXT: retq1948;1949; AVX1-LABEL: icmp0_v64i8_v64i1:1950; AVX1: # %bb.0:1951; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21952; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm31953; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm41954; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm31955; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11956; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm11957; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01958; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm01959; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm01960; AVX1-NEXT: vpxor %xmm0, %xmm3, %xmm01961; AVX1-NEXT: vpmovmskb %xmm0, %eax1962; AVX1-NEXT: xorb %ah, %al1963; AVX1-NEXT: setnp %al1964; AVX1-NEXT: vzeroupper1965; AVX1-NEXT: retq1966;1967; AVX2-LABEL: icmp0_v64i8_v64i1:1968; AVX2: # %bb.0:1969; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21970; AVX2-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm11971; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm01972; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm01973; AVX2-NEXT: vpmovmskb %ymm0, %eax1974; AVX2-NEXT: movl %eax, %ecx1975; AVX2-NEXT: shrl $16, %ecx1976; AVX2-NEXT: xorl %eax, %ecx1977; AVX2-NEXT: xorb %ch, %cl1978; AVX2-NEXT: setnp %al1979; AVX2-NEXT: vzeroupper1980; AVX2-NEXT: retq1981;1982; AVX512F-LABEL: icmp0_v64i8_v64i1:1983; AVX512F: # %bb.0:1984; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm11985; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm21986; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm11987; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm01988; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm21989; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm31990; AVX512F-NEXT: vpxor %xmm2, %xmm3, %xmm21991; AVX512F-NEXT: vpxor %xmm1, %xmm0, %xmm01992; AVX512F-NEXT: vpxor %xmm2, %xmm0, %xmm01993; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm01994; AVX512F-NEXT: vpslld $31, %zmm0, %zmm01995; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k01996; AVX512F-NEXT: kshiftrw $8, %k0, %k11997; AVX512F-NEXT: kxorw %k1, %k0, %k01998; AVX512F-NEXT: kshiftrw $4, %k0, %k11999; AVX512F-NEXT: kxorw %k1, %k0, %k02000; AVX512F-NEXT: kshiftrw $2, %k0, %k12001; AVX512F-NEXT: kxorw %k1, %k0, %k02002; AVX512F-NEXT: kshiftrw $1, %k0, %k12003; AVX512F-NEXT: kxorw %k1, %k0, %k02004; AVX512F-NEXT: kmovw %k0, %eax2005; AVX512F-NEXT: # kill: def $al killed $al killed $eax2006; AVX512F-NEXT: vzeroupper2007; AVX512F-NEXT: retq2008;2009; AVX512BW-LABEL: icmp0_v64i8_v64i1:2010; AVX512BW: # %bb.0:2011; AVX512BW-NEXT: vptestnmb %zmm0, %zmm0, %k02012; AVX512BW-NEXT: kmovq %k0, %rax2013; AVX512BW-NEXT: movl %eax, %ecx2014; AVX512BW-NEXT: shrq $32, %rax2015; AVX512BW-NEXT: xorl %ecx, %eax2016; AVX512BW-NEXT: movl %eax, %ecx2017; AVX512BW-NEXT: shrl $16, %ecx2018; AVX512BW-NEXT: xorl %eax, %ecx2019; AVX512BW-NEXT: xorb %ch, %cl2020; AVX512BW-NEXT: setnp %al2021; AVX512BW-NEXT: vzeroupper2022; AVX512BW-NEXT: retq2023;2024; AVX512VL-LABEL: icmp0_v64i8_v64i1:2025; AVX512VL: # %bb.0:2026; AVX512VL-NEXT: vptestnmb %zmm0, %zmm0, %k02027; AVX512VL-NEXT: kmovq %k0, %rax2028; AVX512VL-NEXT: movl %eax, %ecx2029; AVX512VL-NEXT: shrq $32, %rax2030; AVX512VL-NEXT: xorl %ecx, %eax2031; AVX512VL-NEXT: movl %eax, %ecx2032; AVX512VL-NEXT: shrl $16, %ecx2033; AVX512VL-NEXT: xorl %eax, %ecx2034; AVX512VL-NEXT: xorb %ch, %cl2035; AVX512VL-NEXT: setnp %al2036; AVX512VL-NEXT: vzeroupper2037; AVX512VL-NEXT: retq2038 %a = icmp eq <64 x i8> %0, zeroinitializer2039 %b = call i1 @llvm.vector.reduce.xor.v64i1(<64 x i1> %a)2040 ret i1 %b2041}2042 2043; Comparison2044;2045 2046define i1 @icmp_v2i64_v2i1(<2 x i64>, <2 x i64>) nounwind {2047; SSE2-LABEL: icmp_v2i64_v2i1:2048; SSE2: # %bb.0:2049; SSE2-NEXT: pcmpeqd %xmm1, %xmm02050; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]2051; SSE2-NEXT: pand %xmm0, %xmm12052; SSE2-NEXT: movmskpd %xmm1, %eax2053; SSE2-NEXT: testb %al, %al2054; SSE2-NEXT: setnp %al2055; SSE2-NEXT: ret{{[l|q]}}2056;2057; SSE41-LABEL: icmp_v2i64_v2i1:2058; SSE41: # %bb.0:2059; SSE41-NEXT: pcmpeqq %xmm1, %xmm02060; SSE41-NEXT: movmskpd %xmm0, %eax2061; SSE41-NEXT: testb %al, %al2062; SSE41-NEXT: setnp %al2063; SSE41-NEXT: retq2064;2065; AVX-LABEL: icmp_v2i64_v2i1:2066; AVX: # %bb.0:2067; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm02068; AVX-NEXT: vmovmskpd %xmm0, %eax2069; AVX-NEXT: testb %al, %al2070; AVX-NEXT: setnp %al2071; AVX-NEXT: retq2072;2073; AVX512F-LABEL: icmp_v2i64_v2i1:2074; AVX512F: # %bb.0:2075; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm12076; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02077; AVX512F-NEXT: vpcmpeqq %zmm1, %zmm0, %k02078; AVX512F-NEXT: kmovw %k0, %eax2079; AVX512F-NEXT: testb $3, %al2080; AVX512F-NEXT: setnp %al2081; AVX512F-NEXT: vzeroupper2082; AVX512F-NEXT: retq2083;2084; AVX512BW-LABEL: icmp_v2i64_v2i1:2085; AVX512BW: # %bb.0:2086; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm12087; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02088; AVX512BW-NEXT: vpcmpeqq %zmm1, %zmm0, %k02089; AVX512BW-NEXT: kmovd %k0, %eax2090; AVX512BW-NEXT: testb $3, %al2091; AVX512BW-NEXT: setnp %al2092; AVX512BW-NEXT: vzeroupper2093; AVX512BW-NEXT: retq2094;2095; AVX512VL-LABEL: icmp_v2i64_v2i1:2096; AVX512VL: # %bb.0:2097; AVX512VL-NEXT: vpcmpeqq %xmm1, %xmm0, %k02098; AVX512VL-NEXT: kmovd %k0, %eax2099; AVX512VL-NEXT: testb %al, %al2100; AVX512VL-NEXT: setnp %al2101; AVX512VL-NEXT: retq2102 %a = icmp eq <2 x i64> %0, %12103 %b = call i1 @llvm.vector.reduce.xor.v2i1(<2 x i1> %a)2104 ret i1 %b2105}2106 2107define i1 @icmp_v4i32_v4i1(<4 x i32>, <4 x i32>) nounwind {2108; SSE-LABEL: icmp_v4i32_v4i1:2109; SSE: # %bb.0:2110; SSE-NEXT: pcmpeqd %xmm1, %xmm02111; SSE-NEXT: movmskps %xmm0, %eax2112; SSE-NEXT: testb %al, %al2113; SSE-NEXT: setnp %al2114; SSE-NEXT: ret{{[l|q]}}2115;2116; AVX-LABEL: icmp_v4i32_v4i1:2117; AVX: # %bb.0:2118; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm02119; AVX-NEXT: vmovmskps %xmm0, %eax2120; AVX-NEXT: testb %al, %al2121; AVX-NEXT: setnp %al2122; AVX-NEXT: retq2123;2124; AVX512F-LABEL: icmp_v4i32_v4i1:2125; AVX512F: # %bb.0:2126; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm12127; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02128; AVX512F-NEXT: vpcmpeqd %zmm1, %zmm0, %k02129; AVX512F-NEXT: kmovw %k0, %eax2130; AVX512F-NEXT: testb $15, %al2131; AVX512F-NEXT: setnp %al2132; AVX512F-NEXT: vzeroupper2133; AVX512F-NEXT: retq2134;2135; AVX512BW-LABEL: icmp_v4i32_v4i1:2136; AVX512BW: # %bb.0:2137; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm12138; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02139; AVX512BW-NEXT: vpcmpeqd %zmm1, %zmm0, %k02140; AVX512BW-NEXT: kmovd %k0, %eax2141; AVX512BW-NEXT: testb $15, %al2142; AVX512BW-NEXT: setnp %al2143; AVX512BW-NEXT: vzeroupper2144; AVX512BW-NEXT: retq2145;2146; AVX512VL-LABEL: icmp_v4i32_v4i1:2147; AVX512VL: # %bb.0:2148; AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %k02149; AVX512VL-NEXT: kmovd %k0, %eax2150; AVX512VL-NEXT: testb %al, %al2151; AVX512VL-NEXT: setnp %al2152; AVX512VL-NEXT: retq2153 %a = icmp eq <4 x i32> %0, %12154 %b = call i1 @llvm.vector.reduce.xor.v4i1(<4 x i1> %a)2155 ret i1 %b2156}2157 2158define i1 @icmp_v8i16_v8i1(<8 x i16>, <8 x i16>) nounwind {2159; SSE-LABEL: icmp_v8i16_v8i1:2160; SSE: # %bb.0:2161; SSE-NEXT: pcmpeqw %xmm1, %xmm02162; SSE-NEXT: packsswb %xmm0, %xmm02163; SSE-NEXT: pmovmskb %xmm0, %eax2164; SSE-NEXT: testb %al, %al2165; SSE-NEXT: setnp %al2166; SSE-NEXT: ret{{[l|q]}}2167;2168; AVX-LABEL: icmp_v8i16_v8i1:2169; AVX: # %bb.0:2170; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm02171; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm02172; AVX-NEXT: vpmovmskb %xmm0, %eax2173; AVX-NEXT: testb %al, %al2174; AVX-NEXT: setnp %al2175; AVX-NEXT: retq2176;2177; AVX512F-LABEL: icmp_v8i16_v8i1:2178; AVX512F: # %bb.0:2179; AVX512F-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm02180; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm02181; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k02182; AVX512F-NEXT: kmovw %k0, %eax2183; AVX512F-NEXT: testb %al, %al2184; AVX512F-NEXT: setnp %al2185; AVX512F-NEXT: vzeroupper2186; AVX512F-NEXT: retq2187;2188; AVX512BW-LABEL: icmp_v8i16_v8i1:2189; AVX512BW: # %bb.0:2190; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm12191; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02192; AVX512BW-NEXT: vpcmpeqw %zmm1, %zmm0, %k02193; AVX512BW-NEXT: kmovd %k0, %eax2194; AVX512BW-NEXT: testb %al, %al2195; AVX512BW-NEXT: setnp %al2196; AVX512BW-NEXT: vzeroupper2197; AVX512BW-NEXT: retq2198;2199; AVX512VL-LABEL: icmp_v8i16_v8i1:2200; AVX512VL: # %bb.0:2201; AVX512VL-NEXT: vpcmpeqw %xmm1, %xmm0, %k02202; AVX512VL-NEXT: kmovd %k0, %eax2203; AVX512VL-NEXT: testb %al, %al2204; AVX512VL-NEXT: setnp %al2205; AVX512VL-NEXT: retq2206 %a = icmp eq <8 x i16> %0, %12207 %b = call i1 @llvm.vector.reduce.xor.v8i1(<8 x i1> %a)2208 ret i1 %b2209}2210 2211define i1 @icmp_v16i8_v16i1(<16 x i8>, <16 x i8>) nounwind {2212; SSE-LABEL: icmp_v16i8_v16i1:2213; SSE: # %bb.0:2214; SSE-NEXT: pcmpeqb %xmm1, %xmm02215; SSE-NEXT: pmovmskb %xmm0, %eax2216; SSE-NEXT: xorb %ah, %al2217; SSE-NEXT: setnp %al2218; SSE-NEXT: ret{{[l|q]}}2219;2220; AVX-LABEL: icmp_v16i8_v16i1:2221; AVX: # %bb.0:2222; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm02223; AVX-NEXT: vpmovmskb %xmm0, %eax2224; AVX-NEXT: xorb %ah, %al2225; AVX-NEXT: setnp %al2226; AVX-NEXT: retq2227;2228; AVX512F-LABEL: icmp_v16i8_v16i1:2229; AVX512F: # %bb.0:2230; AVX512F-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm02231; AVX512F-NEXT: vpmovmskb %xmm0, %eax2232; AVX512F-NEXT: xorb %ah, %al2233; AVX512F-NEXT: setnp %al2234; AVX512F-NEXT: retq2235;2236; AVX512BW-LABEL: icmp_v16i8_v16i1:2237; AVX512BW: # %bb.0:2238; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm12239; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02240; AVX512BW-NEXT: vpcmpeqb %zmm1, %zmm0, %k02241; AVX512BW-NEXT: kmovd %k0, %eax2242; AVX512BW-NEXT: movl %eax, %ecx2243; AVX512BW-NEXT: shrl $8, %eax2244; AVX512BW-NEXT: xorb %cl, %al2245; AVX512BW-NEXT: setnp %al2246; AVX512BW-NEXT: vzeroupper2247; AVX512BW-NEXT: retq2248;2249; AVX512VL-LABEL: icmp_v16i8_v16i1:2250; AVX512VL: # %bb.0:2251; AVX512VL-NEXT: vpcmpeqb %xmm1, %xmm0, %k02252; AVX512VL-NEXT: kmovd %k0, %eax2253; AVX512VL-NEXT: movl %eax, %ecx2254; AVX512VL-NEXT: shrl $8, %eax2255; AVX512VL-NEXT: xorb %cl, %al2256; AVX512VL-NEXT: setnp %al2257; AVX512VL-NEXT: retq2258 %a = icmp eq <16 x i8> %0, %12259 %b = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)2260 ret i1 %b2261}2262 2263define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {2264; X86-SSE2-LABEL: icmp_v4i64_v4i1:2265; X86-SSE2: # %bb.0:2266; X86-SSE2-NEXT: pushl %ebp2267; X86-SSE2-NEXT: movl %esp, %ebp2268; X86-SSE2-NEXT: andl $-16, %esp2269; X86-SSE2-NEXT: subl $16, %esp2270; X86-SSE2-NEXT: pcmpeqd %xmm2, %xmm02271; X86-SSE2-NEXT: pcmpeqd 8(%ebp), %xmm12272; X86-SSE2-NEXT: movdqa %xmm0, %xmm22273; X86-SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm1[1,3]2274; X86-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2275; X86-SSE2-NEXT: andps %xmm2, %xmm02276; X86-SSE2-NEXT: movmskps %xmm0, %eax2277; X86-SSE2-NEXT: testb %al, %al2278; X86-SSE2-NEXT: setnp %al2279; X86-SSE2-NEXT: movl %ebp, %esp2280; X86-SSE2-NEXT: popl %ebp2281; X86-SSE2-NEXT: retl2282;2283; X64-SSE2-LABEL: icmp_v4i64_v4i1:2284; X64-SSE2: # %bb.0:2285; X64-SSE2-NEXT: pcmpeqd %xmm3, %xmm12286; X64-SSE2-NEXT: pcmpeqd %xmm2, %xmm02287; X64-SSE2-NEXT: movdqa %xmm0, %xmm22288; X64-SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm1[1,3]2289; X64-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2290; X64-SSE2-NEXT: andps %xmm2, %xmm02291; X64-SSE2-NEXT: movmskps %xmm0, %eax2292; X64-SSE2-NEXT: testb %al, %al2293; X64-SSE2-NEXT: setnp %al2294; X64-SSE2-NEXT: retq2295;2296; SSE41-LABEL: icmp_v4i64_v4i1:2297; SSE41: # %bb.0:2298; SSE41-NEXT: pcmpeqq %xmm3, %xmm12299; SSE41-NEXT: pcmpeqq %xmm2, %xmm02300; SSE41-NEXT: packssdw %xmm1, %xmm02301; SSE41-NEXT: movmskps %xmm0, %eax2302; SSE41-NEXT: testb %al, %al2303; SSE41-NEXT: setnp %al2304; SSE41-NEXT: retq2305;2306; AVX1-LABEL: icmp_v4i64_v4i1:2307; AVX1: # %bb.0:2308; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22309; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm32310; AVX1-NEXT: vpcmpeqq %xmm2, %xmm3, %xmm22311; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm02312; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02313; AVX1-NEXT: vmovmskpd %ymm0, %eax2314; AVX1-NEXT: testb %al, %al2315; AVX1-NEXT: setnp %al2316; AVX1-NEXT: vzeroupper2317; AVX1-NEXT: retq2318;2319; AVX2-LABEL: icmp_v4i64_v4i1:2320; AVX2: # %bb.0:2321; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm02322; AVX2-NEXT: vmovmskpd %ymm0, %eax2323; AVX2-NEXT: testb %al, %al2324; AVX2-NEXT: setnp %al2325; AVX2-NEXT: vzeroupper2326; AVX2-NEXT: retq2327;2328; AVX512F-LABEL: icmp_v4i64_v4i1:2329; AVX512F: # %bb.0:2330; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm12331; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02332; AVX512F-NEXT: vpcmpeqq %zmm1, %zmm0, %k02333; AVX512F-NEXT: kmovw %k0, %eax2334; AVX512F-NEXT: testb $15, %al2335; AVX512F-NEXT: setnp %al2336; AVX512F-NEXT: vzeroupper2337; AVX512F-NEXT: retq2338;2339; AVX512BW-LABEL: icmp_v4i64_v4i1:2340; AVX512BW: # %bb.0:2341; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm12342; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02343; AVX512BW-NEXT: vpcmpeqq %zmm1, %zmm0, %k02344; AVX512BW-NEXT: kmovd %k0, %eax2345; AVX512BW-NEXT: testb $15, %al2346; AVX512BW-NEXT: setnp %al2347; AVX512BW-NEXT: vzeroupper2348; AVX512BW-NEXT: retq2349;2350; AVX512VL-LABEL: icmp_v4i64_v4i1:2351; AVX512VL: # %bb.0:2352; AVX512VL-NEXT: vpcmpeqq %ymm1, %ymm0, %k02353; AVX512VL-NEXT: kmovd %k0, %eax2354; AVX512VL-NEXT: testb %al, %al2355; AVX512VL-NEXT: setnp %al2356; AVX512VL-NEXT: vzeroupper2357; AVX512VL-NEXT: retq2358 %a = icmp eq <4 x i64> %0, %12359 %b = call i1 @llvm.vector.reduce.xor.v4i1(<4 x i1> %a)2360 ret i1 %b2361}2362 2363define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {2364; X86-SSE2-LABEL: icmp_v8i32_v8i1:2365; X86-SSE2: # %bb.0:2366; X86-SSE2-NEXT: pushl %ebp2367; X86-SSE2-NEXT: movl %esp, %ebp2368; X86-SSE2-NEXT: andl $-16, %esp2369; X86-SSE2-NEXT: subl $16, %esp2370; X86-SSE2-NEXT: pcmpeqd %xmm2, %xmm02371; X86-SSE2-NEXT: pcmpeqd 8(%ebp), %xmm12372; X86-SSE2-NEXT: packssdw %xmm1, %xmm02373; X86-SSE2-NEXT: packsswb %xmm0, %xmm02374; X86-SSE2-NEXT: pmovmskb %xmm0, %eax2375; X86-SSE2-NEXT: testb %al, %al2376; X86-SSE2-NEXT: setnp %al2377; X86-SSE2-NEXT: movl %ebp, %esp2378; X86-SSE2-NEXT: popl %ebp2379; X86-SSE2-NEXT: retl2380;2381; X64-SSE-LABEL: icmp_v8i32_v8i1:2382; X64-SSE: # %bb.0:2383; X64-SSE-NEXT: pcmpeqd %xmm3, %xmm12384; X64-SSE-NEXT: pcmpeqd %xmm2, %xmm02385; X64-SSE-NEXT: packssdw %xmm1, %xmm02386; X64-SSE-NEXT: packsswb %xmm0, %xmm02387; X64-SSE-NEXT: pmovmskb %xmm0, %eax2388; X64-SSE-NEXT: testb %al, %al2389; X64-SSE-NEXT: setnp %al2390; X64-SSE-NEXT: retq2391;2392; AVX1-LABEL: icmp_v8i32_v8i1:2393; AVX1: # %bb.0:2394; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22395; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm32396; AVX1-NEXT: vpcmpeqd %xmm2, %xmm3, %xmm22397; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm02398; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm02399; AVX1-NEXT: vmovmskps %ymm0, %eax2400; AVX1-NEXT: testb %al, %al2401; AVX1-NEXT: setnp %al2402; AVX1-NEXT: vzeroupper2403; AVX1-NEXT: retq2404;2405; AVX2-LABEL: icmp_v8i32_v8i1:2406; AVX2: # %bb.0:2407; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm02408; AVX2-NEXT: vmovmskps %ymm0, %eax2409; AVX2-NEXT: testb %al, %al2410; AVX2-NEXT: setnp %al2411; AVX2-NEXT: vzeroupper2412; AVX2-NEXT: retq2413;2414; AVX512F-LABEL: icmp_v8i32_v8i1:2415; AVX512F: # %bb.0:2416; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm12417; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02418; AVX512F-NEXT: vpcmpeqd %zmm1, %zmm0, %k02419; AVX512F-NEXT: kmovw %k0, %eax2420; AVX512F-NEXT: testb %al, %al2421; AVX512F-NEXT: setnp %al2422; AVX512F-NEXT: vzeroupper2423; AVX512F-NEXT: retq2424;2425; AVX512BW-LABEL: icmp_v8i32_v8i1:2426; AVX512BW: # %bb.0:2427; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm12428; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02429; AVX512BW-NEXT: vpcmpeqd %zmm1, %zmm0, %k02430; AVX512BW-NEXT: kmovd %k0, %eax2431; AVX512BW-NEXT: testb %al, %al2432; AVX512BW-NEXT: setnp %al2433; AVX512BW-NEXT: vzeroupper2434; AVX512BW-NEXT: retq2435;2436; AVX512VL-LABEL: icmp_v8i32_v8i1:2437; AVX512VL: # %bb.0:2438; AVX512VL-NEXT: vpcmpeqd %ymm1, %ymm0, %k02439; AVX512VL-NEXT: kmovd %k0, %eax2440; AVX512VL-NEXT: testb %al, %al2441; AVX512VL-NEXT: setnp %al2442; AVX512VL-NEXT: vzeroupper2443; AVX512VL-NEXT: retq2444 %a = icmp eq <8 x i32> %0, %12445 %b = call i1 @llvm.vector.reduce.xor.v8i1(<8 x i1> %a)2446 ret i1 %b2447}2448 2449define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) nounwind {2450; X86-SSE2-LABEL: icmp_v16i16_v16i1:2451; X86-SSE2: # %bb.0:2452; X86-SSE2-NEXT: pushl %ebp2453; X86-SSE2-NEXT: movl %esp, %ebp2454; X86-SSE2-NEXT: andl $-16, %esp2455; X86-SSE2-NEXT: subl $16, %esp2456; X86-SSE2-NEXT: pcmpeqw %xmm2, %xmm02457; X86-SSE2-NEXT: pcmpeqw 8(%ebp), %xmm12458; X86-SSE2-NEXT: packsswb %xmm1, %xmm02459; X86-SSE2-NEXT: pmovmskb %xmm0, %eax2460; X86-SSE2-NEXT: xorb %ah, %al2461; X86-SSE2-NEXT: setnp %al2462; X86-SSE2-NEXT: movl %ebp, %esp2463; X86-SSE2-NEXT: popl %ebp2464; X86-SSE2-NEXT: retl2465;2466; X64-SSE-LABEL: icmp_v16i16_v16i1:2467; X64-SSE: # %bb.0:2468; X64-SSE-NEXT: pcmpeqw %xmm3, %xmm12469; X64-SSE-NEXT: pcmpeqw %xmm2, %xmm02470; X64-SSE-NEXT: packsswb %xmm1, %xmm02471; X64-SSE-NEXT: pmovmskb %xmm0, %eax2472; X64-SSE-NEXT: xorb %ah, %al2473; X64-SSE-NEXT: setnp %al2474; X64-SSE-NEXT: retq2475;2476; AVX1-LABEL: icmp_v16i16_v16i1:2477; AVX1: # %bb.0:2478; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22479; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm32480; AVX1-NEXT: vpcmpeqw %xmm2, %xmm3, %xmm22481; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm02482; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm02483; AVX1-NEXT: vpmovmskb %xmm0, %eax2484; AVX1-NEXT: xorb %ah, %al2485; AVX1-NEXT: setnp %al2486; AVX1-NEXT: vzeroupper2487; AVX1-NEXT: retq2488;2489; AVX2-LABEL: icmp_v16i16_v16i1:2490; AVX2: # %bb.0:2491; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm02492; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12493; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm02494; AVX2-NEXT: vpmovmskb %xmm0, %eax2495; AVX2-NEXT: xorb %ah, %al2496; AVX2-NEXT: setnp %al2497; AVX2-NEXT: vzeroupper2498; AVX2-NEXT: retq2499;2500; AVX512F-LABEL: icmp_v16i16_v16i1:2501; AVX512F: # %bb.0:2502; AVX512F-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm02503; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm02504; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k02505; AVX512F-NEXT: kmovw %k0, %eax2506; AVX512F-NEXT: movl %eax, %ecx2507; AVX512F-NEXT: shrl $8, %eax2508; AVX512F-NEXT: xorb %cl, %al2509; AVX512F-NEXT: setnp %al2510; AVX512F-NEXT: vzeroupper2511; AVX512F-NEXT: retq2512;2513; AVX512BW-LABEL: icmp_v16i16_v16i1:2514; AVX512BW: # %bb.0:2515; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm12516; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02517; AVX512BW-NEXT: vpcmpeqw %zmm1, %zmm0, %k02518; AVX512BW-NEXT: kmovd %k0, %eax2519; AVX512BW-NEXT: movl %eax, %ecx2520; AVX512BW-NEXT: shrl $8, %eax2521; AVX512BW-NEXT: xorb %cl, %al2522; AVX512BW-NEXT: setnp %al2523; AVX512BW-NEXT: vzeroupper2524; AVX512BW-NEXT: retq2525;2526; AVX512VL-LABEL: icmp_v16i16_v16i1:2527; AVX512VL: # %bb.0:2528; AVX512VL-NEXT: vpcmpeqw %ymm1, %ymm0, %k02529; AVX512VL-NEXT: kmovd %k0, %eax2530; AVX512VL-NEXT: movl %eax, %ecx2531; AVX512VL-NEXT: shrl $8, %eax2532; AVX512VL-NEXT: xorb %cl, %al2533; AVX512VL-NEXT: setnp %al2534; AVX512VL-NEXT: vzeroupper2535; AVX512VL-NEXT: retq2536 %a = icmp eq <16 x i16> %0, %12537 %b = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)2538 ret i1 %b2539}2540 2541define i1 @icmp_v32i8_v32i1(<32 x i8>, <32 x i8>) nounwind {2542; X86-SSE2-LABEL: icmp_v32i8_v32i1:2543; X86-SSE2: # %bb.0:2544; X86-SSE2-NEXT: pushl %ebp2545; X86-SSE2-NEXT: movl %esp, %ebp2546; X86-SSE2-NEXT: andl $-16, %esp2547; X86-SSE2-NEXT: subl $16, %esp2548; X86-SSE2-NEXT: pcmpeqb %xmm2, %xmm02549; X86-SSE2-NEXT: pcmpeqb 8(%ebp), %xmm12550; X86-SSE2-NEXT: pxor %xmm0, %xmm12551; X86-SSE2-NEXT: pmovmskb %xmm1, %eax2552; X86-SSE2-NEXT: xorb %ah, %al2553; X86-SSE2-NEXT: setnp %al2554; X86-SSE2-NEXT: movl %ebp, %esp2555; X86-SSE2-NEXT: popl %ebp2556; X86-SSE2-NEXT: retl2557;2558; X64-SSE-LABEL: icmp_v32i8_v32i1:2559; X64-SSE: # %bb.0:2560; X64-SSE-NEXT: pcmpeqb %xmm3, %xmm12561; X64-SSE-NEXT: pcmpeqb %xmm2, %xmm02562; X64-SSE-NEXT: pxor %xmm1, %xmm02563; X64-SSE-NEXT: pmovmskb %xmm0, %eax2564; X64-SSE-NEXT: xorb %ah, %al2565; X64-SSE-NEXT: setnp %al2566; X64-SSE-NEXT: retq2567;2568; AVX1-LABEL: icmp_v32i8_v32i1:2569; AVX1: # %bb.0:2570; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22571; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm32572; AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm22573; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm02574; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm02575; AVX1-NEXT: vpmovmskb %xmm0, %eax2576; AVX1-NEXT: xorb %ah, %al2577; AVX1-NEXT: setnp %al2578; AVX1-NEXT: vzeroupper2579; AVX1-NEXT: retq2580;2581; AVX2-LABEL: icmp_v32i8_v32i1:2582; AVX2: # %bb.0:2583; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm02584; AVX2-NEXT: vpmovmskb %ymm0, %eax2585; AVX2-NEXT: movl %eax, %ecx2586; AVX2-NEXT: shrl $16, %ecx2587; AVX2-NEXT: xorl %eax, %ecx2588; AVX2-NEXT: xorb %ch, %cl2589; AVX2-NEXT: setnp %al2590; AVX2-NEXT: vzeroupper2591; AVX2-NEXT: retq2592;2593; AVX512F-LABEL: icmp_v32i8_v32i1:2594; AVX512F: # %bb.0:2595; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm02596; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm12597; AVX512F-NEXT: vpxor %xmm1, %xmm0, %xmm02598; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm02599; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k02600; AVX512F-NEXT: kshiftrw $8, %k0, %k12601; AVX512F-NEXT: kxorw %k1, %k0, %k02602; AVX512F-NEXT: kshiftrw $4, %k0, %k12603; AVX512F-NEXT: kxorw %k1, %k0, %k02604; AVX512F-NEXT: kshiftrw $2, %k0, %k12605; AVX512F-NEXT: kxorw %k1, %k0, %k02606; AVX512F-NEXT: kshiftrw $1, %k0, %k12607; AVX512F-NEXT: kxorw %k1, %k0, %k02608; AVX512F-NEXT: kmovw %k0, %eax2609; AVX512F-NEXT: # kill: def $al killed $al killed $eax2610; AVX512F-NEXT: vzeroupper2611; AVX512F-NEXT: retq2612;2613; AVX512BW-LABEL: icmp_v32i8_v32i1:2614; AVX512BW: # %bb.0:2615; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm12616; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02617; AVX512BW-NEXT: vpcmpeqb %zmm1, %zmm0, %k02618; AVX512BW-NEXT: kmovd %k0, %eax2619; AVX512BW-NEXT: movl %eax, %ecx2620; AVX512BW-NEXT: shrl $16, %ecx2621; AVX512BW-NEXT: xorl %eax, %ecx2622; AVX512BW-NEXT: xorb %ch, %cl2623; AVX512BW-NEXT: setnp %al2624; AVX512BW-NEXT: vzeroupper2625; AVX512BW-NEXT: retq2626;2627; AVX512VL-LABEL: icmp_v32i8_v32i1:2628; AVX512VL: # %bb.0:2629; AVX512VL-NEXT: vpcmpeqb %ymm1, %ymm0, %k02630; AVX512VL-NEXT: kmovd %k0, %eax2631; AVX512VL-NEXT: movl %eax, %ecx2632; AVX512VL-NEXT: shrl $16, %ecx2633; AVX512VL-NEXT: xorl %eax, %ecx2634; AVX512VL-NEXT: xorb %ch, %cl2635; AVX512VL-NEXT: setnp %al2636; AVX512VL-NEXT: vzeroupper2637; AVX512VL-NEXT: retq2638 %a = icmp eq <32 x i8> %0, %12639 %b = call i1 @llvm.vector.reduce.xor.v32i1(<32 x i1> %a)2640 ret i1 %b2641}2642 2643define i1 @icmp_v8i64_v8i1(<8 x i64>, <8 x i64>) nounwind {2644; X86-SSE2-LABEL: icmp_v8i64_v8i1:2645; X86-SSE2: # %bb.0:2646; X86-SSE2-NEXT: pushl %ebp2647; X86-SSE2-NEXT: movl %esp, %ebp2648; X86-SSE2-NEXT: andl $-16, %esp2649; X86-SSE2-NEXT: subl $16, %esp2650; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm32651; X86-SSE2-NEXT: pcmpeqd 72(%ebp), %xmm32652; X86-SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,0,3,2]2653; X86-SSE2-NEXT: pand %xmm3, %xmm42654; X86-SSE2-NEXT: pcmpeqd 56(%ebp), %xmm22655; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]2656; X86-SSE2-NEXT: pand %xmm2, %xmm32657; X86-SSE2-NEXT: packssdw %xmm4, %xmm32658; X86-SSE2-NEXT: pcmpeqd 40(%ebp), %xmm12659; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]2660; X86-SSE2-NEXT: pand %xmm1, %xmm22661; X86-SSE2-NEXT: pcmpeqd 24(%ebp), %xmm02662; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]2663; X86-SSE2-NEXT: pand %xmm0, %xmm12664; X86-SSE2-NEXT: packssdw %xmm2, %xmm12665; X86-SSE2-NEXT: packssdw %xmm3, %xmm12666; X86-SSE2-NEXT: packsswb %xmm1, %xmm12667; X86-SSE2-NEXT: pmovmskb %xmm1, %eax2668; X86-SSE2-NEXT: testb %al, %al2669; X86-SSE2-NEXT: setnp %al2670; X86-SSE2-NEXT: movl %ebp, %esp2671; X86-SSE2-NEXT: popl %ebp2672; X86-SSE2-NEXT: retl2673;2674; X64-SSE2-LABEL: icmp_v8i64_v8i1:2675; X64-SSE2: # %bb.0:2676; X64-SSE2-NEXT: pcmpeqd %xmm7, %xmm32677; X64-SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,0,3,2]2678; X64-SSE2-NEXT: pand %xmm3, %xmm72679; X64-SSE2-NEXT: pcmpeqd %xmm6, %xmm22680; X64-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]2681; X64-SSE2-NEXT: pand %xmm2, %xmm32682; X64-SSE2-NEXT: packssdw %xmm7, %xmm32683; X64-SSE2-NEXT: pcmpeqd %xmm5, %xmm12684; X64-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]2685; X64-SSE2-NEXT: pand %xmm1, %xmm22686; X64-SSE2-NEXT: pcmpeqd %xmm4, %xmm02687; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]2688; X64-SSE2-NEXT: pand %xmm0, %xmm12689; X64-SSE2-NEXT: packssdw %xmm2, %xmm12690; X64-SSE2-NEXT: packssdw %xmm3, %xmm12691; X64-SSE2-NEXT: packsswb %xmm1, %xmm12692; X64-SSE2-NEXT: pmovmskb %xmm1, %eax2693; X64-SSE2-NEXT: testb %al, %al2694; X64-SSE2-NEXT: setnp %al2695; X64-SSE2-NEXT: retq2696;2697; SSE41-LABEL: icmp_v8i64_v8i1:2698; SSE41: # %bb.0:2699; SSE41-NEXT: pcmpeqq %xmm7, %xmm32700; SSE41-NEXT: pcmpeqq %xmm6, %xmm22701; SSE41-NEXT: packssdw %xmm3, %xmm22702; SSE41-NEXT: pcmpeqq %xmm5, %xmm12703; SSE41-NEXT: pcmpeqq %xmm4, %xmm02704; SSE41-NEXT: packssdw %xmm1, %xmm02705; SSE41-NEXT: packssdw %xmm2, %xmm02706; SSE41-NEXT: packsswb %xmm0, %xmm02707; SSE41-NEXT: pmovmskb %xmm0, %eax2708; SSE41-NEXT: testb %al, %al2709; SSE41-NEXT: setnp %al2710; SSE41-NEXT: retq2711;2712; AVX1-LABEL: icmp_v8i64_v8i1:2713; AVX1: # %bb.0:2714; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm42715; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm52716; AVX1-NEXT: vpcmpeqq %xmm4, %xmm5, %xmm42717; AVX1-NEXT: vpcmpeqq %xmm3, %xmm1, %xmm12718; AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm12719; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm32720; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm42721; AVX1-NEXT: vpcmpeqq %xmm3, %xmm4, %xmm32722; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm02723; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm02724; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm02725; AVX1-NEXT: vmovmskps %ymm0, %eax2726; AVX1-NEXT: testb %al, %al2727; AVX1-NEXT: setnp %al2728; AVX1-NEXT: vzeroupper2729; AVX1-NEXT: retq2730;2731; AVX2-LABEL: icmp_v8i64_v8i1:2732; AVX2: # %bb.0:2733; AVX2-NEXT: vpcmpeqq %ymm3, %ymm1, %ymm12734; AVX2-NEXT: vpcmpeqq %ymm2, %ymm0, %ymm02735; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm02736; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]2737; AVX2-NEXT: vmovmskps %ymm0, %eax2738; AVX2-NEXT: testb %al, %al2739; AVX2-NEXT: setnp %al2740; AVX2-NEXT: vzeroupper2741; AVX2-NEXT: retq2742;2743; AVX512F-LABEL: icmp_v8i64_v8i1:2744; AVX512F: # %bb.0:2745; AVX512F-NEXT: vpcmpeqq %zmm1, %zmm0, %k02746; AVX512F-NEXT: kmovw %k0, %eax2747; AVX512F-NEXT: testb %al, %al2748; AVX512F-NEXT: setnp %al2749; AVX512F-NEXT: vzeroupper2750; AVX512F-NEXT: retq2751;2752; AVX512BW-LABEL: icmp_v8i64_v8i1:2753; AVX512BW: # %bb.0:2754; AVX512BW-NEXT: vpcmpeqq %zmm1, %zmm0, %k02755; AVX512BW-NEXT: kmovd %k0, %eax2756; AVX512BW-NEXT: testb %al, %al2757; AVX512BW-NEXT: setnp %al2758; AVX512BW-NEXT: vzeroupper2759; AVX512BW-NEXT: retq2760;2761; AVX512VL-LABEL: icmp_v8i64_v8i1:2762; AVX512VL: # %bb.0:2763; AVX512VL-NEXT: vpcmpeqq %zmm1, %zmm0, %k02764; AVX512VL-NEXT: kmovd %k0, %eax2765; AVX512VL-NEXT: testb %al, %al2766; AVX512VL-NEXT: setnp %al2767; AVX512VL-NEXT: vzeroupper2768; AVX512VL-NEXT: retq2769 %a = icmp eq <8 x i64> %0, %12770 %b = call i1 @llvm.vector.reduce.xor.v8i1(<8 x i1> %a)2771 ret i1 %b2772}2773 2774define i1 @icmp_v16i32_v16i1(<16 x i32>, <16 x i32>) nounwind {2775; X86-SSE2-LABEL: icmp_v16i32_v16i1:2776; X86-SSE2: # %bb.0:2777; X86-SSE2-NEXT: pushl %ebp2778; X86-SSE2-NEXT: movl %esp, %ebp2779; X86-SSE2-NEXT: andl $-16, %esp2780; X86-SSE2-NEXT: subl $16, %esp2781; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm32782; X86-SSE2-NEXT: pcmpeqd 72(%ebp), %xmm32783; X86-SSE2-NEXT: pcmpeqd 56(%ebp), %xmm22784; X86-SSE2-NEXT: packssdw %xmm3, %xmm22785; X86-SSE2-NEXT: pcmpeqd 40(%ebp), %xmm12786; X86-SSE2-NEXT: pcmpeqd 24(%ebp), %xmm02787; X86-SSE2-NEXT: packssdw %xmm1, %xmm02788; X86-SSE2-NEXT: packsswb %xmm2, %xmm02789; X86-SSE2-NEXT: pmovmskb %xmm0, %eax2790; X86-SSE2-NEXT: xorb %ah, %al2791; X86-SSE2-NEXT: setnp %al2792; X86-SSE2-NEXT: movl %ebp, %esp2793; X86-SSE2-NEXT: popl %ebp2794; X86-SSE2-NEXT: retl2795;2796; X64-SSE-LABEL: icmp_v16i32_v16i1:2797; X64-SSE: # %bb.0:2798; X64-SSE-NEXT: pcmpeqd %xmm7, %xmm32799; X64-SSE-NEXT: pcmpeqd %xmm6, %xmm22800; X64-SSE-NEXT: packssdw %xmm3, %xmm22801; X64-SSE-NEXT: pcmpeqd %xmm5, %xmm12802; X64-SSE-NEXT: pcmpeqd %xmm4, %xmm02803; X64-SSE-NEXT: packssdw %xmm1, %xmm02804; X64-SSE-NEXT: packsswb %xmm2, %xmm02805; X64-SSE-NEXT: pmovmskb %xmm0, %eax2806; X64-SSE-NEXT: xorb %ah, %al2807; X64-SSE-NEXT: setnp %al2808; X64-SSE-NEXT: retq2809;2810; AVX1-LABEL: icmp_v16i32_v16i1:2811; AVX1: # %bb.0:2812; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm42813; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm52814; AVX1-NEXT: vpcmpeqd %xmm4, %xmm5, %xmm42815; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm12816; AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm12817; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm32818; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm42819; AVX1-NEXT: vpcmpeqd %xmm3, %xmm4, %xmm32820; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm02821; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm02822; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm02823; AVX1-NEXT: vpmovmskb %xmm0, %eax2824; AVX1-NEXT: xorb %ah, %al2825; AVX1-NEXT: setnp %al2826; AVX1-NEXT: vzeroupper2827; AVX1-NEXT: retq2828;2829; AVX2-LABEL: icmp_v16i32_v16i1:2830; AVX2: # %bb.0:2831; AVX2-NEXT: vpcmpeqd %ymm3, %ymm1, %ymm12832; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm02833; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm02834; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12835; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm02836; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]2837; AVX2-NEXT: vpmovmskb %xmm0, %eax2838; AVX2-NEXT: xorb %ah, %al2839; AVX2-NEXT: setnp %al2840; AVX2-NEXT: vzeroupper2841; AVX2-NEXT: retq2842;2843; AVX512F-LABEL: icmp_v16i32_v16i1:2844; AVX512F: # %bb.0:2845; AVX512F-NEXT: vpcmpeqd %zmm1, %zmm0, %k02846; AVX512F-NEXT: kmovw %k0, %eax2847; AVX512F-NEXT: movl %eax, %ecx2848; AVX512F-NEXT: shrl $8, %eax2849; AVX512F-NEXT: xorb %cl, %al2850; AVX512F-NEXT: setnp %al2851; AVX512F-NEXT: vzeroupper2852; AVX512F-NEXT: retq2853;2854; AVX512BW-LABEL: icmp_v16i32_v16i1:2855; AVX512BW: # %bb.0:2856; AVX512BW-NEXT: vpcmpeqd %zmm1, %zmm0, %k02857; AVX512BW-NEXT: kmovd %k0, %eax2858; AVX512BW-NEXT: movl %eax, %ecx2859; AVX512BW-NEXT: shrl $8, %eax2860; AVX512BW-NEXT: xorb %cl, %al2861; AVX512BW-NEXT: setnp %al2862; AVX512BW-NEXT: vzeroupper2863; AVX512BW-NEXT: retq2864;2865; AVX512VL-LABEL: icmp_v16i32_v16i1:2866; AVX512VL: # %bb.0:2867; AVX512VL-NEXT: vpcmpeqd %zmm1, %zmm0, %k02868; AVX512VL-NEXT: kmovd %k0, %eax2869; AVX512VL-NEXT: movl %eax, %ecx2870; AVX512VL-NEXT: shrl $8, %eax2871; AVX512VL-NEXT: xorb %cl, %al2872; AVX512VL-NEXT: setnp %al2873; AVX512VL-NEXT: vzeroupper2874; AVX512VL-NEXT: retq2875 %a = icmp eq <16 x i32> %0, %12876 %b = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)2877 ret i1 %b2878}2879 2880define i1 @icmp_v32i16_v32i1(<32 x i16>, <32 x i16>) nounwind {2881; X86-SSE2-LABEL: icmp_v32i16_v32i1:2882; X86-SSE2: # %bb.0:2883; X86-SSE2-NEXT: pushl %ebp2884; X86-SSE2-NEXT: movl %esp, %ebp2885; X86-SSE2-NEXT: andl $-16, %esp2886; X86-SSE2-NEXT: subl $16, %esp2887; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm32888; X86-SSE2-NEXT: pcmpeqw 56(%ebp), %xmm22889; X86-SSE2-NEXT: pcmpeqw 24(%ebp), %xmm02890; X86-SSE2-NEXT: pxor %xmm2, %xmm02891; X86-SSE2-NEXT: pcmpeqw 72(%ebp), %xmm32892; X86-SSE2-NEXT: pcmpeqw 40(%ebp), %xmm12893; X86-SSE2-NEXT: pxor %xmm3, %xmm12894; X86-SSE2-NEXT: packsswb %xmm1, %xmm02895; X86-SSE2-NEXT: pmovmskb %xmm0, %eax2896; X86-SSE2-NEXT: xorb %ah, %al2897; X86-SSE2-NEXT: setnp %al2898; X86-SSE2-NEXT: movl %ebp, %esp2899; X86-SSE2-NEXT: popl %ebp2900; X86-SSE2-NEXT: retl2901;2902; X64-SSE-LABEL: icmp_v32i16_v32i1:2903; X64-SSE: # %bb.0:2904; X64-SSE-NEXT: pcmpeqw %xmm6, %xmm22905; X64-SSE-NEXT: pcmpeqw %xmm4, %xmm02906; X64-SSE-NEXT: pxor %xmm2, %xmm02907; X64-SSE-NEXT: pcmpeqw %xmm7, %xmm32908; X64-SSE-NEXT: pcmpeqw %xmm5, %xmm12909; X64-SSE-NEXT: pxor %xmm3, %xmm12910; X64-SSE-NEXT: packsswb %xmm1, %xmm02911; X64-SSE-NEXT: pmovmskb %xmm0, %eax2912; X64-SSE-NEXT: xorb %ah, %al2913; X64-SSE-NEXT: setnp %al2914; X64-SSE-NEXT: retq2915;2916; AVX1-LABEL: icmp_v32i16_v32i1:2917; AVX1: # %bb.0:2918; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm42919; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm52920; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm42921; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm32922; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm12923; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm12924; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm22925; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02926; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm02927; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm02928; AVX1-NEXT: vpacksswb %xmm0, %xmm4, %xmm02929; AVX1-NEXT: vpmovmskb %xmm0, %eax2930; AVX1-NEXT: xorb %ah, %al2931; AVX1-NEXT: setnp %al2932; AVX1-NEXT: vzeroupper2933; AVX1-NEXT: retq2934;2935; AVX2-LABEL: icmp_v32i16_v32i1:2936; AVX2: # %bb.0:2937; AVX2-NEXT: vpcmpeqw %ymm3, %ymm1, %ymm12938; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm02939; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm02940; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]2941; AVX2-NEXT: vpmovmskb %ymm0, %eax2942; AVX2-NEXT: movl %eax, %ecx2943; AVX2-NEXT: shrl $16, %ecx2944; AVX2-NEXT: xorl %eax, %ecx2945; AVX2-NEXT: xorb %ch, %cl2946; AVX2-NEXT: setnp %al2947; AVX2-NEXT: vzeroupper2948; AVX2-NEXT: retq2949;2950; AVX512F-LABEL: icmp_v32i16_v32i1:2951; AVX512F: # %bb.0:2952; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm22953; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm32954; AVX512F-NEXT: vpcmpeqw %ymm2, %ymm3, %ymm22955; AVX512F-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm02956; AVX512F-NEXT: vpxor %ymm2, %ymm0, %ymm02957; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm02958; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k02959; AVX512F-NEXT: kshiftrw $8, %k0, %k12960; AVX512F-NEXT: kxorw %k1, %k0, %k02961; AVX512F-NEXT: kshiftrw $4, %k0, %k12962; AVX512F-NEXT: kxorw %k1, %k0, %k02963; AVX512F-NEXT: kshiftrw $2, %k0, %k12964; AVX512F-NEXT: kxorw %k1, %k0, %k02965; AVX512F-NEXT: kshiftrw $1, %k0, %k12966; AVX512F-NEXT: kxorw %k1, %k0, %k02967; AVX512F-NEXT: kmovw %k0, %eax2968; AVX512F-NEXT: # kill: def $al killed $al killed $eax2969; AVX512F-NEXT: vzeroupper2970; AVX512F-NEXT: retq2971;2972; AVX512BW-LABEL: icmp_v32i16_v32i1:2973; AVX512BW: # %bb.0:2974; AVX512BW-NEXT: vpcmpeqw %zmm1, %zmm0, %k02975; AVX512BW-NEXT: kmovd %k0, %eax2976; AVX512BW-NEXT: movl %eax, %ecx2977; AVX512BW-NEXT: shrl $16, %ecx2978; AVX512BW-NEXT: xorl %eax, %ecx2979; AVX512BW-NEXT: xorb %ch, %cl2980; AVX512BW-NEXT: setnp %al2981; AVX512BW-NEXT: vzeroupper2982; AVX512BW-NEXT: retq2983;2984; AVX512VL-LABEL: icmp_v32i16_v32i1:2985; AVX512VL: # %bb.0:2986; AVX512VL-NEXT: vpcmpeqw %zmm1, %zmm0, %k02987; AVX512VL-NEXT: kmovd %k0, %eax2988; AVX512VL-NEXT: movl %eax, %ecx2989; AVX512VL-NEXT: shrl $16, %ecx2990; AVX512VL-NEXT: xorl %eax, %ecx2991; AVX512VL-NEXT: xorb %ch, %cl2992; AVX512VL-NEXT: setnp %al2993; AVX512VL-NEXT: vzeroupper2994; AVX512VL-NEXT: retq2995 %a = icmp eq <32 x i16> %0, %12996 %b = call i1 @llvm.vector.reduce.xor.v32i1(<32 x i1> %a)2997 ret i1 %b2998}2999 3000define i1 @icmp_v64i8_v64i1(<64 x i8>, <64 x i8>) nounwind {3001; X86-SSE2-LABEL: icmp_v64i8_v64i1:3002; X86-SSE2: # %bb.0:3003; X86-SSE2-NEXT: pushl %ebp3004; X86-SSE2-NEXT: movl %esp, %ebp3005; X86-SSE2-NEXT: andl $-16, %esp3006; X86-SSE2-NEXT: subl $16, %esp3007; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm33008; X86-SSE2-NEXT: pcmpeqb 56(%ebp), %xmm23009; X86-SSE2-NEXT: pcmpeqb 24(%ebp), %xmm03010; X86-SSE2-NEXT: pxor %xmm2, %xmm03011; X86-SSE2-NEXT: pcmpeqb 72(%ebp), %xmm33012; X86-SSE2-NEXT: pcmpeqb 40(%ebp), %xmm13013; X86-SSE2-NEXT: pxor %xmm3, %xmm13014; X86-SSE2-NEXT: pxor %xmm0, %xmm13015; X86-SSE2-NEXT: pmovmskb %xmm1, %eax3016; X86-SSE2-NEXT: xorb %ah, %al3017; X86-SSE2-NEXT: setnp %al3018; X86-SSE2-NEXT: movl %ebp, %esp3019; X86-SSE2-NEXT: popl %ebp3020; X86-SSE2-NEXT: retl3021;3022; X64-SSE-LABEL: icmp_v64i8_v64i1:3023; X64-SSE: # %bb.0:3024; X64-SSE-NEXT: pcmpeqb %xmm6, %xmm23025; X64-SSE-NEXT: pcmpeqb %xmm4, %xmm03026; X64-SSE-NEXT: pxor %xmm2, %xmm03027; X64-SSE-NEXT: pcmpeqb %xmm7, %xmm33028; X64-SSE-NEXT: pcmpeqb %xmm5, %xmm13029; X64-SSE-NEXT: pxor %xmm3, %xmm13030; X64-SSE-NEXT: pxor %xmm0, %xmm13031; X64-SSE-NEXT: pmovmskb %xmm1, %eax3032; X64-SSE-NEXT: xorb %ah, %al3033; X64-SSE-NEXT: setnp %al3034; X64-SSE-NEXT: retq3035;3036; AVX1-LABEL: icmp_v64i8_v64i1:3037; AVX1: # %bb.0:3038; AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm43039; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm53040; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm43041; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm33042; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm13043; AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm13044; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm23045; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm03046; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm03047; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm03048; AVX1-NEXT: vpxor %xmm0, %xmm4, %xmm03049; AVX1-NEXT: vpmovmskb %xmm0, %eax3050; AVX1-NEXT: xorb %ah, %al3051; AVX1-NEXT: setnp %al3052; AVX1-NEXT: vzeroupper3053; AVX1-NEXT: retq3054;3055; AVX2-LABEL: icmp_v64i8_v64i1:3056; AVX2: # %bb.0:3057; AVX2-NEXT: vpcmpeqb %ymm3, %ymm1, %ymm13058; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm03059; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm03060; AVX2-NEXT: vpmovmskb %ymm0, %eax3061; AVX2-NEXT: movl %eax, %ecx3062; AVX2-NEXT: shrl $16, %ecx3063; AVX2-NEXT: xorl %eax, %ecx3064; AVX2-NEXT: xorb %ch, %cl3065; AVX2-NEXT: setnp %al3066; AVX2-NEXT: vzeroupper3067; AVX2-NEXT: retq3068;3069; AVX512F-LABEL: icmp_v64i8_v64i1:3070; AVX512F: # %bb.0:3071; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm23072; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm33073; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm3, %ymm23074; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm03075; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm13076; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm33077; AVX512F-NEXT: vpxor %xmm1, %xmm3, %xmm13078; AVX512F-NEXT: vpxor %xmm2, %xmm0, %xmm03079; AVX512F-NEXT: vpxor %xmm1, %xmm0, %xmm03080; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm03081; AVX512F-NEXT: vpslld $31, %zmm0, %zmm03082; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k03083; AVX512F-NEXT: kshiftrw $8, %k0, %k13084; AVX512F-NEXT: kxorw %k1, %k0, %k03085; AVX512F-NEXT: kshiftrw $4, %k0, %k13086; AVX512F-NEXT: kxorw %k1, %k0, %k03087; AVX512F-NEXT: kshiftrw $2, %k0, %k13088; AVX512F-NEXT: kxorw %k1, %k0, %k03089; AVX512F-NEXT: kshiftrw $1, %k0, %k13090; AVX512F-NEXT: kxorw %k1, %k0, %k03091; AVX512F-NEXT: kmovw %k0, %eax3092; AVX512F-NEXT: # kill: def $al killed $al killed $eax3093; AVX512F-NEXT: vzeroupper3094; AVX512F-NEXT: retq3095;3096; AVX512BW-LABEL: icmp_v64i8_v64i1:3097; AVX512BW: # %bb.0:3098; AVX512BW-NEXT: vpcmpeqb %zmm1, %zmm0, %k03099; AVX512BW-NEXT: kmovq %k0, %rax3100; AVX512BW-NEXT: movl %eax, %ecx3101; AVX512BW-NEXT: shrq $32, %rax3102; AVX512BW-NEXT: xorl %ecx, %eax3103; AVX512BW-NEXT: movl %eax, %ecx3104; AVX512BW-NEXT: shrl $16, %ecx3105; AVX512BW-NEXT: xorl %eax, %ecx3106; AVX512BW-NEXT: xorb %ch, %cl3107; AVX512BW-NEXT: setnp %al3108; AVX512BW-NEXT: vzeroupper3109; AVX512BW-NEXT: retq3110;3111; AVX512VL-LABEL: icmp_v64i8_v64i1:3112; AVX512VL: # %bb.0:3113; AVX512VL-NEXT: vpcmpeqb %zmm1, %zmm0, %k03114; AVX512VL-NEXT: kmovq %k0, %rax3115; AVX512VL-NEXT: movl %eax, %ecx3116; AVX512VL-NEXT: shrq $32, %rax3117; AVX512VL-NEXT: xorl %ecx, %eax3118; AVX512VL-NEXT: movl %eax, %ecx3119; AVX512VL-NEXT: shrl $16, %ecx3120; AVX512VL-NEXT: xorl %eax, %ecx3121; AVX512VL-NEXT: xorb %ch, %cl3122; AVX512VL-NEXT: setnp %al3123; AVX512VL-NEXT: vzeroupper3124; AVX512VL-NEXT: retq3125 %a = icmp eq <64 x i8> %0, %13126 %b = call i1 @llvm.vector.reduce.xor.v64i1(<64 x i1> %a)3127 ret i1 %b3128}3129 3130declare i1 @llvm.vector.reduce.xor.v2i1(<2 x i1>)3131declare i1 @llvm.vector.reduce.xor.v4i1(<4 x i1>)3132declare i1 @llvm.vector.reduce.xor.v8i1(<8 x i1>)3133declare i1 @llvm.vector.reduce.xor.v16i1(<16 x i1>)3134declare i1 @llvm.vector.reduce.xor.v32i1(<32 x i1>)3135declare i1 @llvm.vector.reduce.xor.v64i1(<64 x i1>)3136