brintos

brintos / llvm-project-archived public Read only

0
0
Text · 35.6 KiB · 234c7a0 Raw
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