brintos

brintos / llvm-project-archived public Read only

0
0
Text · 21.5 KiB · 58bf0b6 Raw
662 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=SSE3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX25; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW7 8define i32 @v32i16(<32 x i16> %a, <32 x i16> %b) {9; SSE-LABEL: v32i16:10; SSE:       # %bb.0:11; SSE-NEXT:    pcmpgtw %xmm5, %xmm112; SSE-NEXT:    pcmpgtw %xmm4, %xmm013; SSE-NEXT:    packsswb %xmm1, %xmm014; SSE-NEXT:    pmovmskb %xmm0, %ecx15; SSE-NEXT:    pcmpgtw %xmm7, %xmm316; SSE-NEXT:    pcmpgtw %xmm6, %xmm217; SSE-NEXT:    packsswb %xmm3, %xmm218; SSE-NEXT:    pmovmskb %xmm2, %eax19; SSE-NEXT:    shll $16, %eax20; SSE-NEXT:    orl %ecx, %eax21; SSE-NEXT:    retq22;23; AVX1-LABEL: v32i16:24; AVX1:       # %bb.0:25; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm426; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm527; AVX1-NEXT:    vpcmpgtw %xmm4, %xmm5, %xmm428; AVX1-NEXT:    vpcmpgtw %xmm2, %xmm0, %xmm029; AVX1-NEXT:    vpacksswb %xmm4, %xmm0, %xmm030; AVX1-NEXT:    vpmovmskb %xmm0, %ecx31; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm032; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm233; AVX1-NEXT:    vpcmpgtw %xmm0, %xmm2, %xmm034; AVX1-NEXT:    vpcmpgtw %xmm3, %xmm1, %xmm135; AVX1-NEXT:    vpacksswb %xmm0, %xmm1, %xmm036; AVX1-NEXT:    vpmovmskb %xmm0, %eax37; AVX1-NEXT:    shll $16, %eax38; AVX1-NEXT:    orl %ecx, %eax39; AVX1-NEXT:    vzeroupper40; AVX1-NEXT:    retq41;42; AVX2-LABEL: v32i16:43; AVX2:       # %bb.0:44; AVX2-NEXT:    vpcmpgtw %ymm3, %ymm1, %ymm145; AVX2-NEXT:    vpcmpgtw %ymm2, %ymm0, %ymm046; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm047; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]48; AVX2-NEXT:    vpmovmskb %ymm0, %eax49; AVX2-NEXT:    vzeroupper50; AVX2-NEXT:    retq51;52; AVX512F-LABEL: v32i16:53; AVX512F:       # %bb.0:54; AVX512F-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm255; AVX512F-NEXT:    vpmovsxwd %ymm2, %zmm256; AVX512F-NEXT:    vptestmd %zmm2, %zmm2, %k057; AVX512F-NEXT:    kmovw %k0, %ecx58; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm159; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm060; AVX512F-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm061; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm062; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k063; AVX512F-NEXT:    kmovw %k0, %eax64; AVX512F-NEXT:    shll $16, %eax65; AVX512F-NEXT:    orl %ecx, %eax66; AVX512F-NEXT:    vzeroupper67; AVX512F-NEXT:    retq68;69; AVX512BW-LABEL: v32i16:70; AVX512BW:       # %bb.0:71; AVX512BW-NEXT:    vpcmpgtw %zmm1, %zmm0, %k072; AVX512BW-NEXT:    kmovd %k0, %eax73; AVX512BW-NEXT:    vzeroupper74; AVX512BW-NEXT:    retq75  %x = icmp sgt <32 x i16> %a, %b76  %res = bitcast <32 x i1> %x to i3277  ret i32 %res78}79 80define i16 @v16i32(<16 x i32> %a, <16 x i32> %b) {81; SSE-LABEL: v16i32:82; SSE:       # %bb.0:83; SSE-NEXT:    pcmpgtd %xmm7, %xmm384; SSE-NEXT:    pcmpgtd %xmm6, %xmm285; SSE-NEXT:    packssdw %xmm3, %xmm286; SSE-NEXT:    pcmpgtd %xmm5, %xmm187; SSE-NEXT:    pcmpgtd %xmm4, %xmm088; SSE-NEXT:    packssdw %xmm1, %xmm089; SSE-NEXT:    packsswb %xmm2, %xmm090; SSE-NEXT:    pmovmskb %xmm0, %eax91; SSE-NEXT:    # kill: def $ax killed $ax killed $eax92; SSE-NEXT:    retq93;94; AVX1-LABEL: v16i32:95; AVX1:       # %bb.0:96; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm497; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm598; AVX1-NEXT:    vpcmpgtd %xmm4, %xmm5, %xmm499; AVX1-NEXT:    vpcmpgtd %xmm3, %xmm1, %xmm1100; AVX1-NEXT:    vpackssdw %xmm4, %xmm1, %xmm1101; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3102; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4103; AVX1-NEXT:    vpcmpgtd %xmm3, %xmm4, %xmm3104; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm0, %xmm0105; AVX1-NEXT:    vpackssdw %xmm3, %xmm0, %xmm0106; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0107; AVX1-NEXT:    vpmovmskb %xmm0, %eax108; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax109; AVX1-NEXT:    vzeroupper110; AVX1-NEXT:    retq111;112; AVX2-LABEL: v16i32:113; AVX2:       # %bb.0:114; AVX2-NEXT:    vpcmpgtd %ymm3, %ymm1, %ymm1115; AVX2-NEXT:    vpcmpgtd %ymm2, %ymm0, %ymm0116; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0117; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1118; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0119; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]120; AVX2-NEXT:    vpmovmskb %xmm0, %eax121; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax122; AVX2-NEXT:    vzeroupper123; AVX2-NEXT:    retq124;125; AVX512F-LABEL: v16i32:126; AVX512F:       # %bb.0:127; AVX512F-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0128; AVX512F-NEXT:    kmovw %k0, %eax129; AVX512F-NEXT:    # kill: def $ax killed $ax killed $eax130; AVX512F-NEXT:    vzeroupper131; AVX512F-NEXT:    retq132;133; AVX512BW-LABEL: v16i32:134; AVX512BW:       # %bb.0:135; AVX512BW-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0136; AVX512BW-NEXT:    kmovd %k0, %eax137; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax138; AVX512BW-NEXT:    vzeroupper139; AVX512BW-NEXT:    retq140  %x = icmp sgt <16 x i32> %a, %b141  %res = bitcast <16 x i1> %x to i16142  ret i16 %res143}144 145define i16 @v16f32(<16 x float> %a, <16 x float> %b) {146; SSE-LABEL: v16f32:147; SSE:       # %bb.0:148; SSE-NEXT:    cmpltps %xmm3, %xmm7149; SSE-NEXT:    cmpltps %xmm2, %xmm6150; SSE-NEXT:    packssdw %xmm7, %xmm6151; SSE-NEXT:    cmpltps %xmm1, %xmm5152; SSE-NEXT:    cmpltps %xmm0, %xmm4153; SSE-NEXT:    packssdw %xmm5, %xmm4154; SSE-NEXT:    packsswb %xmm6, %xmm4155; SSE-NEXT:    pmovmskb %xmm4, %eax156; SSE-NEXT:    # kill: def $ax killed $ax killed $eax157; SSE-NEXT:    retq158;159; AVX1-LABEL: v16f32:160; AVX1:       # %bb.0:161; AVX1-NEXT:    vcmpltps %ymm1, %ymm3, %ymm1162; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3163; AVX1-NEXT:    vpackssdw %xmm3, %xmm1, %xmm1164; AVX1-NEXT:    vcmpltps %ymm0, %ymm2, %ymm0165; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2166; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0167; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0168; AVX1-NEXT:    vpmovmskb %xmm0, %eax169; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax170; AVX1-NEXT:    vzeroupper171; AVX1-NEXT:    retq172;173; AVX2-LABEL: v16f32:174; AVX2:       # %bb.0:175; AVX2-NEXT:    vcmpltps %ymm1, %ymm3, %ymm1176; AVX2-NEXT:    vcmpltps %ymm0, %ymm2, %ymm0177; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0178; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1179; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0180; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]181; AVX2-NEXT:    vpmovmskb %xmm0, %eax182; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax183; AVX2-NEXT:    vzeroupper184; AVX2-NEXT:    retq185;186; AVX512F-LABEL: v16f32:187; AVX512F:       # %bb.0:188; AVX512F-NEXT:    vcmpltps %zmm0, %zmm1, %k0189; AVX512F-NEXT:    kmovw %k0, %eax190; AVX512F-NEXT:    # kill: def $ax killed $ax killed $eax191; AVX512F-NEXT:    vzeroupper192; AVX512F-NEXT:    retq193;194; AVX512BW-LABEL: v16f32:195; AVX512BW:       # %bb.0:196; AVX512BW-NEXT:    vcmpltps %zmm0, %zmm1, %k0197; AVX512BW-NEXT:    kmovd %k0, %eax198; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax199; AVX512BW-NEXT:    vzeroupper200; AVX512BW-NEXT:    retq201  %x = fcmp ogt <16 x float> %a, %b202  %res = bitcast <16 x i1> %x to i16203  ret i16 %res204}205 206define i64 @v64i8(<64 x i8> %a, <64 x i8> %b) {207; SSE-LABEL: v64i8:208; SSE:       # %bb.0:209; SSE-NEXT:    pcmpgtb %xmm4, %xmm0210; SSE-NEXT:    pmovmskb %xmm0, %eax211; SSE-NEXT:    pcmpgtb %xmm5, %xmm1212; SSE-NEXT:    pmovmskb %xmm1, %ecx213; SSE-NEXT:    shll $16, %ecx214; SSE-NEXT:    orl %eax, %ecx215; SSE-NEXT:    pcmpgtb %xmm6, %xmm2216; SSE-NEXT:    pmovmskb %xmm2, %edx217; SSE-NEXT:    pcmpgtb %xmm7, %xmm3218; SSE-NEXT:    pmovmskb %xmm3, %eax219; SSE-NEXT:    shll $16, %eax220; SSE-NEXT:    orl %edx, %eax221; SSE-NEXT:    shlq $32, %rax222; SSE-NEXT:    orq %rcx, %rax223; SSE-NEXT:    retq224;225; AVX1-LABEL: v64i8:226; AVX1:       # %bb.0:227; AVX1-NEXT:    vpcmpgtb %xmm2, %xmm0, %xmm4228; AVX1-NEXT:    vpmovmskb %xmm4, %eax229; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2230; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0231; AVX1-NEXT:    vpcmpgtb %xmm2, %xmm0, %xmm0232; AVX1-NEXT:    vpmovmskb %xmm0, %ecx233; AVX1-NEXT:    shll $16, %ecx234; AVX1-NEXT:    orl %eax, %ecx235; AVX1-NEXT:    vpcmpgtb %xmm3, %xmm1, %xmm0236; AVX1-NEXT:    vpmovmskb %xmm0, %edx237; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm0238; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1239; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0240; AVX1-NEXT:    vpmovmskb %xmm0, %eax241; AVX1-NEXT:    shll $16, %eax242; AVX1-NEXT:    orl %edx, %eax243; AVX1-NEXT:    shlq $32, %rax244; AVX1-NEXT:    orq %rcx, %rax245; AVX1-NEXT:    vzeroupper246; AVX1-NEXT:    retq247;248; AVX2-LABEL: v64i8:249; AVX2:       # %bb.0:250; AVX2-NEXT:    vpcmpgtb %ymm2, %ymm0, %ymm0251; AVX2-NEXT:    vpmovmskb %ymm0, %ecx252; AVX2-NEXT:    vpcmpgtb %ymm3, %ymm1, %ymm0253; AVX2-NEXT:    vpmovmskb %ymm0, %eax254; AVX2-NEXT:    shlq $32, %rax255; AVX2-NEXT:    orq %rcx, %rax256; AVX2-NEXT:    vzeroupper257; AVX2-NEXT:    retq258;259; AVX512F-LABEL: v64i8:260; AVX512F:       # %bb.0:261; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2262; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm3263; AVX512F-NEXT:    vpcmpgtb %ymm2, %ymm3, %ymm2264; AVX512F-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm0265; AVX512F-NEXT:    vpmovmskb %ymm0, %ecx266; AVX512F-NEXT:    vpmovmskb %ymm2, %eax267; AVX512F-NEXT:    shlq $32, %rax268; AVX512F-NEXT:    orq %rcx, %rax269; AVX512F-NEXT:    vzeroupper270; AVX512F-NEXT:    retq271;272; AVX512BW-LABEL: v64i8:273; AVX512BW:       # %bb.0:274; AVX512BW-NEXT:    vpcmpgtb %zmm1, %zmm0, %k0275; AVX512BW-NEXT:    kmovq %k0, %rax276; AVX512BW-NEXT:    vzeroupper277; AVX512BW-NEXT:    retq278  %x = icmp sgt <64 x i8> %a, %b279  %res = bitcast <64 x i1> %x to i64280  ret i64 %res281}282 283define i8 @v8i64(<8 x i64> %a, <8 x i64> %b) {284; SSE-LABEL: v8i64:285; SSE:       # %bb.0:286; SSE-NEXT:    pcmpgtq %xmm7, %xmm3287; SSE-NEXT:    pcmpgtq %xmm6, %xmm2288; SSE-NEXT:    packssdw %xmm3, %xmm2289; SSE-NEXT:    pcmpgtq %xmm5, %xmm1290; SSE-NEXT:    pcmpgtq %xmm4, %xmm0291; SSE-NEXT:    packssdw %xmm1, %xmm0292; SSE-NEXT:    packssdw %xmm2, %xmm0293; SSE-NEXT:    packsswb %xmm0, %xmm0294; SSE-NEXT:    pmovmskb %xmm0, %eax295; SSE-NEXT:    # kill: def $al killed $al killed $eax296; SSE-NEXT:    retq297;298; AVX1-LABEL: v8i64:299; AVX1:       # %bb.0:300; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4301; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5302; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4303; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm1304; AVX1-NEXT:    vpackssdw %xmm4, %xmm1, %xmm1305; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3306; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4307; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3308; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm0309; AVX1-NEXT:    vpackssdw %xmm3, %xmm0, %xmm0310; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0311; AVX1-NEXT:    vmovmskps %ymm0, %eax312; AVX1-NEXT:    # kill: def $al killed $al killed $eax313; AVX1-NEXT:    vzeroupper314; AVX1-NEXT:    retq315;316; AVX2-LABEL: v8i64:317; AVX2:       # %bb.0:318; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm1, %ymm1319; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm0320; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0321; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]322; AVX2-NEXT:    vmovmskps %ymm0, %eax323; AVX2-NEXT:    # kill: def $al killed $al killed $eax324; AVX2-NEXT:    vzeroupper325; AVX2-NEXT:    retq326;327; AVX512F-LABEL: v8i64:328; AVX512F:       # %bb.0:329; AVX512F-NEXT:    vpcmpgtq %zmm1, %zmm0, %k0330; AVX512F-NEXT:    kmovw %k0, %eax331; AVX512F-NEXT:    # kill: def $al killed $al killed $eax332; AVX512F-NEXT:    vzeroupper333; AVX512F-NEXT:    retq334;335; AVX512BW-LABEL: v8i64:336; AVX512BW:       # %bb.0:337; AVX512BW-NEXT:    vpcmpgtq %zmm1, %zmm0, %k0338; AVX512BW-NEXT:    kmovd %k0, %eax339; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax340; AVX512BW-NEXT:    vzeroupper341; AVX512BW-NEXT:    retq342  %x = icmp sgt <8 x i64> %a, %b343  %res = bitcast <8 x i1> %x to i8344  ret i8 %res345}346 347define i8 @v8f64(<8 x double> %a, <8 x double> %b) {348; SSE-LABEL: v8f64:349; SSE:       # %bb.0:350; SSE-NEXT:    cmpltpd %xmm3, %xmm7351; SSE-NEXT:    cmpltpd %xmm2, %xmm6352; SSE-NEXT:    packssdw %xmm7, %xmm6353; SSE-NEXT:    cmpltpd %xmm1, %xmm5354; SSE-NEXT:    cmpltpd %xmm0, %xmm4355; SSE-NEXT:    packssdw %xmm5, %xmm4356; SSE-NEXT:    packssdw %xmm6, %xmm4357; SSE-NEXT:    packsswb %xmm4, %xmm4358; SSE-NEXT:    pmovmskb %xmm4, %eax359; SSE-NEXT:    # kill: def $al killed $al killed $eax360; SSE-NEXT:    retq361;362; AVX1-LABEL: v8f64:363; AVX1:       # %bb.0:364; AVX1-NEXT:    vcmpltpd %ymm1, %ymm3, %ymm1365; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3366; AVX1-NEXT:    vpackssdw %xmm3, %xmm1, %xmm1367; AVX1-NEXT:    vcmpltpd %ymm0, %ymm2, %ymm0368; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2369; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0370; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0371; AVX1-NEXT:    vmovmskps %ymm0, %eax372; AVX1-NEXT:    # kill: def $al killed $al killed $eax373; AVX1-NEXT:    vzeroupper374; AVX1-NEXT:    retq375;376; AVX2-LABEL: v8f64:377; AVX2:       # %bb.0:378; AVX2-NEXT:    vcmpltpd %ymm1, %ymm3, %ymm1379; AVX2-NEXT:    vcmpltpd %ymm0, %ymm2, %ymm0380; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0381; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]382; AVX2-NEXT:    vmovmskps %ymm0, %eax383; AVX2-NEXT:    # kill: def $al killed $al killed $eax384; AVX2-NEXT:    vzeroupper385; AVX2-NEXT:    retq386;387; AVX512F-LABEL: v8f64:388; AVX512F:       # %bb.0:389; AVX512F-NEXT:    vcmpltpd %zmm0, %zmm1, %k0390; AVX512F-NEXT:    kmovw %k0, %eax391; AVX512F-NEXT:    # kill: def $al killed $al killed $eax392; AVX512F-NEXT:    vzeroupper393; AVX512F-NEXT:    retq394;395; AVX512BW-LABEL: v8f64:396; AVX512BW:       # %bb.0:397; AVX512BW-NEXT:    vcmpltpd %zmm0, %zmm1, %k0398; AVX512BW-NEXT:    kmovd %k0, %eax399; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax400; AVX512BW-NEXT:    vzeroupper401; AVX512BW-NEXT:    retq402  %x = fcmp ogt <8 x double> %a, %b403  %res = bitcast <8 x i1> %x to i8404  ret i8 %res405}406 407define void @bitcast_64i8_store(ptr %p, <64 x i8> %a0) {408; SSE-LABEL: bitcast_64i8_store:409; SSE:       # %bb.0:410; SSE-NEXT:    pmovmskb %xmm0, %eax411; SSE-NEXT:    pmovmskb %xmm1, %ecx412; SSE-NEXT:    shll $16, %ecx413; SSE-NEXT:    orl %eax, %ecx414; SSE-NEXT:    pmovmskb %xmm2, %eax415; SSE-NEXT:    pmovmskb %xmm3, %edx416; SSE-NEXT:    shll $16, %edx417; SSE-NEXT:    orl %eax, %edx418; SSE-NEXT:    shlq $32, %rdx419; SSE-NEXT:    orq %rcx, %rdx420; SSE-NEXT:    movq %rdx, (%rdi)421; SSE-NEXT:    retq422;423; AVX1-LABEL: bitcast_64i8_store:424; AVX1:       # %bb.0:425; AVX1-NEXT:    vpmovmskb %xmm0, %eax426; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0427; AVX1-NEXT:    vpmovmskb %xmm0, %ecx428; AVX1-NEXT:    shll $16, %ecx429; AVX1-NEXT:    orl %eax, %ecx430; AVX1-NEXT:    vpmovmskb %xmm1, %eax431; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm0432; AVX1-NEXT:    vpmovmskb %xmm0, %edx433; AVX1-NEXT:    shll $16, %edx434; AVX1-NEXT:    orl %eax, %edx435; AVX1-NEXT:    shlq $32, %rdx436; AVX1-NEXT:    orq %rcx, %rdx437; AVX1-NEXT:    movq %rdx, (%rdi)438; AVX1-NEXT:    vzeroupper439; AVX1-NEXT:    retq440;441; AVX2-LABEL: bitcast_64i8_store:442; AVX2:       # %bb.0:443; AVX2-NEXT:    vpmovmskb %ymm1, %eax444; AVX2-NEXT:    shlq $32, %rax445; AVX2-NEXT:    vpmovmskb %ymm0, %ecx446; AVX2-NEXT:    orq %rax, %rcx447; AVX2-NEXT:    movq %rcx, (%rdi)448; AVX2-NEXT:    vzeroupper449; AVX2-NEXT:    retq450;451; AVX512F-LABEL: bitcast_64i8_store:452; AVX512F:       # %bb.0:453; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1454; AVX512F-NEXT:    vpcmpgtb %ymm0, %ymm1, %ymm2455; AVX512F-NEXT:    vpmovsxbd %xmm2, %zmm3456; AVX512F-NEXT:    vptestmd %zmm3, %zmm3, %k0457; AVX512F-NEXT:    vextracti128 $1, %ymm2, %xmm2458; AVX512F-NEXT:    vpmovsxbd %xmm2, %zmm2459; AVX512F-NEXT:    vptestmd %zmm2, %zmm2, %k1460; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm0461; AVX512F-NEXT:    vpcmpgtb %ymm0, %ymm1, %ymm0462; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm1463; AVX512F-NEXT:    vptestmd %zmm1, %zmm1, %k2464; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0465; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0466; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k3467; AVX512F-NEXT:    kmovw %k3, 6(%rdi)468; AVX512F-NEXT:    kmovw %k2, 4(%rdi)469; AVX512F-NEXT:    kmovw %k1, 2(%rdi)470; AVX512F-NEXT:    kmovw %k0, (%rdi)471; AVX512F-NEXT:    vzeroupper472; AVX512F-NEXT:    retq473;474; AVX512BW-LABEL: bitcast_64i8_store:475; AVX512BW:       # %bb.0:476; AVX512BW-NEXT:    vpmovb2m %zmm0, %k0477; AVX512BW-NEXT:    kmovq %k0, (%rdi)478; AVX512BW-NEXT:    vzeroupper479; AVX512BW-NEXT:    retq480  %a1 = icmp slt <64 x i8> %a0, zeroinitializer481  %a2 = bitcast <64 x i1> %a1 to i64482  store i64 %a2, ptr %p483  ret void484}485 486define void @bitcast_32i16_store(ptr %p, <32 x i16> %a0) {487; SSE-LABEL: bitcast_32i16_store:488; SSE:       # %bb.0:489; SSE-NEXT:    packsswb %xmm1, %xmm0490; SSE-NEXT:    pmovmskb %xmm0, %eax491; SSE-NEXT:    packsswb %xmm3, %xmm2492; SSE-NEXT:    pmovmskb %xmm2, %ecx493; SSE-NEXT:    shll $16, %ecx494; SSE-NEXT:    orl %eax, %ecx495; SSE-NEXT:    movl %ecx, (%rdi)496; SSE-NEXT:    retq497;498; AVX1-LABEL: bitcast_32i16_store:499; AVX1:       # %bb.0:500; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2501; AVX1-NEXT:    vpacksswb %xmm2, %xmm0, %xmm0502; AVX1-NEXT:    vpmovmskb %xmm0, %eax503; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm0504; AVX1-NEXT:    vpacksswb %xmm0, %xmm1, %xmm0505; AVX1-NEXT:    vpmovmskb %xmm0, %ecx506; AVX1-NEXT:    shll $16, %ecx507; AVX1-NEXT:    orl %eax, %ecx508; AVX1-NEXT:    movl %ecx, (%rdi)509; AVX1-NEXT:    vzeroupper510; AVX1-NEXT:    retq511;512; AVX2-LABEL: bitcast_32i16_store:513; AVX2:       # %bb.0:514; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0515; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]516; AVX2-NEXT:    vpmovmskb %ymm0, %eax517; AVX2-NEXT:    movl %eax, (%rdi)518; AVX2-NEXT:    vzeroupper519; AVX2-NEXT:    retq520;521; AVX512F-LABEL: bitcast_32i16_store:522; AVX512F:       # %bb.0:523; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1524; AVX512F-NEXT:    vpcmpgtw %ymm0, %ymm1, %ymm2525; AVX512F-NEXT:    vpmovsxwd %ymm2, %zmm2526; AVX512F-NEXT:    vptestmd %zmm2, %zmm2, %k0527; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm0528; AVX512F-NEXT:    vpcmpgtw %ymm0, %ymm1, %ymm0529; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0530; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1531; AVX512F-NEXT:    kmovw %k1, 2(%rdi)532; AVX512F-NEXT:    kmovw %k0, (%rdi)533; AVX512F-NEXT:    vzeroupper534; AVX512F-NEXT:    retq535;536; AVX512BW-LABEL: bitcast_32i16_store:537; AVX512BW:       # %bb.0:538; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0539; AVX512BW-NEXT:    kmovd %k0, (%rdi)540; AVX512BW-NEXT:    vzeroupper541; AVX512BW-NEXT:    retq542  %a1 = icmp slt <32 x i16> %a0, zeroinitializer543  %a2 = bitcast <32 x i1> %a1 to i32544  store i32 %a2, ptr %p545  ret void546}547 548define void @bitcast_16i32_store(ptr %p, <16 x i32> %a0) {549; SSE-LABEL: bitcast_16i32_store:550; SSE:       # %bb.0:551; SSE-NEXT:    packssdw %xmm3, %xmm2552; SSE-NEXT:    packssdw %xmm1, %xmm0553; SSE-NEXT:    packsswb %xmm2, %xmm0554; SSE-NEXT:    pmovmskb %xmm0, %eax555; SSE-NEXT:    movw %ax, (%rdi)556; SSE-NEXT:    retq557;558; AVX1-LABEL: bitcast_16i32_store:559; AVX1:       # %bb.0:560; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2561; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1562; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2563; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0564; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0565; AVX1-NEXT:    vpmovmskb %xmm0, %eax566; AVX1-NEXT:    movw %ax, (%rdi)567; AVX1-NEXT:    vzeroupper568; AVX1-NEXT:    retq569;570; AVX2-LABEL: bitcast_16i32_store:571; AVX2:       # %bb.0:572; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2573; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm2, %ymm1574; AVX2-NEXT:    vpcmpgtd %ymm0, %ymm2, %ymm0575; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0576; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1577; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0578; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]579; AVX2-NEXT:    vpmovmskb %xmm0, %eax580; AVX2-NEXT:    movw %ax, (%rdi)581; AVX2-NEXT:    vzeroupper582; AVX2-NEXT:    retq583;584; AVX512-LABEL: bitcast_16i32_store:585; AVX512:       # %bb.0:586; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1587; AVX512-NEXT:    vpcmpgtd %zmm0, %zmm1, %k0588; AVX512-NEXT:    kmovw %k0, (%rdi)589; AVX512-NEXT:    vzeroupper590; AVX512-NEXT:    retq591  %a1 = icmp slt <16 x i32> %a0, zeroinitializer592  %a2 = bitcast <16 x i1> %a1 to i16593  store i16 %a2, ptr %p594  ret void595}596 597define void @bitcast_8i64_store(ptr %p, <8 x i64> %a0) {598; SSE-LABEL: bitcast_8i64_store:599; SSE:       # %bb.0:600; SSE-NEXT:    pxor %xmm4, %xmm4601; SSE-NEXT:    pxor %xmm5, %xmm5602; SSE-NEXT:    pcmpgtq %xmm3, %xmm5603; SSE-NEXT:    pxor %xmm3, %xmm3604; SSE-NEXT:    pcmpgtq %xmm2, %xmm3605; SSE-NEXT:    packssdw %xmm5, %xmm3606; SSE-NEXT:    pxor %xmm2, %xmm2607; SSE-NEXT:    pcmpgtq %xmm1, %xmm2608; SSE-NEXT:    pcmpgtq %xmm0, %xmm4609; SSE-NEXT:    packssdw %xmm2, %xmm4610; SSE-NEXT:    packssdw %xmm3, %xmm4611; SSE-NEXT:    packsswb %xmm4, %xmm4612; SSE-NEXT:    pmovmskb %xmm4, %eax613; SSE-NEXT:    movb %al, (%rdi)614; SSE-NEXT:    retq615;616; AVX1-LABEL: bitcast_8i64_store:617; AVX1:       # %bb.0:618; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2619; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3620; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2621; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm0622; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0623; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2624; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1625; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0626; AVX1-NEXT:    vmovmskps %ymm0, %eax627; AVX1-NEXT:    movb %al, (%rdi)628; AVX1-NEXT:    vzeroupper629; AVX1-NEXT:    retq630;631; AVX2-LABEL: bitcast_8i64_store:632; AVX2:       # %bb.0:633; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0634; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]635; AVX2-NEXT:    vmovmskps %ymm0, %eax636; AVX2-NEXT:    movb %al, (%rdi)637; AVX2-NEXT:    vzeroupper638; AVX2-NEXT:    retq639;640; AVX512F-LABEL: bitcast_8i64_store:641; AVX512F:       # %bb.0:642; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1643; AVX512F-NEXT:    vpcmpgtq %zmm0, %zmm1, %k0644; AVX512F-NEXT:    kmovw %k0, %eax645; AVX512F-NEXT:    movb %al, (%rdi)646; AVX512F-NEXT:    vzeroupper647; AVX512F-NEXT:    retq648;649; AVX512BW-LABEL: bitcast_8i64_store:650; AVX512BW:       # %bb.0:651; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1652; AVX512BW-NEXT:    vpcmpgtq %zmm0, %zmm1, %k0653; AVX512BW-NEXT:    kmovd %k0, %eax654; AVX512BW-NEXT:    movb %al, (%rdi)655; AVX512BW-NEXT:    vzeroupper656; AVX512BW-NEXT:    retq657  %a1 = icmp slt <8 x i64> %a0, zeroinitializer658  %a2 = bitcast <8 x i1> %a1 to i8659  store i8 %a2, ptr %p660  ret void661}662