989 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+SSE2 | FileCheck %s --check-prefix=SSE2-SSSE33; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+SSSE3 | FileCheck %s --check-prefix=SSE2-SSSE34; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX12,AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX12,AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefix=AVX512F7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw | FileCheck %s --check-prefix=AVX512BW8 9define i4 @v4i64(<4 x i64> %a, <4 x i64> %b, <4 x i64> %c, <4 x i64> %d) {10; SSE2-SSSE3-LABEL: v4i64:11; SSE2-SSSE3: # %bb.0:12; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648]13; SSE2-SSSE3-NEXT: pxor %xmm9, %xmm314; SSE2-SSSE3-NEXT: pxor %xmm9, %xmm115; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm1016; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm1017; SSE2-SSSE3-NEXT: pxor %xmm9, %xmm218; SSE2-SSSE3-NEXT: pxor %xmm9, %xmm019; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm820; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm821; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm1122; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm11 = xmm11[0,2],xmm10[0,2]23; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm124; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm025; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]26; SSE2-SSSE3-NEXT: andps %xmm11, %xmm027; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm8 = xmm8[1,3],xmm10[1,3]28; SSE2-SSSE3-NEXT: orps %xmm0, %xmm829; SSE2-SSSE3-NEXT: pxor %xmm9, %xmm730; SSE2-SSSE3-NEXT: pxor %xmm9, %xmm531; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm032; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm033; SSE2-SSSE3-NEXT: pxor %xmm9, %xmm634; SSE2-SSSE3-NEXT: pxor %xmm9, %xmm435; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm136; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm137; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm238; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm0[0,2]39; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm540; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm441; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm4 = xmm4[1,3],xmm5[1,3]42; SSE2-SSSE3-NEXT: andps %xmm2, %xmm443; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm0[1,3]44; SSE2-SSSE3-NEXT: orps %xmm4, %xmm145; SSE2-SSSE3-NEXT: andps %xmm8, %xmm146; SSE2-SSSE3-NEXT: movmskps %xmm1, %eax47; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax48; SSE2-SSSE3-NEXT: retq49;50; AVX1-LABEL: v4i64:51; AVX1: # %bb.0:52; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm453; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm554; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm455; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm256; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm257; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm358; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm459; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm360; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm061; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm062; AVX1-NEXT: vandpd %ymm2, %ymm0, %ymm063; AVX1-NEXT: vmovmskpd %ymm0, %eax64; AVX1-NEXT: # kill: def $al killed $al killed $eax65; AVX1-NEXT: vzeroupper66; AVX1-NEXT: retq67;68; AVX2-LABEL: v4i64:69; AVX2: # %bb.0:70; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm271; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm072; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm073; AVX2-NEXT: vmovmskpd %ymm0, %eax74; AVX2-NEXT: # kill: def $al killed $al killed $eax75; AVX2-NEXT: vzeroupper76; AVX2-NEXT: retq77;78; AVX512F-LABEL: v4i64:79; AVX512F: # %bb.0:80; AVX512F-NEXT: vpcmpgtq %ymm1, %ymm0, %k181; AVX512F-NEXT: vpcmpgtq %ymm3, %ymm2, %k0 {%k1}82; AVX512F-NEXT: kmovw %k0, %eax83; AVX512F-NEXT: # kill: def $al killed $al killed $eax84; AVX512F-NEXT: vzeroupper85; AVX512F-NEXT: retq86;87; AVX512BW-LABEL: v4i64:88; AVX512BW: # %bb.0:89; AVX512BW-NEXT: vpcmpgtq %ymm1, %ymm0, %k190; AVX512BW-NEXT: vpcmpgtq %ymm3, %ymm2, %k0 {%k1}91; AVX512BW-NEXT: kmovd %k0, %eax92; AVX512BW-NEXT: # kill: def $al killed $al killed $eax93; AVX512BW-NEXT: vzeroupper94; AVX512BW-NEXT: retq95 %x0 = icmp sgt <4 x i64> %a, %b96 %x1 = icmp sgt <4 x i64> %c, %d97 %y = and <4 x i1> %x0, %x198 %res = bitcast <4 x i1> %y to i499 ret i4 %res100}101 102define i4 @v4f64(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x double> %d) {103; SSE2-SSSE3-LABEL: v4f64:104; SSE2-SSSE3: # %bb.0:105; SSE2-SSSE3-NEXT: cmpltpd %xmm1, %xmm3106; SSE2-SSSE3-NEXT: cmpltpd %xmm0, %xmm2107; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]108; SSE2-SSSE3-NEXT: cmpltpd %xmm5, %xmm7109; SSE2-SSSE3-NEXT: cmpltpd %xmm4, %xmm6110; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm6 = xmm6[0,2],xmm7[0,2]111; SSE2-SSSE3-NEXT: andps %xmm2, %xmm6112; SSE2-SSSE3-NEXT: movmskps %xmm6, %eax113; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax114; SSE2-SSSE3-NEXT: retq115;116; AVX12-LABEL: v4f64:117; AVX12: # %bb.0:118; AVX12-NEXT: vcmpltpd %ymm2, %ymm3, %ymm2119; AVX12-NEXT: vcmpltpd %ymm0, %ymm1, %ymm0120; AVX12-NEXT: vandpd %ymm2, %ymm0, %ymm0121; AVX12-NEXT: vmovmskpd %ymm0, %eax122; AVX12-NEXT: # kill: def $al killed $al killed $eax123; AVX12-NEXT: vzeroupper124; AVX12-NEXT: retq125;126; AVX512F-LABEL: v4f64:127; AVX512F: # %bb.0:128; AVX512F-NEXT: vcmpltpd %ymm0, %ymm1, %k1129; AVX512F-NEXT: vcmpltpd %ymm2, %ymm3, %k0 {%k1}130; AVX512F-NEXT: kmovw %k0, %eax131; AVX512F-NEXT: # kill: def $al killed $al killed $eax132; AVX512F-NEXT: vzeroupper133; AVX512F-NEXT: retq134;135; AVX512BW-LABEL: v4f64:136; AVX512BW: # %bb.0:137; AVX512BW-NEXT: vcmpltpd %ymm0, %ymm1, %k1138; AVX512BW-NEXT: vcmpltpd %ymm2, %ymm3, %k0 {%k1}139; AVX512BW-NEXT: kmovd %k0, %eax140; AVX512BW-NEXT: # kill: def $al killed $al killed $eax141; AVX512BW-NEXT: vzeroupper142; AVX512BW-NEXT: retq143 %x0 = fcmp ogt <4 x double> %a, %b144 %x1 = fcmp ogt <4 x double> %c, %d145 %y = and <4 x i1> %x0, %x1146 %res = bitcast <4 x i1> %y to i4147 ret i4 %res148}149 150define i16 @v16i16(<16 x i16> %a, <16 x i16> %b, <16 x i16> %c, <16 x i16> %d) {151; SSE2-SSSE3-LABEL: v16i16:152; SSE2-SSSE3: # %bb.0:153; SSE2-SSSE3-NEXT: pcmpgtw %xmm2, %xmm0154; SSE2-SSSE3-NEXT: pcmpgtw %xmm3, %xmm1155; SSE2-SSSE3-NEXT: pcmpgtw %xmm6, %xmm4156; SSE2-SSSE3-NEXT: pand %xmm0, %xmm4157; SSE2-SSSE3-NEXT: pcmpgtw %xmm7, %xmm5158; SSE2-SSSE3-NEXT: pand %xmm1, %xmm5159; SSE2-SSSE3-NEXT: packsswb %xmm5, %xmm4160; SSE2-SSSE3-NEXT: pmovmskb %xmm4, %eax161; SSE2-SSSE3-NEXT: # kill: def $ax killed $ax killed $eax162; SSE2-SSSE3-NEXT: retq163;164; AVX1-LABEL: v16i16:165; AVX1: # %bb.0:166; AVX1-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm4167; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1168; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0169; AVX1-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0170; AVX1-NEXT: vpcmpgtw %xmm3, %xmm2, %xmm1171; AVX1-NEXT: vpand %xmm1, %xmm4, %xmm1172; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3173; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2174; AVX1-NEXT: vpcmpgtw %xmm3, %xmm2, %xmm2175; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0176; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm0177; AVX1-NEXT: vpmovmskb %xmm0, %eax178; AVX1-NEXT: # kill: def $ax killed $ax killed $eax179; AVX1-NEXT: vzeroupper180; AVX1-NEXT: retq181;182; AVX2-LABEL: v16i16:183; AVX2: # %bb.0:184; AVX2-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm0185; AVX2-NEXT: vpcmpgtw %ymm3, %ymm2, %ymm1186; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0187; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1188; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0189; AVX2-NEXT: vpmovmskb %xmm0, %eax190; AVX2-NEXT: # kill: def $ax killed $ax killed $eax191; AVX2-NEXT: vzeroupper192; AVX2-NEXT: retq193;194; AVX512F-LABEL: v16i16:195; AVX512F: # %bb.0:196; AVX512F-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm0197; AVX512F-NEXT: vpcmpgtw %ymm3, %ymm2, %ymm1198; AVX512F-NEXT: vpand %ymm1, %ymm0, %ymm0199; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0200; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0201; AVX512F-NEXT: kmovw %k0, %eax202; AVX512F-NEXT: # kill: def $ax killed $ax killed $eax203; AVX512F-NEXT: vzeroupper204; AVX512F-NEXT: retq205;206; AVX512BW-LABEL: v16i16:207; AVX512BW: # %bb.0:208; AVX512BW-NEXT: vpcmpgtw %ymm1, %ymm0, %k1209; AVX512BW-NEXT: vpcmpgtw %ymm3, %ymm2, %k0 {%k1}210; AVX512BW-NEXT: kmovd %k0, %eax211; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax212; AVX512BW-NEXT: vzeroupper213; AVX512BW-NEXT: retq214 %x0 = icmp sgt <16 x i16> %a, %b215 %x1 = icmp sgt <16 x i16> %c, %d216 %y = and <16 x i1> %x0, %x1217 %res = bitcast <16 x i1> %y to i16218 ret i16 %res219}220 221define i8 @v8i32_and(<8 x i32> %a, <8 x i32> %b, <8 x i32> %c, <8 x i32> %d) {222; SSE2-SSSE3-LABEL: v8i32_and:223; SSE2-SSSE3: # %bb.0:224; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm0225; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm1226; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm4227; SSE2-SSSE3-NEXT: pand %xmm0, %xmm4228; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm5229; SSE2-SSSE3-NEXT: pand %xmm1, %xmm5230; SSE2-SSSE3-NEXT: packssdw %xmm5, %xmm4231; SSE2-SSSE3-NEXT: packsswb %xmm4, %xmm4232; SSE2-SSSE3-NEXT: pmovmskb %xmm4, %eax233; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax234; SSE2-SSSE3-NEXT: retq235;236; AVX1-LABEL: v8i32_and:237; AVX1: # %bb.0:238; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4239; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5240; AVX1-NEXT: vpcmpgtd %xmm4, %xmm5, %xmm4241; AVX1-NEXT: vpcmpgtd %xmm3, %xmm2, %xmm2242; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm2243; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3244; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4245; AVX1-NEXT: vpcmpgtd %xmm3, %xmm4, %xmm3246; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0247; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0248; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0249; AVX1-NEXT: vmovmskps %ymm0, %eax250; AVX1-NEXT: # kill: def $al killed $al killed $eax251; AVX1-NEXT: vzeroupper252; AVX1-NEXT: retq253;254; AVX2-LABEL: v8i32_and:255; AVX2: # %bb.0:256; AVX2-NEXT: vpcmpgtd %ymm3, %ymm2, %ymm2257; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0258; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0259; AVX2-NEXT: vmovmskps %ymm0, %eax260; AVX2-NEXT: # kill: def $al killed $al killed $eax261; AVX2-NEXT: vzeroupper262; AVX2-NEXT: retq263;264; AVX512F-LABEL: v8i32_and:265; AVX512F: # %bb.0:266; AVX512F-NEXT: vpcmpgtd %ymm1, %ymm0, %k1267; AVX512F-NEXT: vpcmpgtd %ymm3, %ymm2, %k0 {%k1}268; AVX512F-NEXT: kmovw %k0, %eax269; AVX512F-NEXT: # kill: def $al killed $al killed $eax270; AVX512F-NEXT: vzeroupper271; AVX512F-NEXT: retq272;273; AVX512BW-LABEL: v8i32_and:274; AVX512BW: # %bb.0:275; AVX512BW-NEXT: vpcmpgtd %ymm1, %ymm0, %k1276; AVX512BW-NEXT: vpcmpgtd %ymm3, %ymm2, %k0 {%k1}277; AVX512BW-NEXT: kmovd %k0, %eax278; AVX512BW-NEXT: # kill: def $al killed $al killed $eax279; AVX512BW-NEXT: vzeroupper280; AVX512BW-NEXT: retq281 %x0 = icmp sgt <8 x i32> %a, %b282 %x1 = icmp sgt <8 x i32> %c, %d283 %y = and <8 x i1> %x0, %x1284 %res = bitcast <8 x i1> %y to i8285 ret i8 %res286}287 288; We should see through any bitwise logic op.289 290define i8 @v8i32_or(<8 x i32> %a, <8 x i32> %b, <8 x i32> %c, <8 x i32> %d) {291; SSE2-SSSE3-LABEL: v8i32_or:292; SSE2-SSSE3: # %bb.0:293; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm0294; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm1295; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm4296; SSE2-SSSE3-NEXT: por %xmm0, %xmm4297; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm5298; SSE2-SSSE3-NEXT: por %xmm1, %xmm5299; SSE2-SSSE3-NEXT: packssdw %xmm5, %xmm4300; SSE2-SSSE3-NEXT: packsswb %xmm4, %xmm4301; SSE2-SSSE3-NEXT: pmovmskb %xmm4, %eax302; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax303; SSE2-SSSE3-NEXT: retq304;305; AVX1-LABEL: v8i32_or:306; AVX1: # %bb.0:307; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4308; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5309; AVX1-NEXT: vpcmpgtd %xmm4, %xmm5, %xmm4310; AVX1-NEXT: vpcmpgtd %xmm3, %xmm2, %xmm2311; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm2312; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3313; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4314; AVX1-NEXT: vpcmpgtd %xmm3, %xmm4, %xmm3315; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0316; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0317; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0318; AVX1-NEXT: vmovmskps %ymm0, %eax319; AVX1-NEXT: # kill: def $al killed $al killed $eax320; AVX1-NEXT: vzeroupper321; AVX1-NEXT: retq322;323; AVX2-LABEL: v8i32_or:324; AVX2: # %bb.0:325; AVX2-NEXT: vpcmpgtd %ymm3, %ymm2, %ymm2326; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0327; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0328; AVX2-NEXT: vmovmskps %ymm0, %eax329; AVX2-NEXT: # kill: def $al killed $al killed $eax330; AVX2-NEXT: vzeroupper331; AVX2-NEXT: retq332;333; AVX512F-LABEL: v8i32_or:334; AVX512F: # %bb.0:335; AVX512F-NEXT: vpcmpgtd %ymm1, %ymm0, %k0336; AVX512F-NEXT: vpcmpgtd %ymm3, %ymm2, %k1337; AVX512F-NEXT: korw %k1, %k0, %k0338; AVX512F-NEXT: kmovw %k0, %eax339; AVX512F-NEXT: # kill: def $al killed $al killed $eax340; AVX512F-NEXT: vzeroupper341; AVX512F-NEXT: retq342;343; AVX512BW-LABEL: v8i32_or:344; AVX512BW: # %bb.0:345; AVX512BW-NEXT: vpcmpgtd %ymm1, %ymm0, %k0346; AVX512BW-NEXT: vpcmpgtd %ymm3, %ymm2, %k1347; AVX512BW-NEXT: korw %k1, %k0, %k0348; AVX512BW-NEXT: kmovd %k0, %eax349; AVX512BW-NEXT: # kill: def $al killed $al killed $eax350; AVX512BW-NEXT: vzeroupper351; AVX512BW-NEXT: retq352 %x0 = icmp sgt <8 x i32> %a, %b353 %x1 = icmp sgt <8 x i32> %c, %d354 %y = or <8 x i1> %x0, %x1355 %res = bitcast <8 x i1> %y to i8356 ret i8 %res357}358 359; We should see through multiple bitwise logic ops.360 361define i8 @v8i32_or_and(<8 x i32> %a, <8 x i32> %b, <8 x i32> %c, <8 x i32> %d, <8 x i32> %e, <8 x i32> %f) {362; SSE2-SSSE3-LABEL: v8i32_or_and:363; SSE2-SSSE3: # %bb.0:364; SSE2-SSSE3-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8365; SSE2-SSSE3-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9366; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm1367; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm0368; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm7369; SSE2-SSSE3-NEXT: por %xmm1, %xmm7370; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm6371; SSE2-SSSE3-NEXT: por %xmm0, %xmm6372; SSE2-SSSE3-NEXT: pcmpeqd {{[0-9]+}}(%rsp), %xmm9373; SSE2-SSSE3-NEXT: pand %xmm6, %xmm9374; SSE2-SSSE3-NEXT: pcmpeqd {{[0-9]+}}(%rsp), %xmm8375; SSE2-SSSE3-NEXT: pand %xmm7, %xmm8376; SSE2-SSSE3-NEXT: packssdw %xmm8, %xmm9377; SSE2-SSSE3-NEXT: packsswb %xmm9, %xmm9378; SSE2-SSSE3-NEXT: pmovmskb %xmm9, %eax379; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax380; SSE2-SSSE3-NEXT: retq381;382; AVX1-LABEL: v8i32_or_and:383; AVX1: # %bb.0:384; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6385; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm7386; AVX1-NEXT: vpcmpgtd %xmm6, %xmm7, %xmm6387; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm2388; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm2, %ymm2389; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3390; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6391; AVX1-NEXT: vpcmpgtd %xmm3, %xmm6, %xmm3392; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0393; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0394; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0395; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm1396; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm2397; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm1398; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm2399; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1400; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0401; AVX1-NEXT: vmovmskps %ymm0, %eax402; AVX1-NEXT: # kill: def $al killed $al killed $eax403; AVX1-NEXT: vzeroupper404; AVX1-NEXT: retq405;406; AVX2-LABEL: v8i32_or_and:407; AVX2: # %bb.0:408; AVX2-NEXT: vpcmpgtd %ymm2, %ymm3, %ymm2409; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0410; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0411; AVX2-NEXT: vpcmpeqd %ymm5, %ymm4, %ymm1412; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0413; AVX2-NEXT: vmovmskps %ymm0, %eax414; AVX2-NEXT: # kill: def $al killed $al killed $eax415; AVX2-NEXT: vzeroupper416; AVX2-NEXT: retq417;418; AVX512F-LABEL: v8i32_or_and:419; AVX512F: # %bb.0:420; AVX512F-NEXT: vpcmpgtd %ymm1, %ymm0, %k0421; AVX512F-NEXT: vpcmpgtd %ymm2, %ymm3, %k1422; AVX512F-NEXT: korw %k1, %k0, %k1423; AVX512F-NEXT: vpcmpeqd %ymm5, %ymm4, %k0 {%k1}424; AVX512F-NEXT: kmovw %k0, %eax425; AVX512F-NEXT: # kill: def $al killed $al killed $eax426; AVX512F-NEXT: vzeroupper427; AVX512F-NEXT: retq428;429; AVX512BW-LABEL: v8i32_or_and:430; AVX512BW: # %bb.0:431; AVX512BW-NEXT: vpcmpgtd %ymm1, %ymm0, %k0432; AVX512BW-NEXT: vpcmpgtd %ymm2, %ymm3, %k1433; AVX512BW-NEXT: korw %k1, %k0, %k1434; AVX512BW-NEXT: vpcmpeqd %ymm5, %ymm4, %k0 {%k1}435; AVX512BW-NEXT: kmovd %k0, %eax436; AVX512BW-NEXT: # kill: def $al killed $al killed $eax437; AVX512BW-NEXT: vzeroupper438; AVX512BW-NEXT: retq439 %x0 = icmp sgt <8 x i32> %a, %b440 %x1 = icmp slt <8 x i32> %c, %d441 %x2 = icmp eq <8 x i32> %e, %f442 %y = or <8 x i1> %x0, %x1443 %z = and <8 x i1> %y, %x2444 %res = bitcast <8 x i1> %z to i8445 ret i8 %res446}447 448; PR61104 - peek through vselect allones operand449; combineBitcastvxi1 may be called before the fold vselect(c,-1,x) --> or(c,x) vXi1 fold450 451define i8 @v8i32_or_vselect(<8 x i32> %a0, <8 x i32> %a1, <8 x i32> %a2) {452; SSE2-SSSE3-LABEL: v8i32_or_vselect:453; SSE2-SSSE3: # %bb.0:454; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm0455; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm1456; SSE2-SSSE3-NEXT: por %xmm5, %xmm1457; SSE2-SSSE3-NEXT: por %xmm4, %xmm0458; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0459; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm0460; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax461; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax462; SSE2-SSSE3-NEXT: retq463;464; AVX1-LABEL: v8i32_or_vselect:465; AVX1: # %bb.0:466; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3467; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4468; AVX1-NEXT: vpcmpeqd %xmm3, %xmm4, %xmm3469; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0470; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0471; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0472; AVX1-NEXT: vmovmskps %ymm0, %eax473; AVX1-NEXT: # kill: def $al killed $al killed $eax474; AVX1-NEXT: vzeroupper475; AVX1-NEXT: retq476;477; AVX2-LABEL: v8i32_or_vselect:478; AVX2: # %bb.0:479; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0480; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0481; AVX2-NEXT: vmovmskps %ymm0, %eax482; AVX2-NEXT: # kill: def $al killed $al killed $eax483; AVX2-NEXT: vzeroupper484; AVX2-NEXT: retq485;486; AVX512F-LABEL: v8i32_or_vselect:487; AVX512F: # %bb.0:488; AVX512F-NEXT: vpcmpeqd %ymm1, %ymm0, %k0489; AVX512F-NEXT: vpxor %xmm0, %xmm0, %xmm0490; AVX512F-NEXT: vpcmpgtd %ymm2, %ymm0, %k1491; AVX512F-NEXT: korw %k1, %k0, %k0492; AVX512F-NEXT: kmovw %k0, %eax493; AVX512F-NEXT: # kill: def $al killed $al killed $eax494; AVX512F-NEXT: vzeroupper495; AVX512F-NEXT: retq496;497; AVX512BW-LABEL: v8i32_or_vselect:498; AVX512BW: # %bb.0:499; AVX512BW-NEXT: vpcmpeqd %ymm1, %ymm0, %k0500; AVX512BW-NEXT: vpxor %xmm0, %xmm0, %xmm0501; AVX512BW-NEXT: vpcmpgtd %ymm2, %ymm0, %k1502; AVX512BW-NEXT: korw %k1, %k0, %k0503; AVX512BW-NEXT: kmovd %k0, %eax504; AVX512BW-NEXT: # kill: def $al killed $al killed $eax505; AVX512BW-NEXT: vzeroupper506; AVX512BW-NEXT: retq507 %cmp = icmp eq <8 x i32> %a0, %a1508 %slt = icmp slt <8 x i32> %a2, zeroinitializer509 %sel = select <8 x i1> %cmp, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i1> %slt510 %res = bitcast <8 x i1> %sel to i8511 ret i8 %res512}513 514define i8 @v8i32_or_select(<8 x i32> %a0, <8 x i32> %a1, <8 x i32> %a2, <8 x i32> %a3, i1 %a4) {515; SSE2-SSSE3-LABEL: v8i32_or_select:516; SSE2-SSSE3: # %bb.0:517; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm2518; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm3519; SSE2-SSSE3-NEXT: testb $1, %dil520; SSE2-SSSE3-NEXT: jne .LBB7_1521; SSE2-SSSE3-NEXT: # %bb.2:522; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm0523; SSE2-SSSE3-NEXT: jmp .LBB7_3524; SSE2-SSSE3-NEXT: .LBB7_1:525; SSE2-SSSE3-NEXT: pcmpeqd %xmm5, %xmm1526; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm0527; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0528; SSE2-SSSE3-NEXT: .LBB7_3:529; SSE2-SSSE3-NEXT: por %xmm3, %xmm7530; SSE2-SSSE3-NEXT: por %xmm2, %xmm6531; SSE2-SSSE3-NEXT: packssdw %xmm7, %xmm6532; SSE2-SSSE3-NEXT: por %xmm0, %xmm6533; SSE2-SSSE3-NEXT: packsswb %xmm6, %xmm6534; SSE2-SSSE3-NEXT: pmovmskb %xmm6, %eax535; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax536; SSE2-SSSE3-NEXT: retq537;538; AVX1-LABEL: v8i32_or_select:539; AVX1: # %bb.0:540; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4541; AVX1-NEXT: testb $1, %dil542; AVX1-NEXT: jne .LBB7_1543; AVX1-NEXT: # %bb.2:544; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2545; AVX1-NEXT: jmp .LBB7_3546; AVX1-NEXT: .LBB7_1:547; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5548; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm5549; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm2550; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm2551; AVX1-NEXT: .LBB7_3:552; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5553; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm4554; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0555; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0556; AVX1-NEXT: vorps %ymm0, %ymm3, %ymm0557; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0558; AVX1-NEXT: vmovmskps %ymm0, %eax559; AVX1-NEXT: # kill: def $al killed $al killed $eax560; AVX1-NEXT: vzeroupper561; AVX1-NEXT: retq562;563; AVX2-LABEL: v8i32_or_select:564; AVX2: # %bb.0:565; AVX2-NEXT: testb $1, %dil566; AVX2-NEXT: jne .LBB7_1567; AVX2-NEXT: # %bb.2:568; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2569; AVX2-NEXT: jmp .LBB7_3570; AVX2-NEXT: .LBB7_1:571; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm2572; AVX2-NEXT: .LBB7_3:573; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm0574; AVX2-NEXT: vpor %ymm0, %ymm3, %ymm0575; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0576; AVX2-NEXT: vmovmskps %ymm0, %eax577; AVX2-NEXT: # kill: def $al killed $al killed $eax578; AVX2-NEXT: vzeroupper579; AVX2-NEXT: retq580;581; AVX512F-LABEL: v8i32_or_select:582; AVX512F: # %bb.0:583; AVX512F-NEXT: vpcmpeqd %ymm1, %ymm0, %k0584; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1585; AVX512F-NEXT: vpcmpgtd %ymm3, %ymm1, %k1586; AVX512F-NEXT: testb $1, %dil587; AVX512F-NEXT: jne .LBB7_1588; AVX512F-NEXT: # %bb.2:589; AVX512F-NEXT: kxorw %k0, %k0, %k2590; AVX512F-NEXT: jmp .LBB7_3591; AVX512F-NEXT: .LBB7_1:592; AVX512F-NEXT: vpcmpeqd %ymm2, %ymm0, %k2593; AVX512F-NEXT: .LBB7_3:594; AVX512F-NEXT: korw %k0, %k1, %k0595; AVX512F-NEXT: korw %k2, %k0, %k0596; AVX512F-NEXT: kmovw %k0, %eax597; AVX512F-NEXT: # kill: def $al killed $al killed $eax598; AVX512F-NEXT: vzeroupper599; AVX512F-NEXT: retq600;601; AVX512BW-LABEL: v8i32_or_select:602; AVX512BW: # %bb.0:603; AVX512BW-NEXT: vpcmpeqd %ymm1, %ymm0, %k0604; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1605; AVX512BW-NEXT: vpcmpgtd %ymm3, %ymm1, %k1606; AVX512BW-NEXT: testb $1, %dil607; AVX512BW-NEXT: jne .LBB7_1608; AVX512BW-NEXT: # %bb.2:609; AVX512BW-NEXT: kxorw %k0, %k0, %k2610; AVX512BW-NEXT: jmp .LBB7_3611; AVX512BW-NEXT: .LBB7_1:612; AVX512BW-NEXT: vpcmpeqd %ymm2, %ymm0, %k2613; AVX512BW-NEXT: .LBB7_3:614; AVX512BW-NEXT: korw %k0, %k1, %k0615; AVX512BW-NEXT: korw %k2, %k0, %k0616; AVX512BW-NEXT: kmovd %k0, %eax617; AVX512BW-NEXT: # kill: def $al killed $al killed $eax618; AVX512BW-NEXT: vzeroupper619; AVX512BW-NEXT: retq620 %cmp0 = icmp eq <8 x i32> %a0, %a1621 %cmp1 = icmp eq <8 x i32> %a0, %a2622 %cmp2 = icmp slt <8 x i32> %a3, zeroinitializer623 %sel = select i1 %a4, <8 x i1> %cmp1, <8 x i1> zeroinitializer624 %or0 = or <8 x i1> %cmp2, %cmp0625 %or1 = or <8 x i1> %or0, %sel626 %res = bitcast <8 x i1> %or1 to i8627 ret i8 %res628}629 630define i8 @v8f32_and(<8 x float> %a, <8 x float> %b, <8 x float> %c, <8 x float> %d) {631; SSE2-SSSE3-LABEL: v8f32_and:632; SSE2-SSSE3: # %bb.0:633; SSE2-SSSE3-NEXT: cmpltps %xmm0, %xmm2634; SSE2-SSSE3-NEXT: cmpltps %xmm1, %xmm3635; SSE2-SSSE3-NEXT: cmpltps %xmm4, %xmm6636; SSE2-SSSE3-NEXT: andps %xmm2, %xmm6637; SSE2-SSSE3-NEXT: cmpltps %xmm5, %xmm7638; SSE2-SSSE3-NEXT: andps %xmm3, %xmm7639; SSE2-SSSE3-NEXT: packssdw %xmm7, %xmm6640; SSE2-SSSE3-NEXT: packsswb %xmm6, %xmm6641; SSE2-SSSE3-NEXT: pmovmskb %xmm6, %eax642; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax643; SSE2-SSSE3-NEXT: retq644;645; AVX12-LABEL: v8f32_and:646; AVX12: # %bb.0:647; AVX12-NEXT: vcmpltps %ymm2, %ymm3, %ymm2648; AVX12-NEXT: vcmpltps %ymm0, %ymm1, %ymm0649; AVX12-NEXT: vandps %ymm2, %ymm0, %ymm0650; AVX12-NEXT: vmovmskps %ymm0, %eax651; AVX12-NEXT: # kill: def $al killed $al killed $eax652; AVX12-NEXT: vzeroupper653; AVX12-NEXT: retq654;655; AVX512F-LABEL: v8f32_and:656; AVX512F: # %bb.0:657; AVX512F-NEXT: vcmpltps %ymm0, %ymm1, %k1658; AVX512F-NEXT: vcmpltps %ymm2, %ymm3, %k0 {%k1}659; AVX512F-NEXT: kmovw %k0, %eax660; AVX512F-NEXT: # kill: def $al killed $al killed $eax661; AVX512F-NEXT: vzeroupper662; AVX512F-NEXT: retq663;664; AVX512BW-LABEL: v8f32_and:665; AVX512BW: # %bb.0:666; AVX512BW-NEXT: vcmpltps %ymm0, %ymm1, %k1667; AVX512BW-NEXT: vcmpltps %ymm2, %ymm3, %k0 {%k1}668; AVX512BW-NEXT: kmovd %k0, %eax669; AVX512BW-NEXT: # kill: def $al killed $al killed $eax670; AVX512BW-NEXT: vzeroupper671; AVX512BW-NEXT: retq672 %x0 = fcmp ogt <8 x float> %a, %b673 %x1 = fcmp ogt <8 x float> %c, %d674 %y = and <8 x i1> %x0, %x1675 %res = bitcast <8 x i1> %y to i8676 ret i8 %res677}678 679; We should see through any bitwise logic op.680 681define i8 @v8f32_xor(<8 x float> %a, <8 x float> %b, <8 x float> %c, <8 x float> %d) {682; SSE2-SSSE3-LABEL: v8f32_xor:683; SSE2-SSSE3: # %bb.0:684; SSE2-SSSE3-NEXT: cmpltps %xmm0, %xmm2685; SSE2-SSSE3-NEXT: cmpltps %xmm1, %xmm3686; SSE2-SSSE3-NEXT: cmpltps %xmm4, %xmm6687; SSE2-SSSE3-NEXT: xorps %xmm2, %xmm6688; SSE2-SSSE3-NEXT: cmpltps %xmm5, %xmm7689; SSE2-SSSE3-NEXT: xorps %xmm3, %xmm7690; SSE2-SSSE3-NEXT: packssdw %xmm7, %xmm6691; SSE2-SSSE3-NEXT: packsswb %xmm6, %xmm6692; SSE2-SSSE3-NEXT: pmovmskb %xmm6, %eax693; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax694; SSE2-SSSE3-NEXT: retq695;696; AVX12-LABEL: v8f32_xor:697; AVX12: # %bb.0:698; AVX12-NEXT: vcmpltps %ymm2, %ymm3, %ymm2699; AVX12-NEXT: vcmpltps %ymm0, %ymm1, %ymm0700; AVX12-NEXT: vxorps %ymm2, %ymm0, %ymm0701; AVX12-NEXT: vmovmskps %ymm0, %eax702; AVX12-NEXT: # kill: def $al killed $al killed $eax703; AVX12-NEXT: vzeroupper704; AVX12-NEXT: retq705;706; AVX512F-LABEL: v8f32_xor:707; AVX512F: # %bb.0:708; AVX512F-NEXT: vcmpltps %ymm0, %ymm1, %k0709; AVX512F-NEXT: vcmpltps %ymm2, %ymm3, %k1710; AVX512F-NEXT: kxorw %k1, %k0, %k0711; AVX512F-NEXT: kmovw %k0, %eax712; AVX512F-NEXT: # kill: def $al killed $al killed $eax713; AVX512F-NEXT: vzeroupper714; AVX512F-NEXT: retq715;716; AVX512BW-LABEL: v8f32_xor:717; AVX512BW: # %bb.0:718; AVX512BW-NEXT: vcmpltps %ymm0, %ymm1, %k0719; AVX512BW-NEXT: vcmpltps %ymm2, %ymm3, %k1720; AVX512BW-NEXT: kxorw %k1, %k0, %k0721; AVX512BW-NEXT: kmovd %k0, %eax722; AVX512BW-NEXT: # kill: def $al killed $al killed $eax723; AVX512BW-NEXT: vzeroupper724; AVX512BW-NEXT: retq725 %x0 = fcmp ogt <8 x float> %a, %b726 %x1 = fcmp ogt <8 x float> %c, %d727 %y = xor <8 x i1> %x0, %x1728 %res = bitcast <8 x i1> %y to i8729 ret i8 %res730}731 732; We should see through multiple bitwise logic ops.733 734define i8 @v8f32_xor_and(<8 x float> %a, <8 x float> %b, <8 x float> %c, <8 x float> %d, <8 x float> %e, <8 x float> %f) {735; SSE2-SSSE3-LABEL: v8f32_xor_and:736; SSE2-SSSE3: # %bb.0:737; SSE2-SSSE3-NEXT: movaps {{[0-9]+}}(%rsp), %xmm9738; SSE2-SSSE3-NEXT: movaps {{[0-9]+}}(%rsp), %xmm8739; SSE2-SSSE3-NEXT: cmpnleps %xmm3, %xmm1740; SSE2-SSSE3-NEXT: cmpnleps %xmm2, %xmm0741; SSE2-SSSE3-NEXT: movaps %xmm5, %xmm2742; SSE2-SSSE3-NEXT: cmpeqps %xmm7, %xmm2743; SSE2-SSSE3-NEXT: cmpunordps %xmm7, %xmm5744; SSE2-SSSE3-NEXT: orps %xmm2, %xmm5745; SSE2-SSSE3-NEXT: xorps %xmm1, %xmm5746; SSE2-SSSE3-NEXT: movaps %xmm4, %xmm1747; SSE2-SSSE3-NEXT: cmpeqps %xmm6, %xmm1748; SSE2-SSSE3-NEXT: cmpunordps %xmm6, %xmm4749; SSE2-SSSE3-NEXT: orps %xmm1, %xmm4750; SSE2-SSSE3-NEXT: xorps %xmm0, %xmm4751; SSE2-SSSE3-NEXT: cmpltps {{[0-9]+}}(%rsp), %xmm8752; SSE2-SSSE3-NEXT: andps %xmm4, %xmm8753; SSE2-SSSE3-NEXT: cmpltps {{[0-9]+}}(%rsp), %xmm9754; SSE2-SSSE3-NEXT: andps %xmm5, %xmm9755; SSE2-SSSE3-NEXT: packssdw %xmm9, %xmm8756; SSE2-SSSE3-NEXT: packsswb %xmm8, %xmm8757; SSE2-SSSE3-NEXT: pmovmskb %xmm8, %eax758; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax759; SSE2-SSSE3-NEXT: retq760;761; AVX12-LABEL: v8f32_xor_and:762; AVX12: # %bb.0:763; AVX12-NEXT: vcmpeq_uqps %ymm3, %ymm2, %ymm2764; AVX12-NEXT: vcmpnleps %ymm1, %ymm0, %ymm0765; AVX12-NEXT: vxorps %ymm2, %ymm0, %ymm0766; AVX12-NEXT: vcmpltps %ymm4, %ymm5, %ymm1767; AVX12-NEXT: vandps %ymm1, %ymm0, %ymm0768; AVX12-NEXT: vmovmskps %ymm0, %eax769; AVX12-NEXT: # kill: def $al killed $al killed $eax770; AVX12-NEXT: vzeroupper771; AVX12-NEXT: retq772;773; AVX512F-LABEL: v8f32_xor_and:774; AVX512F: # %bb.0:775; AVX512F-NEXT: vcmpnleps %ymm1, %ymm0, %k0776; AVX512F-NEXT: vcmpeq_uqps %ymm3, %ymm2, %k1777; AVX512F-NEXT: kxorw %k1, %k0, %k1778; AVX512F-NEXT: vcmpltps %ymm4, %ymm5, %k0 {%k1}779; AVX512F-NEXT: kmovw %k0, %eax780; AVX512F-NEXT: # kill: def $al killed $al killed $eax781; AVX512F-NEXT: vzeroupper782; AVX512F-NEXT: retq783;784; AVX512BW-LABEL: v8f32_xor_and:785; AVX512BW: # %bb.0:786; AVX512BW-NEXT: vcmpnleps %ymm1, %ymm0, %k0787; AVX512BW-NEXT: vcmpeq_uqps %ymm3, %ymm2, %k1788; AVX512BW-NEXT: kxorw %k1, %k0, %k1789; AVX512BW-NEXT: vcmpltps %ymm4, %ymm5, %k0 {%k1}790; AVX512BW-NEXT: kmovd %k0, %eax791; AVX512BW-NEXT: # kill: def $al killed $al killed $eax792; AVX512BW-NEXT: vzeroupper793; AVX512BW-NEXT: retq794 %x0 = fcmp ugt <8 x float> %a, %b795 %x1 = fcmp ueq <8 x float> %c, %d796 %x2 = fcmp ogt <8 x float> %e, %f797 %y = xor <8 x i1> %x0, %x1798 %z = and <8 x i1> %y, %x2799 %res = bitcast <8 x i1> %z to i8800 ret i8 %res801}802 803define i32 @v32i8(<32 x i8> %a, <32 x i8> %b, <32 x i8> %c, <32 x i8> %d) {804; SSE2-SSSE3-LABEL: v32i8:805; SSE2-SSSE3: # %bb.0:806; SSE2-SSSE3-NEXT: pcmpgtb %xmm2, %xmm0807; SSE2-SSSE3-NEXT: pcmpgtb %xmm3, %xmm1808; SSE2-SSSE3-NEXT: pcmpgtb %xmm6, %xmm4809; SSE2-SSSE3-NEXT: pand %xmm0, %xmm4810; SSE2-SSSE3-NEXT: pcmpgtb %xmm7, %xmm5811; SSE2-SSSE3-NEXT: pand %xmm1, %xmm5812; SSE2-SSSE3-NEXT: pmovmskb %xmm4, %ecx813; SSE2-SSSE3-NEXT: pmovmskb %xmm5, %eax814; SSE2-SSSE3-NEXT: shll $16, %eax815; SSE2-SSSE3-NEXT: orl %ecx, %eax816; SSE2-SSSE3-NEXT: retq817;818; AVX1-LABEL: v32i8:819; AVX1: # %bb.0:820; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4821; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5822; AVX1-NEXT: vpcmpgtb %xmm4, %xmm5, %xmm4823; AVX1-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0824; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1825; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5826; AVX1-NEXT: vpcmpgtb %xmm1, %xmm5, %xmm1827; AVX1-NEXT: vpand %xmm1, %xmm4, %xmm1828; AVX1-NEXT: vpcmpgtb %xmm3, %xmm2, %xmm2829; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0830; AVX1-NEXT: vpmovmskb %xmm0, %ecx831; AVX1-NEXT: vpmovmskb %xmm1, %eax832; AVX1-NEXT: shll $16, %eax833; AVX1-NEXT: orl %ecx, %eax834; AVX1-NEXT: vzeroupper835; AVX1-NEXT: retq836;837; AVX2-LABEL: v32i8:838; AVX2: # %bb.0:839; AVX2-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm0840; AVX2-NEXT: vpcmpgtb %ymm3, %ymm2, %ymm1841; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0842; AVX2-NEXT: vpmovmskb %ymm0, %eax843; AVX2-NEXT: vzeroupper844; AVX2-NEXT: retq845;846; AVX512F-LABEL: v32i8:847; AVX512F: # %bb.0:848; AVX512F-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm0849; AVX512F-NEXT: vpcmpgtb %ymm3, %ymm2, %ymm1850; AVX512F-NEXT: vpand %ymm1, %ymm0, %ymm0851; AVX512F-NEXT: vpmovmskb %ymm0, %eax852; AVX512F-NEXT: vzeroupper853; AVX512F-NEXT: retq854;855; AVX512BW-LABEL: v32i8:856; AVX512BW: # %bb.0:857; AVX512BW-NEXT: vpcmpgtb %ymm1, %ymm0, %k1858; AVX512BW-NEXT: vpcmpgtb %ymm3, %ymm2, %k0 {%k1}859; AVX512BW-NEXT: kmovd %k0, %eax860; AVX512BW-NEXT: vzeroupper861; AVX512BW-NEXT: retq862 %x0 = icmp sgt <32 x i8> %a, %b863 %x1 = icmp sgt <32 x i8> %c, %d864 %y = and <32 x i1> %x0, %x1865 %res = bitcast <32 x i1> %y to i32866 ret i32 %res867}868 869; PR61683 - ignore upper undef elements870define i8 @v4i32_concat_undef(<4 x i32> %vec) {871; SSE2-SSSE3-LABEL: v4i32_concat_undef:872; SSE2-SSSE3: # %bb.0:873; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm1874; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1875; SSE2-SSSE3-NEXT: movmskps %xmm1, %eax876; SSE2-SSSE3-NEXT: xorl $15, %eax877; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax878; SSE2-SSSE3-NEXT: retq879;880; AVX12-LABEL: v4i32_concat_undef:881; AVX12: # %bb.0:882; AVX12-NEXT: vpxor %xmm1, %xmm1, %xmm1883; AVX12-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0884; AVX12-NEXT: vmovmskps %xmm0, %eax885; AVX12-NEXT: xorl $15, %eax886; AVX12-NEXT: # kill: def $al killed $al killed $eax887; AVX12-NEXT: retq888;889; AVX512F-LABEL: v4i32_concat_undef:890; AVX512F: # %bb.0:891; AVX512F-NEXT: vptestmd %xmm0, %xmm0, %k0892; AVX512F-NEXT: kmovw %k0, %eax893; AVX512F-NEXT: # kill: def $al killed $al killed $eax894; AVX512F-NEXT: retq895;896; AVX512BW-LABEL: v4i32_concat_undef:897; AVX512BW: # %bb.0:898; AVX512BW-NEXT: vptestmd %xmm0, %xmm0, %k0899; AVX512BW-NEXT: kmovd %k0, %eax900; AVX512BW-NEXT: # kill: def $al killed $al killed $eax901; AVX512BW-NEXT: retq902 %tobool = icmp ne <4 x i32> %vec, zeroinitializer903 %insertvec = shufflevector <4 x i1> %tobool, <4 x i1> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>904 %res = bitcast <8 x i1> %insertvec to i8905 ret i8 %res906}907 908define i8 @v2i64_concat_undef(<2 x i64> %vec) {909; SSE2-SSSE3-LABEL: v2i64_concat_undef:910; SSE2-SSSE3: # %bb.0:911; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm1912; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1913; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2]914; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0915; SSE2-SSSE3-NEXT: movmskpd %xmm0, %eax916; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax917; SSE2-SSSE3-NEXT: retq918;919; AVX12-LABEL: v2i64_concat_undef:920; AVX12: # %bb.0:921; AVX12-NEXT: vpxor %xmm1, %xmm1, %xmm1922; AVX12-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0923; AVX12-NEXT: vmovmskpd %xmm0, %eax924; AVX12-NEXT: # kill: def $al killed $al killed $eax925; AVX12-NEXT: retq926;927; AVX512F-LABEL: v2i64_concat_undef:928; AVX512F: # %bb.0:929; AVX512F-NEXT: vptestnmq %xmm0, %xmm0, %k0930; AVX512F-NEXT: kmovw %k0, %eax931; AVX512F-NEXT: # kill: def $al killed $al killed $eax932; AVX512F-NEXT: retq933;934; AVX512BW-LABEL: v2i64_concat_undef:935; AVX512BW: # %bb.0:936; AVX512BW-NEXT: vptestnmq %xmm0, %xmm0, %k0937; AVX512BW-NEXT: kmovd %k0, %eax938; AVX512BW-NEXT: # kill: def $al killed $al killed $eax939; AVX512BW-NEXT: retq940 %tobool = icmp eq <2 x i64> %vec, zeroinitializer941 %insertvec = shufflevector <2 x i1> %tobool, <2 x i1> poison, <8 x i32> <i32 0, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>942 %res = bitcast <8 x i1> %insertvec to i8943 ret i8 %res944}945 946define i8 @v4f64_concat_undef(<4 x double> %vec) {947; SSE2-SSSE3-LABEL: v4f64_concat_undef:948; SSE2-SSSE3: # %bb.0:949; SSE2-SSSE3-NEXT: xorpd %xmm2, %xmm2950; SSE2-SSSE3-NEXT: xorpd %xmm3, %xmm3951; SSE2-SSSE3-NEXT: cmpltpd %xmm1, %xmm3952; SSE2-SSSE3-NEXT: cmpltpd %xmm0, %xmm2953; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]954; SSE2-SSSE3-NEXT: movmskps %xmm2, %eax955; SSE2-SSSE3-NEXT: # kill: def $al killed $al killed $eax956; SSE2-SSSE3-NEXT: retq957;958; AVX12-LABEL: v4f64_concat_undef:959; AVX12: # %bb.0:960; AVX12-NEXT: vxorpd %xmm1, %xmm1, %xmm1961; AVX12-NEXT: vcmpltpd %ymm0, %ymm1, %ymm0962; AVX12-NEXT: vmovmskpd %ymm0, %eax963; AVX12-NEXT: # kill: def $al killed $al killed $eax964; AVX12-NEXT: vzeroupper965; AVX12-NEXT: retq966;967; AVX512F-LABEL: v4f64_concat_undef:968; AVX512F: # %bb.0:969; AVX512F-NEXT: vxorpd %xmm1, %xmm1, %xmm1970; AVX512F-NEXT: vcmpltpd %ymm0, %ymm1, %k0971; AVX512F-NEXT: kmovw %k0, %eax972; AVX512F-NEXT: # kill: def $al killed $al killed $eax973; AVX512F-NEXT: vzeroupper974; AVX512F-NEXT: retq975;976; AVX512BW-LABEL: v4f64_concat_undef:977; AVX512BW: # %bb.0:978; AVX512BW-NEXT: vxorpd %xmm1, %xmm1, %xmm1979; AVX512BW-NEXT: vcmpltpd %ymm0, %ymm1, %k0980; AVX512BW-NEXT: kmovd %k0, %eax981; AVX512BW-NEXT: # kill: def $al killed $al killed $eax982; AVX512BW-NEXT: vzeroupper983; AVX512BW-NEXT: retq984 %tobool = fcmp ogt <4 x double> %vec, zeroinitializer985 %insertvec = shufflevector <4 x i1> %tobool, <4 x i1> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>986 %res = bitcast <8 x i1> %insertvec to i8987 ret i8 %res988}989