brintos

brintos / llvm-project-archived public Read only

0
0
Text · 46.9 KiB · fae1ff9 Raw
1487 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-prefixes=SSE,SSE2-SSSE33; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSE2-SSSE34; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE415; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX12,AVX16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX12,AVX27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX5128 9;10; 128-bit vectors11;12 13define i1 @bitcast_v2i64_to_v2i1(<2 x i64> %a0) nounwind {14; SSE-LABEL: bitcast_v2i64_to_v2i1:15; SSE:       # %bb.0:16; SSE-NEXT:    movmskpd %xmm0, %ecx17; SSE-NEXT:    movl %ecx, %eax18; SSE-NEXT:    shrb %al19; SSE-NEXT:    xorb %cl, %al20; SSE-NEXT:    retq21;22; AVX12-LABEL: bitcast_v2i64_to_v2i1:23; AVX12:       # %bb.0:24; AVX12-NEXT:    vmovmskpd %xmm0, %ecx25; AVX12-NEXT:    movl %ecx, %eax26; AVX12-NEXT:    shrb %al27; AVX12-NEXT:    xorb %cl, %al28; AVX12-NEXT:    retq29;30; AVX512-LABEL: bitcast_v2i64_to_v2i1:31; AVX512:       # %bb.0:32; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm133; AVX512-NEXT:    vpcmpgtq %xmm0, %xmm1, %k034; AVX512-NEXT:    kshiftrw $1, %k0, %k135; AVX512-NEXT:    kmovd %k1, %ecx36; AVX512-NEXT:    kmovd %k0, %eax37; AVX512-NEXT:    xorb %cl, %al38; AVX512-NEXT:    # kill: def $al killed $al killed $eax39; AVX512-NEXT:    retq40  %1 = icmp slt <2 x i64> %a0, zeroinitializer41  %2 = bitcast <2 x i1> %1 to <2 x i1>42  %3 = extractelement <2 x i1> %2, i32 043  %4 = extractelement <2 x i1> %2, i32 144  %5 = add i1 %3, %445  ret i1 %546}47 48define i1 @trunc_v2i64_cmp(<2 x i64> %a0) nounwind {49; SSE2-SSSE3-LABEL: trunc_v2i64_cmp:50; SSE2-SSSE3:       # %bb.0:51; SSE2-SSSE3-NEXT:    psllq $63, %xmm052; SSE2-SSSE3-NEXT:    movmskpd %xmm0, %eax53; SSE2-SSSE3-NEXT:    testl %eax, %eax54; SSE2-SSSE3-NEXT:    sete %al55; SSE2-SSSE3-NEXT:    retq56;57; SSE41-LABEL: trunc_v2i64_cmp:58; SSE41:       # %bb.0:59; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm060; SSE41-NEXT:    sete %al61; SSE41-NEXT:    retq62;63; AVX12-LABEL: trunc_v2i64_cmp:64; AVX12:       # %bb.0:65; AVX12-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm066; AVX12-NEXT:    sete %al67; AVX12-NEXT:    retq68;69; AVX512-LABEL: trunc_v2i64_cmp:70; AVX512:       # %bb.0:71; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [1,1]72; AVX512-NEXT:    vptest %xmm1, %xmm073; AVX512-NEXT:    sete %al74; AVX512-NEXT:    retq75  %1 = trunc <2 x i64> %a0 to <2 x i1>76  %2 = bitcast <2 x i1> %1 to i277  %3 = icmp eq i2 %2, 078  ret i1 %379}80 81define i2 @bitcast_v4i32_to_v2i2(<4 x i32> %a0) nounwind {82; SSE-LABEL: bitcast_v4i32_to_v2i2:83; SSE:       # %bb.0:84; SSE-NEXT:    movmskps %xmm0, %eax85; SSE-NEXT:    movl %eax, %ecx86; SSE-NEXT:    shrb $2, %cl87; SSE-NEXT:    andb $3, %al88; SSE-NEXT:    addb %cl, %al89; SSE-NEXT:    # kill: def $al killed $al killed $eax90; SSE-NEXT:    retq91;92; AVX-LABEL: bitcast_v4i32_to_v2i2:93; AVX:       # %bb.0:94; AVX-NEXT:    vmovmskps %xmm0, %eax95; AVX-NEXT:    movl %eax, %ecx96; AVX-NEXT:    shrb $2, %cl97; AVX-NEXT:    andb $3, %al98; AVX-NEXT:    addb %cl, %al99; AVX-NEXT:    # kill: def $al killed $al killed $eax100; AVX-NEXT:    retq101  %1 = icmp slt <4 x i32> %a0, zeroinitializer102  %2 = bitcast <4 x i1> %1 to <2 x i2>103  %3 = extractelement <2 x i2> %2, i32 0104  %4 = extractelement <2 x i2> %2, i32 1105  %5 = add i2 %3, %4106  ret i2 %5107}108 109define i1 @trunc_v4i32_cmp(<4 x i32> %a0) nounwind {110; SSE2-SSSE3-LABEL: trunc_v4i32_cmp:111; SSE2-SSSE3:       # %bb.0:112; SSE2-SSSE3-NEXT:    pslld $31, %xmm0113; SSE2-SSSE3-NEXT:    movmskps %xmm0, %eax114; SSE2-SSSE3-NEXT:    xorl $15, %eax115; SSE2-SSSE3-NEXT:    sete %al116; SSE2-SSSE3-NEXT:    retq117;118; SSE41-LABEL: trunc_v4i32_cmp:119; SSE41:       # %bb.0:120; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0121; SSE41-NEXT:    setb %al122; SSE41-NEXT:    retq123;124; AVX12-LABEL: trunc_v4i32_cmp:125; AVX12:       # %bb.0:126; AVX12-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0127; AVX12-NEXT:    setb %al128; AVX12-NEXT:    retq129;130; AVX512-LABEL: trunc_v4i32_cmp:131; AVX512:       # %bb.0:132; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [4294967297,4294967297]133; AVX512-NEXT:    vptest %xmm1, %xmm0134; AVX512-NEXT:    setb %al135; AVX512-NEXT:    retq136  %1 = trunc <4 x i32> %a0 to <4 x i1>137  %2 = bitcast <4 x i1> %1 to i4138  %3 = icmp eq i4 %2, -1139  ret i1 %3140}141 142define i4 @bitcast_v8i16_to_v2i4(<8 x i16> %a0) nounwind {143; SSE-LABEL: bitcast_v8i16_to_v2i4:144; SSE:       # %bb.0:145; SSE-NEXT:    packsswb %xmm0, %xmm0146; SSE-NEXT:    pmovmskb %xmm0, %eax147; SSE-NEXT:    movl %eax, %ecx148; SSE-NEXT:    shrb $4, %cl149; SSE-NEXT:    andb $15, %al150; SSE-NEXT:    addb %cl, %al151; SSE-NEXT:    # kill: def $al killed $al killed $eax152; SSE-NEXT:    retq153;154; AVX12-LABEL: bitcast_v8i16_to_v2i4:155; AVX12:       # %bb.0:156; AVX12-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0157; AVX12-NEXT:    vpmovmskb %xmm0, %eax158; AVX12-NEXT:    movl %eax, %ecx159; AVX12-NEXT:    shrb $4, %cl160; AVX12-NEXT:    andb $15, %al161; AVX12-NEXT:    addb %cl, %al162; AVX12-NEXT:    # kill: def $al killed $al killed $eax163; AVX12-NEXT:    retq164;165; AVX512-LABEL: bitcast_v8i16_to_v2i4:166; AVX512:       # %bb.0:167; AVX512-NEXT:    vpmovw2m %xmm0, %k0168; AVX512-NEXT:    kmovd %k0, %eax169; AVX512-NEXT:    movl %eax, %ecx170; AVX512-NEXT:    shrb $4, %cl171; AVX512-NEXT:    andb $15, %al172; AVX512-NEXT:    addb %cl, %al173; AVX512-NEXT:    # kill: def $al killed $al killed $eax174; AVX512-NEXT:    retq175  %1 = icmp slt <8 x i16> %a0, zeroinitializer176  %2 = bitcast <8 x i1> %1 to <2 x i4>177  %3 = extractelement <2 x i4> %2, i32 0178  %4 = extractelement <2 x i4> %2, i32 1179  %5 = add i4 %3, %4180  ret i4 %5181}182 183define i1 @trunc_v8i16_cmp(<8 x i16> %a0) nounwind {184; SSE2-SSSE3-LABEL: trunc_v8i16_cmp:185; SSE2-SSSE3:       # %bb.0:186; SSE2-SSSE3-NEXT:    psllw $7, %xmm0187; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax188; SSE2-SSSE3-NEXT:    testl $21845, %eax # imm = 0x5555189; SSE2-SSSE3-NEXT:    setne %al190; SSE2-SSSE3-NEXT:    retq191;192; SSE41-LABEL: trunc_v8i16_cmp:193; SSE41:       # %bb.0:194; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0195; SSE41-NEXT:    setne %al196; SSE41-NEXT:    retq197;198; AVX12-LABEL: trunc_v8i16_cmp:199; AVX12:       # %bb.0:200; AVX12-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0201; AVX12-NEXT:    setne %al202; AVX12-NEXT:    retq203;204; AVX512-LABEL: trunc_v8i16_cmp:205; AVX512:       # %bb.0:206; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [281479271743489,281479271743489]207; AVX512-NEXT:    vptest %xmm1, %xmm0208; AVX512-NEXT:    setne %al209; AVX512-NEXT:    retq210  %1 = trunc <8 x i16> %a0 to <8 x i1>211  %2 = bitcast <8 x i1> %1 to i8212  %3 = icmp ne i8 %2, 0213  ret i1 %3214}215 216define i8 @bitcast_v16i8_to_v2i8(<16 x i8> %a0) nounwind {217; SSE-LABEL: bitcast_v16i8_to_v2i8:218; SSE:       # %bb.0:219; SSE-NEXT:    pmovmskb %xmm0, %eax220; SSE-NEXT:    movl %eax, %ecx221; SSE-NEXT:    shrl $8, %eax222; SSE-NEXT:    addb %cl, %al223; SSE-NEXT:    # kill: def $al killed $al killed $eax224; SSE-NEXT:    retq225;226; AVX12-LABEL: bitcast_v16i8_to_v2i8:227; AVX12:       # %bb.0:228; AVX12-NEXT:    vpmovmskb %xmm0, %eax229; AVX12-NEXT:    movl %eax, %ecx230; AVX12-NEXT:    shrl $8, %eax231; AVX12-NEXT:    addb %cl, %al232; AVX12-NEXT:    # kill: def $al killed $al killed $eax233; AVX12-NEXT:    retq234;235; AVX512-LABEL: bitcast_v16i8_to_v2i8:236; AVX512:       # %bb.0:237; AVX512-NEXT:    vpmovb2m %xmm0, %k0238; AVX512-NEXT:    kshiftrw $8, %k0, %k1239; AVX512-NEXT:    kmovd %k0, %ecx240; AVX512-NEXT:    kmovd %k1, %eax241; AVX512-NEXT:    addb %cl, %al242; AVX512-NEXT:    # kill: def $al killed $al killed $eax243; AVX512-NEXT:    retq244  %1 = icmp slt <16 x i8> %a0, zeroinitializer245  %2 = bitcast <16 x i1> %1 to <2 x i8>246  %3 = extractelement <2 x i8> %2, i32 0247  %4 = extractelement <2 x i8> %2, i32 1248  %5 = add i8 %3, %4249  ret i8 %5250}251 252define i1 @trunc_v16i8_cmp(<16 x i8> %a0) nounwind {253; SSE2-SSSE3-LABEL: trunc_v16i8_cmp:254; SSE2-SSSE3:       # %bb.0:255; SSE2-SSSE3-NEXT:    psllw $7, %xmm0256; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax257; SSE2-SSSE3-NEXT:    xorl $65535, %eax # imm = 0xFFFF258; SSE2-SSSE3-NEXT:    setne %al259; SSE2-SSSE3-NEXT:    retq260;261; SSE41-LABEL: trunc_v16i8_cmp:262; SSE41:       # %bb.0:263; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0264; SSE41-NEXT:    setae %al265; SSE41-NEXT:    retq266;267; AVX12-LABEL: trunc_v16i8_cmp:268; AVX12:       # %bb.0:269; AVX12-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0270; AVX12-NEXT:    setae %al271; AVX12-NEXT:    retq272;273; AVX512-LABEL: trunc_v16i8_cmp:274; AVX512:       # %bb.0:275; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [72340172838076673,72340172838076673]276; AVX512-NEXT:    vptest %xmm1, %xmm0277; AVX512-NEXT:    setae %al278; AVX512-NEXT:    retq279  %1 = trunc <16 x i8> %a0 to <16 x i1>280  %2 = bitcast <16 x i1> %1 to i16281  %3 = icmp ne i16 %2, -1282  ret i1 %3283}284 285;286; 256-bit vectors287;288 289define i2 @bitcast_v4i64_to_v2i2(<4 x i64> %a0) nounwind {290; SSE-LABEL: bitcast_v4i64_to_v2i2:291; SSE:       # %bb.0:292; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]293; SSE-NEXT:    movmskps %xmm0, %eax294; SSE-NEXT:    movl %eax, %ecx295; SSE-NEXT:    shrb $2, %cl296; SSE-NEXT:    andb $3, %al297; SSE-NEXT:    addb %cl, %al298; SSE-NEXT:    # kill: def $al killed $al killed $eax299; SSE-NEXT:    retq300;301; AVX-LABEL: bitcast_v4i64_to_v2i2:302; AVX:       # %bb.0:303; AVX-NEXT:    vmovmskpd %ymm0, %eax304; AVX-NEXT:    movl %eax, %ecx305; AVX-NEXT:    shrb $2, %cl306; AVX-NEXT:    andb $3, %al307; AVX-NEXT:    addb %cl, %al308; AVX-NEXT:    # kill: def $al killed $al killed $eax309; AVX-NEXT:    vzeroupper310; AVX-NEXT:    retq311  %1 = icmp slt <4 x i64> %a0, zeroinitializer312  %2 = bitcast <4 x i1> %1 to <2 x i2>313  %3 = extractelement <2 x i2> %2, i32 0314  %4 = extractelement <2 x i2> %2, i32 1315  %5 = add i2 %3, %4316  ret i2 %5317}318 319define i1 @trunc_v4i64_cmp(<4 x i64> %a0) nounwind {320; SSE2-SSSE3-LABEL: trunc_v4i64_cmp:321; SSE2-SSSE3:       # %bb.0:322; SSE2-SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]323; SSE2-SSSE3-NEXT:    pslld $31, %xmm0324; SSE2-SSSE3-NEXT:    movmskps %xmm0, %eax325; SSE2-SSSE3-NEXT:    testl %eax, %eax326; SSE2-SSSE3-NEXT:    setne %al327; SSE2-SSSE3-NEXT:    retq328;329; SSE41-LABEL: trunc_v4i64_cmp:330; SSE41:       # %bb.0:331; SSE41-NEXT:    por %xmm1, %xmm0332; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0333; SSE41-NEXT:    setne %al334; SSE41-NEXT:    retq335;336; AVX1-LABEL: trunc_v4i64_cmp:337; AVX1:       # %bb.0:338; AVX1-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0339; AVX1-NEXT:    setne %al340; AVX1-NEXT:    vzeroupper341; AVX1-NEXT:    retq342;343; AVX2-LABEL: trunc_v4i64_cmp:344; AVX2:       # %bb.0:345; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]346; AVX2-NEXT:    vptest %ymm1, %ymm0347; AVX2-NEXT:    setne %al348; AVX2-NEXT:    vzeroupper349; AVX2-NEXT:    retq350;351; AVX512-LABEL: trunc_v4i64_cmp:352; AVX512:       # %bb.0:353; AVX512-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]354; AVX512-NEXT:    vptest %ymm1, %ymm0355; AVX512-NEXT:    setne %al356; AVX512-NEXT:    vzeroupper357; AVX512-NEXT:    retq358  %1 = trunc <4 x i64> %a0 to <4 x i1>359  %2 = bitcast <4 x i1> %1 to i4360  %3 = icmp ne i4 %2, 0361  ret i1 %3362}363 364define i4 @bitcast_v8i32_to_v2i4(<8 x i32> %a0) nounwind {365; SSE-LABEL: bitcast_v8i32_to_v2i4:366; SSE:       # %bb.0:367; SSE-NEXT:    packssdw %xmm1, %xmm0368; SSE-NEXT:    packsswb %xmm0, %xmm0369; SSE-NEXT:    pmovmskb %xmm0, %eax370; SSE-NEXT:    movl %eax, %ecx371; SSE-NEXT:    shrb $4, %cl372; SSE-NEXT:    andb $15, %al373; SSE-NEXT:    addb %cl, %al374; SSE-NEXT:    # kill: def $al killed $al killed $eax375; SSE-NEXT:    retq376;377; AVX-LABEL: bitcast_v8i32_to_v2i4:378; AVX:       # %bb.0:379; AVX-NEXT:    vmovmskps %ymm0, %eax380; AVX-NEXT:    movl %eax, %ecx381; AVX-NEXT:    shrb $4, %cl382; AVX-NEXT:    andb $15, %al383; AVX-NEXT:    addb %cl, %al384; AVX-NEXT:    # kill: def $al killed $al killed $eax385; AVX-NEXT:    vzeroupper386; AVX-NEXT:    retq387  %1 = icmp slt <8 x i32> %a0, zeroinitializer388  %2 = bitcast <8 x i1> %1 to <2 x i4>389  %3 = extractelement <2 x i4> %2, i32 0390  %4 = extractelement <2 x i4> %2, i32 1391  %5 = add i4 %3, %4392  ret i4 %5393}394 395define i1 @trunc_v8i132_cmp(<8 x i32> %a0) nounwind {396; SSE2-SSSE3-LABEL: trunc_v8i132_cmp:397; SSE2-SSSE3:       # %bb.0:398; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm0399; SSE2-SSSE3-NEXT:    pslld $31, %xmm0400; SSE2-SSSE3-NEXT:    movmskps %xmm0, %eax401; SSE2-SSSE3-NEXT:    xorl $15, %eax402; SSE2-SSSE3-NEXT:    setne %al403; SSE2-SSSE3-NEXT:    retq404;405; SSE41-LABEL: trunc_v8i132_cmp:406; SSE41:       # %bb.0:407; SSE41-NEXT:    pand %xmm1, %xmm0408; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0409; SSE41-NEXT:    setae %al410; SSE41-NEXT:    retq411;412; AVX1-LABEL: trunc_v8i132_cmp:413; AVX1:       # %bb.0:414; AVX1-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0415; AVX1-NEXT:    setae %al416; AVX1-NEXT:    vzeroupper417; AVX1-NEXT:    retq418;419; AVX2-LABEL: trunc_v8i132_cmp:420; AVX2:       # %bb.0:421; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]422; AVX2-NEXT:    vptest %ymm1, %ymm0423; AVX2-NEXT:    setae %al424; AVX2-NEXT:    vzeroupper425; AVX2-NEXT:    retq426;427; AVX512-LABEL: trunc_v8i132_cmp:428; AVX512:       # %bb.0:429; AVX512-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]430; AVX512-NEXT:    vptest %ymm1, %ymm0431; AVX512-NEXT:    setae %al432; AVX512-NEXT:    vzeroupper433; AVX512-NEXT:    retq434  %1 = trunc <8 x i32> %a0 to <8 x i1>435  %2 = bitcast <8 x i1> %1 to i8436  %3 = icmp ne i8 %2, -1437  ret i1 %3438}439 440define i8 @bitcast_v16i16_to_v2i8(<16 x i16> %a0) nounwind {441; SSE-LABEL: bitcast_v16i16_to_v2i8:442; SSE:       # %bb.0:443; SSE-NEXT:    packsswb %xmm1, %xmm0444; SSE-NEXT:    pmovmskb %xmm0, %eax445; SSE-NEXT:    movl %eax, %ecx446; SSE-NEXT:    shrl $8, %eax447; SSE-NEXT:    addb %cl, %al448; SSE-NEXT:    # kill: def $al killed $al killed $eax449; SSE-NEXT:    retq450;451; AVX1-LABEL: bitcast_v16i16_to_v2i8:452; AVX1:       # %bb.0:453; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1454; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0455; AVX1-NEXT:    vpmovmskb %xmm0, %eax456; AVX1-NEXT:    movl %eax, %ecx457; AVX1-NEXT:    shrl $8, %eax458; AVX1-NEXT:    addb %cl, %al459; AVX1-NEXT:    # kill: def $al killed $al killed $eax460; AVX1-NEXT:    vzeroupper461; AVX1-NEXT:    retq462;463; AVX2-LABEL: bitcast_v16i16_to_v2i8:464; AVX2:       # %bb.0:465; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1466; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0467; AVX2-NEXT:    vpmovmskb %xmm0, %eax468; AVX2-NEXT:    movl %eax, %ecx469; AVX2-NEXT:    shrl $8, %eax470; AVX2-NEXT:    addb %cl, %al471; AVX2-NEXT:    # kill: def $al killed $al killed $eax472; AVX2-NEXT:    vzeroupper473; AVX2-NEXT:    retq474;475; AVX512-LABEL: bitcast_v16i16_to_v2i8:476; AVX512:       # %bb.0:477; AVX512-NEXT:    vpmovw2m %ymm0, %k0478; AVX512-NEXT:    kshiftrw $8, %k0, %k1479; AVX512-NEXT:    kmovd %k0, %ecx480; AVX512-NEXT:    kmovd %k1, %eax481; AVX512-NEXT:    addb %cl, %al482; AVX512-NEXT:    # kill: def $al killed $al killed $eax483; AVX512-NEXT:    vzeroupper484; AVX512-NEXT:    retq485  %1 = icmp slt <16 x i16> %a0, zeroinitializer486  %2 = bitcast <16 x i1> %1 to <2 x i8>487  %3 = extractelement <2 x i8> %2, i32 0488  %4 = extractelement <2 x i8> %2, i32 1489  %5 = add i8 %3, %4490  ret i8 %5491}492 493define i1 @trunc_v16i16_cmp(<16 x i16> %a0) nounwind {494; SSE2-SSSE3-LABEL: trunc_v16i16_cmp:495; SSE2-SSSE3:       # %bb.0:496; SSE2-SSSE3-NEXT:    por %xmm1, %xmm0497; SSE2-SSSE3-NEXT:    psllw $7, %xmm0498; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax499; SSE2-SSSE3-NEXT:    testl $21845, %eax # imm = 0x5555500; SSE2-SSSE3-NEXT:    sete %al501; SSE2-SSSE3-NEXT:    retq502;503; SSE41-LABEL: trunc_v16i16_cmp:504; SSE41:       # %bb.0:505; SSE41-NEXT:    por %xmm1, %xmm0506; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0507; SSE41-NEXT:    sete %al508; SSE41-NEXT:    retq509;510; AVX1-LABEL: trunc_v16i16_cmp:511; AVX1:       # %bb.0:512; AVX1-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0513; AVX1-NEXT:    sete %al514; AVX1-NEXT:    vzeroupper515; AVX1-NEXT:    retq516;517; AVX2-LABEL: trunc_v16i16_cmp:518; AVX2:       # %bb.0:519; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]520; AVX2-NEXT:    vptest %ymm1, %ymm0521; AVX2-NEXT:    sete %al522; AVX2-NEXT:    vzeroupper523; AVX2-NEXT:    retq524;525; AVX512-LABEL: trunc_v16i16_cmp:526; AVX512:       # %bb.0:527; AVX512-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]528; AVX512-NEXT:    vptest %ymm1, %ymm0529; AVX512-NEXT:    sete %al530; AVX512-NEXT:    vzeroupper531; AVX512-NEXT:    retq532  %1 = trunc <16 x i16> %a0 to <16 x i1>533  %2 = bitcast <16 x i1> %1 to i16534  %3 = icmp eq i16 %2, 0535  ret i1 %3536}537 538define i16 @bitcast_v32i8_to_v2i16(<32 x i8> %a0) nounwind {539; SSE-LABEL: bitcast_v32i8_to_v2i16:540; SSE:       # %bb.0:541; SSE-NEXT:    pmovmskb %xmm1, %ecx542; SSE-NEXT:    pmovmskb %xmm0, %eax543; SSE-NEXT:    addl %ecx, %eax544; SSE-NEXT:    # kill: def $ax killed $ax killed $eax545; SSE-NEXT:    retq546;547; AVX1-LABEL: bitcast_v32i8_to_v2i16:548; AVX1:       # %bb.0:549; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1550; AVX1-NEXT:    vpmovmskb %xmm1, %ecx551; AVX1-NEXT:    vpmovmskb %xmm0, %eax552; AVX1-NEXT:    addl %ecx, %eax553; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax554; AVX1-NEXT:    vzeroupper555; AVX1-NEXT:    retq556;557; AVX2-LABEL: bitcast_v32i8_to_v2i16:558; AVX2:       # %bb.0:559; AVX2-NEXT:    vpmovmskb %ymm0, %ecx560; AVX2-NEXT:    movl %ecx, %eax561; AVX2-NEXT:    shrl $16, %eax562; AVX2-NEXT:    addl %ecx, %eax563; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax564; AVX2-NEXT:    vzeroupper565; AVX2-NEXT:    retq566;567; AVX512-LABEL: bitcast_v32i8_to_v2i16:568; AVX512:       # %bb.0:569; AVX512-NEXT:    vpmovb2m %ymm0, %k0570; AVX512-NEXT:    kshiftrd $16, %k0, %k1571; AVX512-NEXT:    kmovd %k0, %ecx572; AVX512-NEXT:    kmovd %k1, %eax573; AVX512-NEXT:    addl %ecx, %eax574; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax575; AVX512-NEXT:    vzeroupper576; AVX512-NEXT:    retq577  %1 = icmp slt <32 x i8> %a0, zeroinitializer578  %2 = bitcast <32 x i1> %1 to <2 x i16>579  %3 = extractelement <2 x i16> %2, i32 0580  %4 = extractelement <2 x i16> %2, i32 1581  %5 = add i16 %3, %4582  ret i16 %5583}584 585define i1 @trunc_v32i8_cmp(<32 x i8> %a0) nounwind {586; SSE2-SSSE3-LABEL: trunc_v32i8_cmp:587; SSE2-SSSE3:       # %bb.0:588; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm0589; SSE2-SSSE3-NEXT:    psllw $7, %xmm0590; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax591; SSE2-SSSE3-NEXT:    xorl $65535, %eax # imm = 0xFFFF592; SSE2-SSSE3-NEXT:    sete %al593; SSE2-SSSE3-NEXT:    retq594;595; SSE41-LABEL: trunc_v32i8_cmp:596; SSE41:       # %bb.0:597; SSE41-NEXT:    pand %xmm1, %xmm0598; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0599; SSE41-NEXT:    setb %al600; SSE41-NEXT:    retq601;602; AVX1-LABEL: trunc_v32i8_cmp:603; AVX1:       # %bb.0:604; AVX1-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0605; AVX1-NEXT:    setb %al606; AVX1-NEXT:    vzeroupper607; AVX1-NEXT:    retq608;609; AVX2-LABEL: trunc_v32i8_cmp:610; AVX2:       # %bb.0:611; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]612; AVX2-NEXT:    vptest %ymm1, %ymm0613; AVX2-NEXT:    setb %al614; AVX2-NEXT:    vzeroupper615; AVX2-NEXT:    retq616;617; AVX512-LABEL: trunc_v32i8_cmp:618; AVX512:       # %bb.0:619; AVX512-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]620; AVX512-NEXT:    vptest %ymm1, %ymm0621; AVX512-NEXT:    setb %al622; AVX512-NEXT:    vzeroupper623; AVX512-NEXT:    retq624  %1 = trunc <32 x i8> %a0 to <32 x i1>625  %2 = bitcast <32 x i1> %1 to i32626  %3 = icmp eq i32 %2, -1627  ret i1 %3628}629 630;631; 512-bit vectors632;633 634define i4 @bitcast_v8i64_to_v2i4(<8 x i64> %a0) nounwind {635; SSE-LABEL: bitcast_v8i64_to_v2i4:636; SSE:       # %bb.0:637; SSE-NEXT:    packssdw %xmm3, %xmm2638; SSE-NEXT:    packssdw %xmm1, %xmm0639; SSE-NEXT:    packssdw %xmm2, %xmm0640; SSE-NEXT:    packsswb %xmm0, %xmm0641; SSE-NEXT:    pmovmskb %xmm0, %eax642; SSE-NEXT:    movl %eax, %ecx643; SSE-NEXT:    shrb $4, %cl644; SSE-NEXT:    andb $15, %al645; SSE-NEXT:    addb %cl, %al646; SSE-NEXT:    # kill: def $al killed $al killed $eax647; SSE-NEXT:    retq648;649; AVX1-LABEL: bitcast_v8i64_to_v2i4:650; AVX1:       # %bb.0:651; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2652; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3653; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2654; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm0655; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0656; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2657; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1658; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0659; AVX1-NEXT:    vmovmskps %ymm0, %eax660; AVX1-NEXT:    movl %eax, %ecx661; AVX1-NEXT:    shrb $4, %cl662; AVX1-NEXT:    andb $15, %al663; AVX1-NEXT:    addb %cl, %al664; AVX1-NEXT:    # kill: def $al killed $al killed $eax665; AVX1-NEXT:    vzeroupper666; AVX1-NEXT:    retq667;668; AVX2-LABEL: bitcast_v8i64_to_v2i4:669; AVX2:       # %bb.0:670; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0671; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]672; AVX2-NEXT:    vmovmskps %ymm0, %eax673; AVX2-NEXT:    movl %eax, %ecx674; AVX2-NEXT:    shrb $4, %cl675; AVX2-NEXT:    andb $15, %al676; AVX2-NEXT:    addb %cl, %al677; AVX2-NEXT:    # kill: def $al killed $al killed $eax678; AVX2-NEXT:    vzeroupper679; AVX2-NEXT:    retq680;681; AVX512-LABEL: bitcast_v8i64_to_v2i4:682; AVX512:       # %bb.0:683; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1684; AVX512-NEXT:    vpcmpgtq %zmm0, %zmm1, %k0685; AVX512-NEXT:    kmovd %k0, %eax686; AVX512-NEXT:    movl %eax, %ecx687; AVX512-NEXT:    shrb $4, %cl688; AVX512-NEXT:    andb $15, %al689; AVX512-NEXT:    addb %cl, %al690; AVX512-NEXT:    # kill: def $al killed $al killed $eax691; AVX512-NEXT:    vzeroupper692; AVX512-NEXT:    retq693  %1 = icmp slt <8 x i64> %a0, zeroinitializer694  %2 = bitcast <8 x i1> %1 to <2 x i4>695  %3 = extractelement <2 x i4> %2, i32 0696  %4 = extractelement <2 x i4> %2, i32 1697  %5 = add i4 %3, %4698  ret i4 %5699}700 701define i1 @trunc_v8i64_cmp(<8 x i64> %a0) nounwind {702; SSE2-SSSE3-LABEL: trunc_v8i64_cmp:703; SSE2-SSSE3:       # %bb.0:704; SSE2-SSSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]705; SSE2-SSSE3-NEXT:    pslld $16, %xmm2706; SSE2-SSSE3-NEXT:    psrad $16, %xmm2707; SSE2-SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]708; SSE2-SSSE3-NEXT:    pslld $16, %xmm0709; SSE2-SSSE3-NEXT:    psrad $16, %xmm0710; SSE2-SSSE3-NEXT:    packssdw %xmm2, %xmm0711; SSE2-SSSE3-NEXT:    psllw $15, %xmm0712; SSE2-SSSE3-NEXT:    packsswb %xmm0, %xmm0713; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax714; SSE2-SSSE3-NEXT:    cmpb $-1, %al715; SSE2-SSSE3-NEXT:    sete %al716; SSE2-SSSE3-NEXT:    retq717;718; SSE41-LABEL: trunc_v8i64_cmp:719; SSE41:       # %bb.0:720; SSE41-NEXT:    pand %xmm3, %xmm1721; SSE41-NEXT:    pand %xmm2, %xmm0722; SSE41-NEXT:    pand %xmm1, %xmm0723; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0724; SSE41-NEXT:    setb %al725; SSE41-NEXT:    retq726;727; AVX1-LABEL: trunc_v8i64_cmp:728; AVX1:       # %bb.0:729; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0730; AVX1-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0731; AVX1-NEXT:    setb %al732; AVX1-NEXT:    vzeroupper733; AVX1-NEXT:    retq734;735; AVX2-LABEL: trunc_v8i64_cmp:736; AVX2:       # %bb.0:737; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0738; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]739; AVX2-NEXT:    vptest %ymm1, %ymm0740; AVX2-NEXT:    setb %al741; AVX2-NEXT:    vzeroupper742; AVX2-NEXT:    retq743;744; AVX512-LABEL: trunc_v8i64_cmp:745; AVX512:       # %bb.0:746; AVX512-NEXT:    vpbroadcastq {{.*#+}} zmm1 = [1,1,1,1,1,1,1,1]747; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm0748; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0749; AVX512-NEXT:    kortestw %k0, %k0750; AVX512-NEXT:    sete %al751; AVX512-NEXT:    vzeroupper752; AVX512-NEXT:    retq753  %1 = trunc <8 x i64> %a0 to <8 x i1>754  %2 = bitcast <8 x i1> %1 to i8755  %3 = icmp eq i8 %2, -1756  ret i1 %3757}758 759define i8 @bitcast_v16i32_to_v2i8(<16 x i32> %a0) nounwind {760; SSE-LABEL: bitcast_v16i32_to_v2i8:761; SSE:       # %bb.0:762; SSE-NEXT:    packssdw %xmm3, %xmm2763; SSE-NEXT:    packssdw %xmm1, %xmm0764; SSE-NEXT:    packsswb %xmm2, %xmm0765; SSE-NEXT:    pmovmskb %xmm0, %eax766; SSE-NEXT:    movl %eax, %ecx767; SSE-NEXT:    shrl $8, %eax768; SSE-NEXT:    addb %cl, %al769; SSE-NEXT:    # kill: def $al killed $al killed $eax770; SSE-NEXT:    retq771;772; AVX1-LABEL: bitcast_v16i32_to_v2i8:773; AVX1:       # %bb.0:774; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2775; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1776; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2777; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0778; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0779; AVX1-NEXT:    vpmovmskb %xmm0, %eax780; AVX1-NEXT:    movl %eax, %ecx781; AVX1-NEXT:    shrl $8, %eax782; AVX1-NEXT:    addb %cl, %al783; AVX1-NEXT:    # kill: def $al killed $al killed $eax784; AVX1-NEXT:    vzeroupper785; AVX1-NEXT:    retq786;787; AVX2-LABEL: bitcast_v16i32_to_v2i8:788; AVX2:       # %bb.0:789; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2790; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm2, %ymm1791; AVX2-NEXT:    vpcmpgtd %ymm0, %ymm2, %ymm0792; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0793; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1794; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0795; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]796; AVX2-NEXT:    vpmovmskb %xmm0, %eax797; AVX2-NEXT:    movl %eax, %ecx798; AVX2-NEXT:    shrl $8, %eax799; AVX2-NEXT:    addb %cl, %al800; AVX2-NEXT:    # kill: def $al killed $al killed $eax801; AVX2-NEXT:    vzeroupper802; AVX2-NEXT:    retq803;804; AVX512-LABEL: bitcast_v16i32_to_v2i8:805; AVX512:       # %bb.0:806; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1807; AVX512-NEXT:    vpcmpgtd %zmm0, %zmm1, %k0808; AVX512-NEXT:    kshiftrw $8, %k0, %k1809; AVX512-NEXT:    kmovd %k0, %ecx810; AVX512-NEXT:    kmovd %k1, %eax811; AVX512-NEXT:    addb %cl, %al812; AVX512-NEXT:    # kill: def $al killed $al killed $eax813; AVX512-NEXT:    vzeroupper814; AVX512-NEXT:    retq815  %1 = icmp slt <16 x i32> %a0, zeroinitializer816  %2 = bitcast <16 x i1> %1 to <2 x i8>817  %3 = extractelement <2 x i8> %2, i32 0818  %4 = extractelement <2 x i8> %2, i32 1819  %5 = add i8 %3, %4820  ret i8 %5821}822 823define i1 @trunc_v16i32_cmp(<16 x i32> %a0) nounwind {824; SSE2-SSSE3-LABEL: trunc_v16i32_cmp:825; SSE2-SSSE3:       # %bb.0:826; SSE2-SSSE3-NEXT:    por %xmm3, %xmm1827; SSE2-SSSE3-NEXT:    por %xmm2, %xmm0828; SSE2-SSSE3-NEXT:    por %xmm1, %xmm0829; SSE2-SSSE3-NEXT:    pslld $31, %xmm0830; SSE2-SSSE3-NEXT:    movmskps %xmm0, %eax831; SSE2-SSSE3-NEXT:    testl %eax, %eax832; SSE2-SSSE3-NEXT:    sete %al833; SSE2-SSSE3-NEXT:    retq834;835; SSE41-LABEL: trunc_v16i32_cmp:836; SSE41:       # %bb.0:837; SSE41-NEXT:    por %xmm3, %xmm1838; SSE41-NEXT:    por %xmm2, %xmm0839; SSE41-NEXT:    por %xmm1, %xmm0840; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0841; SSE41-NEXT:    sete %al842; SSE41-NEXT:    retq843;844; AVX1-LABEL: trunc_v16i32_cmp:845; AVX1:       # %bb.0:846; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0847; AVX1-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0848; AVX1-NEXT:    sete %al849; AVX1-NEXT:    vzeroupper850; AVX1-NEXT:    retq851;852; AVX2-LABEL: trunc_v16i32_cmp:853; AVX2:       # %bb.0:854; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0855; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]856; AVX2-NEXT:    vptest %ymm1, %ymm0857; AVX2-NEXT:    sete %al858; AVX2-NEXT:    vzeroupper859; AVX2-NEXT:    retq860;861; AVX512-LABEL: trunc_v16i32_cmp:862; AVX512:       # %bb.0:863; AVX512-NEXT:    vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k0864; AVX512-NEXT:    kortestw %k0, %k0865; AVX512-NEXT:    sete %al866; AVX512-NEXT:    vzeroupper867; AVX512-NEXT:    retq868  %1 = trunc <16 x i32> %a0 to <16 x i1>869  %2 = bitcast <16 x i1> %1 to i16870  %3 = icmp eq i16 %2, 0871  ret i1 %3872}873 874define i16 @bitcast_v32i16_to_v2i16(<32 x i16> %a0) nounwind {875; SSE-LABEL: bitcast_v32i16_to_v2i16:876; SSE:       # %bb.0:877; SSE-NEXT:    packsswb %xmm3, %xmm2878; SSE-NEXT:    pmovmskb %xmm2, %ecx879; SSE-NEXT:    packsswb %xmm1, %xmm0880; SSE-NEXT:    pmovmskb %xmm0, %eax881; SSE-NEXT:    addl %ecx, %eax882; SSE-NEXT:    # kill: def $ax killed $ax killed $eax883; SSE-NEXT:    retq884;885; AVX1-LABEL: bitcast_v32i16_to_v2i16:886; AVX1:       # %bb.0:887; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2888; AVX1-NEXT:    vpacksswb %xmm2, %xmm1, %xmm1889; AVX1-NEXT:    vpmovmskb %xmm1, %ecx890; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1891; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0892; AVX1-NEXT:    vpmovmskb %xmm0, %eax893; AVX1-NEXT:    addl %ecx, %eax894; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax895; AVX1-NEXT:    vzeroupper896; AVX1-NEXT:    retq897;898; AVX2-LABEL: bitcast_v32i16_to_v2i16:899; AVX2:       # %bb.0:900; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0901; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]902; AVX2-NEXT:    vpmovmskb %ymm0, %ecx903; AVX2-NEXT:    movl %ecx, %eax904; AVX2-NEXT:    shrl $16, %eax905; AVX2-NEXT:    addl %ecx, %eax906; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax907; AVX2-NEXT:    vzeroupper908; AVX2-NEXT:    retq909;910; AVX512-LABEL: bitcast_v32i16_to_v2i16:911; AVX512:       # %bb.0:912; AVX512-NEXT:    vpmovw2m %zmm0, %k0913; AVX512-NEXT:    kshiftrd $16, %k0, %k1914; AVX512-NEXT:    kmovd %k0, %ecx915; AVX512-NEXT:    kmovd %k1, %eax916; AVX512-NEXT:    addl %ecx, %eax917; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax918; AVX512-NEXT:    vzeroupper919; AVX512-NEXT:    retq920  %1 = icmp slt <32 x i16> %a0, zeroinitializer921  %2 = bitcast <32 x i1> %1 to <2 x i16>922  %3 = extractelement <2 x i16> %2, i32 0923  %4 = extractelement <2 x i16> %2, i32 1924  %5 = add i16 %3, %4925  ret i16 %5926}927 928define i1 @trunc_v32i16_cmp(<32 x i16> %a0) nounwind {929; SSE2-SSSE3-LABEL: trunc_v32i16_cmp:930; SSE2-SSSE3:       # %bb.0:931; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm1932; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm0933; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm0934; SSE2-SSSE3-NEXT:    psllw $7, %xmm0935; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax936; SSE2-SSSE3-NEXT:    notl %eax937; SSE2-SSSE3-NEXT:    testl $21845, %eax # imm = 0x5555938; SSE2-SSSE3-NEXT:    setne %al939; SSE2-SSSE3-NEXT:    retq940;941; SSE41-LABEL: trunc_v32i16_cmp:942; SSE41:       # %bb.0:943; SSE41-NEXT:    pand %xmm3, %xmm1944; SSE41-NEXT:    pand %xmm2, %xmm0945; SSE41-NEXT:    pand %xmm1, %xmm0946; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0947; SSE41-NEXT:    setae %al948; SSE41-NEXT:    retq949;950; AVX1-LABEL: trunc_v32i16_cmp:951; AVX1:       # %bb.0:952; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0953; AVX1-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0954; AVX1-NEXT:    setae %al955; AVX1-NEXT:    vzeroupper956; AVX1-NEXT:    retq957;958; AVX2-LABEL: trunc_v32i16_cmp:959; AVX2:       # %bb.0:960; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0961; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]962; AVX2-NEXT:    vptest %ymm1, %ymm0963; AVX2-NEXT:    setae %al964; AVX2-NEXT:    vzeroupper965; AVX2-NEXT:    retq966;967; AVX512-LABEL: trunc_v32i16_cmp:968; AVX512:       # %bb.0:969; AVX512-NEXT:    vpbroadcastw {{.*#+}} zmm1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]970; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm0971; AVX512-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0972; AVX512-NEXT:    kortestw %k0, %k0973; AVX512-NEXT:    setne %al974; AVX512-NEXT:    vzeroupper975; AVX512-NEXT:    retq976  %1 = trunc <32 x i16> %a0 to <32 x i1>977  %2 = bitcast <32 x i1> %1 to i32978  %3 = icmp ne i32 %2, -1979  ret i1 %3980}981 982define i32 @bitcast_v64i8_to_v2i32(<64 x i8> %a0) nounwind {983; SSE2-SSSE3-LABEL: bitcast_v64i8_to_v2i32:984; SSE2-SSSE3:       # %bb.0:985; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax986; SSE2-SSSE3-NEXT:    pmovmskb %xmm1, %ecx987; SSE2-SSSE3-NEXT:    shll $16, %ecx988; SSE2-SSSE3-NEXT:    orl %eax, %ecx989; SSE2-SSSE3-NEXT:    pmovmskb %xmm2, %eax990; SSE2-SSSE3-NEXT:    pmovmskb %xmm3, %edx991; SSE2-SSSE3-NEXT:    shll $16, %edx992; SSE2-SSSE3-NEXT:    orl %eax, %edx993; SSE2-SSSE3-NEXT:    shlq $32, %rdx994; SSE2-SSSE3-NEXT:    orq %rcx, %rdx995; SSE2-SSSE3-NEXT:    movq %rdx, %xmm0996; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]997; SSE2-SSSE3-NEXT:    movd %xmm0, %eax998; SSE2-SSSE3-NEXT:    addl %ecx, %eax999; SSE2-SSSE3-NEXT:    retq1000;1001; SSE41-LABEL: bitcast_v64i8_to_v2i32:1002; SSE41:       # %bb.0:1003; SSE41-NEXT:    pmovmskb %xmm2, %eax1004; SSE41-NEXT:    pmovmskb %xmm3, %ecx1005; SSE41-NEXT:    shll $16, %ecx1006; SSE41-NEXT:    orl %eax, %ecx1007; SSE41-NEXT:    pmovmskb %xmm0, %edx1008; SSE41-NEXT:    pmovmskb %xmm1, %eax1009; SSE41-NEXT:    shll $16, %eax1010; SSE41-NEXT:    orl %edx, %eax1011; SSE41-NEXT:    addl %ecx, %eax1012; SSE41-NEXT:    retq1013;1014; AVX1-LABEL: bitcast_v64i8_to_v2i32:1015; AVX1:       # %bb.0:1016; AVX1-NEXT:    vpmovmskb %xmm1, %eax1017; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm11018; AVX1-NEXT:    vpmovmskb %xmm1, %ecx1019; AVX1-NEXT:    shll $16, %ecx1020; AVX1-NEXT:    orl %eax, %ecx1021; AVX1-NEXT:    vpmovmskb %xmm0, %edx1022; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01023; AVX1-NEXT:    vpmovmskb %xmm0, %eax1024; AVX1-NEXT:    shll $16, %eax1025; AVX1-NEXT:    orl %edx, %eax1026; AVX1-NEXT:    addl %ecx, %eax1027; AVX1-NEXT:    vzeroupper1028; AVX1-NEXT:    retq1029;1030; AVX2-LABEL: bitcast_v64i8_to_v2i32:1031; AVX2:       # %bb.0:1032; AVX2-NEXT:    vpmovmskb %ymm1, %ecx1033; AVX2-NEXT:    vpmovmskb %ymm0, %eax1034; AVX2-NEXT:    addl %ecx, %eax1035; AVX2-NEXT:    vzeroupper1036; AVX2-NEXT:    retq1037;1038; AVX512-LABEL: bitcast_v64i8_to_v2i32:1039; AVX512:       # %bb.0:1040; AVX512-NEXT:    vpmovb2m %zmm0, %k01041; AVX512-NEXT:    kshiftrq $32, %k0, %k11042; AVX512-NEXT:    kmovd %k0, %ecx1043; AVX512-NEXT:    kmovd %k1, %eax1044; AVX512-NEXT:    addl %ecx, %eax1045; AVX512-NEXT:    vzeroupper1046; AVX512-NEXT:    retq1047  %1 = icmp slt <64 x i8> %a0, zeroinitializer1048  %2 = bitcast <64 x i1> %1 to <2 x i32>1049  %3 = extractelement <2 x i32> %2, i32 01050  %4 = extractelement <2 x i32> %2, i32 11051  %5 = add i32 %3, %41052  ret i32 %51053}1054 1055define i1 @trunc_v64i8_cmp(<64 x i8> %a0) nounwind {1056; SSE2-SSSE3-LABEL: trunc_v64i8_cmp:1057; SSE2-SSSE3:       # %bb.0:1058; SSE2-SSSE3-NEXT:    por %xmm3, %xmm11059; SSE2-SSSE3-NEXT:    por %xmm2, %xmm01060; SSE2-SSSE3-NEXT:    por %xmm1, %xmm01061; SSE2-SSSE3-NEXT:    psllw $7, %xmm01062; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax1063; SSE2-SSSE3-NEXT:    testl %eax, %eax1064; SSE2-SSSE3-NEXT:    setne %al1065; SSE2-SSSE3-NEXT:    retq1066;1067; SSE41-LABEL: trunc_v64i8_cmp:1068; SSE41:       # %bb.0:1069; SSE41-NEXT:    por %xmm3, %xmm11070; SSE41-NEXT:    por %xmm2, %xmm01071; SSE41-NEXT:    por %xmm1, %xmm01072; SSE41-NEXT:    ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01073; SSE41-NEXT:    setne %al1074; SSE41-NEXT:    retq1075;1076; AVX1-LABEL: trunc_v64i8_cmp:1077; AVX1:       # %bb.0:1078; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm01079; AVX1-NEXT:    vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm01080; AVX1-NEXT:    setne %al1081; AVX1-NEXT:    vzeroupper1082; AVX1-NEXT:    retq1083;1084; AVX2-LABEL: trunc_v64i8_cmp:1085; AVX2:       # %bb.0:1086; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm01087; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]1088; AVX2-NEXT:    vptest %ymm1, %ymm01089; AVX2-NEXT:    setne %al1090; AVX2-NEXT:    vzeroupper1091; AVX2-NEXT:    retq1092;1093; AVX512-LABEL: trunc_v64i8_cmp:1094; AVX512:       # %bb.0:1095; AVX512-NEXT:    vptestmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %k01096; AVX512-NEXT:    kortestw %k0, %k01097; AVX512-NEXT:    setne %al1098; AVX512-NEXT:    vzeroupper1099; AVX512-NEXT:    retq1100  %1 = trunc <64 x i8> %a0 to <64 x i1>1101  %2 = bitcast <64 x i1> %1 to i641102  %3 = icmp ne i64 %2, 01103  ret i1 %31104}1105 1106define i64 @bitcast_v128i8_to_v2i64(<128 x i8> %a0) nounwind {1107; SSE-LABEL: bitcast_v128i8_to_v2i64:1108; SSE:       # %bb.0:1109; SSE-NEXT:    pmovmskb %xmm4, %eax1110; SSE-NEXT:    pmovmskb %xmm5, %ecx1111; SSE-NEXT:    shll $16, %ecx1112; SSE-NEXT:    orl %eax, %ecx1113; SSE-NEXT:    pmovmskb %xmm6, %eax1114; SSE-NEXT:    pmovmskb %xmm7, %edx1115; SSE-NEXT:    shll $16, %edx1116; SSE-NEXT:    orl %eax, %edx1117; SSE-NEXT:    shlq $32, %rdx1118; SSE-NEXT:    orq %rcx, %rdx1119; SSE-NEXT:    pmovmskb %xmm0, %eax1120; SSE-NEXT:    pmovmskb %xmm1, %ecx1121; SSE-NEXT:    shll $16, %ecx1122; SSE-NEXT:    orl %eax, %ecx1123; SSE-NEXT:    pmovmskb %xmm2, %esi1124; SSE-NEXT:    pmovmskb %xmm3, %eax1125; SSE-NEXT:    shll $16, %eax1126; SSE-NEXT:    orl %esi, %eax1127; SSE-NEXT:    shlq $32, %rax1128; SSE-NEXT:    orq %rcx, %rax1129; SSE-NEXT:    addq %rdx, %rax1130; SSE-NEXT:    retq1131;1132; AVX1-LABEL: bitcast_v128i8_to_v2i64:1133; AVX1:       # %bb.0:1134; AVX1-NEXT:    vpmovmskb %xmm2, %eax1135; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm21136; AVX1-NEXT:    vpmovmskb %xmm2, %edx1137; AVX1-NEXT:    shll $16, %edx1138; AVX1-NEXT:    orl %eax, %edx1139; AVX1-NEXT:    vpmovmskb %xmm3, %eax1140; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm21141; AVX1-NEXT:    vpmovmskb %xmm2, %ecx1142; AVX1-NEXT:    shll $16, %ecx1143; AVX1-NEXT:    orl %eax, %ecx1144; AVX1-NEXT:    shlq $32, %rcx1145; AVX1-NEXT:    orq %rdx, %rcx1146; AVX1-NEXT:    vpmovmskb %xmm0, %eax1147; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01148; AVX1-NEXT:    vpmovmskb %xmm0, %edx1149; AVX1-NEXT:    shll $16, %edx1150; AVX1-NEXT:    orl %eax, %edx1151; AVX1-NEXT:    vpmovmskb %xmm1, %esi1152; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm01153; AVX1-NEXT:    vpmovmskb %xmm0, %eax1154; AVX1-NEXT:    shll $16, %eax1155; AVX1-NEXT:    orl %esi, %eax1156; AVX1-NEXT:    shlq $32, %rax1157; AVX1-NEXT:    orq %rdx, %rax1158; AVX1-NEXT:    addq %rcx, %rax1159; AVX1-NEXT:    vzeroupper1160; AVX1-NEXT:    retq1161;1162; AVX2-LABEL: bitcast_v128i8_to_v2i64:1163; AVX2:       # %bb.0:1164; AVX2-NEXT:    vpmovmskb %ymm3, %eax1165; AVX2-NEXT:    shlq $32, %rax1166; AVX2-NEXT:    vpmovmskb %ymm2, %ecx1167; AVX2-NEXT:    orq %rax, %rcx1168; AVX2-NEXT:    vpmovmskb %ymm1, %edx1169; AVX2-NEXT:    shlq $32, %rdx1170; AVX2-NEXT:    vpmovmskb %ymm0, %eax1171; AVX2-NEXT:    orq %rdx, %rax1172; AVX2-NEXT:    addq %rcx, %rax1173; AVX2-NEXT:    vzeroupper1174; AVX2-NEXT:    retq1175;1176; AVX512-LABEL: bitcast_v128i8_to_v2i64:1177; AVX512:       # %bb.0:1178; AVX512-NEXT:    vpmovb2m %zmm1, %k01179; AVX512-NEXT:    kmovq %k0, %rcx1180; AVX512-NEXT:    vpmovb2m %zmm0, %k01181; AVX512-NEXT:    kmovq %k0, %rax1182; AVX512-NEXT:    addq %rcx, %rax1183; AVX512-NEXT:    vzeroupper1184; AVX512-NEXT:    retq1185  %1 = icmp slt <128 x i8> %a0, zeroinitializer1186  %2 = bitcast <128 x i1> %1 to <2 x i64>1187  %3 = extractelement <2 x i64> %2, i32 01188  %4 = extractelement <2 x i64> %2, i32 11189  %5 = add i64 %3, %41190  ret i64 %51191}1192 1193define i1 @trunc_v128i8_cmp(<128 x i8> %a0) nounwind {1194; SSE2-SSSE3-LABEL: trunc_v128i8_cmp:1195; SSE2-SSSE3:       # %bb.0:1196; SSE2-SSSE3-NEXT:    psllw $7, %xmm01197; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax1198; SSE2-SSSE3-NEXT:    psllw $7, %xmm11199; SSE2-SSSE3-NEXT:    pmovmskb %xmm1, %ecx1200; SSE2-SSSE3-NEXT:    shll $16, %ecx1201; SSE2-SSSE3-NEXT:    orl %eax, %ecx1202; SSE2-SSSE3-NEXT:    psllw $7, %xmm21203; SSE2-SSSE3-NEXT:    pmovmskb %xmm2, %edx1204; SSE2-SSSE3-NEXT:    psllw $7, %xmm31205; SSE2-SSSE3-NEXT:    pmovmskb %xmm3, %eax1206; SSE2-SSSE3-NEXT:    shll $16, %eax1207; SSE2-SSSE3-NEXT:    orl %edx, %eax1208; SSE2-SSSE3-NEXT:    shlq $32, %rax1209; SSE2-SSSE3-NEXT:    orq %rcx, %rax1210; SSE2-SSSE3-NEXT:    psllw $7, %xmm41211; SSE2-SSSE3-NEXT:    pmovmskb %xmm4, %ecx1212; SSE2-SSSE3-NEXT:    psllw $7, %xmm51213; SSE2-SSSE3-NEXT:    pmovmskb %xmm5, %edx1214; SSE2-SSSE3-NEXT:    shll $16, %edx1215; SSE2-SSSE3-NEXT:    orl %ecx, %edx1216; SSE2-SSSE3-NEXT:    psllw $7, %xmm61217; SSE2-SSSE3-NEXT:    pmovmskb %xmm6, %ecx1218; SSE2-SSSE3-NEXT:    psllw $7, %xmm71219; SSE2-SSSE3-NEXT:    pmovmskb %xmm7, %esi1220; SSE2-SSSE3-NEXT:    shll $16, %esi1221; SSE2-SSSE3-NEXT:    orl %ecx, %esi1222; SSE2-SSSE3-NEXT:    shlq $32, %rsi1223; SSE2-SSSE3-NEXT:    orq %rdx, %rsi1224; SSE2-SSSE3-NEXT:    movq %rsi, %xmm01225; SSE2-SSSE3-NEXT:    movq %rax, %xmm11226; SSE2-SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]1227; SSE2-SSSE3-NEXT:    pcmpeqd %xmm0, %xmm01228; SSE2-SSSE3-NEXT:    pcmpeqb %xmm1, %xmm01229; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax1230; SSE2-SSSE3-NEXT:    cmpl $65535, %eax # imm = 0xFFFF1231; SSE2-SSSE3-NEXT:    setne %al1232; SSE2-SSSE3-NEXT:    retq1233;1234; SSE41-LABEL: trunc_v128i8_cmp:1235; SSE41:       # %bb.0:1236; SSE41-NEXT:    psllw $7, %xmm01237; SSE41-NEXT:    pmovmskb %xmm0, %eax1238; SSE41-NEXT:    psllw $7, %xmm11239; SSE41-NEXT:    pmovmskb %xmm1, %ecx1240; SSE41-NEXT:    shll $16, %ecx1241; SSE41-NEXT:    orl %eax, %ecx1242; SSE41-NEXT:    psllw $7, %xmm21243; SSE41-NEXT:    pmovmskb %xmm2, %edx1244; SSE41-NEXT:    psllw $7, %xmm31245; SSE41-NEXT:    pmovmskb %xmm3, %eax1246; SSE41-NEXT:    shll $16, %eax1247; SSE41-NEXT:    orl %edx, %eax1248; SSE41-NEXT:    shlq $32, %rax1249; SSE41-NEXT:    orq %rcx, %rax1250; SSE41-NEXT:    psllw $7, %xmm41251; SSE41-NEXT:    pmovmskb %xmm4, %ecx1252; SSE41-NEXT:    psllw $7, %xmm51253; SSE41-NEXT:    pmovmskb %xmm5, %edx1254; SSE41-NEXT:    shll $16, %edx1255; SSE41-NEXT:    orl %ecx, %edx1256; SSE41-NEXT:    psllw $7, %xmm61257; SSE41-NEXT:    pmovmskb %xmm6, %ecx1258; SSE41-NEXT:    psllw $7, %xmm71259; SSE41-NEXT:    pmovmskb %xmm7, %esi1260; SSE41-NEXT:    shll $16, %esi1261; SSE41-NEXT:    orl %ecx, %esi1262; SSE41-NEXT:    shlq $32, %rsi1263; SSE41-NEXT:    orq %rdx, %rsi1264; SSE41-NEXT:    movq %rsi, %xmm01265; SSE41-NEXT:    movq %rax, %xmm11266; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]1267; SSE41-NEXT:    pcmpeqd %xmm0, %xmm01268; SSE41-NEXT:    ptest %xmm0, %xmm11269; SSE41-NEXT:    setae %al1270; SSE41-NEXT:    retq1271;1272; AVX1-LABEL: trunc_v128i8_cmp:1273; AVX1:       # %bb.0:1274; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm41275; AVX1-NEXT:    vpmovmskb %xmm4, %eax1276; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01277; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm01278; AVX1-NEXT:    vpmovmskb %xmm0, %ecx1279; AVX1-NEXT:    shll $16, %ecx1280; AVX1-NEXT:    orl %eax, %ecx1281; AVX1-NEXT:    vpsllw $7, %xmm1, %xmm01282; AVX1-NEXT:    vpmovmskb %xmm0, %edx1283; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm01284; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm01285; AVX1-NEXT:    vpmovmskb %xmm0, %eax1286; AVX1-NEXT:    shll $16, %eax1287; AVX1-NEXT:    orl %edx, %eax1288; AVX1-NEXT:    shlq $32, %rax1289; AVX1-NEXT:    orq %rcx, %rax1290; AVX1-NEXT:    vpsllw $7, %xmm2, %xmm01291; AVX1-NEXT:    vpmovmskb %xmm0, %ecx1292; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm01293; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm01294; AVX1-NEXT:    vpmovmskb %xmm0, %edx1295; AVX1-NEXT:    shll $16, %edx1296; AVX1-NEXT:    orl %ecx, %edx1297; AVX1-NEXT:    vpsllw $7, %xmm3, %xmm01298; AVX1-NEXT:    vpmovmskb %xmm0, %ecx1299; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm01300; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm01301; AVX1-NEXT:    vpmovmskb %xmm0, %esi1302; AVX1-NEXT:    shll $16, %esi1303; AVX1-NEXT:    orl %ecx, %esi1304; AVX1-NEXT:    shlq $32, %rsi1305; AVX1-NEXT:    orq %rdx, %rsi1306; AVX1-NEXT:    vmovq %rsi, %xmm01307; AVX1-NEXT:    vmovq %rax, %xmm11308; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]1309; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm11310; AVX1-NEXT:    vptest %xmm1, %xmm01311; AVX1-NEXT:    setae %al1312; AVX1-NEXT:    vzeroupper1313; AVX1-NEXT:    retq1314;1315; AVX2-LABEL: trunc_v128i8_cmp:1316; AVX2:       # %bb.0:1317; AVX2-NEXT:    vpsllw $7, %ymm1, %ymm11318; AVX2-NEXT:    vpmovmskb %ymm1, %eax1319; AVX2-NEXT:    shlq $32, %rax1320; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm01321; AVX2-NEXT:    vpmovmskb %ymm0, %ecx1322; AVX2-NEXT:    orq %rax, %rcx1323; AVX2-NEXT:    vpsllw $7, %ymm3, %ymm01324; AVX2-NEXT:    vpmovmskb %ymm0, %eax1325; AVX2-NEXT:    shlq $32, %rax1326; AVX2-NEXT:    vpsllw $7, %ymm2, %ymm01327; AVX2-NEXT:    vpmovmskb %ymm0, %edx1328; AVX2-NEXT:    orq %rax, %rdx1329; AVX2-NEXT:    vmovq %rdx, %xmm01330; AVX2-NEXT:    vmovq %rcx, %xmm11331; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]1332; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm11333; AVX2-NEXT:    vptest %xmm1, %xmm01334; AVX2-NEXT:    setae %al1335; AVX2-NEXT:    vzeroupper1336; AVX2-NEXT:    retq1337;1338; AVX512-LABEL: trunc_v128i8_cmp:1339; AVX512:       # %bb.0:1340; AVX512-NEXT:    vpsllw $7, %zmm0, %zmm01341; AVX512-NEXT:    vpmovb2m %zmm0, %k01342; AVX512-NEXT:    kmovq %k0, %rax1343; AVX512-NEXT:    vpsllw $7, %zmm1, %zmm01344; AVX512-NEXT:    vpmovb2m %zmm0, %k01345; AVX512-NEXT:    kmovq %k0, %rcx1346; AVX512-NEXT:    vmovq %rcx, %xmm01347; AVX512-NEXT:    vmovq %rax, %xmm11348; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]1349; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm11350; AVX512-NEXT:    vptest %xmm1, %xmm01351; AVX512-NEXT:    setae %al1352; AVX512-NEXT:    vzeroupper1353; AVX512-NEXT:    retq1354  %1 = trunc <128 x i8> %a0 to <128 x i1>1355  %2 = bitcast <128 x i1> %1 to i1281356  %3 = icmp ne i128 %2, -11357  ret i1 %31358}1359 1360define [2 x i8] @PR58546(<16 x float> %a0) {1361; SSE-LABEL: PR58546:1362; SSE:       # %bb.0:1363; SSE-NEXT:    xorps %xmm4, %xmm41364; SSE-NEXT:    cmpunordps %xmm4, %xmm31365; SSE-NEXT:    cmpunordps %xmm4, %xmm21366; SSE-NEXT:    packssdw %xmm3, %xmm21367; SSE-NEXT:    cmpunordps %xmm4, %xmm11368; SSE-NEXT:    cmpunordps %xmm4, %xmm01369; SSE-NEXT:    packssdw %xmm1, %xmm01370; SSE-NEXT:    packsswb %xmm2, %xmm01371; SSE-NEXT:    pmovmskb %xmm0, %eax1372; SSE-NEXT:    movl %eax, %edx1373; SSE-NEXT:    shrl $8, %edx1374; SSE-NEXT:    # kill: def $al killed $al killed $eax1375; SSE-NEXT:    # kill: def $dl killed $dl killed $edx1376; SSE-NEXT:    retq1377;1378; AVX1-LABEL: PR58546:1379; AVX1:       # %bb.0:1380; AVX1-NEXT:    vxorps %xmm2, %xmm2, %xmm21381; AVX1-NEXT:    vcmpunordps %ymm2, %ymm1, %ymm11382; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm31383; AVX1-NEXT:    vpackssdw %xmm3, %xmm1, %xmm11384; AVX1-NEXT:    vcmpunordps %ymm2, %ymm0, %ymm01385; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21386; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm01387; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm01388; AVX1-NEXT:    vpmovmskb %xmm0, %eax1389; AVX1-NEXT:    movl %eax, %edx1390; AVX1-NEXT:    shrl $8, %edx1391; AVX1-NEXT:    # kill: def $al killed $al killed $eax1392; AVX1-NEXT:    # kill: def $dl killed $dl killed $edx1393; AVX1-NEXT:    vzeroupper1394; AVX1-NEXT:    retq1395;1396; AVX2-LABEL: PR58546:1397; AVX2:       # %bb.0:1398; AVX2-NEXT:    vxorps %xmm2, %xmm2, %xmm21399; AVX2-NEXT:    vcmpunordps %ymm2, %ymm1, %ymm11400; AVX2-NEXT:    vcmpunordps %ymm2, %ymm0, %ymm01401; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm01402; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11403; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm01404; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]1405; AVX2-NEXT:    vpmovmskb %xmm0, %eax1406; AVX2-NEXT:    movl %eax, %edx1407; AVX2-NEXT:    shrl $8, %edx1408; AVX2-NEXT:    # kill: def $al killed $al killed $eax1409; AVX2-NEXT:    # kill: def $dl killed $dl killed $edx1410; AVX2-NEXT:    vzeroupper1411; AVX2-NEXT:    retq1412;1413; AVX512-LABEL: PR58546:1414; AVX512:       # %bb.0:1415; AVX512-NEXT:    vxorps %xmm1, %xmm1, %xmm11416; AVX512-NEXT:    vcmpunordps %zmm1, %zmm0, %k01417; AVX512-NEXT:    kshiftrw $8, %k0, %k11418; AVX512-NEXT:    kmovd %k0, %eax1419; AVX512-NEXT:    kmovd %k1, %edx1420; AVX512-NEXT:    # kill: def $al killed $al killed $eax1421; AVX512-NEXT:    # kill: def $dl killed $dl killed $edx1422; AVX512-NEXT:    vzeroupper1423; AVX512-NEXT:    retq1424  %1 = fcmp uno <16 x float> %a0, zeroinitializer1425  %2 = bitcast <16 x i1> %1 to <2 x i8>1426  %3 = extractelement <2 x i8> %2, i64 01427  %4 = extractelement <2 x i8> %2, i64 11428  %5 = insertvalue [2 x i8] poison, i8 %3, 01429  %6 = insertvalue [2 x i8] %5, i8 %4, 11430  ret [2 x i8] %61431}1432 1433define i8 @PR59526(<8 x i32> %a, <8 x i32> %b, ptr %mask) {1434; SSE-LABEL: PR59526:1435; SSE:       # %bb.0:1436; SSE-NEXT:    pcmpeqd %xmm2, %xmm01437; SSE-NEXT:    pcmpeqd %xmm3, %xmm11438; SSE-NEXT:    movdqu (%rdi), %xmm21439; SSE-NEXT:    pand %xmm0, %xmm21440; SSE-NEXT:    movdqu 16(%rdi), %xmm01441; SSE-NEXT:    pand %xmm1, %xmm01442; SSE-NEXT:    packssdw %xmm0, %xmm21443; SSE-NEXT:    pmovmskb %xmm2, %eax1444; SSE-NEXT:    testl $43690, %eax # imm = 0xAAAA1445; SSE-NEXT:    setne %al1446; SSE-NEXT:    retq1447;1448; AVX1-LABEL: PR59526:1449; AVX1:       # %bb.0:1450; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm21451; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm31452; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm3, %xmm21453; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm01454; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01455; AVX1-NEXT:    vtestps (%rdi), %ymm01456; AVX1-NEXT:    setne %al1457; AVX1-NEXT:    vzeroupper1458; AVX1-NEXT:    retq1459;1460; AVX2-LABEL: PR59526:1461; AVX2:       # %bb.0:1462; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm01463; AVX2-NEXT:    vtestps (%rdi), %ymm01464; AVX2-NEXT:    setne %al1465; AVX2-NEXT:    vzeroupper1466; AVX2-NEXT:    retq1467;1468; AVX512-LABEL: PR59526:1469; AVX512:       # %bb.0:1470; AVX512-NEXT:    vpcmpeqd %ymm1, %ymm0, %k11471; AVX512-NEXT:    vpxor %xmm0, %xmm0, %xmm01472; AVX512-NEXT:    vpcmpgtd (%rdi), %ymm0, %k0 {%k1}1473; AVX512-NEXT:    kmovd %k0, %eax1474; AVX512-NEXT:    testb %al, %al1475; AVX512-NEXT:    setne %al1476; AVX512-NEXT:    vzeroupper1477; AVX512-NEXT:    retq1478  %cmp.eq = icmp eq <8 x i32> %a, %b1479  %load = load <8 x i32>, ptr %mask, align 11480  %cmp.slt = icmp slt <8 x i32> %load, zeroinitializer1481  %sel = select <8 x i1> %cmp.eq, <8 x i1> %cmp.slt, <8 x i1> zeroinitializer1482  %bc = bitcast <8 x i1> %sel to i81483  %cmp = icmp ne i8 %bc, 01484  %conv = zext i1 %cmp to i81485  ret i8 %conv1486}1487