2505 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,AVX1OR2,AVX16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VL10 11;12; Truncate13;14 15define i1 @trunc_v2i64_v2i1(<2 x i64>) nounwind {16; SSE2-LABEL: trunc_v2i64_v2i1:17; SSE2: # %bb.0:18; SSE2-NEXT: psllq $63, %xmm019; SSE2-NEXT: movmskpd %xmm0, %eax20; SSE2-NEXT: testl %eax, %eax21; SSE2-NEXT: setne %al22; SSE2-NEXT: ret{{[l|q]}}23;24; SSE41-LABEL: trunc_v2i64_v2i1:25; SSE41: # %bb.0:26; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm027; SSE41-NEXT: setne %al28; SSE41-NEXT: retq29;30; AVX1OR2-LABEL: trunc_v2i64_v2i1:31; AVX1OR2: # %bb.0:32; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm033; AVX1OR2-NEXT: setne %al34; AVX1OR2-NEXT: retq35;36; AVX512F-LABEL: trunc_v2i64_v2i1:37; AVX512F: # %bb.0:38; AVX512F-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm039; AVX512F-NEXT: setne %al40; AVX512F-NEXT: retq41;42; AVX512BW-LABEL: trunc_v2i64_v2i1:43; AVX512BW: # %bb.0:44; AVX512BW-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm045; AVX512BW-NEXT: setne %al46; AVX512BW-NEXT: retq47;48; AVX512VL-LABEL: trunc_v2i64_v2i1:49; AVX512VL: # %bb.0:50; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [1,1]51; AVX512VL-NEXT: vptest %xmm1, %xmm052; AVX512VL-NEXT: setne %al53; AVX512VL-NEXT: retq54 %a = trunc <2 x i64> %0 to <2 x i1>55 %b = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %a)56 ret i1 %b57}58 59define i1 @trunc_v4i32_v4i1(<4 x i32>) nounwind {60; SSE2-LABEL: trunc_v4i32_v4i1:61; SSE2: # %bb.0:62; SSE2-NEXT: pslld $31, %xmm063; SSE2-NEXT: movmskps %xmm0, %eax64; SSE2-NEXT: testl %eax, %eax65; SSE2-NEXT: setne %al66; SSE2-NEXT: ret{{[l|q]}}67;68; SSE41-LABEL: trunc_v4i32_v4i1:69; SSE41: # %bb.0:70; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm071; SSE41-NEXT: setne %al72; SSE41-NEXT: retq73;74; AVX1OR2-LABEL: trunc_v4i32_v4i1:75; AVX1OR2: # %bb.0:76; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm077; AVX1OR2-NEXT: setne %al78; AVX1OR2-NEXT: retq79;80; AVX512F-LABEL: trunc_v4i32_v4i1:81; AVX512F: # %bb.0:82; AVX512F-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm083; AVX512F-NEXT: setne %al84; AVX512F-NEXT: retq85;86; AVX512BW-LABEL: trunc_v4i32_v4i1:87; AVX512BW: # %bb.0:88; AVX512BW-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm089; AVX512BW-NEXT: setne %al90; AVX512BW-NEXT: retq91;92; AVX512VL-LABEL: trunc_v4i32_v4i1:93; AVX512VL: # %bb.0:94; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [4294967297,4294967297]95; AVX512VL-NEXT: vptest %xmm1, %xmm096; AVX512VL-NEXT: setne %al97; AVX512VL-NEXT: retq98 %a = trunc <4 x i32> %0 to <4 x i1>99 %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a)100 ret i1 %b101}102 103define i1 @trunc_v8i16_v8i1(<8 x i16>) nounwind {104; SSE2-LABEL: trunc_v8i16_v8i1:105; SSE2: # %bb.0:106; SSE2-NEXT: psllw $7, %xmm0107; SSE2-NEXT: pmovmskb %xmm0, %eax108; SSE2-NEXT: testl $21845, %eax # imm = 0x5555109; SSE2-NEXT: setne %al110; SSE2-NEXT: ret{{[l|q]}}111;112; SSE41-LABEL: trunc_v8i16_v8i1:113; SSE41: # %bb.0:114; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0115; SSE41-NEXT: setne %al116; SSE41-NEXT: retq117;118; AVX1OR2-LABEL: trunc_v8i16_v8i1:119; AVX1OR2: # %bb.0:120; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0121; AVX1OR2-NEXT: setne %al122; AVX1OR2-NEXT: retq123;124; AVX512F-LABEL: trunc_v8i16_v8i1:125; AVX512F: # %bb.0:126; AVX512F-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0127; AVX512F-NEXT: setne %al128; AVX512F-NEXT: retq129;130; AVX512BW-LABEL: trunc_v8i16_v8i1:131; AVX512BW: # %bb.0:132; AVX512BW-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0133; AVX512BW-NEXT: setne %al134; AVX512BW-NEXT: retq135;136; AVX512VL-LABEL: trunc_v8i16_v8i1:137; AVX512VL: # %bb.0:138; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [281479271743489,281479271743489]139; AVX512VL-NEXT: vptest %xmm1, %xmm0140; AVX512VL-NEXT: setne %al141; AVX512VL-NEXT: retq142 %a = trunc <8 x i16> %0 to <8 x i1>143 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)144 ret i1 %b145}146 147define i1 @trunc_v16i8_v16i1(<16 x i8>) nounwind {148; SSE2-LABEL: trunc_v16i8_v16i1:149; SSE2: # %bb.0:150; SSE2-NEXT: psllw $7, %xmm0151; SSE2-NEXT: pmovmskb %xmm0, %eax152; SSE2-NEXT: testl %eax, %eax153; SSE2-NEXT: setne %al154; SSE2-NEXT: ret{{[l|q]}}155;156; SSE41-LABEL: trunc_v16i8_v16i1:157; SSE41: # %bb.0:158; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0159; SSE41-NEXT: setne %al160; SSE41-NEXT: retq161;162; AVX1OR2-LABEL: trunc_v16i8_v16i1:163; AVX1OR2: # %bb.0:164; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0165; AVX1OR2-NEXT: setne %al166; AVX1OR2-NEXT: retq167;168; AVX512F-LABEL: trunc_v16i8_v16i1:169; AVX512F: # %bb.0:170; AVX512F-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0171; AVX512F-NEXT: setne %al172; AVX512F-NEXT: retq173;174; AVX512BW-LABEL: trunc_v16i8_v16i1:175; AVX512BW: # %bb.0:176; AVX512BW-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0177; AVX512BW-NEXT: setne %al178; AVX512BW-NEXT: retq179;180; AVX512VL-LABEL: trunc_v16i8_v16i1:181; AVX512VL: # %bb.0:182; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [72340172838076673,72340172838076673]183; AVX512VL-NEXT: vptest %xmm1, %xmm0184; AVX512VL-NEXT: setne %al185; AVX512VL-NEXT: retq186 %a = trunc <16 x i8> %0 to <16 x i1>187 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)188 ret i1 %b189}190 191define i1 @trunc_v4i64_v4i1(<4 x i64>) nounwind {192; SSE2-LABEL: trunc_v4i64_v4i1:193; SSE2: # %bb.0:194; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]195; SSE2-NEXT: pslld $31, %xmm0196; SSE2-NEXT: movmskps %xmm0, %eax197; SSE2-NEXT: testl %eax, %eax198; SSE2-NEXT: setne %al199; SSE2-NEXT: ret{{[l|q]}}200;201; SSE41-LABEL: trunc_v4i64_v4i1:202; SSE41: # %bb.0:203; SSE41-NEXT: por %xmm1, %xmm0204; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0205; SSE41-NEXT: setne %al206; SSE41-NEXT: retq207;208; AVX1-LABEL: trunc_v4i64_v4i1:209; AVX1: # %bb.0:210; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0211; AVX1-NEXT: setne %al212; AVX1-NEXT: vzeroupper213; AVX1-NEXT: retq214;215; AVX2-LABEL: trunc_v4i64_v4i1:216; AVX2: # %bb.0:217; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]218; AVX2-NEXT: vptest %ymm1, %ymm0219; AVX2-NEXT: setne %al220; AVX2-NEXT: vzeroupper221; AVX2-NEXT: retq222;223; AVX512-LABEL: trunc_v4i64_v4i1:224; AVX512: # %bb.0:225; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]226; AVX512-NEXT: vptest %ymm1, %ymm0227; AVX512-NEXT: setne %al228; AVX512-NEXT: vzeroupper229; AVX512-NEXT: retq230 %a = trunc <4 x i64> %0 to <4 x i1>231 %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a)232 ret i1 %b233}234 235define i1 @trunc_v8i32_v8i1(<8 x i32>) nounwind {236; SSE2-LABEL: trunc_v8i32_v8i1:237; SSE2: # %bb.0:238; SSE2-NEXT: por %xmm1, %xmm0239; SSE2-NEXT: pslld $31, %xmm0240; SSE2-NEXT: movmskps %xmm0, %eax241; SSE2-NEXT: testl %eax, %eax242; SSE2-NEXT: setne %al243; SSE2-NEXT: ret{{[l|q]}}244;245; SSE41-LABEL: trunc_v8i32_v8i1:246; SSE41: # %bb.0:247; SSE41-NEXT: por %xmm1, %xmm0248; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0249; SSE41-NEXT: setne %al250; SSE41-NEXT: retq251;252; AVX1-LABEL: trunc_v8i32_v8i1:253; AVX1: # %bb.0:254; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0255; AVX1-NEXT: setne %al256; AVX1-NEXT: vzeroupper257; AVX1-NEXT: retq258;259; AVX2-LABEL: trunc_v8i32_v8i1:260; AVX2: # %bb.0:261; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]262; AVX2-NEXT: vptest %ymm1, %ymm0263; AVX2-NEXT: setne %al264; AVX2-NEXT: vzeroupper265; AVX2-NEXT: retq266;267; AVX512-LABEL: trunc_v8i32_v8i1:268; AVX512: # %bb.0:269; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]270; AVX512-NEXT: vptest %ymm1, %ymm0271; AVX512-NEXT: setne %al272; AVX512-NEXT: vzeroupper273; AVX512-NEXT: retq274 %a = trunc <8 x i32> %0 to <8 x i1>275 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)276 ret i1 %b277}278 279define i1 @trunc_v16i16_v16i1(<16 x i16>) nounwind {280; SSE2-LABEL: trunc_v16i16_v16i1:281; SSE2: # %bb.0:282; SSE2-NEXT: por %xmm1, %xmm0283; SSE2-NEXT: psllw $7, %xmm0284; SSE2-NEXT: pmovmskb %xmm0, %eax285; SSE2-NEXT: testl $21845, %eax # imm = 0x5555286; SSE2-NEXT: setne %al287; SSE2-NEXT: ret{{[l|q]}}288;289; SSE41-LABEL: trunc_v16i16_v16i1:290; SSE41: # %bb.0:291; SSE41-NEXT: por %xmm1, %xmm0292; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0293; SSE41-NEXT: setne %al294; SSE41-NEXT: retq295;296; AVX1-LABEL: trunc_v16i16_v16i1:297; AVX1: # %bb.0:298; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0299; AVX1-NEXT: setne %al300; AVX1-NEXT: vzeroupper301; AVX1-NEXT: retq302;303; AVX2-LABEL: trunc_v16i16_v16i1:304; AVX2: # %bb.0:305; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]306; AVX2-NEXT: vptest %ymm1, %ymm0307; AVX2-NEXT: setne %al308; AVX2-NEXT: vzeroupper309; AVX2-NEXT: retq310;311; AVX512-LABEL: trunc_v16i16_v16i1:312; AVX512: # %bb.0:313; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]314; AVX512-NEXT: vptest %ymm1, %ymm0315; AVX512-NEXT: setne %al316; AVX512-NEXT: vzeroupper317; AVX512-NEXT: retq318 %a = trunc <16 x i16> %0 to <16 x i1>319 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)320 ret i1 %b321}322 323define i1 @trunc_v32i8_v32i1(<32 x i8>) nounwind {324; SSE2-LABEL: trunc_v32i8_v32i1:325; SSE2: # %bb.0:326; SSE2-NEXT: por %xmm1, %xmm0327; SSE2-NEXT: psllw $7, %xmm0328; SSE2-NEXT: pmovmskb %xmm0, %eax329; SSE2-NEXT: testl %eax, %eax330; SSE2-NEXT: setne %al331; SSE2-NEXT: ret{{[l|q]}}332;333; SSE41-LABEL: trunc_v32i8_v32i1:334; SSE41: # %bb.0:335; SSE41-NEXT: por %xmm1, %xmm0336; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0337; SSE41-NEXT: setne %al338; SSE41-NEXT: retq339;340; AVX1-LABEL: trunc_v32i8_v32i1:341; AVX1: # %bb.0:342; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0343; AVX1-NEXT: setne %al344; AVX1-NEXT: vzeroupper345; AVX1-NEXT: retq346;347; AVX2-LABEL: trunc_v32i8_v32i1:348; AVX2: # %bb.0:349; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]350; AVX2-NEXT: vptest %ymm1, %ymm0351; AVX2-NEXT: setne %al352; AVX2-NEXT: vzeroupper353; AVX2-NEXT: retq354;355; AVX512-LABEL: trunc_v32i8_v32i1:356; AVX512: # %bb.0:357; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]358; AVX512-NEXT: vptest %ymm1, %ymm0359; AVX512-NEXT: setne %al360; AVX512-NEXT: vzeroupper361; AVX512-NEXT: retq362 %a = trunc <32 x i8> %0 to <32 x i1>363 %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a)364 ret i1 %b365}366 367define i1 @trunc_v8i64_v8i1(<8 x i64>) nounwind {368; X86-SSE2-LABEL: trunc_v8i64_v8i1:369; X86-SSE2: # %bb.0:370; X86-SSE2-NEXT: pushl %ebp371; X86-SSE2-NEXT: movl %esp, %ebp372; X86-SSE2-NEXT: andl $-16, %esp373; X86-SSE2-NEXT: subl $16, %esp374; X86-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]375; X86-SSE2-NEXT: pslld $16, %xmm0376; X86-SSE2-NEXT: psrad $16, %xmm0377; X86-SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],mem[0,2]378; X86-SSE2-NEXT: pslld $16, %xmm2379; X86-SSE2-NEXT: psrad $16, %xmm2380; X86-SSE2-NEXT: packssdw %xmm2, %xmm0381; X86-SSE2-NEXT: psllw $15, %xmm0382; X86-SSE2-NEXT: pmovmskb %xmm0, %eax383; X86-SSE2-NEXT: testl $43690, %eax # imm = 0xAAAA384; X86-SSE2-NEXT: setne %al385; X86-SSE2-NEXT: movl %ebp, %esp386; X86-SSE2-NEXT: popl %ebp387; X86-SSE2-NEXT: retl388;389; X64-SSE2-LABEL: trunc_v8i64_v8i1:390; X64-SSE2: # %bb.0:391; X64-SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]392; X64-SSE2-NEXT: pslld $16, %xmm2393; X64-SSE2-NEXT: psrad $16, %xmm2394; X64-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]395; X64-SSE2-NEXT: pslld $16, %xmm0396; X64-SSE2-NEXT: psrad $16, %xmm0397; X64-SSE2-NEXT: packssdw %xmm2, %xmm0398; X64-SSE2-NEXT: psllw $15, %xmm0399; X64-SSE2-NEXT: pmovmskb %xmm0, %eax400; X64-SSE2-NEXT: testl $43690, %eax # imm = 0xAAAA401; X64-SSE2-NEXT: setne %al402; X64-SSE2-NEXT: retq403;404; SSE41-LABEL: trunc_v8i64_v8i1:405; SSE41: # %bb.0:406; SSE41-NEXT: por %xmm3, %xmm1407; SSE41-NEXT: por %xmm2, %xmm0408; SSE41-NEXT: por %xmm1, %xmm0409; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0410; SSE41-NEXT: setne %al411; SSE41-NEXT: retq412;413; AVX1-LABEL: trunc_v8i64_v8i1:414; AVX1: # %bb.0:415; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0416; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0417; AVX1-NEXT: setne %al418; AVX1-NEXT: vzeroupper419; AVX1-NEXT: retq420;421; AVX2-LABEL: trunc_v8i64_v8i1:422; AVX2: # %bb.0:423; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0424; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]425; AVX2-NEXT: vptest %ymm1, %ymm0426; AVX2-NEXT: setne %al427; AVX2-NEXT: vzeroupper428; AVX2-NEXT: retq429;430; AVX512-LABEL: trunc_v8i64_v8i1:431; AVX512: # %bb.0:432; AVX512-NEXT: vpbroadcastq {{.*#+}} zmm1 = [1,1,1,1,1,1,1,1]433; AVX512-NEXT: vptestmd %zmm1, %zmm0, %k0434; AVX512-NEXT: kortestw %k0, %k0435; AVX512-NEXT: setne %al436; AVX512-NEXT: vzeroupper437; AVX512-NEXT: retq438 %a = trunc <8 x i64> %0 to <8 x i1>439 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)440 ret i1 %b441}442 443define i1 @trunc_v16i32_v16i1(<16 x i32>) nounwind {444; X86-SSE2-LABEL: trunc_v16i32_v16i1:445; X86-SSE2: # %bb.0:446; X86-SSE2-NEXT: pushl %ebp447; X86-SSE2-NEXT: movl %esp, %ebp448; X86-SSE2-NEXT: andl $-16, %esp449; X86-SSE2-NEXT: subl $16, %esp450; X86-SSE2-NEXT: por %xmm2, %xmm0451; X86-SSE2-NEXT: por 8(%ebp), %xmm1452; X86-SSE2-NEXT: por %xmm0, %xmm1453; X86-SSE2-NEXT: pslld $31, %xmm1454; X86-SSE2-NEXT: movmskps %xmm1, %eax455; X86-SSE2-NEXT: testl %eax, %eax456; X86-SSE2-NEXT: setne %al457; X86-SSE2-NEXT: movl %ebp, %esp458; X86-SSE2-NEXT: popl %ebp459; X86-SSE2-NEXT: retl460;461; X64-SSE2-LABEL: trunc_v16i32_v16i1:462; X64-SSE2: # %bb.0:463; X64-SSE2-NEXT: por %xmm3, %xmm1464; X64-SSE2-NEXT: por %xmm2, %xmm0465; X64-SSE2-NEXT: por %xmm1, %xmm0466; X64-SSE2-NEXT: pslld $31, %xmm0467; X64-SSE2-NEXT: movmskps %xmm0, %eax468; X64-SSE2-NEXT: testl %eax, %eax469; X64-SSE2-NEXT: setne %al470; X64-SSE2-NEXT: retq471;472; SSE41-LABEL: trunc_v16i32_v16i1:473; SSE41: # %bb.0:474; SSE41-NEXT: por %xmm3, %xmm1475; SSE41-NEXT: por %xmm2, %xmm0476; SSE41-NEXT: por %xmm1, %xmm0477; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0478; SSE41-NEXT: setne %al479; SSE41-NEXT: retq480;481; AVX1-LABEL: trunc_v16i32_v16i1:482; AVX1: # %bb.0:483; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0484; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0485; AVX1-NEXT: setne %al486; AVX1-NEXT: vzeroupper487; AVX1-NEXT: retq488;489; AVX2-LABEL: trunc_v16i32_v16i1:490; AVX2: # %bb.0:491; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0492; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]493; AVX2-NEXT: vptest %ymm1, %ymm0494; AVX2-NEXT: setne %al495; AVX2-NEXT: vzeroupper496; AVX2-NEXT: retq497;498; AVX512-LABEL: trunc_v16i32_v16i1:499; AVX512: # %bb.0:500; AVX512-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k0501; AVX512-NEXT: kortestw %k0, %k0502; AVX512-NEXT: setne %al503; AVX512-NEXT: vzeroupper504; AVX512-NEXT: retq505 %a = trunc <16 x i32> %0 to <16 x i1>506 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)507 ret i1 %b508}509 510define i1 @trunc_v32i16_v32i1(<32 x i16>) nounwind {511; X86-SSE2-LABEL: trunc_v32i16_v32i1:512; X86-SSE2: # %bb.0:513; X86-SSE2-NEXT: pushl %ebp514; X86-SSE2-NEXT: movl %esp, %ebp515; X86-SSE2-NEXT: andl $-16, %esp516; X86-SSE2-NEXT: subl $16, %esp517; X86-SSE2-NEXT: por %xmm2, %xmm0518; X86-SSE2-NEXT: por 8(%ebp), %xmm1519; X86-SSE2-NEXT: por %xmm0, %xmm1520; X86-SSE2-NEXT: psllw $7, %xmm1521; X86-SSE2-NEXT: pmovmskb %xmm1, %eax522; X86-SSE2-NEXT: testl $21845, %eax # imm = 0x5555523; X86-SSE2-NEXT: setne %al524; X86-SSE2-NEXT: movl %ebp, %esp525; X86-SSE2-NEXT: popl %ebp526; X86-SSE2-NEXT: retl527;528; X64-SSE2-LABEL: trunc_v32i16_v32i1:529; X64-SSE2: # %bb.0:530; X64-SSE2-NEXT: por %xmm3, %xmm1531; X64-SSE2-NEXT: por %xmm2, %xmm0532; X64-SSE2-NEXT: por %xmm1, %xmm0533; X64-SSE2-NEXT: psllw $7, %xmm0534; X64-SSE2-NEXT: pmovmskb %xmm0, %eax535; X64-SSE2-NEXT: testl $21845, %eax # imm = 0x5555536; X64-SSE2-NEXT: setne %al537; X64-SSE2-NEXT: retq538;539; SSE41-LABEL: trunc_v32i16_v32i1:540; SSE41: # %bb.0:541; SSE41-NEXT: por %xmm3, %xmm1542; SSE41-NEXT: por %xmm2, %xmm0543; SSE41-NEXT: por %xmm1, %xmm0544; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0545; SSE41-NEXT: setne %al546; SSE41-NEXT: retq547;548; AVX1-LABEL: trunc_v32i16_v32i1:549; AVX1: # %bb.0:550; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0551; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0552; AVX1-NEXT: setne %al553; AVX1-NEXT: vzeroupper554; AVX1-NEXT: retq555;556; AVX2-LABEL: trunc_v32i16_v32i1:557; AVX2: # %bb.0:558; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0559; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]560; AVX2-NEXT: vptest %ymm1, %ymm0561; AVX2-NEXT: setne %al562; AVX2-NEXT: vzeroupper563; AVX2-NEXT: retq564;565; AVX512-LABEL: trunc_v32i16_v32i1:566; AVX512: # %bb.0:567; AVX512-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k0568; AVX512-NEXT: kortestw %k0, %k0569; AVX512-NEXT: setne %al570; AVX512-NEXT: vzeroupper571; AVX512-NEXT: retq572 %a = trunc <32 x i16> %0 to <32 x i1>573 %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a)574 ret i1 %b575}576 577define i1 @trunc_v64i8_v64i1(<64 x i8>) nounwind {578; X86-SSE2-LABEL: trunc_v64i8_v64i1:579; X86-SSE2: # %bb.0:580; X86-SSE2-NEXT: pushl %ebp581; X86-SSE2-NEXT: movl %esp, %ebp582; X86-SSE2-NEXT: andl $-16, %esp583; X86-SSE2-NEXT: subl $16, %esp584; X86-SSE2-NEXT: por %xmm2, %xmm0585; X86-SSE2-NEXT: por 8(%ebp), %xmm1586; X86-SSE2-NEXT: por %xmm0, %xmm1587; X86-SSE2-NEXT: psllw $7, %xmm1588; X86-SSE2-NEXT: pmovmskb %xmm1, %eax589; X86-SSE2-NEXT: testl %eax, %eax590; X86-SSE2-NEXT: setne %al591; X86-SSE2-NEXT: movl %ebp, %esp592; X86-SSE2-NEXT: popl %ebp593; X86-SSE2-NEXT: retl594;595; X64-SSE2-LABEL: trunc_v64i8_v64i1:596; X64-SSE2: # %bb.0:597; X64-SSE2-NEXT: por %xmm3, %xmm1598; X64-SSE2-NEXT: por %xmm2, %xmm0599; X64-SSE2-NEXT: por %xmm1, %xmm0600; X64-SSE2-NEXT: psllw $7, %xmm0601; X64-SSE2-NEXT: pmovmskb %xmm0, %eax602; X64-SSE2-NEXT: testl %eax, %eax603; X64-SSE2-NEXT: setne %al604; X64-SSE2-NEXT: retq605;606; SSE41-LABEL: trunc_v64i8_v64i1:607; SSE41: # %bb.0:608; SSE41-NEXT: por %xmm3, %xmm1609; SSE41-NEXT: por %xmm2, %xmm0610; SSE41-NEXT: por %xmm1, %xmm0611; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0612; SSE41-NEXT: setne %al613; SSE41-NEXT: retq614;615; AVX1-LABEL: trunc_v64i8_v64i1:616; AVX1: # %bb.0:617; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0618; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0619; AVX1-NEXT: setne %al620; AVX1-NEXT: vzeroupper621; AVX1-NEXT: retq622;623; AVX2-LABEL: trunc_v64i8_v64i1:624; AVX2: # %bb.0:625; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0626; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]627; AVX2-NEXT: vptest %ymm1, %ymm0628; AVX2-NEXT: setne %al629; AVX2-NEXT: vzeroupper630; AVX2-NEXT: retq631;632; AVX512-LABEL: trunc_v64i8_v64i1:633; AVX512: # %bb.0:634; AVX512-NEXT: vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k0635; AVX512-NEXT: kortestw %k0, %k0636; AVX512-NEXT: setne %al637; AVX512-NEXT: vzeroupper638; AVX512-NEXT: retq639 %a = trunc <64 x i8> %0 to <64 x i1>640 %b = call i1 @llvm.vector.reduce.or.v64i1(<64 x i1> %a)641 ret i1 %b642}643 644;645; Comparison With Zero646;647 648define i1 @icmp0_v2i64_v2i1(<2 x i64>) nounwind {649; SSE2-LABEL: icmp0_v2i64_v2i1:650; SSE2: # %bb.0:651; SSE2-NEXT: pxor %xmm1, %xmm1652; SSE2-NEXT: pcmpeqd %xmm0, %xmm1653; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]654; SSE2-NEXT: pand %xmm1, %xmm0655; SSE2-NEXT: movmskpd %xmm0, %eax656; SSE2-NEXT: testl %eax, %eax657; SSE2-NEXT: setne %al658; SSE2-NEXT: ret{{[l|q]}}659;660; SSE41-LABEL: icmp0_v2i64_v2i1:661; SSE41: # %bb.0:662; SSE41-NEXT: pxor %xmm1, %xmm1663; SSE41-NEXT: pcmpeqq %xmm0, %xmm1664; SSE41-NEXT: movmskpd %xmm1, %eax665; SSE41-NEXT: testl %eax, %eax666; SSE41-NEXT: setne %al667; SSE41-NEXT: retq668;669; AVX1OR2-LABEL: icmp0_v2i64_v2i1:670; AVX1OR2: # %bb.0:671; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1672; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0673; AVX1OR2-NEXT: vtestpd %xmm0, %xmm0674; AVX1OR2-NEXT: setne %al675; AVX1OR2-NEXT: retq676;677; AVX512F-LABEL: icmp0_v2i64_v2i1:678; AVX512F: # %bb.0:679; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0680; AVX512F-NEXT: vptestnmq %zmm0, %zmm0, %k0681; AVX512F-NEXT: kmovw %k0, %eax682; AVX512F-NEXT: testb $3, %al683; AVX512F-NEXT: setne %al684; AVX512F-NEXT: vzeroupper685; AVX512F-NEXT: retq686;687; AVX512BW-LABEL: icmp0_v2i64_v2i1:688; AVX512BW: # %bb.0:689; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0690; AVX512BW-NEXT: vptestnmq %zmm0, %zmm0, %k0691; AVX512BW-NEXT: kmovd %k0, %eax692; AVX512BW-NEXT: testb $3, %al693; AVX512BW-NEXT: setne %al694; AVX512BW-NEXT: vzeroupper695; AVX512BW-NEXT: retq696;697; AVX512VL-LABEL: icmp0_v2i64_v2i1:698; AVX512VL: # %bb.0:699; AVX512VL-NEXT: vptestnmq %xmm0, %xmm0, %k0700; AVX512VL-NEXT: kmovd %k0, %eax701; AVX512VL-NEXT: testb %al, %al702; AVX512VL-NEXT: setne %al703; AVX512VL-NEXT: retq704 %a = icmp eq <2 x i64> %0, zeroinitializer705 %b = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %a)706 ret i1 %b707}708 709define i1 @icmp0_v4i32_v4i1(<4 x i32>) nounwind {710; SSE-LABEL: icmp0_v4i32_v4i1:711; SSE: # %bb.0:712; SSE-NEXT: pxor %xmm1, %xmm1713; SSE-NEXT: pcmpeqd %xmm0, %xmm1714; SSE-NEXT: movmskps %xmm1, %eax715; SSE-NEXT: testl %eax, %eax716; SSE-NEXT: setne %al717; SSE-NEXT: ret{{[l|q]}}718;719; AVX1OR2-LABEL: icmp0_v4i32_v4i1:720; AVX1OR2: # %bb.0:721; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1722; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0723; AVX1OR2-NEXT: vtestps %xmm0, %xmm0724; AVX1OR2-NEXT: setne %al725; AVX1OR2-NEXT: retq726;727; AVX512F-LABEL: icmp0_v4i32_v4i1:728; AVX512F: # %bb.0:729; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0730; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k0731; AVX512F-NEXT: kmovw %k0, %eax732; AVX512F-NEXT: testb $15, %al733; AVX512F-NEXT: setne %al734; AVX512F-NEXT: vzeroupper735; AVX512F-NEXT: retq736;737; AVX512BW-LABEL: icmp0_v4i32_v4i1:738; AVX512BW: # %bb.0:739; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0740; AVX512BW-NEXT: vptestnmd %zmm0, %zmm0, %k0741; AVX512BW-NEXT: kmovd %k0, %eax742; AVX512BW-NEXT: testb $15, %al743; AVX512BW-NEXT: setne %al744; AVX512BW-NEXT: vzeroupper745; AVX512BW-NEXT: retq746;747; AVX512VL-LABEL: icmp0_v4i32_v4i1:748; AVX512VL: # %bb.0:749; AVX512VL-NEXT: vptestnmd %xmm0, %xmm0, %k0750; AVX512VL-NEXT: kmovd %k0, %eax751; AVX512VL-NEXT: testb %al, %al752; AVX512VL-NEXT: setne %al753; AVX512VL-NEXT: retq754 %a = icmp eq <4 x i32> %0, zeroinitializer755 %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a)756 ret i1 %b757}758 759define i1 @icmp0_v8i16_v8i1(<8 x i16>) nounwind {760; SSE-LABEL: icmp0_v8i16_v8i1:761; SSE: # %bb.0:762; SSE-NEXT: pxor %xmm1, %xmm1763; SSE-NEXT: pcmpeqw %xmm0, %xmm1764; SSE-NEXT: pmovmskb %xmm1, %eax765; SSE-NEXT: testl %eax, %eax766; SSE-NEXT: setne %al767; SSE-NEXT: ret{{[l|q]}}768;769; AVX1OR2-LABEL: icmp0_v8i16_v8i1:770; AVX1OR2: # %bb.0:771; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1772; AVX1OR2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0773; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax774; AVX1OR2-NEXT: testl %eax, %eax775; AVX1OR2-NEXT: setne %al776; AVX1OR2-NEXT: retq777;778; AVX512F-LABEL: icmp0_v8i16_v8i1:779; AVX512F: # %bb.0:780; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1781; AVX512F-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0782; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm0783; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0784; AVX512F-NEXT: kortestw %k0, %k0785; AVX512F-NEXT: setne %al786; AVX512F-NEXT: vzeroupper787; AVX512F-NEXT: retq788;789; AVX512BW-LABEL: icmp0_v8i16_v8i1:790; AVX512BW: # %bb.0:791; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0792; AVX512BW-NEXT: vptestnmw %zmm0, %zmm0, %k0793; AVX512BW-NEXT: kmovd %k0, %eax794; AVX512BW-NEXT: testb %al, %al795; AVX512BW-NEXT: setne %al796; AVX512BW-NEXT: vzeroupper797; AVX512BW-NEXT: retq798;799; AVX512VL-LABEL: icmp0_v8i16_v8i1:800; AVX512VL: # %bb.0:801; AVX512VL-NEXT: vptestnmw %xmm0, %xmm0, %k0802; AVX512VL-NEXT: kmovd %k0, %eax803; AVX512VL-NEXT: testb %al, %al804; AVX512VL-NEXT: setne %al805; AVX512VL-NEXT: retq806 %a = icmp eq <8 x i16> %0, zeroinitializer807 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)808 ret i1 %b809}810 811define i1 @icmp0_v16i8_v16i1(<16 x i8>) nounwind {812; SSE-LABEL: icmp0_v16i8_v16i1:813; SSE: # %bb.0:814; SSE-NEXT: pxor %xmm1, %xmm1815; SSE-NEXT: pcmpeqb %xmm0, %xmm1816; SSE-NEXT: pmovmskb %xmm1, %eax817; SSE-NEXT: testl %eax, %eax818; SSE-NEXT: setne %al819; SSE-NEXT: ret{{[l|q]}}820;821; AVX1OR2-LABEL: icmp0_v16i8_v16i1:822; AVX1OR2: # %bb.0:823; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1824; AVX1OR2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0825; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax826; AVX1OR2-NEXT: testl %eax, %eax827; AVX1OR2-NEXT: setne %al828; AVX1OR2-NEXT: retq829;830; AVX512F-LABEL: icmp0_v16i8_v16i1:831; AVX512F: # %bb.0:832; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1833; AVX512F-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0834; AVX512F-NEXT: vpmovmskb %xmm0, %eax835; AVX512F-NEXT: testl %eax, %eax836; AVX512F-NEXT: setne %al837; AVX512F-NEXT: retq838;839; AVX512BW-LABEL: icmp0_v16i8_v16i1:840; AVX512BW: # %bb.0:841; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0842; AVX512BW-NEXT: vptestnmb %zmm0, %zmm0, %k0843; AVX512BW-NEXT: kortestw %k0, %k0844; AVX512BW-NEXT: setne %al845; AVX512BW-NEXT: vzeroupper846; AVX512BW-NEXT: retq847;848; AVX512VL-LABEL: icmp0_v16i8_v16i1:849; AVX512VL: # %bb.0:850; AVX512VL-NEXT: vptestnmb %xmm0, %xmm0, %k0851; AVX512VL-NEXT: kortestw %k0, %k0852; AVX512VL-NEXT: setne %al853; AVX512VL-NEXT: retq854 %a = icmp eq <16 x i8> %0, zeroinitializer855 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)856 ret i1 %b857}858 859define i1 @icmp0_v4i64_v4i1(<4 x i64>) nounwind {860; SSE2-LABEL: icmp0_v4i64_v4i1:861; SSE2: # %bb.0:862; SSE2-NEXT: pxor %xmm2, %xmm2863; SSE2-NEXT: pcmpeqd %xmm2, %xmm1864; SSE2-NEXT: pcmpeqd %xmm2, %xmm0865; SSE2-NEXT: movdqa %xmm0, %xmm2866; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm1[1,3]867; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]868; SSE2-NEXT: andps %xmm2, %xmm0869; SSE2-NEXT: movmskps %xmm0, %eax870; SSE2-NEXT: testl %eax, %eax871; SSE2-NEXT: setne %al872; SSE2-NEXT: ret{{[l|q]}}873;874; SSE41-LABEL: icmp0_v4i64_v4i1:875; SSE41: # %bb.0:876; SSE41-NEXT: pxor %xmm2, %xmm2877; SSE41-NEXT: pcmpeqq %xmm2, %xmm1878; SSE41-NEXT: pcmpeqq %xmm2, %xmm0879; SSE41-NEXT: packssdw %xmm1, %xmm0880; SSE41-NEXT: movmskps %xmm0, %eax881; SSE41-NEXT: testl %eax, %eax882; SSE41-NEXT: setne %al883; SSE41-NEXT: retq884;885; AVX1-LABEL: icmp0_v4i64_v4i1:886; AVX1: # %bb.0:887; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1888; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2889; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1890; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm0891; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0892; AVX1-NEXT: vtestpd %xmm0, %xmm0893; AVX1-NEXT: setne %al894; AVX1-NEXT: vzeroupper895; AVX1-NEXT: retq896;897; AVX2-LABEL: icmp0_v4i64_v4i1:898; AVX2: # %bb.0:899; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1900; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0901; AVX2-NEXT: vtestpd %ymm0, %ymm0902; AVX2-NEXT: setne %al903; AVX2-NEXT: vzeroupper904; AVX2-NEXT: retq905;906; AVX512F-LABEL: icmp0_v4i64_v4i1:907; AVX512F: # %bb.0:908; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0909; AVX512F-NEXT: vptestnmq %zmm0, %zmm0, %k0910; AVX512F-NEXT: kmovw %k0, %eax911; AVX512F-NEXT: testb $15, %al912; AVX512F-NEXT: setne %al913; AVX512F-NEXT: vzeroupper914; AVX512F-NEXT: retq915;916; AVX512BW-LABEL: icmp0_v4i64_v4i1:917; AVX512BW: # %bb.0:918; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0919; AVX512BW-NEXT: vptestnmq %zmm0, %zmm0, %k0920; AVX512BW-NEXT: kmovd %k0, %eax921; AVX512BW-NEXT: testb $15, %al922; AVX512BW-NEXT: setne %al923; AVX512BW-NEXT: vzeroupper924; AVX512BW-NEXT: retq925;926; AVX512VL-LABEL: icmp0_v4i64_v4i1:927; AVX512VL: # %bb.0:928; AVX512VL-NEXT: vptestnmq %ymm0, %ymm0, %k0929; AVX512VL-NEXT: kmovd %k0, %eax930; AVX512VL-NEXT: testb %al, %al931; AVX512VL-NEXT: setne %al932; AVX512VL-NEXT: vzeroupper933; AVX512VL-NEXT: retq934 %a = icmp eq <4 x i64> %0, zeroinitializer935 %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a)936 ret i1 %b937}938 939define i1 @icmp0_v8i32_v8i1(<8 x i32>) nounwind {940; SSE-LABEL: icmp0_v8i32_v8i1:941; SSE: # %bb.0:942; SSE-NEXT: pxor %xmm2, %xmm2943; SSE-NEXT: pcmpeqd %xmm2, %xmm1944; SSE-NEXT: pcmpeqd %xmm2, %xmm0945; SSE-NEXT: packssdw %xmm1, %xmm0946; SSE-NEXT: pmovmskb %xmm0, %eax947; SSE-NEXT: testl %eax, %eax948; SSE-NEXT: setne %al949; SSE-NEXT: ret{{[l|q]}}950;951; AVX1-LABEL: icmp0_v8i32_v8i1:952; AVX1: # %bb.0:953; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1954; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2955; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1956; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0957; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0958; AVX1-NEXT: vtestps %xmm0, %xmm0959; AVX1-NEXT: setne %al960; AVX1-NEXT: vzeroupper961; AVX1-NEXT: retq962;963; AVX2-LABEL: icmp0_v8i32_v8i1:964; AVX2: # %bb.0:965; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1966; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0967; AVX2-NEXT: vtestps %ymm0, %ymm0968; AVX2-NEXT: setne %al969; AVX2-NEXT: vzeroupper970; AVX2-NEXT: retq971;972; AVX512F-LABEL: icmp0_v8i32_v8i1:973; AVX512F: # %bb.0:974; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0975; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k0976; AVX512F-NEXT: kmovw %k0, %eax977; AVX512F-NEXT: testb %al, %al978; AVX512F-NEXT: setne %al979; AVX512F-NEXT: vzeroupper980; AVX512F-NEXT: retq981;982; AVX512BW-LABEL: icmp0_v8i32_v8i1:983; AVX512BW: # %bb.0:984; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0985; AVX512BW-NEXT: vptestnmd %zmm0, %zmm0, %k0986; AVX512BW-NEXT: kmovd %k0, %eax987; AVX512BW-NEXT: testb %al, %al988; AVX512BW-NEXT: setne %al989; AVX512BW-NEXT: vzeroupper990; AVX512BW-NEXT: retq991;992; AVX512VL-LABEL: icmp0_v8i32_v8i1:993; AVX512VL: # %bb.0:994; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k0995; AVX512VL-NEXT: kmovd %k0, %eax996; AVX512VL-NEXT: testb %al, %al997; AVX512VL-NEXT: setne %al998; AVX512VL-NEXT: vzeroupper999; AVX512VL-NEXT: retq1000 %a = icmp eq <8 x i32> %0, zeroinitializer1001 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)1002 ret i1 %b1003}1004 1005define i1 @icmp0_v16i16_v16i1(<16 x i16>) nounwind {1006; SSE-LABEL: icmp0_v16i16_v16i1:1007; SSE: # %bb.0:1008; SSE-NEXT: pxor %xmm2, %xmm21009; SSE-NEXT: pcmpeqw %xmm2, %xmm11010; SSE-NEXT: pcmpeqw %xmm2, %xmm01011; SSE-NEXT: packsswb %xmm1, %xmm01012; SSE-NEXT: pmovmskb %xmm0, %eax1013; SSE-NEXT: testl %eax, %eax1014; SSE-NEXT: setne %al1015; SSE-NEXT: ret{{[l|q]}}1016;1017; AVX1-LABEL: icmp0_v16i16_v16i1:1018; AVX1: # %bb.0:1019; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11020; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21021; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm11022; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm01023; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm01024; AVX1-NEXT: vpmovmskb %xmm0, %eax1025; AVX1-NEXT: testl %eax, %eax1026; AVX1-NEXT: setne %al1027; AVX1-NEXT: vzeroupper1028; AVX1-NEXT: retq1029;1030; AVX2-LABEL: icmp0_v16i16_v16i1:1031; AVX2: # %bb.0:1032; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11033; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm01034; AVX2-NEXT: vpmovmskb %ymm0, %eax1035; AVX2-NEXT: testl %eax, %eax1036; AVX2-NEXT: setne %al1037; AVX2-NEXT: vzeroupper1038; AVX2-NEXT: retq1039;1040; AVX512F-LABEL: icmp0_v16i16_v16i1:1041; AVX512F: # %bb.0:1042; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm11043; AVX512F-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm01044; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm01045; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k01046; AVX512F-NEXT: kortestw %k0, %k01047; AVX512F-NEXT: setne %al1048; AVX512F-NEXT: vzeroupper1049; AVX512F-NEXT: retq1050;1051; AVX512BW-LABEL: icmp0_v16i16_v16i1:1052; AVX512BW: # %bb.0:1053; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01054; AVX512BW-NEXT: vptestnmw %zmm0, %zmm0, %k01055; AVX512BW-NEXT: kortestw %k0, %k01056; AVX512BW-NEXT: setne %al1057; AVX512BW-NEXT: vzeroupper1058; AVX512BW-NEXT: retq1059;1060; AVX512VL-LABEL: icmp0_v16i16_v16i1:1061; AVX512VL: # %bb.0:1062; AVX512VL-NEXT: vptestnmw %ymm0, %ymm0, %k01063; AVX512VL-NEXT: kortestw %k0, %k01064; AVX512VL-NEXT: setne %al1065; AVX512VL-NEXT: vzeroupper1066; AVX512VL-NEXT: retq1067 %a = icmp eq <16 x i16> %0, zeroinitializer1068 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)1069 ret i1 %b1070}1071 1072define i1 @icmp0_v32i8_v32i1(<32 x i8>) nounwind {1073; SSE-LABEL: icmp0_v32i8_v32i1:1074; SSE: # %bb.0:1075; SSE-NEXT: pxor %xmm2, %xmm21076; SSE-NEXT: pcmpeqb %xmm2, %xmm11077; SSE-NEXT: pcmpeqb %xmm2, %xmm01078; SSE-NEXT: por %xmm1, %xmm01079; SSE-NEXT: pmovmskb %xmm0, %eax1080; SSE-NEXT: testl %eax, %eax1081; SSE-NEXT: setne %al1082; SSE-NEXT: ret{{[l|q]}}1083;1084; AVX1-LABEL: icmp0_v32i8_v32i1:1085; AVX1: # %bb.0:1086; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11087; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21088; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm11089; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm01090; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm01091; AVX1-NEXT: vpmovmskb %xmm0, %eax1092; AVX1-NEXT: testl %eax, %eax1093; AVX1-NEXT: setne %al1094; AVX1-NEXT: vzeroupper1095; AVX1-NEXT: retq1096;1097; AVX2-LABEL: icmp0_v32i8_v32i1:1098; AVX2: # %bb.0:1099; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11100; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm01101; AVX2-NEXT: vpmovmskb %ymm0, %eax1102; AVX2-NEXT: testl %eax, %eax1103; AVX2-NEXT: setne %al1104; AVX2-NEXT: vzeroupper1105; AVX2-NEXT: retq1106;1107; AVX512F-LABEL: icmp0_v32i8_v32i1:1108; AVX512F: # %bb.0:1109; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm11110; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm01111; AVX512F-NEXT: vpmovmskb %ymm0, %eax1112; AVX512F-NEXT: testl %eax, %eax1113; AVX512F-NEXT: setne %al1114; AVX512F-NEXT: vzeroupper1115; AVX512F-NEXT: retq1116;1117; AVX512BW-LABEL: icmp0_v32i8_v32i1:1118; AVX512BW: # %bb.0:1119; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01120; AVX512BW-NEXT: vptestnmb %zmm0, %zmm0, %k01121; AVX512BW-NEXT: kortestd %k0, %k01122; AVX512BW-NEXT: setne %al1123; AVX512BW-NEXT: vzeroupper1124; AVX512BW-NEXT: retq1125;1126; AVX512VL-LABEL: icmp0_v32i8_v32i1:1127; AVX512VL: # %bb.0:1128; AVX512VL-NEXT: vptestnmb %ymm0, %ymm0, %k01129; AVX512VL-NEXT: kortestd %k0, %k01130; AVX512VL-NEXT: setne %al1131; AVX512VL-NEXT: vzeroupper1132; AVX512VL-NEXT: retq1133 %a = icmp eq <32 x i8> %0, zeroinitializer1134 %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a)1135 ret i1 %b1136}1137 1138define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {1139; X86-SSE2-LABEL: icmp0_v8i64_v8i1:1140; X86-SSE2: # %bb.0:1141; X86-SSE2-NEXT: pushl %ebp1142; X86-SSE2-NEXT: movl %esp, %ebp1143; X86-SSE2-NEXT: andl $-16, %esp1144; X86-SSE2-NEXT: subl $16, %esp1145; X86-SSE2-NEXT: pxor %xmm3, %xmm31146; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm11147; X86-SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,0,3,2]1148; X86-SSE2-NEXT: pand %xmm1, %xmm41149; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm01150; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]1151; X86-SSE2-NEXT: pand %xmm0, %xmm11152; X86-SSE2-NEXT: packssdw %xmm4, %xmm11153; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm21154; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2]1155; X86-SSE2-NEXT: pand %xmm2, %xmm01156; X86-SSE2-NEXT: pcmpeqd 8(%ebp), %xmm31157; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,0,3,2]1158; X86-SSE2-NEXT: pand %xmm3, %xmm21159; X86-SSE2-NEXT: packssdw %xmm2, %xmm01160; X86-SSE2-NEXT: packssdw %xmm0, %xmm11161; X86-SSE2-NEXT: pmovmskb %xmm1, %eax1162; X86-SSE2-NEXT: testl $43690, %eax # imm = 0xAAAA1163; X86-SSE2-NEXT: setne %al1164; X86-SSE2-NEXT: movl %ebp, %esp1165; X86-SSE2-NEXT: popl %ebp1166; X86-SSE2-NEXT: retl1167;1168; X64-SSE2-LABEL: icmp0_v8i64_v8i1:1169; X64-SSE2: # %bb.0:1170; X64-SSE2-NEXT: pxor %xmm4, %xmm41171; X64-SSE2-NEXT: pcmpeqd %xmm4, %xmm31172; X64-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,0,3,2]1173; X64-SSE2-NEXT: pand %xmm3, %xmm51174; X64-SSE2-NEXT: pcmpeqd %xmm4, %xmm21175; X64-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]1176; X64-SSE2-NEXT: pand %xmm2, %xmm31177; X64-SSE2-NEXT: packssdw %xmm5, %xmm31178; X64-SSE2-NEXT: pcmpeqd %xmm4, %xmm11179; X64-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]1180; X64-SSE2-NEXT: pand %xmm1, %xmm21181; X64-SSE2-NEXT: pcmpeqd %xmm4, %xmm01182; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]1183; X64-SSE2-NEXT: pand %xmm0, %xmm11184; X64-SSE2-NEXT: packssdw %xmm2, %xmm11185; X64-SSE2-NEXT: packssdw %xmm3, %xmm11186; X64-SSE2-NEXT: pmovmskb %xmm1, %eax1187; X64-SSE2-NEXT: testl $43690, %eax # imm = 0xAAAA1188; X64-SSE2-NEXT: setne %al1189; X64-SSE2-NEXT: retq1190;1191; SSE41-LABEL: icmp0_v8i64_v8i1:1192; SSE41: # %bb.0:1193; SSE41-NEXT: pxor %xmm4, %xmm41194; SSE41-NEXT: pcmpeqq %xmm4, %xmm31195; SSE41-NEXT: pcmpeqq %xmm4, %xmm21196; SSE41-NEXT: packssdw %xmm3, %xmm21197; SSE41-NEXT: pcmpeqq %xmm4, %xmm11198; SSE41-NEXT: pcmpeqq %xmm4, %xmm01199; SSE41-NEXT: packssdw %xmm1, %xmm01200; SSE41-NEXT: packssdw %xmm2, %xmm01201; SSE41-NEXT: pmovmskb %xmm0, %eax1202; SSE41-NEXT: testl %eax, %eax1203; SSE41-NEXT: setne %al1204; SSE41-NEXT: retq1205;1206; AVX1-LABEL: icmp0_v8i64_v8i1:1207; AVX1: # %bb.0:1208; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21209; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm31210; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm41211; AVX1-NEXT: vpor %xmm3, %xmm4, %xmm31212; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11213; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm11214; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01215; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm01216; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm01217; AVX1-NEXT: vpackssdw %xmm0, %xmm3, %xmm01218; AVX1-NEXT: vtestps %xmm0, %xmm01219; AVX1-NEXT: setne %al1220; AVX1-NEXT: vzeroupper1221; AVX1-NEXT: retq1222;1223; AVX2-LABEL: icmp0_v8i64_v8i1:1224; AVX2: # %bb.0:1225; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21226; AVX2-NEXT: vpcmpeqq %ymm2, %ymm1, %ymm11227; AVX2-NEXT: vpcmpeqq %ymm2, %ymm0, %ymm01228; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm01229; AVX2-NEXT: vtestps %ymm0, %ymm01230; AVX2-NEXT: setne %al1231; AVX2-NEXT: vzeroupper1232; AVX2-NEXT: retq1233;1234; AVX512F-LABEL: icmp0_v8i64_v8i1:1235; AVX512F: # %bb.0:1236; AVX512F-NEXT: vptestnmq %zmm0, %zmm0, %k01237; AVX512F-NEXT: kmovw %k0, %eax1238; AVX512F-NEXT: testb %al, %al1239; AVX512F-NEXT: setne %al1240; AVX512F-NEXT: vzeroupper1241; AVX512F-NEXT: retq1242;1243; AVX512BW-LABEL: icmp0_v8i64_v8i1:1244; AVX512BW: # %bb.0:1245; AVX512BW-NEXT: vptestnmq %zmm0, %zmm0, %k01246; AVX512BW-NEXT: kmovd %k0, %eax1247; AVX512BW-NEXT: testb %al, %al1248; AVX512BW-NEXT: setne %al1249; AVX512BW-NEXT: vzeroupper1250; AVX512BW-NEXT: retq1251;1252; AVX512VL-LABEL: icmp0_v8i64_v8i1:1253; AVX512VL: # %bb.0:1254; AVX512VL-NEXT: vptestnmq %zmm0, %zmm0, %k01255; AVX512VL-NEXT: kmovd %k0, %eax1256; AVX512VL-NEXT: testb %al, %al1257; AVX512VL-NEXT: setne %al1258; AVX512VL-NEXT: vzeroupper1259; AVX512VL-NEXT: retq1260 %a = icmp eq <8 x i64> %0, zeroinitializer1261 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)1262 ret i1 %b1263}1264 1265define i1 @icmp0_v16i32_v16i1(<16 x i32>) nounwind {1266; X86-SSE2-LABEL: icmp0_v16i32_v16i1:1267; X86-SSE2: # %bb.0:1268; X86-SSE2-NEXT: pushl %ebp1269; X86-SSE2-NEXT: movl %esp, %ebp1270; X86-SSE2-NEXT: andl $-16, %esp1271; X86-SSE2-NEXT: subl $16, %esp1272; X86-SSE2-NEXT: pxor %xmm3, %xmm31273; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm11274; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm01275; X86-SSE2-NEXT: packssdw %xmm1, %xmm01276; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm21277; X86-SSE2-NEXT: pcmpeqd 8(%ebp), %xmm31278; X86-SSE2-NEXT: packssdw %xmm3, %xmm21279; X86-SSE2-NEXT: packsswb %xmm2, %xmm01280; X86-SSE2-NEXT: pmovmskb %xmm0, %eax1281; X86-SSE2-NEXT: testl %eax, %eax1282; X86-SSE2-NEXT: setne %al1283; X86-SSE2-NEXT: movl %ebp, %esp1284; X86-SSE2-NEXT: popl %ebp1285; X86-SSE2-NEXT: retl1286;1287; X64-SSE-LABEL: icmp0_v16i32_v16i1:1288; X64-SSE: # %bb.0:1289; X64-SSE-NEXT: pxor %xmm4, %xmm41290; X64-SSE-NEXT: pcmpeqd %xmm4, %xmm31291; X64-SSE-NEXT: pcmpeqd %xmm4, %xmm21292; X64-SSE-NEXT: packssdw %xmm3, %xmm21293; X64-SSE-NEXT: pcmpeqd %xmm4, %xmm11294; X64-SSE-NEXT: pcmpeqd %xmm4, %xmm01295; X64-SSE-NEXT: packssdw %xmm1, %xmm01296; X64-SSE-NEXT: packsswb %xmm2, %xmm01297; X64-SSE-NEXT: pmovmskb %xmm0, %eax1298; X64-SSE-NEXT: testl %eax, %eax1299; X64-SSE-NEXT: setne %al1300; X64-SSE-NEXT: retq1301;1302; AVX1-LABEL: icmp0_v16i32_v16i1:1303; AVX1: # %bb.0:1304; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21305; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm31306; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm21307; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm11308; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm11309; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21310; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm21311; AVX1-NEXT: vpcmpeqd %xmm3, %xmm0, %xmm01312; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm01313; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm01314; AVX1-NEXT: vpmovmskb %xmm0, %eax1315; AVX1-NEXT: testl %eax, %eax1316; AVX1-NEXT: setne %al1317; AVX1-NEXT: vzeroupper1318; AVX1-NEXT: retq1319;1320; AVX2-LABEL: icmp0_v16i32_v16i1:1321; AVX2: # %bb.0:1322; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21323; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm11324; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm01325; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm01326; AVX2-NEXT: vpmovmskb %ymm0, %eax1327; AVX2-NEXT: testl %eax, %eax1328; AVX2-NEXT: setne %al1329; AVX2-NEXT: vzeroupper1330; AVX2-NEXT: retq1331;1332; AVX512-LABEL: icmp0_v16i32_v16i1:1333; AVX512: # %bb.0:1334; AVX512-NEXT: vptestnmd %zmm0, %zmm0, %k01335; AVX512-NEXT: kortestw %k0, %k01336; AVX512-NEXT: setne %al1337; AVX512-NEXT: vzeroupper1338; AVX512-NEXT: retq1339 %a = icmp eq <16 x i32> %0, zeroinitializer1340 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)1341 ret i1 %b1342}1343 1344define i1 @icmp0_v32i16_v32i1(<32 x i16>) nounwind {1345; X86-SSE2-LABEL: icmp0_v32i16_v32i1:1346; X86-SSE2: # %bb.0:1347; X86-SSE2-NEXT: pushl %ebp1348; X86-SSE2-NEXT: movl %esp, %ebp1349; X86-SSE2-NEXT: andl $-16, %esp1350; X86-SSE2-NEXT: subl $16, %esp1351; X86-SSE2-NEXT: pxor %xmm3, %xmm31352; X86-SSE2-NEXT: pcmpeqw %xmm3, %xmm11353; X86-SSE2-NEXT: pcmpeqw %xmm3, %xmm21354; X86-SSE2-NEXT: pcmpeqw %xmm3, %xmm01355; X86-SSE2-NEXT: por %xmm2, %xmm01356; X86-SSE2-NEXT: pcmpeqw 8(%ebp), %xmm31357; X86-SSE2-NEXT: por %xmm1, %xmm31358; X86-SSE2-NEXT: packsswb %xmm3, %xmm01359; X86-SSE2-NEXT: pmovmskb %xmm0, %eax1360; X86-SSE2-NEXT: testl %eax, %eax1361; X86-SSE2-NEXT: setne %al1362; X86-SSE2-NEXT: movl %ebp, %esp1363; X86-SSE2-NEXT: popl %ebp1364; X86-SSE2-NEXT: retl1365;1366; X64-SSE-LABEL: icmp0_v32i16_v32i1:1367; X64-SSE: # %bb.0:1368; X64-SSE-NEXT: pxor %xmm4, %xmm41369; X64-SSE-NEXT: pcmpeqw %xmm4, %xmm21370; X64-SSE-NEXT: pcmpeqw %xmm4, %xmm01371; X64-SSE-NEXT: por %xmm2, %xmm01372; X64-SSE-NEXT: pcmpeqw %xmm4, %xmm31373; X64-SSE-NEXT: pcmpeqw %xmm4, %xmm11374; X64-SSE-NEXT: por %xmm3, %xmm11375; X64-SSE-NEXT: packsswb %xmm1, %xmm01376; X64-SSE-NEXT: pmovmskb %xmm0, %eax1377; X64-SSE-NEXT: testl %eax, %eax1378; X64-SSE-NEXT: setne %al1379; X64-SSE-NEXT: retq1380;1381; AVX1-LABEL: icmp0_v32i16_v32i1:1382; AVX1: # %bb.0:1383; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21384; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm31385; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm41386; AVX1-NEXT: vpor %xmm3, %xmm4, %xmm31387; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11388; AVX1-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm11389; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01390; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm01391; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm01392; AVX1-NEXT: vpacksswb %xmm0, %xmm3, %xmm01393; AVX1-NEXT: vpmovmskb %xmm0, %eax1394; AVX1-NEXT: testl %eax, %eax1395; AVX1-NEXT: setne %al1396; AVX1-NEXT: vzeroupper1397; AVX1-NEXT: retq1398;1399; AVX2-LABEL: icmp0_v32i16_v32i1:1400; AVX2: # %bb.0:1401; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21402; AVX2-NEXT: vpcmpeqw %ymm2, %ymm1, %ymm11403; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm01404; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm01405; AVX2-NEXT: vpmovmskb %ymm0, %eax1406; AVX2-NEXT: testl %eax, %eax1407; AVX2-NEXT: setne %al1408; AVX2-NEXT: vzeroupper1409; AVX2-NEXT: retq1410;1411; AVX512F-LABEL: icmp0_v32i16_v32i1:1412; AVX512F: # %bb.0:1413; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm11414; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm21415; AVX512F-NEXT: vpcmpeqw %ymm2, %ymm1, %ymm11416; AVX512F-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm01417; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm01418; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm01419; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k01420; AVX512F-NEXT: kortestw %k0, %k01421; AVX512F-NEXT: setne %al1422; AVX512F-NEXT: vzeroupper1423; AVX512F-NEXT: retq1424;1425; AVX512BW-LABEL: icmp0_v32i16_v32i1:1426; AVX512BW: # %bb.0:1427; AVX512BW-NEXT: vptestnmw %zmm0, %zmm0, %k01428; AVX512BW-NEXT: kortestd %k0, %k01429; AVX512BW-NEXT: setne %al1430; AVX512BW-NEXT: vzeroupper1431; AVX512BW-NEXT: retq1432;1433; AVX512VL-LABEL: icmp0_v32i16_v32i1:1434; AVX512VL: # %bb.0:1435; AVX512VL-NEXT: vptestnmw %zmm0, %zmm0, %k01436; AVX512VL-NEXT: kortestd %k0, %k01437; AVX512VL-NEXT: setne %al1438; AVX512VL-NEXT: vzeroupper1439; AVX512VL-NEXT: retq1440 %a = icmp eq <32 x i16> %0, zeroinitializer1441 %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a)1442 ret i1 %b1443}1444 1445define i1 @icmp0_v64i8_v64i1(<64 x i8>) nounwind {1446; X86-SSE2-LABEL: icmp0_v64i8_v64i1:1447; X86-SSE2: # %bb.0:1448; X86-SSE2-NEXT: pushl %ebp1449; X86-SSE2-NEXT: movl %esp, %ebp1450; X86-SSE2-NEXT: andl $-16, %esp1451; X86-SSE2-NEXT: subl $16, %esp1452; X86-SSE2-NEXT: pxor %xmm3, %xmm31453; X86-SSE2-NEXT: pcmpeqb %xmm3, %xmm11454; X86-SSE2-NEXT: pcmpeqb %xmm3, %xmm21455; X86-SSE2-NEXT: pcmpeqb %xmm3, %xmm01456; X86-SSE2-NEXT: por %xmm2, %xmm01457; X86-SSE2-NEXT: pcmpeqb 8(%ebp), %xmm31458; X86-SSE2-NEXT: por %xmm1, %xmm31459; X86-SSE2-NEXT: por %xmm0, %xmm31460; X86-SSE2-NEXT: pmovmskb %xmm3, %eax1461; X86-SSE2-NEXT: testl %eax, %eax1462; X86-SSE2-NEXT: setne %al1463; X86-SSE2-NEXT: movl %ebp, %esp1464; X86-SSE2-NEXT: popl %ebp1465; X86-SSE2-NEXT: retl1466;1467; X64-SSE-LABEL: icmp0_v64i8_v64i1:1468; X64-SSE: # %bb.0:1469; X64-SSE-NEXT: pxor %xmm4, %xmm41470; X64-SSE-NEXT: pcmpeqb %xmm4, %xmm21471; X64-SSE-NEXT: pcmpeqb %xmm4, %xmm01472; X64-SSE-NEXT: por %xmm2, %xmm01473; X64-SSE-NEXT: pcmpeqb %xmm4, %xmm31474; X64-SSE-NEXT: pcmpeqb %xmm4, %xmm11475; X64-SSE-NEXT: por %xmm3, %xmm11476; X64-SSE-NEXT: por %xmm0, %xmm11477; X64-SSE-NEXT: pmovmskb %xmm1, %eax1478; X64-SSE-NEXT: testl %eax, %eax1479; X64-SSE-NEXT: setne %al1480; X64-SSE-NEXT: retq1481;1482; AVX1-LABEL: icmp0_v64i8_v64i1:1483; AVX1: # %bb.0:1484; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21485; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm31486; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm41487; AVX1-NEXT: vpor %xmm3, %xmm4, %xmm31488; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11489; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm11490; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01491; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm01492; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm01493; AVX1-NEXT: vpor %xmm0, %xmm3, %xmm01494; AVX1-NEXT: vpmovmskb %xmm0, %eax1495; AVX1-NEXT: testl %eax, %eax1496; AVX1-NEXT: setne %al1497; AVX1-NEXT: vzeroupper1498; AVX1-NEXT: retq1499;1500; AVX2-LABEL: icmp0_v64i8_v64i1:1501; AVX2: # %bb.0:1502; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21503; AVX2-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm11504; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm01505; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01506; AVX2-NEXT: vpmovmskb %ymm0, %eax1507; AVX2-NEXT: testl %eax, %eax1508; AVX2-NEXT: setne %al1509; AVX2-NEXT: vzeroupper1510; AVX2-NEXT: retq1511;1512; AVX512F-LABEL: icmp0_v64i8_v64i1:1513; AVX512F: # %bb.0:1514; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm11515; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm21516; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm11517; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm01518; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm01519; AVX512F-NEXT: vpmovmskb %ymm0, %eax1520; AVX512F-NEXT: testl %eax, %eax1521; AVX512F-NEXT: setne %al1522; AVX512F-NEXT: vzeroupper1523; AVX512F-NEXT: retq1524;1525; AVX512BW-LABEL: icmp0_v64i8_v64i1:1526; AVX512BW: # %bb.0:1527; AVX512BW-NEXT: vptestnmb %zmm0, %zmm0, %k01528; AVX512BW-NEXT: kortestq %k0, %k01529; AVX512BW-NEXT: setne %al1530; AVX512BW-NEXT: vzeroupper1531; AVX512BW-NEXT: retq1532;1533; AVX512VL-LABEL: icmp0_v64i8_v64i1:1534; AVX512VL: # %bb.0:1535; AVX512VL-NEXT: vptestnmb %zmm0, %zmm0, %k01536; AVX512VL-NEXT: kortestq %k0, %k01537; AVX512VL-NEXT: setne %al1538; AVX512VL-NEXT: vzeroupper1539; AVX512VL-NEXT: retq1540 %a = icmp eq <64 x i8> %0, zeroinitializer1541 %b = call i1 @llvm.vector.reduce.or.v64i1(<64 x i1> %a)1542 ret i1 %b1543}1544 1545; Comparison1546;1547 1548define i1 @icmp_v2i64_v2i1(<2 x i64>, <2 x i64>) nounwind {1549; SSE2-LABEL: icmp_v2i64_v2i1:1550; SSE2: # %bb.0:1551; SSE2-NEXT: pcmpeqd %xmm1, %xmm01552; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]1553; SSE2-NEXT: pand %xmm0, %xmm11554; SSE2-NEXT: movmskpd %xmm1, %eax1555; SSE2-NEXT: testl %eax, %eax1556; SSE2-NEXT: setne %al1557; SSE2-NEXT: ret{{[l|q]}}1558;1559; SSE41-LABEL: icmp_v2i64_v2i1:1560; SSE41: # %bb.0:1561; SSE41-NEXT: pcmpeqq %xmm1, %xmm01562; SSE41-NEXT: movmskpd %xmm0, %eax1563; SSE41-NEXT: testl %eax, %eax1564; SSE41-NEXT: setne %al1565; SSE41-NEXT: retq1566;1567; AVX1OR2-LABEL: icmp_v2i64_v2i1:1568; AVX1OR2: # %bb.0:1569; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm01570; AVX1OR2-NEXT: vtestpd %xmm0, %xmm01571; AVX1OR2-NEXT: setne %al1572; AVX1OR2-NEXT: retq1573;1574; AVX512F-LABEL: icmp_v2i64_v2i1:1575; AVX512F: # %bb.0:1576; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm11577; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01578; AVX512F-NEXT: vpcmpeqq %zmm1, %zmm0, %k01579; AVX512F-NEXT: kmovw %k0, %eax1580; AVX512F-NEXT: testb $3, %al1581; AVX512F-NEXT: setne %al1582; AVX512F-NEXT: vzeroupper1583; AVX512F-NEXT: retq1584;1585; AVX512BW-LABEL: icmp_v2i64_v2i1:1586; AVX512BW: # %bb.0:1587; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm11588; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01589; AVX512BW-NEXT: vpcmpeqq %zmm1, %zmm0, %k01590; AVX512BW-NEXT: kmovd %k0, %eax1591; AVX512BW-NEXT: testb $3, %al1592; AVX512BW-NEXT: setne %al1593; AVX512BW-NEXT: vzeroupper1594; AVX512BW-NEXT: retq1595;1596; AVX512VL-LABEL: icmp_v2i64_v2i1:1597; AVX512VL: # %bb.0:1598; AVX512VL-NEXT: vpcmpeqq %xmm1, %xmm0, %k01599; AVX512VL-NEXT: kmovd %k0, %eax1600; AVX512VL-NEXT: testb %al, %al1601; AVX512VL-NEXT: setne %al1602; AVX512VL-NEXT: retq1603 %a = icmp eq <2 x i64> %0, %11604 %b = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %a)1605 ret i1 %b1606}1607 1608define i1 @icmp_v4i32_v4i1(<4 x i32>, <4 x i32>) nounwind {1609; SSE-LABEL: icmp_v4i32_v4i1:1610; SSE: # %bb.0:1611; SSE-NEXT: pcmpeqd %xmm1, %xmm01612; SSE-NEXT: movmskps %xmm0, %eax1613; SSE-NEXT: testl %eax, %eax1614; SSE-NEXT: setne %al1615; SSE-NEXT: ret{{[l|q]}}1616;1617; AVX1OR2-LABEL: icmp_v4i32_v4i1:1618; AVX1OR2: # %bb.0:1619; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01620; AVX1OR2-NEXT: vtestps %xmm0, %xmm01621; AVX1OR2-NEXT: setne %al1622; AVX1OR2-NEXT: retq1623;1624; AVX512F-LABEL: icmp_v4i32_v4i1:1625; AVX512F: # %bb.0:1626; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm11627; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01628; AVX512F-NEXT: vpcmpeqd %zmm1, %zmm0, %k01629; AVX512F-NEXT: kmovw %k0, %eax1630; AVX512F-NEXT: testb $15, %al1631; AVX512F-NEXT: setne %al1632; AVX512F-NEXT: vzeroupper1633; AVX512F-NEXT: retq1634;1635; AVX512BW-LABEL: icmp_v4i32_v4i1:1636; AVX512BW: # %bb.0:1637; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm11638; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01639; AVX512BW-NEXT: vpcmpeqd %zmm1, %zmm0, %k01640; AVX512BW-NEXT: kmovd %k0, %eax1641; AVX512BW-NEXT: testb $15, %al1642; AVX512BW-NEXT: setne %al1643; AVX512BW-NEXT: vzeroupper1644; AVX512BW-NEXT: retq1645;1646; AVX512VL-LABEL: icmp_v4i32_v4i1:1647; AVX512VL: # %bb.0:1648; AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %k01649; AVX512VL-NEXT: kmovd %k0, %eax1650; AVX512VL-NEXT: testb %al, %al1651; AVX512VL-NEXT: setne %al1652; AVX512VL-NEXT: retq1653 %a = icmp eq <4 x i32> %0, %11654 %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a)1655 ret i1 %b1656}1657 1658define i1 @icmp_v8i16_v8i1(<8 x i16>, <8 x i16>) nounwind {1659; SSE-LABEL: icmp_v8i16_v8i1:1660; SSE: # %bb.0:1661; SSE-NEXT: pcmpeqw %xmm1, %xmm01662; SSE-NEXT: pmovmskb %xmm0, %eax1663; SSE-NEXT: testl %eax, %eax1664; SSE-NEXT: setne %al1665; SSE-NEXT: ret{{[l|q]}}1666;1667; AVX1OR2-LABEL: icmp_v8i16_v8i1:1668; AVX1OR2: # %bb.0:1669; AVX1OR2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm01670; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax1671; AVX1OR2-NEXT: testl %eax, %eax1672; AVX1OR2-NEXT: setne %al1673; AVX1OR2-NEXT: retq1674;1675; AVX512F-LABEL: icmp_v8i16_v8i1:1676; AVX512F: # %bb.0:1677; AVX512F-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm01678; AVX512F-NEXT: vpmovsxwq %xmm0, %zmm01679; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k01680; AVX512F-NEXT: kortestw %k0, %k01681; AVX512F-NEXT: setne %al1682; AVX512F-NEXT: vzeroupper1683; AVX512F-NEXT: retq1684;1685; AVX512BW-LABEL: icmp_v8i16_v8i1:1686; AVX512BW: # %bb.0:1687; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm11688; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01689; AVX512BW-NEXT: vpcmpeqw %zmm1, %zmm0, %k01690; AVX512BW-NEXT: kmovd %k0, %eax1691; AVX512BW-NEXT: testb %al, %al1692; AVX512BW-NEXT: setne %al1693; AVX512BW-NEXT: vzeroupper1694; AVX512BW-NEXT: retq1695;1696; AVX512VL-LABEL: icmp_v8i16_v8i1:1697; AVX512VL: # %bb.0:1698; AVX512VL-NEXT: vpcmpeqw %xmm1, %xmm0, %k01699; AVX512VL-NEXT: kmovd %k0, %eax1700; AVX512VL-NEXT: testb %al, %al1701; AVX512VL-NEXT: setne %al1702; AVX512VL-NEXT: retq1703 %a = icmp eq <8 x i16> %0, %11704 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)1705 ret i1 %b1706}1707 1708define i1 @icmp_v16i8_v16i1(<16 x i8>, <16 x i8>) nounwind {1709; SSE-LABEL: icmp_v16i8_v16i1:1710; SSE: # %bb.0:1711; SSE-NEXT: pcmpeqb %xmm1, %xmm01712; SSE-NEXT: pmovmskb %xmm0, %eax1713; SSE-NEXT: testl %eax, %eax1714; SSE-NEXT: setne %al1715; SSE-NEXT: ret{{[l|q]}}1716;1717; AVX1OR2-LABEL: icmp_v16i8_v16i1:1718; AVX1OR2: # %bb.0:1719; AVX1OR2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm01720; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax1721; AVX1OR2-NEXT: testl %eax, %eax1722; AVX1OR2-NEXT: setne %al1723; AVX1OR2-NEXT: retq1724;1725; AVX512F-LABEL: icmp_v16i8_v16i1:1726; AVX512F: # %bb.0:1727; AVX512F-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm01728; AVX512F-NEXT: vpmovmskb %xmm0, %eax1729; AVX512F-NEXT: testl %eax, %eax1730; AVX512F-NEXT: setne %al1731; AVX512F-NEXT: retq1732;1733; AVX512BW-LABEL: icmp_v16i8_v16i1:1734; AVX512BW: # %bb.0:1735; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm11736; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01737; AVX512BW-NEXT: vpcmpeqb %zmm1, %zmm0, %k01738; AVX512BW-NEXT: kortestw %k0, %k01739; AVX512BW-NEXT: setne %al1740; AVX512BW-NEXT: vzeroupper1741; AVX512BW-NEXT: retq1742;1743; AVX512VL-LABEL: icmp_v16i8_v16i1:1744; AVX512VL: # %bb.0:1745; AVX512VL-NEXT: vpcmpeqb %xmm1, %xmm0, %k01746; AVX512VL-NEXT: kortestw %k0, %k01747; AVX512VL-NEXT: setne %al1748; AVX512VL-NEXT: retq1749 %a = icmp eq <16 x i8> %0, %11750 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)1751 ret i1 %b1752}1753 1754define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {1755; X86-SSE2-LABEL: icmp_v4i64_v4i1:1756; X86-SSE2: # %bb.0:1757; X86-SSE2-NEXT: pushl %ebp1758; X86-SSE2-NEXT: movl %esp, %ebp1759; X86-SSE2-NEXT: andl $-16, %esp1760; X86-SSE2-NEXT: subl $16, %esp1761; X86-SSE2-NEXT: pcmpeqd %xmm2, %xmm01762; X86-SSE2-NEXT: pcmpeqd 8(%ebp), %xmm11763; X86-SSE2-NEXT: movdqa %xmm0, %xmm21764; X86-SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm1[1,3]1765; X86-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1766; X86-SSE2-NEXT: andps %xmm2, %xmm01767; X86-SSE2-NEXT: movmskps %xmm0, %eax1768; X86-SSE2-NEXT: testl %eax, %eax1769; X86-SSE2-NEXT: setne %al1770; X86-SSE2-NEXT: movl %ebp, %esp1771; X86-SSE2-NEXT: popl %ebp1772; X86-SSE2-NEXT: retl1773;1774; X64-SSE2-LABEL: icmp_v4i64_v4i1:1775; X64-SSE2: # %bb.0:1776; X64-SSE2-NEXT: pcmpeqd %xmm3, %xmm11777; X64-SSE2-NEXT: pcmpeqd %xmm2, %xmm01778; X64-SSE2-NEXT: movdqa %xmm0, %xmm21779; X64-SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm1[1,3]1780; X64-SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]1781; X64-SSE2-NEXT: andps %xmm2, %xmm01782; X64-SSE2-NEXT: movmskps %xmm0, %eax1783; X64-SSE2-NEXT: testl %eax, %eax1784; X64-SSE2-NEXT: setne %al1785; X64-SSE2-NEXT: retq1786;1787; SSE41-LABEL: icmp_v4i64_v4i1:1788; SSE41: # %bb.0:1789; SSE41-NEXT: pcmpeqq %xmm3, %xmm11790; SSE41-NEXT: pcmpeqq %xmm2, %xmm01791; SSE41-NEXT: packssdw %xmm1, %xmm01792; SSE41-NEXT: movmskps %xmm0, %eax1793; SSE41-NEXT: testl %eax, %eax1794; SSE41-NEXT: setne %al1795; SSE41-NEXT: retq1796;1797; AVX1-LABEL: icmp_v4i64_v4i1:1798; AVX1: # %bb.0:1799; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21800; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31801; AVX1-NEXT: vpcmpeqq %xmm2, %xmm3, %xmm21802; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm01803; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm01804; AVX1-NEXT: vtestpd %xmm0, %xmm01805; AVX1-NEXT: setne %al1806; AVX1-NEXT: vzeroupper1807; AVX1-NEXT: retq1808;1809; AVX2-LABEL: icmp_v4i64_v4i1:1810; AVX2: # %bb.0:1811; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm01812; AVX2-NEXT: vtestpd %ymm0, %ymm01813; AVX2-NEXT: setne %al1814; AVX2-NEXT: vzeroupper1815; AVX2-NEXT: retq1816;1817; AVX512F-LABEL: icmp_v4i64_v4i1:1818; AVX512F: # %bb.0:1819; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11820; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01821; AVX512F-NEXT: vpcmpeqq %zmm1, %zmm0, %k01822; AVX512F-NEXT: kmovw %k0, %eax1823; AVX512F-NEXT: testb $15, %al1824; AVX512F-NEXT: setne %al1825; AVX512F-NEXT: vzeroupper1826; AVX512F-NEXT: retq1827;1828; AVX512BW-LABEL: icmp_v4i64_v4i1:1829; AVX512BW: # %bb.0:1830; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11831; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01832; AVX512BW-NEXT: vpcmpeqq %zmm1, %zmm0, %k01833; AVX512BW-NEXT: kmovd %k0, %eax1834; AVX512BW-NEXT: testb $15, %al1835; AVX512BW-NEXT: setne %al1836; AVX512BW-NEXT: vzeroupper1837; AVX512BW-NEXT: retq1838;1839; AVX512VL-LABEL: icmp_v4i64_v4i1:1840; AVX512VL: # %bb.0:1841; AVX512VL-NEXT: vpcmpeqq %ymm1, %ymm0, %k01842; AVX512VL-NEXT: kmovd %k0, %eax1843; AVX512VL-NEXT: testb %al, %al1844; AVX512VL-NEXT: setne %al1845; AVX512VL-NEXT: vzeroupper1846; AVX512VL-NEXT: retq1847 %a = icmp eq <4 x i64> %0, %11848 %b = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a)1849 ret i1 %b1850}1851 1852define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {1853; X86-SSE2-LABEL: icmp_v8i32_v8i1:1854; X86-SSE2: # %bb.0:1855; X86-SSE2-NEXT: pushl %ebp1856; X86-SSE2-NEXT: movl %esp, %ebp1857; X86-SSE2-NEXT: andl $-16, %esp1858; X86-SSE2-NEXT: subl $16, %esp1859; X86-SSE2-NEXT: pcmpeqd %xmm2, %xmm01860; X86-SSE2-NEXT: pcmpeqd 8(%ebp), %xmm11861; X86-SSE2-NEXT: packssdw %xmm1, %xmm01862; X86-SSE2-NEXT: pmovmskb %xmm0, %eax1863; X86-SSE2-NEXT: testl %eax, %eax1864; X86-SSE2-NEXT: setne %al1865; X86-SSE2-NEXT: movl %ebp, %esp1866; X86-SSE2-NEXT: popl %ebp1867; X86-SSE2-NEXT: retl1868;1869; X64-SSE-LABEL: icmp_v8i32_v8i1:1870; X64-SSE: # %bb.0:1871; X64-SSE-NEXT: pcmpeqd %xmm3, %xmm11872; X64-SSE-NEXT: pcmpeqd %xmm2, %xmm01873; X64-SSE-NEXT: packssdw %xmm1, %xmm01874; X64-SSE-NEXT: pmovmskb %xmm0, %eax1875; X64-SSE-NEXT: testl %eax, %eax1876; X64-SSE-NEXT: setne %al1877; X64-SSE-NEXT: retq1878;1879; AVX1-LABEL: icmp_v8i32_v8i1:1880; AVX1: # %bb.0:1881; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21882; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31883; AVX1-NEXT: vpcmpeqd %xmm2, %xmm3, %xmm21884; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm01885; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm01886; AVX1-NEXT: vtestps %xmm0, %xmm01887; AVX1-NEXT: setne %al1888; AVX1-NEXT: vzeroupper1889; AVX1-NEXT: retq1890;1891; AVX2-LABEL: icmp_v8i32_v8i1:1892; AVX2: # %bb.0:1893; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm01894; AVX2-NEXT: vtestps %ymm0, %ymm01895; AVX2-NEXT: setne %al1896; AVX2-NEXT: vzeroupper1897; AVX2-NEXT: retq1898;1899; AVX512F-LABEL: icmp_v8i32_v8i1:1900; AVX512F: # %bb.0:1901; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11902; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01903; AVX512F-NEXT: vpcmpeqd %zmm1, %zmm0, %k01904; AVX512F-NEXT: kmovw %k0, %eax1905; AVX512F-NEXT: testb %al, %al1906; AVX512F-NEXT: setne %al1907; AVX512F-NEXT: vzeroupper1908; AVX512F-NEXT: retq1909;1910; AVX512BW-LABEL: icmp_v8i32_v8i1:1911; AVX512BW: # %bb.0:1912; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11913; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01914; AVX512BW-NEXT: vpcmpeqd %zmm1, %zmm0, %k01915; AVX512BW-NEXT: kmovd %k0, %eax1916; AVX512BW-NEXT: testb %al, %al1917; AVX512BW-NEXT: setne %al1918; AVX512BW-NEXT: vzeroupper1919; AVX512BW-NEXT: retq1920;1921; AVX512VL-LABEL: icmp_v8i32_v8i1:1922; AVX512VL: # %bb.0:1923; AVX512VL-NEXT: vpcmpeqd %ymm1, %ymm0, %k01924; AVX512VL-NEXT: kmovd %k0, %eax1925; AVX512VL-NEXT: testb %al, %al1926; AVX512VL-NEXT: setne %al1927; AVX512VL-NEXT: vzeroupper1928; AVX512VL-NEXT: retq1929 %a = icmp eq <8 x i32> %0, %11930 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)1931 ret i1 %b1932}1933 1934define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) nounwind {1935; X86-SSE2-LABEL: icmp_v16i16_v16i1:1936; X86-SSE2: # %bb.0:1937; X86-SSE2-NEXT: pushl %ebp1938; X86-SSE2-NEXT: movl %esp, %ebp1939; X86-SSE2-NEXT: andl $-16, %esp1940; X86-SSE2-NEXT: subl $16, %esp1941; X86-SSE2-NEXT: pcmpeqw %xmm2, %xmm01942; X86-SSE2-NEXT: pcmpeqw 8(%ebp), %xmm11943; X86-SSE2-NEXT: packsswb %xmm1, %xmm01944; X86-SSE2-NEXT: pmovmskb %xmm0, %eax1945; X86-SSE2-NEXT: testl %eax, %eax1946; X86-SSE2-NEXT: setne %al1947; X86-SSE2-NEXT: movl %ebp, %esp1948; X86-SSE2-NEXT: popl %ebp1949; X86-SSE2-NEXT: retl1950;1951; X64-SSE-LABEL: icmp_v16i16_v16i1:1952; X64-SSE: # %bb.0:1953; X64-SSE-NEXT: pcmpeqw %xmm3, %xmm11954; X64-SSE-NEXT: pcmpeqw %xmm2, %xmm01955; X64-SSE-NEXT: packsswb %xmm1, %xmm01956; X64-SSE-NEXT: pmovmskb %xmm0, %eax1957; X64-SSE-NEXT: testl %eax, %eax1958; X64-SSE-NEXT: setne %al1959; X64-SSE-NEXT: retq1960;1961; AVX1-LABEL: icmp_v16i16_v16i1:1962; AVX1: # %bb.0:1963; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21964; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31965; AVX1-NEXT: vpcmpeqw %xmm2, %xmm3, %xmm21966; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm01967; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm01968; AVX1-NEXT: vpmovmskb %xmm0, %eax1969; AVX1-NEXT: testl %eax, %eax1970; AVX1-NEXT: setne %al1971; AVX1-NEXT: vzeroupper1972; AVX1-NEXT: retq1973;1974; AVX2-LABEL: icmp_v16i16_v16i1:1975; AVX2: # %bb.0:1976; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm01977; AVX2-NEXT: vpmovmskb %ymm0, %eax1978; AVX2-NEXT: testl %eax, %eax1979; AVX2-NEXT: setne %al1980; AVX2-NEXT: vzeroupper1981; AVX2-NEXT: retq1982;1983; AVX512F-LABEL: icmp_v16i16_v16i1:1984; AVX512F: # %bb.0:1985; AVX512F-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm01986; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm01987; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k01988; AVX512F-NEXT: kortestw %k0, %k01989; AVX512F-NEXT: setne %al1990; AVX512F-NEXT: vzeroupper1991; AVX512F-NEXT: retq1992;1993; AVX512BW-LABEL: icmp_v16i16_v16i1:1994; AVX512BW: # %bb.0:1995; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11996; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01997; AVX512BW-NEXT: vpcmpeqw %zmm1, %zmm0, %k01998; AVX512BW-NEXT: kortestw %k0, %k01999; AVX512BW-NEXT: setne %al2000; AVX512BW-NEXT: vzeroupper2001; AVX512BW-NEXT: retq2002;2003; AVX512VL-LABEL: icmp_v16i16_v16i1:2004; AVX512VL: # %bb.0:2005; AVX512VL-NEXT: vpcmpeqw %ymm1, %ymm0, %k02006; AVX512VL-NEXT: kortestw %k0, %k02007; AVX512VL-NEXT: setne %al2008; AVX512VL-NEXT: vzeroupper2009; AVX512VL-NEXT: retq2010 %a = icmp eq <16 x i16> %0, %12011 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)2012 ret i1 %b2013}2014 2015define i1 @icmp_v32i8_v32i1(<32 x i8>, <32 x i8>) nounwind {2016; X86-SSE2-LABEL: icmp_v32i8_v32i1:2017; X86-SSE2: # %bb.0:2018; X86-SSE2-NEXT: pushl %ebp2019; X86-SSE2-NEXT: movl %esp, %ebp2020; X86-SSE2-NEXT: andl $-16, %esp2021; X86-SSE2-NEXT: subl $16, %esp2022; X86-SSE2-NEXT: pcmpeqb %xmm2, %xmm02023; X86-SSE2-NEXT: pcmpeqb 8(%ebp), %xmm12024; X86-SSE2-NEXT: por %xmm0, %xmm12025; X86-SSE2-NEXT: pmovmskb %xmm1, %eax2026; X86-SSE2-NEXT: testl %eax, %eax2027; X86-SSE2-NEXT: setne %al2028; X86-SSE2-NEXT: movl %ebp, %esp2029; X86-SSE2-NEXT: popl %ebp2030; X86-SSE2-NEXT: retl2031;2032; X64-SSE-LABEL: icmp_v32i8_v32i1:2033; X64-SSE: # %bb.0:2034; X64-SSE-NEXT: pcmpeqb %xmm3, %xmm12035; X64-SSE-NEXT: pcmpeqb %xmm2, %xmm02036; X64-SSE-NEXT: por %xmm1, %xmm02037; X64-SSE-NEXT: pmovmskb %xmm0, %eax2038; X64-SSE-NEXT: testl %eax, %eax2039; X64-SSE-NEXT: setne %al2040; X64-SSE-NEXT: retq2041;2042; AVX1-LABEL: icmp_v32i8_v32i1:2043; AVX1: # %bb.0:2044; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22045; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm32046; AVX1-NEXT: vpcmpeqb %xmm2, %xmm3, %xmm22047; AVX1-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm02048; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm02049; AVX1-NEXT: vpmovmskb %xmm0, %eax2050; AVX1-NEXT: testl %eax, %eax2051; AVX1-NEXT: setne %al2052; AVX1-NEXT: vzeroupper2053; AVX1-NEXT: retq2054;2055; AVX2-LABEL: icmp_v32i8_v32i1:2056; AVX2: # %bb.0:2057; AVX2-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm02058; AVX2-NEXT: vpmovmskb %ymm0, %eax2059; AVX2-NEXT: testl %eax, %eax2060; AVX2-NEXT: setne %al2061; AVX2-NEXT: vzeroupper2062; AVX2-NEXT: retq2063;2064; AVX512F-LABEL: icmp_v32i8_v32i1:2065; AVX512F: # %bb.0:2066; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm02067; AVX512F-NEXT: vpmovmskb %ymm0, %eax2068; AVX512F-NEXT: testl %eax, %eax2069; AVX512F-NEXT: setne %al2070; AVX512F-NEXT: vzeroupper2071; AVX512F-NEXT: retq2072;2073; AVX512BW-LABEL: icmp_v32i8_v32i1:2074; AVX512BW: # %bb.0:2075; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm12076; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02077; AVX512BW-NEXT: vpcmpeqb %zmm1, %zmm0, %k02078; AVX512BW-NEXT: kortestd %k0, %k02079; AVX512BW-NEXT: setne %al2080; AVX512BW-NEXT: vzeroupper2081; AVX512BW-NEXT: retq2082;2083; AVX512VL-LABEL: icmp_v32i8_v32i1:2084; AVX512VL: # %bb.0:2085; AVX512VL-NEXT: vpcmpeqb %ymm1, %ymm0, %k02086; AVX512VL-NEXT: kortestd %k0, %k02087; AVX512VL-NEXT: setne %al2088; AVX512VL-NEXT: vzeroupper2089; AVX512VL-NEXT: retq2090 %a = icmp eq <32 x i8> %0, %12091 %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a)2092 ret i1 %b2093}2094 2095define i1 @icmp_v8i64_v8i1(<8 x i64>, <8 x i64>) nounwind {2096; X86-SSE2-LABEL: icmp_v8i64_v8i1:2097; X86-SSE2: # %bb.0:2098; X86-SSE2-NEXT: pushl %ebp2099; X86-SSE2-NEXT: movl %esp, %ebp2100; X86-SSE2-NEXT: andl $-16, %esp2101; X86-SSE2-NEXT: subl $16, %esp2102; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm32103; X86-SSE2-NEXT: pcmpeqd 72(%ebp), %xmm32104; X86-SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,0,3,2]2105; X86-SSE2-NEXT: pand %xmm3, %xmm42106; X86-SSE2-NEXT: pcmpeqd 56(%ebp), %xmm22107; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]2108; X86-SSE2-NEXT: pand %xmm2, %xmm32109; X86-SSE2-NEXT: packssdw %xmm4, %xmm32110; X86-SSE2-NEXT: pcmpeqd 40(%ebp), %xmm12111; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]2112; X86-SSE2-NEXT: pand %xmm1, %xmm22113; X86-SSE2-NEXT: pcmpeqd 24(%ebp), %xmm02114; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]2115; X86-SSE2-NEXT: pand %xmm0, %xmm12116; X86-SSE2-NEXT: packssdw %xmm2, %xmm12117; X86-SSE2-NEXT: packssdw %xmm3, %xmm12118; X86-SSE2-NEXT: pmovmskb %xmm1, %eax2119; X86-SSE2-NEXT: testl $43690, %eax # imm = 0xAAAA2120; X86-SSE2-NEXT: setne %al2121; X86-SSE2-NEXT: movl %ebp, %esp2122; X86-SSE2-NEXT: popl %ebp2123; X86-SSE2-NEXT: retl2124;2125; X64-SSE2-LABEL: icmp_v8i64_v8i1:2126; X64-SSE2: # %bb.0:2127; X64-SSE2-NEXT: pcmpeqd %xmm7, %xmm32128; X64-SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,0,3,2]2129; X64-SSE2-NEXT: pand %xmm3, %xmm72130; X64-SSE2-NEXT: pcmpeqd %xmm6, %xmm22131; X64-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]2132; X64-SSE2-NEXT: pand %xmm2, %xmm32133; X64-SSE2-NEXT: packssdw %xmm7, %xmm32134; X64-SSE2-NEXT: pcmpeqd %xmm5, %xmm12135; X64-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]2136; X64-SSE2-NEXT: pand %xmm1, %xmm22137; X64-SSE2-NEXT: pcmpeqd %xmm4, %xmm02138; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]2139; X64-SSE2-NEXT: pand %xmm0, %xmm12140; X64-SSE2-NEXT: packssdw %xmm2, %xmm12141; X64-SSE2-NEXT: packssdw %xmm3, %xmm12142; X64-SSE2-NEXT: pmovmskb %xmm1, %eax2143; X64-SSE2-NEXT: testl $43690, %eax # imm = 0xAAAA2144; X64-SSE2-NEXT: setne %al2145; X64-SSE2-NEXT: retq2146;2147; SSE41-LABEL: icmp_v8i64_v8i1:2148; SSE41: # %bb.0:2149; SSE41-NEXT: pcmpeqq %xmm7, %xmm32150; SSE41-NEXT: pcmpeqq %xmm6, %xmm22151; SSE41-NEXT: packssdw %xmm3, %xmm22152; SSE41-NEXT: pcmpeqq %xmm5, %xmm12153; SSE41-NEXT: pcmpeqq %xmm4, %xmm02154; SSE41-NEXT: packssdw %xmm1, %xmm02155; SSE41-NEXT: packssdw %xmm2, %xmm02156; SSE41-NEXT: pmovmskb %xmm0, %eax2157; SSE41-NEXT: testl %eax, %eax2158; SSE41-NEXT: setne %al2159; SSE41-NEXT: retq2160;2161; AVX1-LABEL: icmp_v8i64_v8i1:2162; AVX1: # %bb.0:2163; AVX1-NEXT: vpcmpeqq %xmm3, %xmm1, %xmm42164; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm52165; AVX1-NEXT: vpor %xmm4, %xmm5, %xmm42166; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm32167; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm12168; AVX1-NEXT: vpcmpeqq %xmm3, %xmm1, %xmm12169; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm22170; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02171; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm02172; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm02173; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm02174; AVX1-NEXT: vtestps %xmm0, %xmm02175; AVX1-NEXT: setne %al2176; AVX1-NEXT: vzeroupper2177; AVX1-NEXT: retq2178;2179; AVX2-LABEL: icmp_v8i64_v8i1:2180; AVX2: # %bb.0:2181; AVX2-NEXT: vpcmpeqq %ymm3, %ymm1, %ymm12182; AVX2-NEXT: vpcmpeqq %ymm2, %ymm0, %ymm02183; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm02184; AVX2-NEXT: vtestps %ymm0, %ymm02185; AVX2-NEXT: setne %al2186; AVX2-NEXT: vzeroupper2187; AVX2-NEXT: retq2188;2189; AVX512F-LABEL: icmp_v8i64_v8i1:2190; AVX512F: # %bb.0:2191; AVX512F-NEXT: vpcmpeqq %zmm1, %zmm0, %k02192; AVX512F-NEXT: kmovw %k0, %eax2193; AVX512F-NEXT: testb %al, %al2194; AVX512F-NEXT: setne %al2195; AVX512F-NEXT: vzeroupper2196; AVX512F-NEXT: retq2197;2198; AVX512BW-LABEL: icmp_v8i64_v8i1:2199; AVX512BW: # %bb.0:2200; AVX512BW-NEXT: vpcmpeqq %zmm1, %zmm0, %k02201; AVX512BW-NEXT: kmovd %k0, %eax2202; AVX512BW-NEXT: testb %al, %al2203; AVX512BW-NEXT: setne %al2204; AVX512BW-NEXT: vzeroupper2205; AVX512BW-NEXT: retq2206;2207; AVX512VL-LABEL: icmp_v8i64_v8i1:2208; AVX512VL: # %bb.0:2209; AVX512VL-NEXT: vpcmpeqq %zmm1, %zmm0, %k02210; AVX512VL-NEXT: kmovd %k0, %eax2211; AVX512VL-NEXT: testb %al, %al2212; AVX512VL-NEXT: setne %al2213; AVX512VL-NEXT: vzeroupper2214; AVX512VL-NEXT: retq2215 %a = icmp eq <8 x i64> %0, %12216 %b = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)2217 ret i1 %b2218}2219 2220define i1 @icmp_v16i32_v16i1(<16 x i32>, <16 x i32>) nounwind {2221; X86-SSE2-LABEL: icmp_v16i32_v16i1:2222; X86-SSE2: # %bb.0:2223; X86-SSE2-NEXT: pushl %ebp2224; X86-SSE2-NEXT: movl %esp, %ebp2225; X86-SSE2-NEXT: andl $-16, %esp2226; X86-SSE2-NEXT: subl $16, %esp2227; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm32228; X86-SSE2-NEXT: pcmpeqd 72(%ebp), %xmm32229; X86-SSE2-NEXT: pcmpeqd 56(%ebp), %xmm22230; X86-SSE2-NEXT: packssdw %xmm3, %xmm22231; X86-SSE2-NEXT: pcmpeqd 40(%ebp), %xmm12232; X86-SSE2-NEXT: pcmpeqd 24(%ebp), %xmm02233; X86-SSE2-NEXT: packssdw %xmm1, %xmm02234; X86-SSE2-NEXT: packsswb %xmm2, %xmm02235; X86-SSE2-NEXT: pmovmskb %xmm0, %eax2236; X86-SSE2-NEXT: testl %eax, %eax2237; X86-SSE2-NEXT: setne %al2238; X86-SSE2-NEXT: movl %ebp, %esp2239; X86-SSE2-NEXT: popl %ebp2240; X86-SSE2-NEXT: retl2241;2242; X64-SSE-LABEL: icmp_v16i32_v16i1:2243; X64-SSE: # %bb.0:2244; X64-SSE-NEXT: pcmpeqd %xmm7, %xmm32245; X64-SSE-NEXT: pcmpeqd %xmm6, %xmm22246; X64-SSE-NEXT: packssdw %xmm3, %xmm22247; X64-SSE-NEXT: pcmpeqd %xmm5, %xmm12248; X64-SSE-NEXT: pcmpeqd %xmm4, %xmm02249; X64-SSE-NEXT: packssdw %xmm1, %xmm02250; X64-SSE-NEXT: packsswb %xmm2, %xmm02251; X64-SSE-NEXT: pmovmskb %xmm0, %eax2252; X64-SSE-NEXT: testl %eax, %eax2253; X64-SSE-NEXT: setne %al2254; X64-SSE-NEXT: retq2255;2256; AVX1-LABEL: icmp_v16i32_v16i1:2257; AVX1: # %bb.0:2258; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm42259; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm52260; AVX1-NEXT: vpcmpeqd %xmm4, %xmm5, %xmm42261; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm12262; AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm12263; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm32264; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm42265; AVX1-NEXT: vpcmpeqd %xmm3, %xmm4, %xmm32266; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm02267; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm02268; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm02269; AVX1-NEXT: vpmovmskb %xmm0, %eax2270; AVX1-NEXT: testl %eax, %eax2271; AVX1-NEXT: setne %al2272; AVX1-NEXT: vzeroupper2273; AVX1-NEXT: retq2274;2275; AVX2-LABEL: icmp_v16i32_v16i1:2276; AVX2: # %bb.0:2277; AVX2-NEXT: vpcmpeqd %ymm3, %ymm1, %ymm12278; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm02279; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm02280; AVX2-NEXT: vpmovmskb %ymm0, %eax2281; AVX2-NEXT: testl %eax, %eax2282; AVX2-NEXT: setne %al2283; AVX2-NEXT: vzeroupper2284; AVX2-NEXT: retq2285;2286; AVX512-LABEL: icmp_v16i32_v16i1:2287; AVX512: # %bb.0:2288; AVX512-NEXT: vpcmpeqd %zmm1, %zmm0, %k02289; AVX512-NEXT: kortestw %k0, %k02290; AVX512-NEXT: setne %al2291; AVX512-NEXT: vzeroupper2292; AVX512-NEXT: retq2293 %a = icmp eq <16 x i32> %0, %12294 %b = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)2295 ret i1 %b2296}2297 2298define i1 @icmp_v32i16_v32i1(<32 x i16>, <32 x i16>) nounwind {2299; X86-SSE2-LABEL: icmp_v32i16_v32i1:2300; X86-SSE2: # %bb.0:2301; X86-SSE2-NEXT: pushl %ebp2302; X86-SSE2-NEXT: movl %esp, %ebp2303; X86-SSE2-NEXT: andl $-16, %esp2304; X86-SSE2-NEXT: subl $16, %esp2305; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm32306; X86-SSE2-NEXT: pcmpeqw 56(%ebp), %xmm22307; X86-SSE2-NEXT: pcmpeqw 24(%ebp), %xmm02308; X86-SSE2-NEXT: por %xmm2, %xmm02309; X86-SSE2-NEXT: pcmpeqw 72(%ebp), %xmm32310; X86-SSE2-NEXT: pcmpeqw 40(%ebp), %xmm12311; X86-SSE2-NEXT: por %xmm3, %xmm12312; X86-SSE2-NEXT: packsswb %xmm1, %xmm02313; X86-SSE2-NEXT: pmovmskb %xmm0, %eax2314; X86-SSE2-NEXT: testl %eax, %eax2315; X86-SSE2-NEXT: setne %al2316; X86-SSE2-NEXT: movl %ebp, %esp2317; X86-SSE2-NEXT: popl %ebp2318; X86-SSE2-NEXT: retl2319;2320; X64-SSE-LABEL: icmp_v32i16_v32i1:2321; X64-SSE: # %bb.0:2322; X64-SSE-NEXT: pcmpeqw %xmm6, %xmm22323; X64-SSE-NEXT: pcmpeqw %xmm4, %xmm02324; X64-SSE-NEXT: por %xmm2, %xmm02325; X64-SSE-NEXT: pcmpeqw %xmm7, %xmm32326; X64-SSE-NEXT: pcmpeqw %xmm5, %xmm12327; X64-SSE-NEXT: por %xmm3, %xmm12328; X64-SSE-NEXT: packsswb %xmm1, %xmm02329; X64-SSE-NEXT: pmovmskb %xmm0, %eax2330; X64-SSE-NEXT: testl %eax, %eax2331; X64-SSE-NEXT: setne %al2332; X64-SSE-NEXT: retq2333;2334; AVX1-LABEL: icmp_v32i16_v32i1:2335; AVX1: # %bb.0:2336; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm42337; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm52338; AVX1-NEXT: vpor %xmm4, %xmm5, %xmm42339; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm32340; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm12341; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm12342; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm22343; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02344; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm02345; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm02346; AVX1-NEXT: vpacksswb %xmm0, %xmm4, %xmm02347; AVX1-NEXT: vpmovmskb %xmm0, %eax2348; AVX1-NEXT: testl %eax, %eax2349; AVX1-NEXT: setne %al2350; AVX1-NEXT: vzeroupper2351; AVX1-NEXT: retq2352;2353; AVX2-LABEL: icmp_v32i16_v32i1:2354; AVX2: # %bb.0:2355; AVX2-NEXT: vpcmpeqw %ymm3, %ymm1, %ymm12356; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm02357; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm02358; AVX2-NEXT: vpmovmskb %ymm0, %eax2359; AVX2-NEXT: testl %eax, %eax2360; AVX2-NEXT: setne %al2361; AVX2-NEXT: vzeroupper2362; AVX2-NEXT: retq2363;2364; AVX512F-LABEL: icmp_v32i16_v32i1:2365; AVX512F: # %bb.0:2366; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm22367; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm32368; AVX512F-NEXT: vpcmpeqw %ymm2, %ymm3, %ymm22369; AVX512F-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm02370; AVX512F-NEXT: vpor %ymm2, %ymm0, %ymm02371; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm02372; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k02373; AVX512F-NEXT: kortestw %k0, %k02374; AVX512F-NEXT: setne %al2375; AVX512F-NEXT: vzeroupper2376; AVX512F-NEXT: retq2377;2378; AVX512BW-LABEL: icmp_v32i16_v32i1:2379; AVX512BW: # %bb.0:2380; AVX512BW-NEXT: vpcmpeqw %zmm1, %zmm0, %k02381; AVX512BW-NEXT: kortestd %k0, %k02382; AVX512BW-NEXT: setne %al2383; AVX512BW-NEXT: vzeroupper2384; AVX512BW-NEXT: retq2385;2386; AVX512VL-LABEL: icmp_v32i16_v32i1:2387; AVX512VL: # %bb.0:2388; AVX512VL-NEXT: vpcmpeqw %zmm1, %zmm0, %k02389; AVX512VL-NEXT: kortestd %k0, %k02390; AVX512VL-NEXT: setne %al2391; AVX512VL-NEXT: vzeroupper2392; AVX512VL-NEXT: retq2393 %a = icmp eq <32 x i16> %0, %12394 %b = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %a)2395 ret i1 %b2396}2397 2398define i1 @icmp_v64i8_v64i1(<64 x i8>, <64 x i8>) nounwind {2399; X86-SSE2-LABEL: icmp_v64i8_v64i1:2400; X86-SSE2: # %bb.0:2401; X86-SSE2-NEXT: pushl %ebp2402; X86-SSE2-NEXT: movl %esp, %ebp2403; X86-SSE2-NEXT: andl $-16, %esp2404; X86-SSE2-NEXT: subl $16, %esp2405; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm32406; X86-SSE2-NEXT: pcmpeqb 56(%ebp), %xmm22407; X86-SSE2-NEXT: pcmpeqb 24(%ebp), %xmm02408; X86-SSE2-NEXT: por %xmm2, %xmm02409; X86-SSE2-NEXT: pcmpeqb 72(%ebp), %xmm32410; X86-SSE2-NEXT: pcmpeqb 40(%ebp), %xmm12411; X86-SSE2-NEXT: por %xmm3, %xmm12412; X86-SSE2-NEXT: por %xmm0, %xmm12413; X86-SSE2-NEXT: pmovmskb %xmm1, %eax2414; X86-SSE2-NEXT: testl %eax, %eax2415; X86-SSE2-NEXT: setne %al2416; X86-SSE2-NEXT: movl %ebp, %esp2417; X86-SSE2-NEXT: popl %ebp2418; X86-SSE2-NEXT: retl2419;2420; X64-SSE-LABEL: icmp_v64i8_v64i1:2421; X64-SSE: # %bb.0:2422; X64-SSE-NEXT: pcmpeqb %xmm6, %xmm22423; X64-SSE-NEXT: pcmpeqb %xmm4, %xmm02424; X64-SSE-NEXT: por %xmm2, %xmm02425; X64-SSE-NEXT: pcmpeqb %xmm7, %xmm32426; X64-SSE-NEXT: pcmpeqb %xmm5, %xmm12427; X64-SSE-NEXT: por %xmm3, %xmm12428; X64-SSE-NEXT: por %xmm0, %xmm12429; X64-SSE-NEXT: pmovmskb %xmm1, %eax2430; X64-SSE-NEXT: testl %eax, %eax2431; X64-SSE-NEXT: setne %al2432; X64-SSE-NEXT: retq2433;2434; AVX1-LABEL: icmp_v64i8_v64i1:2435; AVX1: # %bb.0:2436; AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm42437; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm52438; AVX1-NEXT: vpor %xmm4, %xmm5, %xmm42439; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm32440; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm12441; AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm12442; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm22443; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02444; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm02445; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm02446; AVX1-NEXT: vpor %xmm0, %xmm4, %xmm02447; AVX1-NEXT: vpmovmskb %xmm0, %eax2448; AVX1-NEXT: testl %eax, %eax2449; AVX1-NEXT: setne %al2450; AVX1-NEXT: vzeroupper2451; AVX1-NEXT: retq2452;2453; AVX2-LABEL: icmp_v64i8_v64i1:2454; AVX2: # %bb.0:2455; AVX2-NEXT: vpcmpeqb %ymm3, %ymm1, %ymm12456; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm02457; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm02458; AVX2-NEXT: vpmovmskb %ymm0, %eax2459; AVX2-NEXT: testl %eax, %eax2460; AVX2-NEXT: setne %al2461; AVX2-NEXT: vzeroupper2462; AVX2-NEXT: retq2463;2464; AVX512F-LABEL: icmp_v64i8_v64i1:2465; AVX512F: # %bb.0:2466; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm22467; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm32468; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm3, %ymm22469; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm02470; AVX512F-NEXT: vpor %ymm2, %ymm0, %ymm02471; AVX512F-NEXT: vpmovmskb %ymm0, %eax2472; AVX512F-NEXT: testl %eax, %eax2473; AVX512F-NEXT: setne %al2474; AVX512F-NEXT: vzeroupper2475; AVX512F-NEXT: retq2476;2477; AVX512BW-LABEL: icmp_v64i8_v64i1:2478; AVX512BW: # %bb.0:2479; AVX512BW-NEXT: vpcmpeqb %zmm1, %zmm0, %k02480; AVX512BW-NEXT: kortestq %k0, %k02481; AVX512BW-NEXT: setne %al2482; AVX512BW-NEXT: vzeroupper2483; AVX512BW-NEXT: retq2484;2485; AVX512VL-LABEL: icmp_v64i8_v64i1:2486; AVX512VL: # %bb.0:2487; AVX512VL-NEXT: vpcmpeqb %zmm1, %zmm0, %k02488; AVX512VL-NEXT: kortestq %k0, %k02489; AVX512VL-NEXT: setne %al2490; AVX512VL-NEXT: vzeroupper2491; AVX512VL-NEXT: retq2492 %a = icmp eq <64 x i8> %0, %12493 %b = call i1 @llvm.vector.reduce.or.v64i1(<64 x i1> %a)2494 ret i1 %b2495}2496 2497declare i1 @llvm.vector.reduce.or.v2i1(<2 x i1>)2498declare i1 @llvm.vector.reduce.or.v4i1(<4 x i1>)2499declare i1 @llvm.vector.reduce.or.v8i1(<8 x i1>)2500declare i1 @llvm.vector.reduce.or.v16i1(<16 x i1>)2501declare i1 @llvm.vector.reduce.or.v32i1(<32 x i1>)2502declare i1 @llvm.vector.reduce.or.v64i1(<64 x i1>)2503;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:2504; AVX: {{.*}}2505