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