4554 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-SSSE3,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSE2-SSSE3,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,AVX16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-SLOW7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST,AVX2-FAST-ALL8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST,AVX2-FAST-PERLANE9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL12; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=skx | FileCheck %s --check-prefixes=SKX17 18;19; PACKUS saturation truncation to vXi3220;21 22define <2 x i32> @trunc_packus_v2i64_v2i32(<2 x i64> %a0) {23; SSE2-SSSE3-LABEL: trunc_packus_v2i64_v2i32:24; SSE2-SSSE3: # %bb.0:25; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]26; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm227; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm228; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]29; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm430; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm431; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483647,2147483647]32; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm333; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]34; SSE2-SSSE3-NEXT: pand %xmm4, %xmm235; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]36; SSE2-SSSE3-NEXT: por %xmm2, %xmm337; SSE2-SSSE3-NEXT: pand %xmm3, %xmm038; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm339; SSE2-SSSE3-NEXT: por %xmm0, %xmm340; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm041; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm042; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm243; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm244; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm045; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]46; SSE2-SSSE3-NEXT: pand %xmm2, %xmm047; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]48; SSE2-SSSE3-NEXT: por %xmm0, %xmm149; SSE2-SSSE3-NEXT: pand %xmm3, %xmm150; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]51; SSE2-SSSE3-NEXT: retq52;53; SSE41-LABEL: trunc_packus_v2i64_v2i32:54; SSE41: # %bb.0:55; SSE41-NEXT: movdqa %xmm0, %xmm156; SSE41-NEXT: movapd {{.*#+}} xmm2 = [4294967295,4294967295]57; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]58; SSE41-NEXT: pxor %xmm3, %xmm059; SSE41-NEXT: pmovsxdq {{.*#+}} xmm4 = [2147483647,2147483647]60; SSE41-NEXT: movdqa %xmm0, %xmm561; SSE41-NEXT: pcmpeqd %xmm4, %xmm562; SSE41-NEXT: pcmpgtd %xmm0, %xmm463; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]64; SSE41-NEXT: pand %xmm5, %xmm065; SSE41-NEXT: por %xmm4, %xmm066; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm267; SSE41-NEXT: xorpd %xmm1, %xmm168; SSE41-NEXT: movapd %xmm2, %xmm469; SSE41-NEXT: xorpd %xmm3, %xmm470; SSE41-NEXT: movapd %xmm4, %xmm571; SSE41-NEXT: pcmpeqd %xmm3, %xmm572; SSE41-NEXT: pcmpgtd %xmm3, %xmm473; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]74; SSE41-NEXT: pand %xmm5, %xmm075; SSE41-NEXT: por %xmm4, %xmm076; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm177; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]78; SSE41-NEXT: retq79;80; AVX-LABEL: trunc_packus_v2i64_v2i32:81; AVX: # %bb.0:82; AVX-NEXT: vpmovsxbd {{.*#+}} xmm1 = [4294967295,0,4294967295,0]83; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm284; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm085; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm186; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm187; AVX-NEXT: vpand %xmm0, %xmm1, %xmm088; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]89; AVX-NEXT: retq90;91; AVX512F-LABEL: trunc_packus_v2i64_v2i32:92; AVX512F: # %bb.0:93; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm094; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm195; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm096; AVX512F-NEXT: vpmovusqd %zmm0, %ymm097; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm098; AVX512F-NEXT: vzeroupper99; AVX512F-NEXT: retq100;101; AVX512VL-LABEL: trunc_packus_v2i64_v2i32:102; AVX512VL: # %bb.0:103; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1104; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0105; AVX512VL-NEXT: vpmovusqd %xmm0, %xmm0106; AVX512VL-NEXT: retq107;108; AVX512BW-LABEL: trunc_packus_v2i64_v2i32:109; AVX512BW: # %bb.0:110; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0111; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1112; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0113; AVX512BW-NEXT: vpmovusqd %zmm0, %ymm0114; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0115; AVX512BW-NEXT: vzeroupper116; AVX512BW-NEXT: retq117;118; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i32:119; AVX512BWVL: # %bb.0:120; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1121; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0122; AVX512BWVL-NEXT: vpmovusqd %xmm0, %xmm0123; AVX512BWVL-NEXT: retq124;125; SKX-LABEL: trunc_packus_v2i64_v2i32:126; SKX: # %bb.0:127; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1128; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0129; SKX-NEXT: vpmovusqd %xmm0, %xmm0130; SKX-NEXT: retq131 %1 = icmp slt <2 x i64> %a0, <i64 4294967295, i64 4294967295>132 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 4294967295, i64 4294967295>133 %3 = icmp sgt <2 x i64> %2, zeroinitializer134 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer135 %5 = trunc <2 x i64> %4 to <2 x i32>136 ret <2 x i32> %5137}138 139define void @trunc_packus_v2i64_v2i32_store(<2 x i64> %a0, ptr %p1) {140; SSE2-SSSE3-LABEL: trunc_packus_v2i64_v2i32_store:141; SSE2-SSSE3: # %bb.0:142; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]143; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2144; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2145; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]146; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm4147; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4148; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483647,2147483647]149; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm3150; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]151; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2152; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]153; SSE2-SSSE3-NEXT: por %xmm2, %xmm3154; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0155; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3156; SSE2-SSSE3-NEXT: por %xmm0, %xmm3157; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm0158; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0159; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2160; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm2161; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0162; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]163; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0164; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]165; SSE2-SSSE3-NEXT: por %xmm0, %xmm1166; SSE2-SSSE3-NEXT: pand %xmm3, %xmm1167; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]168; SSE2-SSSE3-NEXT: movq %xmm0, (%rdi)169; SSE2-SSSE3-NEXT: retq170;171; SSE41-LABEL: trunc_packus_v2i64_v2i32_store:172; SSE41: # %bb.0:173; SSE41-NEXT: movdqa %xmm0, %xmm1174; SSE41-NEXT: movapd {{.*#+}} xmm2 = [4294967295,4294967295]175; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]176; SSE41-NEXT: pxor %xmm3, %xmm0177; SSE41-NEXT: pmovsxdq {{.*#+}} xmm4 = [2147483647,2147483647]178; SSE41-NEXT: movdqa %xmm0, %xmm5179; SSE41-NEXT: pcmpeqd %xmm4, %xmm5180; SSE41-NEXT: pcmpgtd %xmm0, %xmm4181; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]182; SSE41-NEXT: pand %xmm5, %xmm0183; SSE41-NEXT: por %xmm4, %xmm0184; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2185; SSE41-NEXT: xorpd %xmm1, %xmm1186; SSE41-NEXT: movapd %xmm2, %xmm4187; SSE41-NEXT: xorpd %xmm3, %xmm4188; SSE41-NEXT: movapd %xmm4, %xmm5189; SSE41-NEXT: pcmpeqd %xmm3, %xmm5190; SSE41-NEXT: pcmpgtd %xmm3, %xmm4191; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]192; SSE41-NEXT: pand %xmm5, %xmm0193; SSE41-NEXT: por %xmm4, %xmm0194; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1195; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]196; SSE41-NEXT: movq %xmm0, (%rdi)197; SSE41-NEXT: retq198;199; AVX-LABEL: trunc_packus_v2i64_v2i32_store:200; AVX: # %bb.0:201; AVX-NEXT: vpmovsxbd {{.*#+}} xmm1 = [4294967295,0,4294967295,0]202; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2203; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0204; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1205; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1206; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0207; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]208; AVX-NEXT: vmovq %xmm0, (%rdi)209; AVX-NEXT: retq210;211; AVX512F-LABEL: trunc_packus_v2i64_v2i32_store:212; AVX512F: # %bb.0:213; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0214; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1215; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0216; AVX512F-NEXT: vpmovusqd %zmm0, %ymm0217; AVX512F-NEXT: vmovq %xmm0, (%rdi)218; AVX512F-NEXT: vzeroupper219; AVX512F-NEXT: retq220;221; AVX512VL-LABEL: trunc_packus_v2i64_v2i32_store:222; AVX512VL: # %bb.0:223; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1224; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0225; AVX512VL-NEXT: vpmovusqd %xmm0, (%rdi)226; AVX512VL-NEXT: retq227;228; AVX512BW-LABEL: trunc_packus_v2i64_v2i32_store:229; AVX512BW: # %bb.0:230; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0231; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1232; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0233; AVX512BW-NEXT: vpmovusqd %zmm0, %ymm0234; AVX512BW-NEXT: vmovq %xmm0, (%rdi)235; AVX512BW-NEXT: vzeroupper236; AVX512BW-NEXT: retq237;238; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i32_store:239; AVX512BWVL: # %bb.0:240; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1241; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0242; AVX512BWVL-NEXT: vpmovusqd %xmm0, (%rdi)243; AVX512BWVL-NEXT: retq244;245; SKX-LABEL: trunc_packus_v2i64_v2i32_store:246; SKX: # %bb.0:247; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1248; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0249; SKX-NEXT: vpmovusqd %xmm0, (%rdi)250; SKX-NEXT: retq251 %1 = icmp slt <2 x i64> %a0, <i64 4294967295, i64 4294967295>252 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 4294967295, i64 4294967295>253 %3 = icmp sgt <2 x i64> %2, zeroinitializer254 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer255 %5 = trunc <2 x i64> %4 to <2 x i32>256 store <2 x i32> %5, ptr %p1257 ret void258}259 260define <4 x i32> @trunc_packus_v4i64_v4i32(<4 x i64> %a0) {261; SSE2-SSSE3-LABEL: trunc_packus_v4i64_v4i32:262; SSE2-SSSE3: # %bb.0:263; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [4294967295,4294967295]264; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]265; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm4266; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm4267; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]268; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm6269; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm5270; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147483647,2147483647]271; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm8272; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm8273; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm8[0,0,2,2]274; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4275; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]276; SSE2-SSSE3-NEXT: por %xmm4, %xmm5277; SSE2-SSSE3-NEXT: pand %xmm5, %xmm0278; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm5279; SSE2-SSSE3-NEXT: por %xmm5, %xmm0280; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4281; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm4282; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]283; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm5284; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm7285; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]286; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4287; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]288; SSE2-SSSE3-NEXT: por %xmm4, %xmm5289; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1290; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm5291; SSE2-SSSE3-NEXT: por %xmm1, %xmm5292; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm1293; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm1294; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm3295; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm3296; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1297; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]298; SSE2-SSSE3-NEXT: pand %xmm3, %xmm1299; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]300; SSE2-SSSE3-NEXT: por %xmm1, %xmm3301; SSE2-SSSE3-NEXT: pand %xmm5, %xmm3302; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1303; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm1304; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4305; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm4306; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1307; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]308; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1309; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]310; SSE2-SSSE3-NEXT: por %xmm1, %xmm2311; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0312; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]313; SSE2-SSSE3-NEXT: retq314;315; SSE41-LABEL: trunc_packus_v4i64_v4i32:316; SSE41: # %bb.0:317; SSE41-NEXT: movdqa %xmm0, %xmm2318; SSE41-NEXT: movapd {{.*#+}} xmm4 = [4294967295,4294967295]319; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]320; SSE41-NEXT: movdqa %xmm0, %xmm5321; SSE41-NEXT: pxor %xmm3, %xmm5322; SSE41-NEXT: pmovsxdq {{.*#+}} xmm6 = [2147483647,2147483647]323; SSE41-NEXT: movdqa %xmm6, %xmm7324; SSE41-NEXT: pcmpgtd %xmm5, %xmm7325; SSE41-NEXT: pcmpeqd %xmm6, %xmm5326; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]327; SSE41-NEXT: pand %xmm5, %xmm0328; SSE41-NEXT: por %xmm7, %xmm0329; SSE41-NEXT: movapd %xmm4, %xmm5330; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5331; SSE41-NEXT: movdqa %xmm1, %xmm0332; SSE41-NEXT: pxor %xmm3, %xmm0333; SSE41-NEXT: movdqa %xmm0, %xmm2334; SSE41-NEXT: pcmpeqd %xmm6, %xmm2335; SSE41-NEXT: pcmpgtd %xmm0, %xmm6336; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]337; SSE41-NEXT: pand %xmm2, %xmm0338; SSE41-NEXT: por %xmm6, %xmm0339; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4340; SSE41-NEXT: xorpd %xmm1, %xmm1341; SSE41-NEXT: movapd %xmm4, %xmm2342; SSE41-NEXT: xorpd %xmm3, %xmm2343; SSE41-NEXT: movapd %xmm2, %xmm6344; SSE41-NEXT: pcmpeqd %xmm3, %xmm6345; SSE41-NEXT: pcmpgtd %xmm3, %xmm2346; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]347; SSE41-NEXT: pand %xmm6, %xmm0348; SSE41-NEXT: por %xmm2, %xmm0349; SSE41-NEXT: pxor %xmm2, %xmm2350; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2351; SSE41-NEXT: movapd %xmm5, %xmm4352; SSE41-NEXT: xorpd %xmm3, %xmm4353; SSE41-NEXT: movapd %xmm4, %xmm6354; SSE41-NEXT: pcmpeqd %xmm3, %xmm6355; SSE41-NEXT: pcmpgtd %xmm3, %xmm4356; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]357; SSE41-NEXT: pand %xmm6, %xmm0358; SSE41-NEXT: por %xmm4, %xmm0359; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1360; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]361; SSE41-NEXT: movaps %xmm1, %xmm0362; SSE41-NEXT: retq363;364; AVX1-LABEL: trunc_packus_v4i64_v4i32:365; AVX1: # %bb.0:366; AVX1-NEXT: vpmovsxbd {{.*#+}} xmm1 = [4294967295,0,4294967295,0]367; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2368; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm2369; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0370; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm3371; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0372; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1373; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm3374; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm0375; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm1376; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1377; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm1[0,2],xmm0[0,2]378; AVX1-NEXT: vzeroupper379; AVX1-NEXT: retq380;381; AVX2-SLOW-LABEL: trunc_packus_v4i64_v4i32:382; AVX2-SLOW: # %bb.0:383; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]384; AVX2-SLOW-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2385; AVX2-SLOW-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0386; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm1, %xmm1387; AVX2-SLOW-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1388; AVX2-SLOW-NEXT: vpand %ymm0, %ymm1, %ymm0389; AVX2-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm1390; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]391; AVX2-SLOW-NEXT: vzeroupper392; AVX2-SLOW-NEXT: retq393;394; AVX2-FAST-ALL-LABEL: trunc_packus_v4i64_v4i32:395; AVX2-FAST-ALL: # %bb.0:396; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]397; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2398; AVX2-FAST-ALL-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0399; AVX2-FAST-ALL-NEXT: vpxor %xmm1, %xmm1, %xmm1400; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1401; AVX2-FAST-ALL-NEXT: vpand %ymm0, %ymm1, %ymm0402; AVX2-FAST-ALL-NEXT: vpmovsxbd {{.*#+}} ymm1 = [0,2,4,6,0,0,0,0]403; AVX2-FAST-ALL-NEXT: vpermd %ymm0, %ymm1, %ymm0404; AVX2-FAST-ALL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0405; AVX2-FAST-ALL-NEXT: vzeroupper406; AVX2-FAST-ALL-NEXT: retq407;408; AVX2-FAST-PERLANE-LABEL: trunc_packus_v4i64_v4i32:409; AVX2-FAST-PERLANE: # %bb.0:410; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]411; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2412; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0413; AVX2-FAST-PERLANE-NEXT: vpxor %xmm1, %xmm1, %xmm1414; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1415; AVX2-FAST-PERLANE-NEXT: vpand %ymm0, %ymm1, %ymm0416; AVX2-FAST-PERLANE-NEXT: vextracti128 $1, %ymm0, %xmm1417; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]418; AVX2-FAST-PERLANE-NEXT: vzeroupper419; AVX2-FAST-PERLANE-NEXT: retq420;421; AVX512F-LABEL: trunc_packus_v4i64_v4i32:422; AVX512F: # %bb.0:423; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0424; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1425; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0426; AVX512F-NEXT: vpmovusqd %zmm0, %ymm0427; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0428; AVX512F-NEXT: vzeroupper429; AVX512F-NEXT: retq430;431; AVX512VL-LABEL: trunc_packus_v4i64_v4i32:432; AVX512VL: # %bb.0:433; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1434; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0435; AVX512VL-NEXT: vpmovusqd %ymm0, %xmm0436; AVX512VL-NEXT: vzeroupper437; AVX512VL-NEXT: retq438;439; AVX512BW-LABEL: trunc_packus_v4i64_v4i32:440; AVX512BW: # %bb.0:441; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0442; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1443; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0444; AVX512BW-NEXT: vpmovusqd %zmm0, %ymm0445; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0446; AVX512BW-NEXT: vzeroupper447; AVX512BW-NEXT: retq448;449; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i32:450; AVX512BWVL: # %bb.0:451; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1452; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0453; AVX512BWVL-NEXT: vpmovusqd %ymm0, %xmm0454; AVX512BWVL-NEXT: vzeroupper455; AVX512BWVL-NEXT: retq456;457; SKX-LABEL: trunc_packus_v4i64_v4i32:458; SKX: # %bb.0:459; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1460; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0461; SKX-NEXT: vpmovusqd %ymm0, %xmm0462; SKX-NEXT: vzeroupper463; SKX-NEXT: retq464 %1 = icmp slt <4 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>465 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>466 %3 = icmp sgt <4 x i64> %2, zeroinitializer467 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer468 %5 = trunc <4 x i64> %4 to <4 x i32>469 ret <4 x i32> %5470}471 472 473define <8 x i32> @trunc_packus_v8i64_v8i32(ptr %p0) "min-legal-vector-width"="256" {474; SSE2-SSSE3-LABEL: trunc_packus_v8i64_v8i32:475; SSE2-SSSE3: # %bb.0:476; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm3477; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm8478; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm6479; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm1480; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [4294967295,4294967295]481; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648]482; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm2483; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm2484; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]485; SSE2-SSSE3-NEXT: pxor %xmm7, %xmm7486; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9487; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483647,2147483647]488; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm10489; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm10490; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]491; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11492; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]493; SSE2-SSSE3-NEXT: por %xmm11, %xmm2494; SSE2-SSSE3-NEXT: pand %xmm2, %xmm3495; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm2496; SSE2-SSSE3-NEXT: por %xmm3, %xmm2497; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm3498; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm3499; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]500; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9501; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm10502; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm10503; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]504; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11505; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm10[1,1,3,3]506; SSE2-SSSE3-NEXT: por %xmm11, %xmm3507; SSE2-SSSE3-NEXT: pand %xmm3, %xmm8508; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm3509; SSE2-SSSE3-NEXT: por %xmm8, %xmm3510; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm8511; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm8512; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,1,3,3]513; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9514; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm10515; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm10516; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]517; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11518; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm10[1,1,3,3]519; SSE2-SSSE3-NEXT: por %xmm11, %xmm8520; SSE2-SSSE3-NEXT: pand %xmm8, %xmm6521; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm8522; SSE2-SSSE3-NEXT: por %xmm6, %xmm8523; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm6524; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm6525; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm6[1,1,3,3]526; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9527; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm5528; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]529; SSE2-SSSE3-NEXT: pand %xmm9, %xmm6530; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]531; SSE2-SSSE3-NEXT: por %xmm6, %xmm5532; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1533; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm5534; SSE2-SSSE3-NEXT: por %xmm1, %xmm5535; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm1536; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm1537; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4538; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm4539; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1540; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]541; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1542; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]543; SSE2-SSSE3-NEXT: por %xmm1, %xmm4544; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4545; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm1546; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm1547; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm5548; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm5549; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1550; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]551; SSE2-SSSE3-NEXT: pand %xmm5, %xmm6552; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]553; SSE2-SSSE3-NEXT: por %xmm6, %xmm1554; SSE2-SSSE3-NEXT: pand %xmm8, %xmm1555; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm4[0,2]556; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm4557; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm4558; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm5559; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm5560; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm4561; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]562; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4563; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]564; SSE2-SSSE3-NEXT: por %xmm4, %xmm5565; SSE2-SSSE3-NEXT: pand %xmm3, %xmm5566; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm3567; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm3568; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm4569; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm4570; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm3571; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]572; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3573; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]574; SSE2-SSSE3-NEXT: por %xmm3, %xmm0575; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0576; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2]577; SSE2-SSSE3-NEXT: retq578;579; SSE41-LABEL: trunc_packus_v8i64_v8i32:580; SSE41: # %bb.0:581; SSE41-NEXT: movdqa (%rdi), %xmm5582; SSE41-NEXT: movdqa 16(%rdi), %xmm8583; SSE41-NEXT: movdqa 32(%rdi), %xmm7584; SSE41-NEXT: movdqa 48(%rdi), %xmm2585; SSE41-NEXT: movapd {{.*#+}} xmm1 = [4294967295,4294967295]586; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]587; SSE41-NEXT: movdqa %xmm5, %xmm4588; SSE41-NEXT: pxor %xmm3, %xmm4589; SSE41-NEXT: pmovsxdq {{.*#+}} xmm6 = [2147483647,2147483647]590; SSE41-NEXT: movdqa %xmm6, %xmm9591; SSE41-NEXT: pcmpgtd %xmm4, %xmm9592; SSE41-NEXT: pcmpeqd %xmm6, %xmm4593; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]594; SSE41-NEXT: pand %xmm4, %xmm0595; SSE41-NEXT: por %xmm9, %xmm0596; SSE41-NEXT: movapd %xmm1, %xmm4597; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm4598; SSE41-NEXT: movdqa %xmm8, %xmm5599; SSE41-NEXT: pxor %xmm3, %xmm5600; SSE41-NEXT: movdqa %xmm6, %xmm9601; SSE41-NEXT: pcmpgtd %xmm5, %xmm9602; SSE41-NEXT: pcmpeqd %xmm6, %xmm5603; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]604; SSE41-NEXT: pand %xmm5, %xmm0605; SSE41-NEXT: por %xmm9, %xmm0606; SSE41-NEXT: movapd %xmm1, %xmm5607; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm5608; SSE41-NEXT: movdqa %xmm7, %xmm8609; SSE41-NEXT: pxor %xmm3, %xmm8610; SSE41-NEXT: movdqa %xmm6, %xmm9611; SSE41-NEXT: pcmpgtd %xmm8, %xmm9612; SSE41-NEXT: pcmpeqd %xmm6, %xmm8613; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]614; SSE41-NEXT: pand %xmm8, %xmm0615; SSE41-NEXT: por %xmm9, %xmm0616; SSE41-NEXT: movapd %xmm1, %xmm8617; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm8618; SSE41-NEXT: movdqa %xmm2, %xmm0619; SSE41-NEXT: pxor %xmm3, %xmm0620; SSE41-NEXT: movdqa %xmm0, %xmm7621; SSE41-NEXT: pcmpeqd %xmm6, %xmm7622; SSE41-NEXT: pcmpgtd %xmm0, %xmm6623; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]624; SSE41-NEXT: pand %xmm7, %xmm0625; SSE41-NEXT: por %xmm6, %xmm0626; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1627; SSE41-NEXT: xorpd %xmm2, %xmm2628; SSE41-NEXT: movapd %xmm1, %xmm6629; SSE41-NEXT: xorpd %xmm3, %xmm6630; SSE41-NEXT: movapd %xmm6, %xmm7631; SSE41-NEXT: pcmpeqd %xmm3, %xmm7632; SSE41-NEXT: pcmpgtd %xmm3, %xmm6633; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]634; SSE41-NEXT: pand %xmm7, %xmm0635; SSE41-NEXT: por %xmm6, %xmm0636; SSE41-NEXT: pxor %xmm6, %xmm6637; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm6638; SSE41-NEXT: movapd %xmm8, %xmm1639; SSE41-NEXT: xorpd %xmm3, %xmm1640; SSE41-NEXT: movapd %xmm1, %xmm7641; SSE41-NEXT: pcmpeqd %xmm3, %xmm7642; SSE41-NEXT: pcmpgtd %xmm3, %xmm1643; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]644; SSE41-NEXT: pand %xmm7, %xmm0645; SSE41-NEXT: por %xmm1, %xmm0646; SSE41-NEXT: pxor %xmm1, %xmm1647; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1648; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm6[0,2]649; SSE41-NEXT: movapd %xmm5, %xmm6650; SSE41-NEXT: xorpd %xmm3, %xmm6651; SSE41-NEXT: movapd %xmm6, %xmm7652; SSE41-NEXT: pcmpeqd %xmm3, %xmm7653; SSE41-NEXT: pcmpgtd %xmm3, %xmm6654; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]655; SSE41-NEXT: pand %xmm7, %xmm0656; SSE41-NEXT: por %xmm6, %xmm0657; SSE41-NEXT: pxor %xmm6, %xmm6658; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm6659; SSE41-NEXT: movapd %xmm4, %xmm5660; SSE41-NEXT: xorpd %xmm3, %xmm5661; SSE41-NEXT: movapd %xmm5, %xmm7662; SSE41-NEXT: pcmpeqd %xmm3, %xmm7663; SSE41-NEXT: pcmpgtd %xmm3, %xmm5664; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]665; SSE41-NEXT: pand %xmm7, %xmm0666; SSE41-NEXT: por %xmm5, %xmm0667; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2668; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm6[0,2]669; SSE41-NEXT: movaps %xmm2, %xmm0670; SSE41-NEXT: retq671;672; AVX1-LABEL: trunc_packus_v8i64_v8i32:673; AVX1: # %bb.0:674; AVX1-NEXT: vmovdqa (%rdi), %xmm0675; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1676; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2677; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3678; AVX1-NEXT: vpmovsxbd {{.*#+}} xmm4 = [4294967295,0,4294967295,0]679; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm5680; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm4, %xmm2681; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm5682; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm4, %xmm3683; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5684; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0685; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm5686; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm1687; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4688; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm5689; AVX1-NEXT: vpand %xmm1, %xmm5, %xmm1690; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5691; AVX1-NEXT: vpand %xmm0, %xmm5, %xmm0692; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]693; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm1694; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1695; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm3696; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm2697; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm2[0,2],xmm1[0,2]698; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0699; AVX1-NEXT: retq700;701; AVX2-LABEL: trunc_packus_v8i64_v8i32:702; AVX2: # %bb.0:703; AVX2-NEXT: vmovdqa (%rdi), %ymm0704; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1705; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]706; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3707; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0708; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3709; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1710; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2711; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3712; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm1713; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2714; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm0715; AVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]716; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]717; AVX2-NEXT: retq718;719; AVX512-LABEL: trunc_packus_v8i64_v8i32:720; AVX512: # %bb.0:721; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0722; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm0723; AVX512-NEXT: vpmovusqd %zmm0, %ymm0724; AVX512-NEXT: retq725;726; SKX-LABEL: trunc_packus_v8i64_v8i32:727; SKX: # %bb.0:728; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm0729; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm1730; SKX-NEXT: vpmovusqd %ymm1, %xmm1731; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm0732; SKX-NEXT: vpmovusqd %ymm0, %xmm0733; SKX-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0734; SKX-NEXT: retq735 %a0 = load <8 x i64>, ptr %p0736 %1 = icmp slt <8 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>737 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>738 %3 = icmp sgt <8 x i64> %2, zeroinitializer739 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer740 %5 = trunc <8 x i64> %4 to <8 x i32>741 ret <8 x i32> %5742}743 744;745; PACKUS saturation truncation to vXi16746;747 748define <2 x i16> @trunc_packus_v2i64_v2i16(<2 x i64> %a0) {749; SSE2-SSSE3-LABEL: trunc_packus_v2i64_v2i16:750; SSE2-SSSE3: # %bb.0:751; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]752; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2753; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2754; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]755; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm4756; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4757; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147549183,2147549183]758; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm3759; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]760; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2761; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]762; SSE2-SSSE3-NEXT: por %xmm2, %xmm3763; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0764; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3765; SSE2-SSSE3-NEXT: por %xmm0, %xmm3766; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm0767; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0768; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2769; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm2770; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]771; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0772; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]773; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0774; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]775; SSE2-SSSE3-NEXT: por %xmm0, %xmm1776; SSE2-SSSE3-NEXT: pand %xmm3, %xmm1777; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]778; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]779; SSE2-SSSE3-NEXT: retq780;781; SSE41-LABEL: trunc_packus_v2i64_v2i16:782; SSE41: # %bb.0:783; SSE41-NEXT: movdqa %xmm0, %xmm1784; SSE41-NEXT: movapd {{.*#+}} xmm2 = [65535,65535]785; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]786; SSE41-NEXT: pxor %xmm3, %xmm0787; SSE41-NEXT: pmovzxdq {{.*#+}} xmm4 = [2147549183,2147549183]788; SSE41-NEXT: movdqa %xmm0, %xmm5789; SSE41-NEXT: pcmpeqd %xmm4, %xmm5790; SSE41-NEXT: pcmpgtd %xmm0, %xmm4791; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]792; SSE41-NEXT: pand %xmm5, %xmm0793; SSE41-NEXT: por %xmm4, %xmm0794; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2795; SSE41-NEXT: xorpd %xmm1, %xmm1796; SSE41-NEXT: movapd %xmm2, %xmm4797; SSE41-NEXT: xorpd %xmm3, %xmm4798; SSE41-NEXT: movapd %xmm4, %xmm5799; SSE41-NEXT: pcmpeqd %xmm3, %xmm5800; SSE41-NEXT: pcmpgtd %xmm3, %xmm4801; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]802; SSE41-NEXT: pand %xmm5, %xmm0803; SSE41-NEXT: por %xmm4, %xmm0804; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1805; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]806; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]807; SSE41-NEXT: retq808;809; AVX1-LABEL: trunc_packus_v2i64_v2i16:810; AVX1: # %bb.0:811; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = [65535,65535]812; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2813; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0814; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1815; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1816; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0817; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]818; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]819; AVX1-NEXT: retq820;821; AVX2-SLOW-LABEL: trunc_packus_v2i64_v2i16:822; AVX2-SLOW: # %bb.0:823; AVX2-SLOW-NEXT: vpmovzxwq {{.*#+}} xmm1 = [65535,65535]824; AVX2-SLOW-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2825; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0826; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm1, %xmm1827; AVX2-SLOW-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1828; AVX2-SLOW-NEXT: vpand %xmm0, %xmm1, %xmm0829; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]830; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]831; AVX2-SLOW-NEXT: retq832;833; AVX2-FAST-LABEL: trunc_packus_v2i64_v2i16:834; AVX2-FAST: # %bb.0:835; AVX2-FAST-NEXT: vpmovzxwq {{.*#+}} xmm1 = [65535,65535]836; AVX2-FAST-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2837; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0838; AVX2-FAST-NEXT: vpxor %xmm1, %xmm1, %xmm1839; AVX2-FAST-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1840; AVX2-FAST-NEXT: vpand %xmm0, %xmm1, %xmm0841; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]842; AVX2-FAST-NEXT: retq843;844; AVX512F-LABEL: trunc_packus_v2i64_v2i16:845; AVX512F: # %bb.0:846; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0847; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1848; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0849; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0850; AVX512F-NEXT: vzeroupper851; AVX512F-NEXT: retq852;853; AVX512VL-LABEL: trunc_packus_v2i64_v2i16:854; AVX512VL: # %bb.0:855; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1856; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0857; AVX512VL-NEXT: vpmovusqw %xmm0, %xmm0858; AVX512VL-NEXT: retq859;860; AVX512BW-LABEL: trunc_packus_v2i64_v2i16:861; AVX512BW: # %bb.0:862; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0863; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1864; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0865; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0866; AVX512BW-NEXT: vzeroupper867; AVX512BW-NEXT: retq868;869; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i16:870; AVX512BWVL: # %bb.0:871; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1872; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0873; AVX512BWVL-NEXT: vpmovusqw %xmm0, %xmm0874; AVX512BWVL-NEXT: retq875;876; SKX-LABEL: trunc_packus_v2i64_v2i16:877; SKX: # %bb.0:878; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1879; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0880; SKX-NEXT: vpmovusqw %xmm0, %xmm0881; SKX-NEXT: retq882 %1 = icmp slt <2 x i64> %a0, <i64 65535, i64 65535>883 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 65535, i64 65535>884 %3 = icmp sgt <2 x i64> %2, zeroinitializer885 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer886 %5 = trunc <2 x i64> %4 to <2 x i16>887 ret <2 x i16> %5888}889 890define void @trunc_packus_v2i64_v2i16_store(<2 x i64> %a0, ptr%p1) {891; SSE2-SSSE3-LABEL: trunc_packus_v2i64_v2i16_store:892; SSE2-SSSE3: # %bb.0:893; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]894; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2895; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2896; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]897; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm4898; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4899; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147549183,2147549183]900; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm3901; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]902; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2903; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]904; SSE2-SSSE3-NEXT: por %xmm2, %xmm3905; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0906; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3907; SSE2-SSSE3-NEXT: por %xmm0, %xmm3908; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm0909; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0910; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2911; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm2912; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]913; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0914; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]915; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0916; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]917; SSE2-SSSE3-NEXT: por %xmm0, %xmm1918; SSE2-SSSE3-NEXT: pand %xmm3, %xmm1919; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]920; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]921; SSE2-SSSE3-NEXT: movd %xmm0, (%rdi)922; SSE2-SSSE3-NEXT: retq923;924; SSE41-LABEL: trunc_packus_v2i64_v2i16_store:925; SSE41: # %bb.0:926; SSE41-NEXT: movdqa %xmm0, %xmm1927; SSE41-NEXT: movapd {{.*#+}} xmm2 = [65535,65535]928; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]929; SSE41-NEXT: pxor %xmm3, %xmm0930; SSE41-NEXT: pmovzxdq {{.*#+}} xmm4 = [2147549183,2147549183]931; SSE41-NEXT: movdqa %xmm0, %xmm5932; SSE41-NEXT: pcmpeqd %xmm4, %xmm5933; SSE41-NEXT: pcmpgtd %xmm0, %xmm4934; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]935; SSE41-NEXT: pand %xmm5, %xmm0936; SSE41-NEXT: por %xmm4, %xmm0937; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2938; SSE41-NEXT: xorpd %xmm1, %xmm1939; SSE41-NEXT: movapd %xmm2, %xmm4940; SSE41-NEXT: xorpd %xmm3, %xmm4941; SSE41-NEXT: movapd %xmm4, %xmm5942; SSE41-NEXT: pcmpeqd %xmm3, %xmm5943; SSE41-NEXT: pcmpgtd %xmm3, %xmm4944; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]945; SSE41-NEXT: pand %xmm5, %xmm0946; SSE41-NEXT: por %xmm4, %xmm0947; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1948; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]949; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]950; SSE41-NEXT: movd %xmm0, (%rdi)951; SSE41-NEXT: retq952;953; AVX1-LABEL: trunc_packus_v2i64_v2i16_store:954; AVX1: # %bb.0:955; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = [65535,65535]956; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2957; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0958; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1959; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1960; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0961; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]962; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]963; AVX1-NEXT: vmovd %xmm0, (%rdi)964; AVX1-NEXT: retq965;966; AVX2-SLOW-LABEL: trunc_packus_v2i64_v2i16_store:967; AVX2-SLOW: # %bb.0:968; AVX2-SLOW-NEXT: vpmovzxwq {{.*#+}} xmm1 = [65535,65535]969; AVX2-SLOW-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2970; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0971; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm1, %xmm1972; AVX2-SLOW-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1973; AVX2-SLOW-NEXT: vpand %xmm0, %xmm1, %xmm0974; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]975; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]976; AVX2-SLOW-NEXT: vmovd %xmm0, (%rdi)977; AVX2-SLOW-NEXT: retq978;979; AVX2-FAST-LABEL: trunc_packus_v2i64_v2i16_store:980; AVX2-FAST: # %bb.0:981; AVX2-FAST-NEXT: vpmovzxwq {{.*#+}} xmm1 = [65535,65535]982; AVX2-FAST-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2983; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0984; AVX2-FAST-NEXT: vpxor %xmm1, %xmm1, %xmm1985; AVX2-FAST-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1986; AVX2-FAST-NEXT: vpand %xmm0, %xmm1, %xmm0987; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,u,u,u,u,u,u,u,u,u,u]988; AVX2-FAST-NEXT: vmovd %xmm0, (%rdi)989; AVX2-FAST-NEXT: retq990;991; AVX512F-LABEL: trunc_packus_v2i64_v2i16_store:992; AVX512F: # %bb.0:993; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0994; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1995; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0996; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0997; AVX512F-NEXT: vmovd %xmm0, (%rdi)998; AVX512F-NEXT: vzeroupper999; AVX512F-NEXT: retq1000;1001; AVX512VL-LABEL: trunc_packus_v2i64_v2i16_store:1002; AVX512VL: # %bb.0:1003; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm11004; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm01005; AVX512VL-NEXT: vpmovusqw %xmm0, (%rdi)1006; AVX512VL-NEXT: retq1007;1008; AVX512BW-LABEL: trunc_packus_v2i64_v2i16_store:1009; AVX512BW: # %bb.0:1010; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01011; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm11012; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm01013; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm01014; AVX512BW-NEXT: vmovd %xmm0, (%rdi)1015; AVX512BW-NEXT: vzeroupper1016; AVX512BW-NEXT: retq1017;1018; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i16_store:1019; AVX512BWVL: # %bb.0:1020; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm11021; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm01022; AVX512BWVL-NEXT: vpmovusqw %xmm0, (%rdi)1023; AVX512BWVL-NEXT: retq1024;1025; SKX-LABEL: trunc_packus_v2i64_v2i16_store:1026; SKX: # %bb.0:1027; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm11028; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm01029; SKX-NEXT: vpmovusqw %xmm0, (%rdi)1030; SKX-NEXT: retq1031 %1 = icmp slt <2 x i64> %a0, <i64 65535, i64 65535>1032 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 65535, i64 65535>1033 %3 = icmp sgt <2 x i64> %2, zeroinitializer1034 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer1035 %5 = trunc <2 x i64> %4 to <2 x i16>1036 store <2 x i16> %5, ptr%p11037 ret void1038}1039 1040define <4 x i16> @trunc_packus_v4i64_v4i16(<4 x i64> %a0) {1041; SSE2-SSSE3-LABEL: trunc_packus_v4i64_v4i16:1042; SSE2-SSSE3: # %bb.0:1043; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535]1044; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]1045; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm51046; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm51047; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]1048; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm21049; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm61050; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147549183,2147549183]1051; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm81052; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm81053; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm8[0,0,2,2]1054; SSE2-SSSE3-NEXT: pand %xmm6, %xmm51055; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm8[1,1,3,3]1056; SSE2-SSSE3-NEXT: por %xmm5, %xmm61057; SSE2-SSSE3-NEXT: pand %xmm6, %xmm01058; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm61059; SSE2-SSSE3-NEXT: por %xmm6, %xmm01060; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm51061; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm51062; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]1063; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm61064; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm71065; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]1066; SSE2-SSSE3-NEXT: pand %xmm6, %xmm51067; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]1068; SSE2-SSSE3-NEXT: por %xmm5, %xmm61069; SSE2-SSSE3-NEXT: pand %xmm6, %xmm11070; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm61071; SSE2-SSSE3-NEXT: por %xmm1, %xmm61072; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm11073; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm11074; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm41075; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm41076; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm11077; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1078; SSE2-SSSE3-NEXT: pand %xmm4, %xmm11079; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]1080; SSE2-SSSE3-NEXT: por %xmm1, %xmm41081; SSE2-SSSE3-NEXT: pand %xmm6, %xmm41082; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm11083; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm11084; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm51085; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm51086; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm11087; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1088; SSE2-SSSE3-NEXT: pand %xmm5, %xmm11089; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]1090; SSE2-SSSE3-NEXT: por %xmm1, %xmm31091; SSE2-SSSE3-NEXT: pand %xmm3, %xmm01092; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]1093; SSE2-SSSE3-NEXT: pslld $16, %xmm01094; SSE2-SSSE3-NEXT: psrad $16, %xmm01095; SSE2-SSSE3-NEXT: packssdw %xmm2, %xmm01096; SSE2-SSSE3-NEXT: retq1097;1098; SSE41-LABEL: trunc_packus_v4i64_v4i16:1099; SSE41: # %bb.0:1100; SSE41-NEXT: movdqa %xmm0, %xmm21101; SSE41-NEXT: movapd {{.*#+}} xmm4 = [65535,65535]1102; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]1103; SSE41-NEXT: movdqa %xmm0, %xmm51104; SSE41-NEXT: pxor %xmm3, %xmm51105; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147549183,2147549183]1106; SSE41-NEXT: movdqa %xmm6, %xmm71107; SSE41-NEXT: pcmpgtd %xmm5, %xmm71108; SSE41-NEXT: pcmpeqd %xmm6, %xmm51109; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]1110; SSE41-NEXT: pand %xmm5, %xmm01111; SSE41-NEXT: por %xmm7, %xmm01112; SSE41-NEXT: movapd %xmm4, %xmm51113; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm51114; SSE41-NEXT: movdqa %xmm1, %xmm01115; SSE41-NEXT: pxor %xmm3, %xmm01116; SSE41-NEXT: movdqa %xmm0, %xmm21117; SSE41-NEXT: pcmpeqd %xmm6, %xmm21118; SSE41-NEXT: pcmpgtd %xmm0, %xmm61119; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]1120; SSE41-NEXT: pand %xmm2, %xmm01121; SSE41-NEXT: por %xmm6, %xmm01122; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm41123; SSE41-NEXT: xorpd %xmm1, %xmm11124; SSE41-NEXT: movapd %xmm4, %xmm21125; SSE41-NEXT: xorpd %xmm3, %xmm21126; SSE41-NEXT: movapd %xmm2, %xmm61127; SSE41-NEXT: pcmpeqd %xmm3, %xmm61128; SSE41-NEXT: pcmpgtd %xmm3, %xmm21129; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]1130; SSE41-NEXT: pand %xmm6, %xmm01131; SSE41-NEXT: por %xmm2, %xmm01132; SSE41-NEXT: pxor %xmm2, %xmm21133; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm21134; SSE41-NEXT: movapd %xmm5, %xmm41135; SSE41-NEXT: xorpd %xmm3, %xmm41136; SSE41-NEXT: movapd %xmm4, %xmm61137; SSE41-NEXT: pcmpeqd %xmm3, %xmm61138; SSE41-NEXT: pcmpgtd %xmm3, %xmm41139; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]1140; SSE41-NEXT: pand %xmm6, %xmm01141; SSE41-NEXT: por %xmm4, %xmm01142; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm11143; SSE41-NEXT: packusdw %xmm2, %xmm11144; SSE41-NEXT: packusdw %xmm1, %xmm11145; SSE41-NEXT: movdqa %xmm1, %xmm01146; SSE41-NEXT: retq1147;1148; AVX1-LABEL: trunc_packus_v4i64_v4i16:1149; AVX1: # %bb.0:1150; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = [65535,65535]1151; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm21152; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm21153; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01154; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm31155; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm01156; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11157; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm31158; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm01159; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm11160; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm11161; AVX1-NEXT: vpackusdw %xmm0, %xmm1, %xmm01162; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm01163; AVX1-NEXT: vzeroupper1164; AVX1-NEXT: retq1165;1166; AVX2-LABEL: trunc_packus_v4i64_v4i16:1167; AVX2: # %bb.0:1168; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [65535,65535,65535,65535]1169; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm21170; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm01171; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11172; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm11173; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm01174; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11175; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm01176; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm01177; AVX2-NEXT: vzeroupper1178; AVX2-NEXT: retq1179;1180; AVX512F-LABEL: trunc_packus_v4i64_v4i16:1181; AVX512F: # %bb.0:1182; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01183; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm11184; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm01185; AVX512F-NEXT: vpmovusqw %zmm0, %xmm01186; AVX512F-NEXT: vzeroupper1187; AVX512F-NEXT: retq1188;1189; AVX512VL-LABEL: trunc_packus_v4i64_v4i16:1190; AVX512VL: # %bb.0:1191; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm11192; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm01193; AVX512VL-NEXT: vpmovusqw %ymm0, %xmm01194; AVX512VL-NEXT: vzeroupper1195; AVX512VL-NEXT: retq1196;1197; AVX512BW-LABEL: trunc_packus_v4i64_v4i16:1198; AVX512BW: # %bb.0:1199; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01200; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm11201; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm01202; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm01203; AVX512BW-NEXT: vzeroupper1204; AVX512BW-NEXT: retq1205;1206; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i16:1207; AVX512BWVL: # %bb.0:1208; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm11209; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm01210; AVX512BWVL-NEXT: vpmovusqw %ymm0, %xmm01211; AVX512BWVL-NEXT: vzeroupper1212; AVX512BWVL-NEXT: retq1213;1214; SKX-LABEL: trunc_packus_v4i64_v4i16:1215; SKX: # %bb.0:1216; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm11217; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm01218; SKX-NEXT: vpmovusqw %ymm0, %xmm01219; SKX-NEXT: vzeroupper1220; SKX-NEXT: retq1221 %1 = icmp slt <4 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535>1222 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 65535, i64 65535, i64 65535, i64 65535>1223 %3 = icmp sgt <4 x i64> %2, zeroinitializer1224 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer1225 %5 = trunc <4 x i64> %4 to <4 x i16>1226 ret <4 x i16> %51227}1228 1229define void @trunc_packus_v4i64_v4i16_store(<4 x i64> %a0, ptr%p1) {1230; SSE2-SSSE3-LABEL: trunc_packus_v4i64_v4i16_store:1231; SSE2-SSSE3: # %bb.0:1232; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535]1233; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]1234; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm31235; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm31236; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]1237; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm61238; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm51239; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147549183,2147549183]1240; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm81241; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm81242; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]1243; SSE2-SSSE3-NEXT: pand %xmm5, %xmm91244; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm8[1,1,3,3]1245; SSE2-SSSE3-NEXT: por %xmm9, %xmm31246; SSE2-SSSE3-NEXT: pand %xmm3, %xmm01247; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm31248; SSE2-SSSE3-NEXT: por %xmm0, %xmm31249; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm01250; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm01251; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]1252; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm51253; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm71254; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]1255; SSE2-SSSE3-NEXT: pand %xmm5, %xmm01256; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]1257; SSE2-SSSE3-NEXT: por %xmm0, %xmm51258; SSE2-SSSE3-NEXT: pand %xmm5, %xmm11259; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm51260; SSE2-SSSE3-NEXT: por %xmm1, %xmm51261; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm01262; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm01263; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm11264; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm11265; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm01266; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1267; SSE2-SSSE3-NEXT: pand %xmm1, %xmm01268; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1269; SSE2-SSSE3-NEXT: por %xmm0, %xmm11270; SSE2-SSSE3-NEXT: pand %xmm5, %xmm11271; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm01272; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm01273; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm41274; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm41275; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm01276; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1277; SSE2-SSSE3-NEXT: pand %xmm4, %xmm01278; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]1279; SSE2-SSSE3-NEXT: por %xmm0, %xmm21280; SSE2-SSSE3-NEXT: pand %xmm3, %xmm21281; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm1[0,2]1282; SSE2-SSSE3-NEXT: pslld $16, %xmm21283; SSE2-SSSE3-NEXT: psrad $16, %xmm21284; SSE2-SSSE3-NEXT: packssdw %xmm2, %xmm21285; SSE2-SSSE3-NEXT: movq %xmm2, (%rdi)1286; SSE2-SSSE3-NEXT: retq1287;1288; SSE41-LABEL: trunc_packus_v4i64_v4i16_store:1289; SSE41: # %bb.0:1290; SSE41-NEXT: movdqa %xmm0, %xmm21291; SSE41-NEXT: movapd {{.*#+}} xmm4 = [65535,65535]1292; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]1293; SSE41-NEXT: movdqa %xmm0, %xmm51294; SSE41-NEXT: pxor %xmm3, %xmm51295; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147549183,2147549183]1296; SSE41-NEXT: movdqa %xmm6, %xmm71297; SSE41-NEXT: pcmpgtd %xmm5, %xmm71298; SSE41-NEXT: pcmpeqd %xmm6, %xmm51299; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]1300; SSE41-NEXT: pand %xmm5, %xmm01301; SSE41-NEXT: por %xmm7, %xmm01302; SSE41-NEXT: movapd %xmm4, %xmm51303; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm51304; SSE41-NEXT: movdqa %xmm1, %xmm01305; SSE41-NEXT: pxor %xmm3, %xmm01306; SSE41-NEXT: movdqa %xmm0, %xmm21307; SSE41-NEXT: pcmpeqd %xmm6, %xmm21308; SSE41-NEXT: pcmpgtd %xmm0, %xmm61309; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]1310; SSE41-NEXT: pand %xmm2, %xmm01311; SSE41-NEXT: por %xmm6, %xmm01312; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm41313; SSE41-NEXT: xorpd %xmm1, %xmm11314; SSE41-NEXT: movapd %xmm4, %xmm21315; SSE41-NEXT: xorpd %xmm3, %xmm21316; SSE41-NEXT: movapd %xmm2, %xmm61317; SSE41-NEXT: pcmpeqd %xmm3, %xmm61318; SSE41-NEXT: pcmpgtd %xmm3, %xmm21319; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]1320; SSE41-NEXT: pand %xmm6, %xmm01321; SSE41-NEXT: por %xmm2, %xmm01322; SSE41-NEXT: pxor %xmm2, %xmm21323; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm21324; SSE41-NEXT: movapd %xmm5, %xmm41325; SSE41-NEXT: xorpd %xmm3, %xmm41326; SSE41-NEXT: movapd %xmm4, %xmm61327; SSE41-NEXT: pcmpeqd %xmm3, %xmm61328; SSE41-NEXT: pcmpgtd %xmm3, %xmm41329; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]1330; SSE41-NEXT: pand %xmm6, %xmm01331; SSE41-NEXT: por %xmm4, %xmm01332; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm11333; SSE41-NEXT: packusdw %xmm2, %xmm11334; SSE41-NEXT: packusdw %xmm1, %xmm11335; SSE41-NEXT: movq %xmm1, (%rdi)1336; SSE41-NEXT: retq1337;1338; AVX1-LABEL: trunc_packus_v4i64_v4i16_store:1339; AVX1: # %bb.0:1340; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = [65535,65535]1341; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm21342; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm21343; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01344; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm31345; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm01346; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11347; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm31348; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm01349; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm11350; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm11351; AVX1-NEXT: vpackusdw %xmm0, %xmm1, %xmm01352; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm01353; AVX1-NEXT: vmovq %xmm0, (%rdi)1354; AVX1-NEXT: vzeroupper1355; AVX1-NEXT: retq1356;1357; AVX2-LABEL: trunc_packus_v4i64_v4i16_store:1358; AVX2: # %bb.0:1359; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [65535,65535,65535,65535]1360; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm21361; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm01362; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11363; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm11364; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm01365; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11366; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm01367; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm01368; AVX2-NEXT: vmovq %xmm0, (%rdi)1369; AVX2-NEXT: vzeroupper1370; AVX2-NEXT: retq1371;1372; AVX512F-LABEL: trunc_packus_v4i64_v4i16_store:1373; AVX512F: # %bb.0:1374; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01375; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm11376; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm01377; AVX512F-NEXT: vpmovusqw %zmm0, %xmm01378; AVX512F-NEXT: vmovq %xmm0, (%rdi)1379; AVX512F-NEXT: vzeroupper1380; AVX512F-NEXT: retq1381;1382; AVX512VL-LABEL: trunc_packus_v4i64_v4i16_store:1383; AVX512VL: # %bb.0:1384; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm11385; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm01386; AVX512VL-NEXT: vpmovusqw %ymm0, (%rdi)1387; AVX512VL-NEXT: vzeroupper1388; AVX512VL-NEXT: retq1389;1390; AVX512BW-LABEL: trunc_packus_v4i64_v4i16_store:1391; AVX512BW: # %bb.0:1392; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01393; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm11394; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm01395; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm01396; AVX512BW-NEXT: vmovq %xmm0, (%rdi)1397; AVX512BW-NEXT: vzeroupper1398; AVX512BW-NEXT: retq1399;1400; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i16_store:1401; AVX512BWVL: # %bb.0:1402; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm11403; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm01404; AVX512BWVL-NEXT: vpmovusqw %ymm0, (%rdi)1405; AVX512BWVL-NEXT: vzeroupper1406; AVX512BWVL-NEXT: retq1407;1408; SKX-LABEL: trunc_packus_v4i64_v4i16_store:1409; SKX: # %bb.0:1410; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm11411; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm01412; SKX-NEXT: vpmovusqw %ymm0, (%rdi)1413; SKX-NEXT: vzeroupper1414; SKX-NEXT: retq1415 %1 = icmp slt <4 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535>1416 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 65535, i64 65535, i64 65535, i64 65535>1417 %3 = icmp sgt <4 x i64> %2, zeroinitializer1418 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer1419 %5 = trunc <4 x i64> %4 to <4 x i16>1420 store <4 x i16> %5, ptr%p11421 ret void1422}1423 1424define <8 x i16> @trunc_packus_v8i64_v8i16(ptr %p0) "min-legal-vector-width"="256" {1425; SSE2-SSSE3-LABEL: trunc_packus_v8i64_v8i16:1426; SSE2-SSSE3: # %bb.0:1427; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm51428; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm01429; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm31430; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm81431; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535]1432; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]1433; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm21434; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm21435; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]1436; SSE2-SSSE3-NEXT: pxor %xmm7, %xmm71437; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm91438; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183]1439; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm101440; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm101441; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]1442; SSE2-SSSE3-NEXT: pand %xmm9, %xmm111443; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]1444; SSE2-SSSE3-NEXT: por %xmm11, %xmm21445; SSE2-SSSE3-NEXT: pand %xmm2, %xmm31446; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm21447; SSE2-SSSE3-NEXT: por %xmm3, %xmm21448; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm31449; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm31450; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]1451; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm91452; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm101453; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm101454; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]1455; SSE2-SSSE3-NEXT: pand %xmm9, %xmm111456; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm10[1,1,3,3]1457; SSE2-SSSE3-NEXT: por %xmm11, %xmm31458; SSE2-SSSE3-NEXT: pand %xmm3, %xmm81459; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm31460; SSE2-SSSE3-NEXT: por %xmm8, %xmm31461; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm81462; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm81463; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,1,3,3]1464; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm91465; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm101466; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm101467; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]1468; SSE2-SSSE3-NEXT: pand %xmm9, %xmm111469; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm10[1,1,3,3]1470; SSE2-SSSE3-NEXT: por %xmm11, %xmm81471; SSE2-SSSE3-NEXT: pand %xmm8, %xmm51472; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm81473; SSE2-SSSE3-NEXT: por %xmm5, %xmm81474; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm51475; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm51476; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]1477; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm91478; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm61479; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm6[0,0,2,2]1480; SSE2-SSSE3-NEXT: pand %xmm9, %xmm51481; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]1482; SSE2-SSSE3-NEXT: por %xmm5, %xmm61483; SSE2-SSSE3-NEXT: pand %xmm6, %xmm01484; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm61485; SSE2-SSSE3-NEXT: por %xmm0, %xmm61486; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm01487; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm01488; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm41489; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm41490; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm01491; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1492; SSE2-SSSE3-NEXT: pand %xmm4, %xmm01493; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]1494; SSE2-SSSE3-NEXT: por %xmm0, %xmm41495; SSE2-SSSE3-NEXT: pand %xmm6, %xmm41496; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm01497; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm01498; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm51499; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm51500; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm01501; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]1502; SSE2-SSSE3-NEXT: pand %xmm5, %xmm61503; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]1504; SSE2-SSSE3-NEXT: por %xmm6, %xmm01505; SSE2-SSSE3-NEXT: pand %xmm8, %xmm01506; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]1507; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm41508; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm41509; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm51510; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm51511; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm41512; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]1513; SSE2-SSSE3-NEXT: pand %xmm5, %xmm41514; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]1515; SSE2-SSSE3-NEXT: por %xmm4, %xmm51516; SSE2-SSSE3-NEXT: pand %xmm3, %xmm51517; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm31518; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm31519; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm41520; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm41521; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm31522; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]1523; SSE2-SSSE3-NEXT: pand %xmm4, %xmm11524; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]1525; SSE2-SSSE3-NEXT: por %xmm1, %xmm31526; SSE2-SSSE3-NEXT: pand %xmm2, %xmm31527; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm5[0,2]1528; SSE2-SSSE3-NEXT: pslld $16, %xmm31529; SSE2-SSSE3-NEXT: psrad $16, %xmm31530; SSE2-SSSE3-NEXT: pslld $16, %xmm01531; SSE2-SSSE3-NEXT: psrad $16, %xmm01532; SSE2-SSSE3-NEXT: packssdw %xmm3, %xmm01533; SSE2-SSSE3-NEXT: retq1534;1535; SSE41-LABEL: trunc_packus_v8i64_v8i16:1536; SSE41: # %bb.0:1537; SSE41-NEXT: movdqa (%rdi), %xmm71538; SSE41-NEXT: movdqa 16(%rdi), %xmm51539; SSE41-NEXT: movdqa 32(%rdi), %xmm41540; SSE41-NEXT: movdqa 48(%rdi), %xmm81541; SSE41-NEXT: movapd {{.*#+}} xmm1 = [65535,65535]1542; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]1543; SSE41-NEXT: movdqa %xmm4, %xmm31544; SSE41-NEXT: pxor %xmm2, %xmm31545; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147549183,2147549183]1546; SSE41-NEXT: movdqa %xmm6, %xmm91547; SSE41-NEXT: pcmpgtd %xmm3, %xmm91548; SSE41-NEXT: pcmpeqd %xmm6, %xmm31549; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]1550; SSE41-NEXT: pand %xmm3, %xmm01551; SSE41-NEXT: por %xmm9, %xmm01552; SSE41-NEXT: movapd %xmm1, %xmm31553; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm31554; SSE41-NEXT: movdqa %xmm8, %xmm41555; SSE41-NEXT: pxor %xmm2, %xmm41556; SSE41-NEXT: movdqa %xmm6, %xmm91557; SSE41-NEXT: pcmpgtd %xmm4, %xmm91558; SSE41-NEXT: pcmpeqd %xmm6, %xmm41559; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]1560; SSE41-NEXT: pand %xmm4, %xmm01561; SSE41-NEXT: por %xmm9, %xmm01562; SSE41-NEXT: movapd %xmm1, %xmm41563; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm41564; SSE41-NEXT: movdqa %xmm7, %xmm81565; SSE41-NEXT: pxor %xmm2, %xmm81566; SSE41-NEXT: movdqa %xmm6, %xmm91567; SSE41-NEXT: pcmpgtd %xmm8, %xmm91568; SSE41-NEXT: pcmpeqd %xmm6, %xmm81569; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]1570; SSE41-NEXT: pand %xmm8, %xmm01571; SSE41-NEXT: por %xmm9, %xmm01572; SSE41-NEXT: movapd %xmm1, %xmm81573; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm81574; SSE41-NEXT: movdqa %xmm5, %xmm01575; SSE41-NEXT: pxor %xmm2, %xmm01576; SSE41-NEXT: movdqa %xmm0, %xmm71577; SSE41-NEXT: pcmpeqd %xmm6, %xmm71578; SSE41-NEXT: pcmpgtd %xmm0, %xmm61579; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]1580; SSE41-NEXT: pand %xmm7, %xmm01581; SSE41-NEXT: por %xmm6, %xmm01582; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm11583; SSE41-NEXT: xorpd %xmm5, %xmm51584; SSE41-NEXT: movapd %xmm1, %xmm61585; SSE41-NEXT: xorpd %xmm2, %xmm61586; SSE41-NEXT: movapd %xmm6, %xmm71587; SSE41-NEXT: pcmpeqd %xmm2, %xmm71588; SSE41-NEXT: pcmpgtd %xmm2, %xmm61589; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]1590; SSE41-NEXT: pand %xmm7, %xmm01591; SSE41-NEXT: por %xmm6, %xmm01592; SSE41-NEXT: pxor %xmm6, %xmm61593; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm61594; SSE41-NEXT: movapd %xmm8, %xmm11595; SSE41-NEXT: xorpd %xmm2, %xmm11596; SSE41-NEXT: movapd %xmm1, %xmm71597; SSE41-NEXT: pcmpeqd %xmm2, %xmm71598; SSE41-NEXT: pcmpgtd %xmm2, %xmm11599; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]1600; SSE41-NEXT: pand %xmm7, %xmm01601; SSE41-NEXT: por %xmm1, %xmm01602; SSE41-NEXT: pxor %xmm1, %xmm11603; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm11604; SSE41-NEXT: packusdw %xmm6, %xmm11605; SSE41-NEXT: movapd %xmm4, %xmm61606; SSE41-NEXT: xorpd %xmm2, %xmm61607; SSE41-NEXT: movapd %xmm6, %xmm71608; SSE41-NEXT: pcmpeqd %xmm2, %xmm71609; SSE41-NEXT: pcmpgtd %xmm2, %xmm61610; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]1611; SSE41-NEXT: pand %xmm7, %xmm01612; SSE41-NEXT: por %xmm6, %xmm01613; SSE41-NEXT: pxor %xmm6, %xmm61614; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm61615; SSE41-NEXT: movapd %xmm3, %xmm41616; SSE41-NEXT: xorpd %xmm2, %xmm41617; SSE41-NEXT: movapd %xmm4, %xmm71618; SSE41-NEXT: pcmpeqd %xmm2, %xmm71619; SSE41-NEXT: pcmpgtd %xmm2, %xmm41620; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]1621; SSE41-NEXT: pand %xmm7, %xmm01622; SSE41-NEXT: por %xmm4, %xmm01623; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm51624; SSE41-NEXT: packusdw %xmm6, %xmm51625; SSE41-NEXT: packusdw %xmm5, %xmm11626; SSE41-NEXT: movdqa %xmm1, %xmm01627; SSE41-NEXT: retq1628;1629; AVX1-LABEL: trunc_packus_v8i64_v8i16:1630; AVX1: # %bb.0:1631; AVX1-NEXT: vmovdqa (%rdi), %xmm01632; AVX1-NEXT: vmovdqa 16(%rdi), %xmm11633; AVX1-NEXT: vmovdqa 32(%rdi), %xmm21634; AVX1-NEXT: vmovdqa 48(%rdi), %xmm31635; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm4 = [65535,65535]1636; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm51637; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm4, %xmm21638; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm51639; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm4, %xmm31640; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm51641; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm01642; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm51643; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm11644; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm41645; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm51646; AVX1-NEXT: vpand %xmm1, %xmm5, %xmm11647; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm51648; AVX1-NEXT: vpand %xmm0, %xmm5, %xmm01649; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm01650; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm11651; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm11652; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm31653; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm21654; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm11655; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm01656; AVX1-NEXT: retq1657;1658; AVX2-LABEL: trunc_packus_v8i64_v8i16:1659; AVX2: # %bb.0:1660; AVX2-NEXT: vmovdqa (%rdi), %ymm01661; AVX2-NEXT: vmovdqa 32(%rdi), %ymm11662; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [65535,65535,65535,65535]1663; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm31664; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm01665; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm31666; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm11667; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21668; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm31669; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm11670; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm21671; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm01672; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm01673; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11674; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm01675; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]1676; AVX2-NEXT: vzeroupper1677; AVX2-NEXT: retq1678;1679; AVX512-LABEL: trunc_packus_v8i64_v8i16:1680; AVX512: # %bb.0:1681; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm01682; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm01683; AVX512-NEXT: vpmovusqw %zmm0, %xmm01684; AVX512-NEXT: vzeroupper1685; AVX512-NEXT: retq1686;1687; SKX-LABEL: trunc_packus_v8i64_v8i16:1688; SKX: # %bb.0:1689; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm01690; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm11691; SKX-NEXT: vpmovusqw %ymm1, %xmm11692; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm01693; SKX-NEXT: vpmovusqw %ymm0, %xmm01694; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1695; SKX-NEXT: vzeroupper1696; SKX-NEXT: retq1697 %a0 = load <8 x i64>, ptr %p01698 %1 = icmp slt <8 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>1699 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>1700 %3 = icmp sgt <8 x i64> %2, zeroinitializer1701 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer1702 %5 = trunc <8 x i64> %4 to <8 x i16>1703 ret <8 x i16> %51704}1705 1706define <4 x i16> @trunc_packus_v4i32_v4i16(<4 x i32> %a0) {1707; SSE2-LABEL: trunc_packus_v4i32_v4i16:1708; SSE2: # %bb.0:1709; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]1710; SSE2-NEXT: movdqa %xmm1, %xmm21711; SSE2-NEXT: pcmpgtd %xmm0, %xmm21712; SSE2-NEXT: pand %xmm2, %xmm01713; SSE2-NEXT: pandn %xmm1, %xmm21714; SSE2-NEXT: por %xmm0, %xmm21715; SSE2-NEXT: pxor %xmm0, %xmm01716; SSE2-NEXT: movdqa %xmm2, %xmm11717; SSE2-NEXT: pcmpgtd %xmm0, %xmm11718; SSE2-NEXT: pand %xmm2, %xmm11719; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]1720; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]1721; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1722; SSE2-NEXT: retq1723;1724; SSSE3-LABEL: trunc_packus_v4i32_v4i16:1725; SSSE3: # %bb.0:1726; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]1727; SSSE3-NEXT: movdqa %xmm1, %xmm21728; SSSE3-NEXT: pcmpgtd %xmm0, %xmm21729; SSSE3-NEXT: pand %xmm2, %xmm01730; SSSE3-NEXT: pandn %xmm1, %xmm21731; SSSE3-NEXT: por %xmm2, %xmm01732; SSSE3-NEXT: pxor %xmm1, %xmm11733; SSSE3-NEXT: movdqa %xmm0, %xmm21734; SSSE3-NEXT: pcmpgtd %xmm1, %xmm21735; SSSE3-NEXT: pand %xmm2, %xmm01736; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]1737; SSSE3-NEXT: retq1738;1739; SSE41-LABEL: trunc_packus_v4i32_v4i16:1740; SSE41: # %bb.0:1741; SSE41-NEXT: packusdw %xmm0, %xmm01742; SSE41-NEXT: retq1743;1744; AVX-LABEL: trunc_packus_v4i32_v4i16:1745; AVX: # %bb.0:1746; AVX-NEXT: vpackusdw %xmm0, %xmm0, %xmm01747; AVX-NEXT: retq1748;1749; AVX512-LABEL: trunc_packus_v4i32_v4i16:1750; AVX512: # %bb.0:1751; AVX512-NEXT: vpackusdw %xmm0, %xmm0, %xmm01752; AVX512-NEXT: retq1753;1754; SKX-LABEL: trunc_packus_v4i32_v4i16:1755; SKX: # %bb.0:1756; SKX-NEXT: vpackusdw %xmm0, %xmm0, %xmm01757; SKX-NEXT: retq1758 %1 = icmp slt <4 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535>1759 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>1760 %3 = icmp sgt <4 x i32> %2, zeroinitializer1761 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> zeroinitializer1762 %5 = trunc <4 x i32> %4 to <4 x i16>1763 ret <4 x i16> %51764}1765 1766define void @trunc_packus_v4i32_v4i16_store(<4 x i32> %a0, ptr%p1) {1767; SSE2-LABEL: trunc_packus_v4i32_v4i16_store:1768; SSE2: # %bb.0:1769; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]1770; SSE2-NEXT: movdqa %xmm1, %xmm21771; SSE2-NEXT: pcmpgtd %xmm0, %xmm21772; SSE2-NEXT: pand %xmm2, %xmm01773; SSE2-NEXT: pandn %xmm1, %xmm21774; SSE2-NEXT: por %xmm0, %xmm21775; SSE2-NEXT: pxor %xmm0, %xmm01776; SSE2-NEXT: movdqa %xmm2, %xmm11777; SSE2-NEXT: pcmpgtd %xmm0, %xmm11778; SSE2-NEXT: pand %xmm2, %xmm11779; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]1780; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]1781; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1782; SSE2-NEXT: movq %xmm0, (%rdi)1783; SSE2-NEXT: retq1784;1785; SSSE3-LABEL: trunc_packus_v4i32_v4i16_store:1786; SSSE3: # %bb.0:1787; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]1788; SSSE3-NEXT: movdqa %xmm1, %xmm21789; SSSE3-NEXT: pcmpgtd %xmm0, %xmm21790; SSSE3-NEXT: pand %xmm2, %xmm01791; SSSE3-NEXT: pandn %xmm1, %xmm21792; SSSE3-NEXT: por %xmm0, %xmm21793; SSSE3-NEXT: pxor %xmm0, %xmm01794; SSSE3-NEXT: movdqa %xmm2, %xmm11795; SSSE3-NEXT: pcmpgtd %xmm0, %xmm11796; SSSE3-NEXT: pand %xmm2, %xmm11797; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]1798; SSSE3-NEXT: movq %xmm1, (%rdi)1799; SSSE3-NEXT: retq1800;1801; SSE41-LABEL: trunc_packus_v4i32_v4i16_store:1802; SSE41: # %bb.0:1803; SSE41-NEXT: packusdw %xmm0, %xmm01804; SSE41-NEXT: movq %xmm0, (%rdi)1805; SSE41-NEXT: retq1806;1807; AVX-LABEL: trunc_packus_v4i32_v4i16_store:1808; AVX: # %bb.0:1809; AVX-NEXT: vpackusdw %xmm0, %xmm0, %xmm01810; AVX-NEXT: vmovq %xmm0, (%rdi)1811; AVX-NEXT: retq1812;1813; AVX512F-LABEL: trunc_packus_v4i32_v4i16_store:1814; AVX512F: # %bb.0:1815; AVX512F-NEXT: vpackusdw %xmm0, %xmm0, %xmm01816; AVX512F-NEXT: vmovq %xmm0, (%rdi)1817; AVX512F-NEXT: retq1818;1819; AVX512VL-LABEL: trunc_packus_v4i32_v4i16_store:1820; AVX512VL: # %bb.0:1821; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm11822; AVX512VL-NEXT: vpmaxsd %xmm1, %xmm0, %xmm01823; AVX512VL-NEXT: vpmovusdw %xmm0, (%rdi)1824; AVX512VL-NEXT: retq1825;1826; AVX512BW-LABEL: trunc_packus_v4i32_v4i16_store:1827; AVX512BW: # %bb.0:1828; AVX512BW-NEXT: vpackusdw %xmm0, %xmm0, %xmm01829; AVX512BW-NEXT: vmovq %xmm0, (%rdi)1830; AVX512BW-NEXT: retq1831;1832; AVX512BWVL-LABEL: trunc_packus_v4i32_v4i16_store:1833; AVX512BWVL: # %bb.0:1834; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm11835; AVX512BWVL-NEXT: vpmaxsd %xmm1, %xmm0, %xmm01836; AVX512BWVL-NEXT: vpmovusdw %xmm0, (%rdi)1837; AVX512BWVL-NEXT: retq1838;1839; SKX-LABEL: trunc_packus_v4i32_v4i16_store:1840; SKX: # %bb.0:1841; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm11842; SKX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm01843; SKX-NEXT: vpmovusdw %xmm0, (%rdi)1844; SKX-NEXT: retq1845 %1 = icmp slt <4 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535>1846 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>1847 %3 = icmp sgt <4 x i32> %2, zeroinitializer1848 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> zeroinitializer1849 %5 = trunc <4 x i32> %4 to <4 x i16>1850 store <4 x i16> %5, ptr%p11851 ret void1852}1853 1854define <8 x i16> @trunc_packus_v8i32_v8i16(<8 x i32> %a0) {1855; SSE2-LABEL: trunc_packus_v8i32_v8i16:1856; SSE2: # %bb.0:1857; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]1858; SSE2-NEXT: movdqa %xmm2, %xmm31859; SSE2-NEXT: pcmpgtd %xmm1, %xmm31860; SSE2-NEXT: pand %xmm3, %xmm11861; SSE2-NEXT: pandn %xmm2, %xmm31862; SSE2-NEXT: por %xmm1, %xmm31863; SSE2-NEXT: movdqa %xmm2, %xmm11864; SSE2-NEXT: pcmpgtd %xmm0, %xmm11865; SSE2-NEXT: pand %xmm1, %xmm01866; SSE2-NEXT: pandn %xmm2, %xmm11867; SSE2-NEXT: por %xmm1, %xmm01868; SSE2-NEXT: pxor %xmm1, %xmm11869; SSE2-NEXT: movdqa %xmm0, %xmm21870; SSE2-NEXT: pcmpgtd %xmm1, %xmm21871; SSE2-NEXT: pand %xmm2, %xmm01872; SSE2-NEXT: movdqa %xmm3, %xmm21873; SSE2-NEXT: pcmpgtd %xmm1, %xmm21874; SSE2-NEXT: pand %xmm3, %xmm21875; SSE2-NEXT: pslld $16, %xmm21876; SSE2-NEXT: psrad $16, %xmm21877; SSE2-NEXT: pslld $16, %xmm01878; SSE2-NEXT: psrad $16, %xmm01879; SSE2-NEXT: packssdw %xmm2, %xmm01880; SSE2-NEXT: retq1881;1882; SSSE3-LABEL: trunc_packus_v8i32_v8i16:1883; SSSE3: # %bb.0:1884; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]1885; SSSE3-NEXT: movdqa %xmm2, %xmm31886; SSSE3-NEXT: pcmpgtd %xmm1, %xmm31887; SSSE3-NEXT: pand %xmm3, %xmm11888; SSSE3-NEXT: pandn %xmm2, %xmm31889; SSSE3-NEXT: por %xmm1, %xmm31890; SSSE3-NEXT: movdqa %xmm2, %xmm11891; SSSE3-NEXT: pcmpgtd %xmm0, %xmm11892; SSSE3-NEXT: pand %xmm1, %xmm01893; SSSE3-NEXT: pandn %xmm2, %xmm11894; SSSE3-NEXT: por %xmm1, %xmm01895; SSSE3-NEXT: pxor %xmm1, %xmm11896; SSSE3-NEXT: movdqa %xmm0, %xmm21897; SSSE3-NEXT: pcmpgtd %xmm1, %xmm21898; SSSE3-NEXT: pand %xmm2, %xmm01899; SSSE3-NEXT: movdqa %xmm3, %xmm21900; SSSE3-NEXT: pcmpgtd %xmm1, %xmm21901; SSSE3-NEXT: pand %xmm3, %xmm21902; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]1903; SSSE3-NEXT: pshufb %xmm1, %xmm21904; SSSE3-NEXT: pshufb %xmm1, %xmm01905; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]1906; SSSE3-NEXT: retq1907;1908; SSE41-LABEL: trunc_packus_v8i32_v8i16:1909; SSE41: # %bb.0:1910; SSE41-NEXT: packusdw %xmm1, %xmm01911; SSE41-NEXT: retq1912;1913; AVX1-LABEL: trunc_packus_v8i32_v8i16:1914; AVX1: # %bb.0:1915; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11916; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm01917; AVX1-NEXT: vzeroupper1918; AVX1-NEXT: retq1919;1920; AVX2-LABEL: trunc_packus_v8i32_v8i16:1921; AVX2: # %bb.0:1922; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11923; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm01924; AVX2-NEXT: vzeroupper1925; AVX2-NEXT: retq1926;1927; AVX512F-LABEL: trunc_packus_v8i32_v8i16:1928; AVX512F: # %bb.0:1929; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm11930; AVX512F-NEXT: vpackusdw %xmm1, %xmm0, %xmm01931; AVX512F-NEXT: vzeroupper1932; AVX512F-NEXT: retq1933;1934; AVX512VL-LABEL: trunc_packus_v8i32_v8i16:1935; AVX512VL: # %bb.0:1936; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm11937; AVX512VL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm01938; AVX512VL-NEXT: vpmovusdw %ymm0, %xmm01939; AVX512VL-NEXT: vzeroupper1940; AVX512VL-NEXT: retq1941;1942; AVX512BW-LABEL: trunc_packus_v8i32_v8i16:1943; AVX512BW: # %bb.0:1944; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm11945; AVX512BW-NEXT: vpackusdw %xmm1, %xmm0, %xmm01946; AVX512BW-NEXT: vzeroupper1947; AVX512BW-NEXT: retq1948;1949; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i16:1950; AVX512BWVL: # %bb.0:1951; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm11952; AVX512BWVL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm01953; AVX512BWVL-NEXT: vpmovusdw %ymm0, %xmm01954; AVX512BWVL-NEXT: vzeroupper1955; AVX512BWVL-NEXT: retq1956;1957; SKX-LABEL: trunc_packus_v8i32_v8i16:1958; SKX: # %bb.0:1959; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm11960; SKX-NEXT: vpmaxsd %ymm1, %ymm0, %ymm01961; SKX-NEXT: vpmovusdw %ymm0, %xmm01962; SKX-NEXT: vzeroupper1963; SKX-NEXT: retq1964 %1 = icmp slt <8 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>1965 %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>1966 %3 = icmp sgt <8 x i32> %2, zeroinitializer1967 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer1968 %5 = trunc <8 x i32> %4 to <8 x i16>1969 ret <8 x i16> %51970}1971 1972define <16 x i16> @trunc_packus_v16i32_v16i16(ptr %p0) "min-legal-vector-width"="256" {1973; SSE2-LABEL: trunc_packus_v16i32_v16i16:1974; SSE2: # %bb.0:1975; SSE2-NEXT: movdqa (%rdi), %xmm11976; SSE2-NEXT: movdqa 16(%rdi), %xmm31977; SSE2-NEXT: movdqa 32(%rdi), %xmm01978; SSE2-NEXT: movdqa 48(%rdi), %xmm41979; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [65535,65535,65535,65535]1980; SSE2-NEXT: movdqa %xmm5, %xmm21981; SSE2-NEXT: pcmpgtd %xmm3, %xmm21982; SSE2-NEXT: pand %xmm2, %xmm31983; SSE2-NEXT: pandn %xmm5, %xmm21984; SSE2-NEXT: por %xmm3, %xmm21985; SSE2-NEXT: movdqa %xmm5, %xmm31986; SSE2-NEXT: pcmpgtd %xmm1, %xmm31987; SSE2-NEXT: pand %xmm3, %xmm11988; SSE2-NEXT: pandn %xmm5, %xmm31989; SSE2-NEXT: por %xmm1, %xmm31990; SSE2-NEXT: movdqa %xmm5, %xmm61991; SSE2-NEXT: pcmpgtd %xmm4, %xmm61992; SSE2-NEXT: pand %xmm6, %xmm41993; SSE2-NEXT: pandn %xmm5, %xmm61994; SSE2-NEXT: por %xmm4, %xmm61995; SSE2-NEXT: movdqa %xmm5, %xmm41996; SSE2-NEXT: pcmpgtd %xmm0, %xmm41997; SSE2-NEXT: pand %xmm4, %xmm01998; SSE2-NEXT: pandn %xmm5, %xmm41999; SSE2-NEXT: por %xmm0, %xmm42000; SSE2-NEXT: pxor %xmm5, %xmm52001; SSE2-NEXT: movdqa %xmm4, %xmm12002; SSE2-NEXT: pcmpgtd %xmm5, %xmm12003; SSE2-NEXT: pand %xmm4, %xmm12004; SSE2-NEXT: movdqa %xmm6, %xmm42005; SSE2-NEXT: pcmpgtd %xmm5, %xmm42006; SSE2-NEXT: pand %xmm6, %xmm42007; SSE2-NEXT: movdqa %xmm3, %xmm02008; SSE2-NEXT: pcmpgtd %xmm5, %xmm02009; SSE2-NEXT: pand %xmm3, %xmm02010; SSE2-NEXT: movdqa %xmm2, %xmm32011; SSE2-NEXT: pcmpgtd %xmm5, %xmm32012; SSE2-NEXT: pand %xmm2, %xmm32013; SSE2-NEXT: pslld $16, %xmm32014; SSE2-NEXT: psrad $16, %xmm32015; SSE2-NEXT: pslld $16, %xmm02016; SSE2-NEXT: psrad $16, %xmm02017; SSE2-NEXT: packssdw %xmm3, %xmm02018; SSE2-NEXT: pslld $16, %xmm42019; SSE2-NEXT: psrad $16, %xmm42020; SSE2-NEXT: pslld $16, %xmm12021; SSE2-NEXT: psrad $16, %xmm12022; SSE2-NEXT: packssdw %xmm4, %xmm12023; SSE2-NEXT: retq2024;2025; SSSE3-LABEL: trunc_packus_v16i32_v16i16:2026; SSSE3: # %bb.0:2027; SSSE3-NEXT: movdqa (%rdi), %xmm12028; SSSE3-NEXT: movdqa 16(%rdi), %xmm32029; SSSE3-NEXT: movdqa 32(%rdi), %xmm02030; SSSE3-NEXT: movdqa 48(%rdi), %xmm42031; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [65535,65535,65535,65535]2032; SSSE3-NEXT: movdqa %xmm5, %xmm22033; SSSE3-NEXT: pcmpgtd %xmm3, %xmm22034; SSSE3-NEXT: pand %xmm2, %xmm32035; SSSE3-NEXT: pandn %xmm5, %xmm22036; SSSE3-NEXT: por %xmm3, %xmm22037; SSSE3-NEXT: movdqa %xmm5, %xmm32038; SSSE3-NEXT: pcmpgtd %xmm1, %xmm32039; SSSE3-NEXT: pand %xmm3, %xmm12040; SSSE3-NEXT: pandn %xmm5, %xmm32041; SSSE3-NEXT: por %xmm1, %xmm32042; SSSE3-NEXT: movdqa %xmm5, %xmm62043; SSSE3-NEXT: pcmpgtd %xmm4, %xmm62044; SSSE3-NEXT: pand %xmm6, %xmm42045; SSSE3-NEXT: pandn %xmm5, %xmm62046; SSSE3-NEXT: por %xmm4, %xmm62047; SSSE3-NEXT: movdqa %xmm5, %xmm42048; SSSE3-NEXT: pcmpgtd %xmm0, %xmm42049; SSSE3-NEXT: pand %xmm4, %xmm02050; SSSE3-NEXT: pandn %xmm5, %xmm42051; SSSE3-NEXT: por %xmm0, %xmm42052; SSSE3-NEXT: pxor %xmm5, %xmm52053; SSSE3-NEXT: movdqa %xmm4, %xmm12054; SSSE3-NEXT: pcmpgtd %xmm5, %xmm12055; SSSE3-NEXT: pand %xmm4, %xmm12056; SSSE3-NEXT: movdqa %xmm6, %xmm42057; SSSE3-NEXT: pcmpgtd %xmm5, %xmm42058; SSSE3-NEXT: pand %xmm6, %xmm42059; SSSE3-NEXT: movdqa %xmm3, %xmm02060; SSSE3-NEXT: pcmpgtd %xmm5, %xmm02061; SSSE3-NEXT: pand %xmm3, %xmm02062; SSSE3-NEXT: movdqa %xmm2, %xmm32063; SSSE3-NEXT: pcmpgtd %xmm5, %xmm32064; SSSE3-NEXT: pand %xmm2, %xmm32065; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]2066; SSSE3-NEXT: pshufb %xmm2, %xmm32067; SSSE3-NEXT: pshufb %xmm2, %xmm02068; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]2069; SSSE3-NEXT: pshufb %xmm2, %xmm42070; SSSE3-NEXT: pshufb %xmm2, %xmm12071; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm4[0]2072; SSSE3-NEXT: retq2073;2074; SSE41-LABEL: trunc_packus_v16i32_v16i16:2075; SSE41: # %bb.0:2076; SSE41-NEXT: movdqa (%rdi), %xmm02077; SSE41-NEXT: movdqa 32(%rdi), %xmm12078; SSE41-NEXT: packusdw 16(%rdi), %xmm02079; SSE41-NEXT: packusdw 48(%rdi), %xmm12080; SSE41-NEXT: retq2081;2082; AVX1-LABEL: trunc_packus_v16i32_v16i16:2083; AVX1: # %bb.0:2084; AVX1-NEXT: vmovdqa (%rdi), %xmm02085; AVX1-NEXT: vmovdqa 32(%rdi), %xmm12086; AVX1-NEXT: vpackusdw 48(%rdi), %xmm1, %xmm12087; AVX1-NEXT: vpackusdw 16(%rdi), %xmm0, %xmm02088; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm02089; AVX1-NEXT: retq2090;2091; AVX2-LABEL: trunc_packus_v16i32_v16i16:2092; AVX2: # %bb.0:2093; AVX2-NEXT: vmovdqa (%rdi), %ymm02094; AVX2-NEXT: vpackusdw 32(%rdi), %ymm0, %ymm02095; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]2096; AVX2-NEXT: retq2097;2098; AVX512-LABEL: trunc_packus_v16i32_v16i16:2099; AVX512: # %bb.0:2100; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm02101; AVX512-NEXT: vpmaxsd (%rdi), %zmm0, %zmm02102; AVX512-NEXT: vpmovusdw %zmm0, %ymm02103; AVX512-NEXT: retq2104;2105; SKX-LABEL: trunc_packus_v16i32_v16i16:2106; SKX: # %bb.0:2107; SKX-NEXT: vmovdqa (%rdi), %ymm02108; SKX-NEXT: vpackusdw 32(%rdi), %ymm0, %ymm02109; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]2110; SKX-NEXT: retq2111 %a0 = load <16 x i32>, ptr %p02112 %1 = icmp slt <16 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>2113 %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>2114 %3 = icmp sgt <16 x i32> %2, zeroinitializer2115 %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> zeroinitializer2116 %5 = trunc <16 x i32> %4 to <16 x i16>2117 ret <16 x i16> %52118}2119 2120;2121; PACKUS saturation truncation to vXi82122;2123 2124define <2 x i8> @trunc_packus_v2i64_v2i8(<2 x i64> %a0) {2125; SSE2-LABEL: trunc_packus_v2i64_v2i8:2126; SSE2: # %bb.0:2127; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]2128; SSE2-NEXT: movdqa %xmm0, %xmm22129; SSE2-NEXT: pxor %xmm1, %xmm22130; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]2131; SSE2-NEXT: pxor %xmm4, %xmm42132; SSE2-NEXT: pcmpeqd %xmm3, %xmm42133; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903]2134; SSE2-NEXT: pcmpgtd %xmm2, %xmm32135; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]2136; SSE2-NEXT: pand %xmm4, %xmm22137; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]2138; SSE2-NEXT: por %xmm2, %xmm32139; SSE2-NEXT: pand %xmm3, %xmm02140; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm32141; SSE2-NEXT: por %xmm3, %xmm02142; SSE2-NEXT: movdqa %xmm0, %xmm22143; SSE2-NEXT: pxor %xmm1, %xmm22144; SSE2-NEXT: movdqa %xmm2, %xmm32145; SSE2-NEXT: pcmpgtd %xmm1, %xmm32146; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]2147; SSE2-NEXT: pcmpeqd %xmm1, %xmm22148; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]2149; SSE2-NEXT: pand %xmm4, %xmm12150; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]2151; SSE2-NEXT: por %xmm1, %xmm22152; SSE2-NEXT: pand %xmm2, %xmm02153; SSE2-NEXT: packuswb %xmm0, %xmm02154; SSE2-NEXT: packuswb %xmm0, %xmm02155; SSE2-NEXT: packuswb %xmm0, %xmm02156; SSE2-NEXT: retq2157;2158; SSSE3-LABEL: trunc_packus_v2i64_v2i8:2159; SSSE3: # %bb.0:2160; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]2161; SSSE3-NEXT: movdqa %xmm0, %xmm22162; SSSE3-NEXT: pxor %xmm1, %xmm22163; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]2164; SSSE3-NEXT: pxor %xmm4, %xmm42165; SSSE3-NEXT: pcmpeqd %xmm3, %xmm42166; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903]2167; SSSE3-NEXT: pcmpgtd %xmm2, %xmm32168; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]2169; SSSE3-NEXT: pand %xmm4, %xmm22170; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]2171; SSSE3-NEXT: por %xmm2, %xmm32172; SSSE3-NEXT: pand %xmm3, %xmm02173; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm32174; SSSE3-NEXT: por %xmm3, %xmm02175; SSSE3-NEXT: movdqa %xmm0, %xmm22176; SSSE3-NEXT: pxor %xmm1, %xmm22177; SSSE3-NEXT: movdqa %xmm2, %xmm32178; SSSE3-NEXT: pcmpgtd %xmm1, %xmm32179; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]2180; SSSE3-NEXT: pcmpeqd %xmm1, %xmm22181; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]2182; SSSE3-NEXT: pand %xmm4, %xmm12183; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]2184; SSSE3-NEXT: por %xmm1, %xmm22185; SSSE3-NEXT: pand %xmm2, %xmm02186; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]2187; SSSE3-NEXT: retq2188;2189; SSE41-LABEL: trunc_packus_v2i64_v2i8:2190; SSE41: # %bb.0:2191; SSE41-NEXT: movdqa %xmm0, %xmm12192; SSE41-NEXT: movapd {{.*#+}} xmm2 = [255,255]2193; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]2194; SSE41-NEXT: pxor %xmm3, %xmm02195; SSE41-NEXT: pmovzxdq {{.*#+}} xmm4 = [2147483903,2147483903]2196; SSE41-NEXT: movdqa %xmm0, %xmm52197; SSE41-NEXT: pcmpeqd %xmm4, %xmm52198; SSE41-NEXT: pcmpgtd %xmm0, %xmm42199; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]2200; SSE41-NEXT: pand %xmm5, %xmm02201; SSE41-NEXT: por %xmm4, %xmm02202; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm22203; SSE41-NEXT: xorpd %xmm1, %xmm12204; SSE41-NEXT: movapd %xmm2, %xmm42205; SSE41-NEXT: xorpd %xmm3, %xmm42206; SSE41-NEXT: movapd %xmm4, %xmm52207; SSE41-NEXT: pcmpeqd %xmm3, %xmm52208; SSE41-NEXT: pcmpgtd %xmm3, %xmm42209; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]2210; SSE41-NEXT: pand %xmm5, %xmm02211; SSE41-NEXT: por %xmm4, %xmm02212; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm12213; SSE41-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]2214; SSE41-NEXT: movdqa %xmm1, %xmm02215; SSE41-NEXT: retq2216;2217; AVX-LABEL: trunc_packus_v2i64_v2i8:2218; AVX: # %bb.0:2219; AVX-NEXT: vpmovzxbq {{.*#+}} xmm1 = [255,255]2220; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm22221; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm02222; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm12223; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm12224; AVX-NEXT: vpand %xmm0, %xmm1, %xmm02225; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]2226; AVX-NEXT: retq2227;2228; AVX512F-LABEL: trunc_packus_v2i64_v2i8:2229; AVX512F: # %bb.0:2230; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02231; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm12232; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm02233; AVX512F-NEXT: vpmovusqb %zmm0, %xmm02234; AVX512F-NEXT: vzeroupper2235; AVX512F-NEXT: retq2236;2237; AVX512VL-LABEL: trunc_packus_v2i64_v2i8:2238; AVX512VL: # %bb.0:2239; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm12240; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm02241; AVX512VL-NEXT: vpmovusqb %xmm0, %xmm02242; AVX512VL-NEXT: retq2243;2244; AVX512BW-LABEL: trunc_packus_v2i64_v2i8:2245; AVX512BW: # %bb.0:2246; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02247; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm12248; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm02249; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm02250; AVX512BW-NEXT: vzeroupper2251; AVX512BW-NEXT: retq2252;2253; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i8:2254; AVX512BWVL: # %bb.0:2255; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm12256; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm02257; AVX512BWVL-NEXT: vpmovusqb %xmm0, %xmm02258; AVX512BWVL-NEXT: retq2259;2260; SKX-LABEL: trunc_packus_v2i64_v2i8:2261; SKX: # %bb.0:2262; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm12263; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm02264; SKX-NEXT: vpmovusqb %xmm0, %xmm02265; SKX-NEXT: retq2266 %1 = icmp slt <2 x i64> %a0, <i64 255, i64 255>2267 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 255, i64 255>2268 %3 = icmp sgt <2 x i64> %2, zeroinitializer2269 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer2270 %5 = trunc <2 x i64> %4 to <2 x i8>2271 ret <2 x i8> %52272}2273 2274define void @trunc_packus_v2i64_v2i8_store(<2 x i64> %a0, ptr%p1) {2275; SSE2-LABEL: trunc_packus_v2i64_v2i8_store:2276; SSE2: # %bb.0:2277; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]2278; SSE2-NEXT: movdqa %xmm0, %xmm22279; SSE2-NEXT: pxor %xmm1, %xmm22280; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]2281; SSE2-NEXT: pxor %xmm4, %xmm42282; SSE2-NEXT: pcmpeqd %xmm3, %xmm42283; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903]2284; SSE2-NEXT: pcmpgtd %xmm2, %xmm32285; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]2286; SSE2-NEXT: pand %xmm4, %xmm22287; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]2288; SSE2-NEXT: por %xmm2, %xmm32289; SSE2-NEXT: pand %xmm3, %xmm02290; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm32291; SSE2-NEXT: por %xmm0, %xmm32292; SSE2-NEXT: movdqa %xmm3, %xmm02293; SSE2-NEXT: pxor %xmm1, %xmm02294; SSE2-NEXT: movdqa %xmm0, %xmm22295; SSE2-NEXT: pcmpgtd %xmm1, %xmm22296; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]2297; SSE2-NEXT: pcmpeqd %xmm1, %xmm02298; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]2299; SSE2-NEXT: pand %xmm4, %xmm02300; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]2301; SSE2-NEXT: por %xmm0, %xmm12302; SSE2-NEXT: pand %xmm3, %xmm12303; SSE2-NEXT: packuswb %xmm1, %xmm12304; SSE2-NEXT: packuswb %xmm1, %xmm12305; SSE2-NEXT: packuswb %xmm1, %xmm12306; SSE2-NEXT: movd %xmm1, %eax2307; SSE2-NEXT: movw %ax, (%rdi)2308; SSE2-NEXT: retq2309;2310; SSSE3-LABEL: trunc_packus_v2i64_v2i8_store:2311; SSSE3: # %bb.0:2312; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]2313; SSSE3-NEXT: movdqa %xmm0, %xmm22314; SSSE3-NEXT: pxor %xmm1, %xmm22315; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]2316; SSSE3-NEXT: pxor %xmm4, %xmm42317; SSSE3-NEXT: pcmpeqd %xmm3, %xmm42318; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903]2319; SSSE3-NEXT: pcmpgtd %xmm2, %xmm32320; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]2321; SSSE3-NEXT: pand %xmm4, %xmm22322; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]2323; SSSE3-NEXT: por %xmm2, %xmm32324; SSSE3-NEXT: pand %xmm3, %xmm02325; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm32326; SSSE3-NEXT: por %xmm0, %xmm32327; SSSE3-NEXT: movdqa %xmm3, %xmm02328; SSSE3-NEXT: pxor %xmm1, %xmm02329; SSSE3-NEXT: movdqa %xmm0, %xmm22330; SSSE3-NEXT: pcmpgtd %xmm1, %xmm22331; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]2332; SSSE3-NEXT: pcmpeqd %xmm1, %xmm02333; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]2334; SSSE3-NEXT: pand %xmm4, %xmm02335; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]2336; SSSE3-NEXT: por %xmm0, %xmm12337; SSSE3-NEXT: pand %xmm3, %xmm12338; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]2339; SSSE3-NEXT: movd %xmm1, %eax2340; SSSE3-NEXT: movw %ax, (%rdi)2341; SSSE3-NEXT: retq2342;2343; SSE41-LABEL: trunc_packus_v2i64_v2i8_store:2344; SSE41: # %bb.0:2345; SSE41-NEXT: movdqa %xmm0, %xmm12346; SSE41-NEXT: movapd {{.*#+}} xmm2 = [255,255]2347; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]2348; SSE41-NEXT: pxor %xmm3, %xmm02349; SSE41-NEXT: pmovzxdq {{.*#+}} xmm4 = [2147483903,2147483903]2350; SSE41-NEXT: movdqa %xmm0, %xmm52351; SSE41-NEXT: pcmpeqd %xmm4, %xmm52352; SSE41-NEXT: pcmpgtd %xmm0, %xmm42353; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]2354; SSE41-NEXT: pand %xmm5, %xmm02355; SSE41-NEXT: por %xmm4, %xmm02356; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm22357; SSE41-NEXT: xorpd %xmm1, %xmm12358; SSE41-NEXT: movapd %xmm2, %xmm42359; SSE41-NEXT: xorpd %xmm3, %xmm42360; SSE41-NEXT: movapd %xmm4, %xmm52361; SSE41-NEXT: pcmpeqd %xmm3, %xmm52362; SSE41-NEXT: pcmpgtd %xmm3, %xmm42363; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]2364; SSE41-NEXT: pand %xmm5, %xmm02365; SSE41-NEXT: por %xmm4, %xmm02366; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm12367; SSE41-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]2368; SSE41-NEXT: pextrw $0, %xmm1, (%rdi)2369; SSE41-NEXT: retq2370;2371; AVX-LABEL: trunc_packus_v2i64_v2i8_store:2372; AVX: # %bb.0:2373; AVX-NEXT: vpmovzxbq {{.*#+}} xmm1 = [255,255]2374; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm22375; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm02376; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm12377; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm12378; AVX-NEXT: vpand %xmm0, %xmm1, %xmm02379; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]2380; AVX-NEXT: vpextrw $0, %xmm0, (%rdi)2381; AVX-NEXT: retq2382;2383; AVX512F-LABEL: trunc_packus_v2i64_v2i8_store:2384; AVX512F: # %bb.0:2385; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02386; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm12387; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm02388; AVX512F-NEXT: vpmovusqb %zmm0, %xmm02389; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi)2390; AVX512F-NEXT: vzeroupper2391; AVX512F-NEXT: retq2392;2393; AVX512VL-LABEL: trunc_packus_v2i64_v2i8_store:2394; AVX512VL: # %bb.0:2395; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm12396; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm02397; AVX512VL-NEXT: vpmovusqb %xmm0, (%rdi)2398; AVX512VL-NEXT: retq2399;2400; AVX512BW-LABEL: trunc_packus_v2i64_v2i8_store:2401; AVX512BW: # %bb.0:2402; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02403; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm12404; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm02405; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm02406; AVX512BW-NEXT: vpextrw $0, %xmm0, (%rdi)2407; AVX512BW-NEXT: vzeroupper2408; AVX512BW-NEXT: retq2409;2410; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i8_store:2411; AVX512BWVL: # %bb.0:2412; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm12413; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm02414; AVX512BWVL-NEXT: vpmovusqb %xmm0, (%rdi)2415; AVX512BWVL-NEXT: retq2416;2417; SKX-LABEL: trunc_packus_v2i64_v2i8_store:2418; SKX: # %bb.0:2419; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm12420; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm02421; SKX-NEXT: vpmovusqb %xmm0, (%rdi)2422; SKX-NEXT: retq2423 %1 = icmp slt <2 x i64> %a0, <i64 255, i64 255>2424 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 255, i64 255>2425 %3 = icmp sgt <2 x i64> %2, zeroinitializer2426 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer2427 %5 = trunc <2 x i64> %4 to <2 x i8>2428 store <2 x i8> %5, ptr%p12429 ret void2430}2431 2432define <4 x i8> @trunc_packus_v4i64_v4i8(<4 x i64> %a0) {2433; SSE2-SSSE3-LABEL: trunc_packus_v4i64_v4i8:2434; SSE2-SSSE3: # %bb.0:2435; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [255,255]2436; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]2437; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm42438; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm42439; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]2440; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm62441; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm52442; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147483903,2147483903]2443; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm82444; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm82445; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm8[0,0,2,2]2446; SSE2-SSSE3-NEXT: pand %xmm5, %xmm42447; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]2448; SSE2-SSSE3-NEXT: por %xmm4, %xmm52449; SSE2-SSSE3-NEXT: pand %xmm5, %xmm02450; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm52451; SSE2-SSSE3-NEXT: por %xmm5, %xmm02452; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm42453; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm42454; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]2455; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm52456; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm72457; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]2458; SSE2-SSSE3-NEXT: pand %xmm5, %xmm42459; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]2460; SSE2-SSSE3-NEXT: por %xmm4, %xmm52461; SSE2-SSSE3-NEXT: pand %xmm5, %xmm12462; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm52463; SSE2-SSSE3-NEXT: por %xmm1, %xmm52464; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm12465; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm12466; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm32467; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm32468; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]2469; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm12470; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]2471; SSE2-SSSE3-NEXT: pand %xmm4, %xmm12472; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]2473; SSE2-SSSE3-NEXT: por %xmm1, %xmm32474; SSE2-SSSE3-NEXT: pand %xmm5, %xmm32475; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm12476; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm12477; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm42478; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm42479; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]2480; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm12481; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]2482; SSE2-SSSE3-NEXT: pand %xmm5, %xmm12483; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]2484; SSE2-SSSE3-NEXT: por %xmm1, %xmm22485; SSE2-SSSE3-NEXT: pand %xmm2, %xmm02486; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm02487; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm02488; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm02489; SSE2-SSSE3-NEXT: retq2490;2491; SSE41-LABEL: trunc_packus_v4i64_v4i8:2492; SSE41: # %bb.0:2493; SSE41-NEXT: movdqa %xmm0, %xmm22494; SSE41-NEXT: movapd {{.*#+}} xmm4 = [255,255]2495; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]2496; SSE41-NEXT: movdqa %xmm0, %xmm52497; SSE41-NEXT: pxor %xmm3, %xmm52498; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147483903,2147483903]2499; SSE41-NEXT: movdqa %xmm6, %xmm72500; SSE41-NEXT: pcmpgtd %xmm5, %xmm72501; SSE41-NEXT: pcmpeqd %xmm6, %xmm52502; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]2503; SSE41-NEXT: pand %xmm5, %xmm02504; SSE41-NEXT: por %xmm7, %xmm02505; SSE41-NEXT: movapd %xmm4, %xmm52506; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm52507; SSE41-NEXT: movdqa %xmm1, %xmm02508; SSE41-NEXT: pxor %xmm3, %xmm02509; SSE41-NEXT: movdqa %xmm0, %xmm22510; SSE41-NEXT: pcmpeqd %xmm6, %xmm22511; SSE41-NEXT: pcmpgtd %xmm0, %xmm62512; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]2513; SSE41-NEXT: pand %xmm2, %xmm02514; SSE41-NEXT: por %xmm6, %xmm02515; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm42516; SSE41-NEXT: xorpd %xmm1, %xmm12517; SSE41-NEXT: movapd %xmm4, %xmm22518; SSE41-NEXT: xorpd %xmm3, %xmm22519; SSE41-NEXT: movapd %xmm2, %xmm62520; SSE41-NEXT: pcmpeqd %xmm3, %xmm62521; SSE41-NEXT: pcmpgtd %xmm3, %xmm22522; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]2523; SSE41-NEXT: pand %xmm6, %xmm02524; SSE41-NEXT: por %xmm2, %xmm02525; SSE41-NEXT: pxor %xmm2, %xmm22526; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm22527; SSE41-NEXT: movapd %xmm5, %xmm42528; SSE41-NEXT: xorpd %xmm3, %xmm42529; SSE41-NEXT: movapd %xmm4, %xmm62530; SSE41-NEXT: pcmpeqd %xmm3, %xmm62531; SSE41-NEXT: pcmpgtd %xmm3, %xmm42532; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]2533; SSE41-NEXT: pand %xmm6, %xmm02534; SSE41-NEXT: por %xmm4, %xmm02535; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm12536; SSE41-NEXT: packusdw %xmm2, %xmm12537; SSE41-NEXT: packusdw %xmm1, %xmm12538; SSE41-NEXT: packuswb %xmm1, %xmm12539; SSE41-NEXT: movdqa %xmm1, %xmm02540; SSE41-NEXT: retq2541;2542; AVX1-LABEL: trunc_packus_v4i64_v4i8:2543; AVX1: # %bb.0:2544; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = [255,255]2545; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm22546; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm22547; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02548; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm32549; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm02550; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm12551; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm32552; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm02553; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm12554; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm12555; AVX1-NEXT: vpackusdw %xmm0, %xmm1, %xmm02556; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm02557; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm02558; AVX1-NEXT: vzeroupper2559; AVX1-NEXT: retq2560;2561; AVX2-LABEL: trunc_packus_v4i64_v4i8:2562; AVX2: # %bb.0:2563; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [255,255,255,255]2564; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm22565; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm02566; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm12567; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm12568; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm02569; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12570; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm02571; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm02572; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm02573; AVX2-NEXT: vzeroupper2574; AVX2-NEXT: retq2575;2576; AVX512F-LABEL: trunc_packus_v4i64_v4i8:2577; AVX512F: # %bb.0:2578; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02579; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm12580; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm02581; AVX512F-NEXT: vpmovusqb %zmm0, %xmm02582; AVX512F-NEXT: vzeroupper2583; AVX512F-NEXT: retq2584;2585; AVX512VL-LABEL: trunc_packus_v4i64_v4i8:2586; AVX512VL: # %bb.0:2587; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm12588; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm02589; AVX512VL-NEXT: vpmovusqb %ymm0, %xmm02590; AVX512VL-NEXT: vzeroupper2591; AVX512VL-NEXT: retq2592;2593; AVX512BW-LABEL: trunc_packus_v4i64_v4i8:2594; AVX512BW: # %bb.0:2595; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02596; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm12597; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm02598; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm02599; AVX512BW-NEXT: vzeroupper2600; AVX512BW-NEXT: retq2601;2602; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i8:2603; AVX512BWVL: # %bb.0:2604; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm12605; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm02606; AVX512BWVL-NEXT: vpmovusqb %ymm0, %xmm02607; AVX512BWVL-NEXT: vzeroupper2608; AVX512BWVL-NEXT: retq2609;2610; SKX-LABEL: trunc_packus_v4i64_v4i8:2611; SKX: # %bb.0:2612; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm12613; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm02614; SKX-NEXT: vpmovusqb %ymm0, %xmm02615; SKX-NEXT: vzeroupper2616; SKX-NEXT: retq2617 %1 = icmp slt <4 x i64> %a0, <i64 255, i64 255, i64 255, i64 255>2618 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 255, i64 255, i64 255, i64 255>2619 %3 = icmp sgt <4 x i64> %2, zeroinitializer2620 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer2621 %5 = trunc <4 x i64> %4 to <4 x i8>2622 ret <4 x i8> %52623}2624 2625define void @trunc_packus_v4i64_v4i8_store(<4 x i64> %a0, ptr%p1) {2626; SSE2-SSSE3-LABEL: trunc_packus_v4i64_v4i8_store:2627; SSE2-SSSE3: # %bb.0:2628; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [255,255]2629; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]2630; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm32631; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm32632; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]2633; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm62634; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm52635; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147483903,2147483903]2636; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm82637; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm82638; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]2639; SSE2-SSSE3-NEXT: pand %xmm5, %xmm92640; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm8[1,1,3,3]2641; SSE2-SSSE3-NEXT: por %xmm9, %xmm32642; SSE2-SSSE3-NEXT: pand %xmm3, %xmm02643; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm32644; SSE2-SSSE3-NEXT: por %xmm0, %xmm32645; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm02646; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm02647; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]2648; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm52649; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm72650; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]2651; SSE2-SSSE3-NEXT: pand %xmm5, %xmm02652; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]2653; SSE2-SSSE3-NEXT: por %xmm0, %xmm52654; SSE2-SSSE3-NEXT: pand %xmm5, %xmm12655; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm52656; SSE2-SSSE3-NEXT: por %xmm1, %xmm52657; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm02658; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm02659; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm12660; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm12661; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]2662; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm02663; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]2664; SSE2-SSSE3-NEXT: pand %xmm4, %xmm02665; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]2666; SSE2-SSSE3-NEXT: por %xmm0, %xmm12667; SSE2-SSSE3-NEXT: pand %xmm5, %xmm12668; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm02669; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm02670; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm42671; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm42672; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]2673; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm02674; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]2675; SSE2-SSSE3-NEXT: pand %xmm5, %xmm02676; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]2677; SSE2-SSSE3-NEXT: por %xmm0, %xmm22678; SSE2-SSSE3-NEXT: pand %xmm3, %xmm22679; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm22680; SSE2-SSSE3-NEXT: packuswb %xmm2, %xmm22681; SSE2-SSSE3-NEXT: packuswb %xmm2, %xmm22682; SSE2-SSSE3-NEXT: movd %xmm2, (%rdi)2683; SSE2-SSSE3-NEXT: retq2684;2685; SSE41-LABEL: trunc_packus_v4i64_v4i8_store:2686; SSE41: # %bb.0:2687; SSE41-NEXT: movdqa %xmm0, %xmm22688; SSE41-NEXT: movapd {{.*#+}} xmm4 = [255,255]2689; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]2690; SSE41-NEXT: movdqa %xmm0, %xmm52691; SSE41-NEXT: pxor %xmm3, %xmm52692; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147483903,2147483903]2693; SSE41-NEXT: movdqa %xmm6, %xmm72694; SSE41-NEXT: pcmpgtd %xmm5, %xmm72695; SSE41-NEXT: pcmpeqd %xmm6, %xmm52696; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]2697; SSE41-NEXT: pand %xmm5, %xmm02698; SSE41-NEXT: por %xmm7, %xmm02699; SSE41-NEXT: movapd %xmm4, %xmm52700; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm52701; SSE41-NEXT: movdqa %xmm1, %xmm02702; SSE41-NEXT: pxor %xmm3, %xmm02703; SSE41-NEXT: movdqa %xmm0, %xmm22704; SSE41-NEXT: pcmpeqd %xmm6, %xmm22705; SSE41-NEXT: pcmpgtd %xmm0, %xmm62706; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]2707; SSE41-NEXT: pand %xmm2, %xmm02708; SSE41-NEXT: por %xmm6, %xmm02709; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm42710; SSE41-NEXT: xorpd %xmm1, %xmm12711; SSE41-NEXT: movapd %xmm4, %xmm22712; SSE41-NEXT: xorpd %xmm3, %xmm22713; SSE41-NEXT: movapd %xmm2, %xmm62714; SSE41-NEXT: pcmpeqd %xmm3, %xmm62715; SSE41-NEXT: pcmpgtd %xmm3, %xmm22716; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]2717; SSE41-NEXT: pand %xmm6, %xmm02718; SSE41-NEXT: por %xmm2, %xmm02719; SSE41-NEXT: pxor %xmm2, %xmm22720; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm22721; SSE41-NEXT: movapd %xmm5, %xmm42722; SSE41-NEXT: xorpd %xmm3, %xmm42723; SSE41-NEXT: movapd %xmm4, %xmm62724; SSE41-NEXT: pcmpeqd %xmm3, %xmm62725; SSE41-NEXT: pcmpgtd %xmm3, %xmm42726; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]2727; SSE41-NEXT: pand %xmm6, %xmm02728; SSE41-NEXT: por %xmm4, %xmm02729; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm12730; SSE41-NEXT: packusdw %xmm2, %xmm12731; SSE41-NEXT: packusdw %xmm1, %xmm12732; SSE41-NEXT: packuswb %xmm1, %xmm12733; SSE41-NEXT: movd %xmm1, (%rdi)2734; SSE41-NEXT: retq2735;2736; AVX1-LABEL: trunc_packus_v4i64_v4i8_store:2737; AVX1: # %bb.0:2738; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = [255,255]2739; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm22740; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm22741; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02742; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm32743; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm02744; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm12745; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm32746; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm02747; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm12748; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm12749; AVX1-NEXT: vpackusdw %xmm0, %xmm1, %xmm02750; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm02751; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm02752; AVX1-NEXT: vmovd %xmm0, (%rdi)2753; AVX1-NEXT: vzeroupper2754; AVX1-NEXT: retq2755;2756; AVX2-LABEL: trunc_packus_v4i64_v4i8_store:2757; AVX2: # %bb.0:2758; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [255,255,255,255]2759; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm22760; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm02761; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm12762; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm12763; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm02764; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12765; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm02766; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm02767; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm02768; AVX2-NEXT: vmovd %xmm0, (%rdi)2769; AVX2-NEXT: vzeroupper2770; AVX2-NEXT: retq2771;2772; AVX512F-LABEL: trunc_packus_v4i64_v4i8_store:2773; AVX512F: # %bb.0:2774; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02775; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm12776; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm02777; AVX512F-NEXT: vpmovusqb %zmm0, %xmm02778; AVX512F-NEXT: vmovd %xmm0, (%rdi)2779; AVX512F-NEXT: vzeroupper2780; AVX512F-NEXT: retq2781;2782; AVX512VL-LABEL: trunc_packus_v4i64_v4i8_store:2783; AVX512VL: # %bb.0:2784; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm12785; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm02786; AVX512VL-NEXT: vpmovusqb %ymm0, (%rdi)2787; AVX512VL-NEXT: vzeroupper2788; AVX512VL-NEXT: retq2789;2790; AVX512BW-LABEL: trunc_packus_v4i64_v4i8_store:2791; AVX512BW: # %bb.0:2792; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02793; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm12794; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm02795; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm02796; AVX512BW-NEXT: vmovd %xmm0, (%rdi)2797; AVX512BW-NEXT: vzeroupper2798; AVX512BW-NEXT: retq2799;2800; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i8_store:2801; AVX512BWVL: # %bb.0:2802; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm12803; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm02804; AVX512BWVL-NEXT: vpmovusqb %ymm0, (%rdi)2805; AVX512BWVL-NEXT: vzeroupper2806; AVX512BWVL-NEXT: retq2807;2808; SKX-LABEL: trunc_packus_v4i64_v4i8_store:2809; SKX: # %bb.0:2810; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm12811; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm02812; SKX-NEXT: vpmovusqb %ymm0, (%rdi)2813; SKX-NEXT: vzeroupper2814; SKX-NEXT: retq2815 %1 = icmp slt <4 x i64> %a0, <i64 255, i64 255, i64 255, i64 255>2816 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 255, i64 255, i64 255, i64 255>2817 %3 = icmp sgt <4 x i64> %2, zeroinitializer2818 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer2819 %5 = trunc <4 x i64> %4 to <4 x i8>2820 store <4 x i8> %5, ptr%p12821 ret void2822}2823 2824define <8 x i8> @trunc_packus_v8i64_v8i8(ptr %p0) "min-legal-vector-width"="256" {2825; SSE2-SSSE3-LABEL: trunc_packus_v8i64_v8i8:2826; SSE2-SSSE3: # %bb.0:2827; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm52828; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm02829; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm32830; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm82831; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [255,255]2832; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]2833; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm22834; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm22835; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]2836; SSE2-SSSE3-NEXT: pxor %xmm7, %xmm72837; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm92838; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483903,2147483903]2839; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm102840; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm102841; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]2842; SSE2-SSSE3-NEXT: pand %xmm9, %xmm112843; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]2844; SSE2-SSSE3-NEXT: por %xmm11, %xmm22845; SSE2-SSSE3-NEXT: pand %xmm2, %xmm32846; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm22847; SSE2-SSSE3-NEXT: por %xmm3, %xmm22848; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm32849; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm32850; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]2851; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm92852; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm102853; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm102854; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]2855; SSE2-SSSE3-NEXT: pand %xmm9, %xmm112856; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm10[1,1,3,3]2857; SSE2-SSSE3-NEXT: por %xmm11, %xmm32858; SSE2-SSSE3-NEXT: pand %xmm3, %xmm82859; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm32860; SSE2-SSSE3-NEXT: por %xmm8, %xmm32861; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm82862; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm82863; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,1,3,3]2864; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm92865; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm102866; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm102867; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]2868; SSE2-SSSE3-NEXT: pand %xmm9, %xmm112869; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm10[1,1,3,3]2870; SSE2-SSSE3-NEXT: por %xmm11, %xmm82871; SSE2-SSSE3-NEXT: pand %xmm8, %xmm52872; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm82873; SSE2-SSSE3-NEXT: por %xmm5, %xmm82874; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm52875; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm52876; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]2877; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm92878; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm62879; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm6[0,0,2,2]2880; SSE2-SSSE3-NEXT: pand %xmm9, %xmm52881; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]2882; SSE2-SSSE3-NEXT: por %xmm5, %xmm62883; SSE2-SSSE3-NEXT: pand %xmm6, %xmm02884; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm62885; SSE2-SSSE3-NEXT: por %xmm0, %xmm62886; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm02887; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm02888; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm42889; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm42890; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]2891; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm02892; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]2893; SSE2-SSSE3-NEXT: pand %xmm5, %xmm02894; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]2895; SSE2-SSSE3-NEXT: por %xmm0, %xmm42896; SSE2-SSSE3-NEXT: pand %xmm6, %xmm42897; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm02898; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm02899; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm52900; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm52901; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]2902; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm02903; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]2904; SSE2-SSSE3-NEXT: pand %xmm6, %xmm72905; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]2906; SSE2-SSSE3-NEXT: por %xmm7, %xmm02907; SSE2-SSSE3-NEXT: pand %xmm8, %xmm02908; SSE2-SSSE3-NEXT: packuswb %xmm4, %xmm02909; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm42910; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm42911; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm52912; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm52913; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]2914; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm42915; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]2916; SSE2-SSSE3-NEXT: pand %xmm6, %xmm42917; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]2918; SSE2-SSSE3-NEXT: por %xmm4, %xmm52919; SSE2-SSSE3-NEXT: pand %xmm3, %xmm52920; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm32921; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm32922; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm42923; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm42924; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]2925; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm32926; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]2927; SSE2-SSSE3-NEXT: pand %xmm6, %xmm12928; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]2929; SSE2-SSSE3-NEXT: por %xmm1, %xmm32930; SSE2-SSSE3-NEXT: pand %xmm2, %xmm32931; SSE2-SSSE3-NEXT: packuswb %xmm5, %xmm32932; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm02933; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm02934; SSE2-SSSE3-NEXT: retq2935;2936; SSE41-LABEL: trunc_packus_v8i64_v8i8:2937; SSE41: # %bb.0:2938; SSE41-NEXT: movdqa (%rdi), %xmm72939; SSE41-NEXT: movdqa 16(%rdi), %xmm52940; SSE41-NEXT: movdqa 32(%rdi), %xmm42941; SSE41-NEXT: movdqa 48(%rdi), %xmm82942; SSE41-NEXT: movapd {{.*#+}} xmm1 = [255,255]2943; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]2944; SSE41-NEXT: movdqa %xmm4, %xmm32945; SSE41-NEXT: pxor %xmm2, %xmm32946; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147483903,2147483903]2947; SSE41-NEXT: movdqa %xmm6, %xmm92948; SSE41-NEXT: pcmpgtd %xmm3, %xmm92949; SSE41-NEXT: pcmpeqd %xmm6, %xmm32950; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]2951; SSE41-NEXT: pand %xmm3, %xmm02952; SSE41-NEXT: por %xmm9, %xmm02953; SSE41-NEXT: movapd %xmm1, %xmm32954; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm32955; SSE41-NEXT: movdqa %xmm8, %xmm42956; SSE41-NEXT: pxor %xmm2, %xmm42957; SSE41-NEXT: movdqa %xmm6, %xmm92958; SSE41-NEXT: pcmpgtd %xmm4, %xmm92959; SSE41-NEXT: pcmpeqd %xmm6, %xmm42960; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]2961; SSE41-NEXT: pand %xmm4, %xmm02962; SSE41-NEXT: por %xmm9, %xmm02963; SSE41-NEXT: movapd %xmm1, %xmm42964; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm42965; SSE41-NEXT: movdqa %xmm7, %xmm82966; SSE41-NEXT: pxor %xmm2, %xmm82967; SSE41-NEXT: movdqa %xmm6, %xmm92968; SSE41-NEXT: pcmpgtd %xmm8, %xmm92969; SSE41-NEXT: pcmpeqd %xmm6, %xmm82970; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]2971; SSE41-NEXT: pand %xmm8, %xmm02972; SSE41-NEXT: por %xmm9, %xmm02973; SSE41-NEXT: movapd %xmm1, %xmm82974; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm82975; SSE41-NEXT: movdqa %xmm5, %xmm02976; SSE41-NEXT: pxor %xmm2, %xmm02977; SSE41-NEXT: movdqa %xmm0, %xmm72978; SSE41-NEXT: pcmpeqd %xmm6, %xmm72979; SSE41-NEXT: pcmpgtd %xmm0, %xmm62980; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]2981; SSE41-NEXT: pand %xmm7, %xmm02982; SSE41-NEXT: por %xmm6, %xmm02983; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm12984; SSE41-NEXT: xorpd %xmm5, %xmm52985; SSE41-NEXT: movapd %xmm1, %xmm62986; SSE41-NEXT: xorpd %xmm2, %xmm62987; SSE41-NEXT: movapd %xmm6, %xmm72988; SSE41-NEXT: pcmpeqd %xmm2, %xmm72989; SSE41-NEXT: pcmpgtd %xmm2, %xmm62990; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]2991; SSE41-NEXT: pand %xmm7, %xmm02992; SSE41-NEXT: por %xmm6, %xmm02993; SSE41-NEXT: pxor %xmm6, %xmm62994; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm62995; SSE41-NEXT: movapd %xmm8, %xmm12996; SSE41-NEXT: xorpd %xmm2, %xmm12997; SSE41-NEXT: movapd %xmm1, %xmm72998; SSE41-NEXT: pcmpeqd %xmm2, %xmm72999; SSE41-NEXT: pcmpgtd %xmm2, %xmm13000; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]3001; SSE41-NEXT: pand %xmm7, %xmm03002; SSE41-NEXT: por %xmm1, %xmm03003; SSE41-NEXT: pxor %xmm1, %xmm13004; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm13005; SSE41-NEXT: packusdw %xmm6, %xmm13006; SSE41-NEXT: movapd %xmm4, %xmm63007; SSE41-NEXT: xorpd %xmm2, %xmm63008; SSE41-NEXT: movapd %xmm6, %xmm73009; SSE41-NEXT: pcmpeqd %xmm2, %xmm73010; SSE41-NEXT: pcmpgtd %xmm2, %xmm63011; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]3012; SSE41-NEXT: pand %xmm7, %xmm03013; SSE41-NEXT: por %xmm6, %xmm03014; SSE41-NEXT: pxor %xmm6, %xmm63015; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm63016; SSE41-NEXT: movapd %xmm3, %xmm43017; SSE41-NEXT: xorpd %xmm2, %xmm43018; SSE41-NEXT: movapd %xmm4, %xmm73019; SSE41-NEXT: pcmpeqd %xmm2, %xmm73020; SSE41-NEXT: pcmpgtd %xmm2, %xmm43021; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]3022; SSE41-NEXT: pand %xmm7, %xmm03023; SSE41-NEXT: por %xmm4, %xmm03024; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm53025; SSE41-NEXT: packusdw %xmm6, %xmm53026; SSE41-NEXT: packusdw %xmm5, %xmm13027; SSE41-NEXT: packuswb %xmm1, %xmm13028; SSE41-NEXT: movdqa %xmm1, %xmm03029; SSE41-NEXT: retq3030;3031; AVX1-LABEL: trunc_packus_v8i64_v8i8:3032; AVX1: # %bb.0:3033; AVX1-NEXT: vmovdqa (%rdi), %xmm03034; AVX1-NEXT: vmovdqa 16(%rdi), %xmm13035; AVX1-NEXT: vmovdqa 32(%rdi), %xmm23036; AVX1-NEXT: vmovdqa 48(%rdi), %xmm33037; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm4 = [255,255]3038; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm53039; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm4, %xmm23040; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm53041; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm4, %xmm33042; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm53043; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm03044; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm53045; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm13046; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm43047; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm53048; AVX1-NEXT: vpand %xmm1, %xmm5, %xmm13049; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm53050; AVX1-NEXT: vpand %xmm0, %xmm5, %xmm03051; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm03052; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm13053; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm13054; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm33055; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm23056; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm13057; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm03058; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm03059; AVX1-NEXT: retq3060;3061; AVX2-LABEL: trunc_packus_v8i64_v8i8:3062; AVX2: # %bb.0:3063; AVX2-NEXT: vmovdqa (%rdi), %ymm03064; AVX2-NEXT: vmovdqa 32(%rdi), %ymm13065; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [255,255,255,255]3066; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm33067; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm03068; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm33069; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm13070; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm23071; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm33072; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm13073; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm23074; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm03075; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm03076; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13077; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm03078; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3079; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm03080; AVX2-NEXT: vzeroupper3081; AVX2-NEXT: retq3082;3083; AVX512-LABEL: trunc_packus_v8i64_v8i8:3084; AVX512: # %bb.0:3085; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm03086; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm03087; AVX512-NEXT: vpmovusqb %zmm0, %xmm03088; AVX512-NEXT: vzeroupper3089; AVX512-NEXT: retq3090;3091; SKX-LABEL: trunc_packus_v8i64_v8i8:3092; SKX: # %bb.0:3093; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm03094; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm13095; SKX-NEXT: vpmovusqb %ymm1, %xmm13096; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm03097; SKX-NEXT: vpmovusqb %ymm0, %xmm03098; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3099; SKX-NEXT: vzeroupper3100; SKX-NEXT: retq3101 %a0 = load <8 x i64>, ptr %p03102 %1 = icmp slt <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>3103 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>3104 %3 = icmp sgt <8 x i64> %2, zeroinitializer3105 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer3106 %5 = trunc <8 x i64> %4 to <8 x i8>3107 ret <8 x i8> %53108}3109 3110define void @trunc_packus_v8i64_v8i8_store(ptr %p0, ptr%p1) "min-legal-vector-width"="256" {3111; SSE2-SSSE3-LABEL: trunc_packus_v8i64_v8i8_store:3112; SSE2-SSSE3: # %bb.0:3113; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm53114; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm33115; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm23116; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm83117; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [255,255]3118; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648]3119; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm13120; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm13121; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm1[1,1,3,3]3122; SSE2-SSSE3-NEXT: pxor %xmm7, %xmm73123; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm93124; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483903,2147483903]3125; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm103126; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm103127; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]3128; SSE2-SSSE3-NEXT: pand %xmm9, %xmm113129; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm10[1,1,3,3]3130; SSE2-SSSE3-NEXT: por %xmm11, %xmm13131; SSE2-SSSE3-NEXT: pand %xmm1, %xmm23132; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm13133; SSE2-SSSE3-NEXT: por %xmm2, %xmm13134; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm23135; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm23136; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]3137; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm93138; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm103139; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm103140; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]3141; SSE2-SSSE3-NEXT: pand %xmm9, %xmm113142; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]3143; SSE2-SSSE3-NEXT: por %xmm11, %xmm23144; SSE2-SSSE3-NEXT: pand %xmm2, %xmm83145; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm23146; SSE2-SSSE3-NEXT: por %xmm8, %xmm23147; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm83148; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm83149; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,1,3,3]3150; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm93151; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm103152; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm103153; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]3154; SSE2-SSSE3-NEXT: pand %xmm9, %xmm113155; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm10[1,1,3,3]3156; SSE2-SSSE3-NEXT: por %xmm11, %xmm83157; SSE2-SSSE3-NEXT: pand %xmm8, %xmm53158; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm83159; SSE2-SSSE3-NEXT: por %xmm5, %xmm83160; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm53161; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm53162; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]3163; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm93164; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm63165; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm6[0,0,2,2]3166; SSE2-SSSE3-NEXT: pand %xmm9, %xmm53167; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]3168; SSE2-SSSE3-NEXT: por %xmm5, %xmm63169; SSE2-SSSE3-NEXT: pand %xmm6, %xmm33170; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm63171; SSE2-SSSE3-NEXT: por %xmm3, %xmm63172; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm33173; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm33174; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm43175; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm43176; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]3177; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm33178; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]3179; SSE2-SSSE3-NEXT: pand %xmm5, %xmm33180; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]3181; SSE2-SSSE3-NEXT: por %xmm3, %xmm43182; SSE2-SSSE3-NEXT: pand %xmm6, %xmm43183; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm33184; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm33185; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm53186; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm53187; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]3188; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm33189; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]3190; SSE2-SSSE3-NEXT: pand %xmm6, %xmm73191; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]3192; SSE2-SSSE3-NEXT: por %xmm7, %xmm33193; SSE2-SSSE3-NEXT: pand %xmm8, %xmm33194; SSE2-SSSE3-NEXT: packuswb %xmm4, %xmm33195; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm43196; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm43197; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm53198; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm53199; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]3200; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm43201; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]3202; SSE2-SSSE3-NEXT: pand %xmm6, %xmm43203; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]3204; SSE2-SSSE3-NEXT: por %xmm4, %xmm53205; SSE2-SSSE3-NEXT: pand %xmm2, %xmm53206; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm23207; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm23208; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm43209; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm43210; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]3211; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm23212; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]3213; SSE2-SSSE3-NEXT: pand %xmm6, %xmm03214; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]3215; SSE2-SSSE3-NEXT: por %xmm0, %xmm23216; SSE2-SSSE3-NEXT: pand %xmm1, %xmm23217; SSE2-SSSE3-NEXT: packuswb %xmm5, %xmm23218; SSE2-SSSE3-NEXT: packuswb %xmm2, %xmm33219; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm33220; SSE2-SSSE3-NEXT: movq %xmm3, (%rsi)3221; SSE2-SSSE3-NEXT: retq3222;3223; SSE41-LABEL: trunc_packus_v8i64_v8i8_store:3224; SSE41: # %bb.0:3225; SSE41-NEXT: movdqa (%rdi), %xmm73226; SSE41-NEXT: movdqa 16(%rdi), %xmm53227; SSE41-NEXT: movdqa 32(%rdi), %xmm33228; SSE41-NEXT: movdqa 48(%rdi), %xmm83229; SSE41-NEXT: movapd {{.*#+}} xmm4 = [255,255]3230; SSE41-NEXT: pmovzxdq {{.*#+}} xmm1 = [2147483648,2147483648]3231; SSE41-NEXT: movdqa %xmm3, %xmm23232; SSE41-NEXT: pxor %xmm1, %xmm23233; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147483903,2147483903]3234; SSE41-NEXT: movdqa %xmm6, %xmm93235; SSE41-NEXT: pcmpgtd %xmm2, %xmm93236; SSE41-NEXT: pcmpeqd %xmm6, %xmm23237; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]3238; SSE41-NEXT: pand %xmm2, %xmm03239; SSE41-NEXT: por %xmm9, %xmm03240; SSE41-NEXT: movapd %xmm4, %xmm23241; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm23242; SSE41-NEXT: movdqa %xmm8, %xmm33243; SSE41-NEXT: pxor %xmm1, %xmm33244; SSE41-NEXT: movdqa %xmm6, %xmm93245; SSE41-NEXT: pcmpgtd %xmm3, %xmm93246; SSE41-NEXT: pcmpeqd %xmm6, %xmm33247; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]3248; SSE41-NEXT: pand %xmm3, %xmm03249; SSE41-NEXT: por %xmm9, %xmm03250; SSE41-NEXT: movapd %xmm4, %xmm33251; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm33252; SSE41-NEXT: movdqa %xmm7, %xmm83253; SSE41-NEXT: pxor %xmm1, %xmm83254; SSE41-NEXT: movdqa %xmm6, %xmm93255; SSE41-NEXT: pcmpgtd %xmm8, %xmm93256; SSE41-NEXT: pcmpeqd %xmm6, %xmm83257; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]3258; SSE41-NEXT: pand %xmm8, %xmm03259; SSE41-NEXT: por %xmm9, %xmm03260; SSE41-NEXT: movapd %xmm4, %xmm83261; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm83262; SSE41-NEXT: movdqa %xmm5, %xmm03263; SSE41-NEXT: pxor %xmm1, %xmm03264; SSE41-NEXT: movdqa %xmm0, %xmm73265; SSE41-NEXT: pcmpeqd %xmm6, %xmm73266; SSE41-NEXT: pcmpgtd %xmm0, %xmm63267; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]3268; SSE41-NEXT: pand %xmm7, %xmm03269; SSE41-NEXT: por %xmm6, %xmm03270; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm43271; SSE41-NEXT: xorpd %xmm5, %xmm53272; SSE41-NEXT: movapd %xmm4, %xmm63273; SSE41-NEXT: xorpd %xmm1, %xmm63274; SSE41-NEXT: movapd %xmm6, %xmm73275; SSE41-NEXT: pcmpeqd %xmm1, %xmm73276; SSE41-NEXT: pcmpgtd %xmm1, %xmm63277; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]3278; SSE41-NEXT: pand %xmm7, %xmm03279; SSE41-NEXT: por %xmm6, %xmm03280; SSE41-NEXT: pxor %xmm6, %xmm63281; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm63282; SSE41-NEXT: movapd %xmm8, %xmm43283; SSE41-NEXT: xorpd %xmm1, %xmm43284; SSE41-NEXT: movapd %xmm4, %xmm73285; SSE41-NEXT: pcmpeqd %xmm1, %xmm73286; SSE41-NEXT: pcmpgtd %xmm1, %xmm43287; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]3288; SSE41-NEXT: pand %xmm7, %xmm03289; SSE41-NEXT: por %xmm4, %xmm03290; SSE41-NEXT: pxor %xmm4, %xmm43291; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm43292; SSE41-NEXT: packusdw %xmm6, %xmm43293; SSE41-NEXT: movapd %xmm3, %xmm63294; SSE41-NEXT: xorpd %xmm1, %xmm63295; SSE41-NEXT: movapd %xmm6, %xmm73296; SSE41-NEXT: pcmpeqd %xmm1, %xmm73297; SSE41-NEXT: pcmpgtd %xmm1, %xmm63298; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]3299; SSE41-NEXT: pand %xmm7, %xmm03300; SSE41-NEXT: por %xmm6, %xmm03301; SSE41-NEXT: pxor %xmm6, %xmm63302; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm63303; SSE41-NEXT: movapd %xmm2, %xmm33304; SSE41-NEXT: xorpd %xmm1, %xmm33305; SSE41-NEXT: movapd %xmm3, %xmm73306; SSE41-NEXT: pcmpeqd %xmm1, %xmm73307; SSE41-NEXT: pcmpgtd %xmm1, %xmm33308; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]3309; SSE41-NEXT: pand %xmm7, %xmm03310; SSE41-NEXT: por %xmm3, %xmm03311; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm53312; SSE41-NEXT: packusdw %xmm6, %xmm53313; SSE41-NEXT: packusdw %xmm5, %xmm43314; SSE41-NEXT: packuswb %xmm4, %xmm43315; SSE41-NEXT: movq %xmm4, (%rsi)3316; SSE41-NEXT: retq3317;3318; AVX1-LABEL: trunc_packus_v8i64_v8i8_store:3319; AVX1: # %bb.0:3320; AVX1-NEXT: vmovdqa (%rdi), %xmm03321; AVX1-NEXT: vmovdqa 16(%rdi), %xmm13322; AVX1-NEXT: vmovdqa 32(%rdi), %xmm23323; AVX1-NEXT: vmovdqa 48(%rdi), %xmm33324; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm4 = [255,255]3325; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm53326; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm4, %xmm23327; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm53328; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm4, %xmm33329; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm53330; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm03331; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm53332; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm13333; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm43334; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm53335; AVX1-NEXT: vpand %xmm1, %xmm5, %xmm13336; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm53337; AVX1-NEXT: vpand %xmm0, %xmm5, %xmm03338; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm03339; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm13340; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm13341; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm33342; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm23343; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm13344; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm03345; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm03346; AVX1-NEXT: vmovq %xmm0, (%rsi)3347; AVX1-NEXT: retq3348;3349; AVX2-LABEL: trunc_packus_v8i64_v8i8_store:3350; AVX2: # %bb.0:3351; AVX2-NEXT: vmovdqa (%rdi), %ymm03352; AVX2-NEXT: vmovdqa 32(%rdi), %ymm13353; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [255,255,255,255]3354; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm33355; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm03356; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm33357; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm13358; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm23359; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm33360; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm13361; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm23362; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm03363; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm03364; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13365; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm03366; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3367; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm03368; AVX2-NEXT: vmovq %xmm0, (%rsi)3369; AVX2-NEXT: vzeroupper3370; AVX2-NEXT: retq3371;3372; AVX512-LABEL: trunc_packus_v8i64_v8i8_store:3373; AVX512: # %bb.0:3374; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm03375; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm03376; AVX512-NEXT: vpmovusqb %zmm0, (%rsi)3377; AVX512-NEXT: vzeroupper3378; AVX512-NEXT: retq3379;3380; SKX-LABEL: trunc_packus_v8i64_v8i8_store:3381; SKX: # %bb.0:3382; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm03383; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm13384; SKX-NEXT: vpmovusqb %ymm1, %xmm13385; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm03386; SKX-NEXT: vpmovusqb %ymm0, %xmm03387; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3388; SKX-NEXT: vmovq %xmm0, (%rsi)3389; SKX-NEXT: vzeroupper3390; SKX-NEXT: retq3391 %a0 = load <8 x i64>, ptr %p03392 %1 = icmp slt <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>3393 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>3394 %3 = icmp sgt <8 x i64> %2, zeroinitializer3395 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer3396 %5 = trunc <8 x i64> %4 to <8 x i8>3397 store <8 x i8> %5, ptr%p13398 ret void3399}3400 3401define <16 x i8> @trunc_packus_v16i64_v16i8(ptr %p0) "min-legal-vector-width"="256" {3402; SSE2-SSSE3-LABEL: trunc_packus_v16i64_v16i8:3403; SSE2-SSSE3: # %bb.0:3404; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm73405; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm03406; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm123407; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm113408; SSE2-SSSE3-NEXT: movdqa 80(%rdi), %xmm103409; SSE2-SSSE3-NEXT: movdqa 64(%rdi), %xmm53410; SSE2-SSSE3-NEXT: movdqa 112(%rdi), %xmm43411; SSE2-SSSE3-NEXT: movdqa 96(%rdi), %xmm33412; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [255,255]3413; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]3414; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm23415; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm23416; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm2[1,1,3,3]3417; SSE2-SSSE3-NEXT: pxor %xmm9, %xmm93418; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm133419; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483903,2147483903]3420; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm143421; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm143422; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]3423; SSE2-SSSE3-NEXT: pand %xmm13, %xmm153424; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm14[1,1,3,3]3425; SSE2-SSSE3-NEXT: por %xmm15, %xmm23426; SSE2-SSSE3-NEXT: pand %xmm2, %xmm33427; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm23428; SSE2-SSSE3-NEXT: por %xmm3, %xmm23429; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm33430; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm33431; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]3432; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm133433; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm143434; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm143435; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]3436; SSE2-SSSE3-NEXT: pand %xmm13, %xmm153437; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm14[1,1,3,3]3438; SSE2-SSSE3-NEXT: por %xmm15, %xmm33439; SSE2-SSSE3-NEXT: pand %xmm3, %xmm43440; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm33441; SSE2-SSSE3-NEXT: por %xmm4, %xmm33442; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm43443; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm43444; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm4[1,1,3,3]3445; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm133446; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm143447; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm143448; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]3449; SSE2-SSSE3-NEXT: pand %xmm13, %xmm153450; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm14[1,1,3,3]3451; SSE2-SSSE3-NEXT: por %xmm15, %xmm43452; SSE2-SSSE3-NEXT: pand %xmm4, %xmm53453; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm43454; SSE2-SSSE3-NEXT: por %xmm5, %xmm43455; SSE2-SSSE3-NEXT: movdqa %xmm10, %xmm53456; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm53457; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm5[1,1,3,3]3458; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm133459; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm143460; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm143461; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]3462; SSE2-SSSE3-NEXT: pand %xmm13, %xmm153463; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm14[1,1,3,3]3464; SSE2-SSSE3-NEXT: por %xmm15, %xmm53465; SSE2-SSSE3-NEXT: pand %xmm5, %xmm103466; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm53467; SSE2-SSSE3-NEXT: por %xmm10, %xmm53468; SSE2-SSSE3-NEXT: movdqa %xmm12, %xmm103469; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm103470; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm10[1,1,3,3]3471; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm133472; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm143473; SSE2-SSSE3-NEXT: pcmpgtd %xmm10, %xmm143474; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]3475; SSE2-SSSE3-NEXT: pand %xmm13, %xmm153476; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm14[1,1,3,3]3477; SSE2-SSSE3-NEXT: por %xmm15, %xmm103478; SSE2-SSSE3-NEXT: pand %xmm10, %xmm123479; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm103480; SSE2-SSSE3-NEXT: por %xmm12, %xmm103481; SSE2-SSSE3-NEXT: movdqa %xmm11, %xmm123482; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm123483; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm12[1,1,3,3]3484; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm133485; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm143486; SSE2-SSSE3-NEXT: pcmpgtd %xmm12, %xmm143487; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]3488; SSE2-SSSE3-NEXT: pand %xmm13, %xmm153489; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm14[1,1,3,3]3490; SSE2-SSSE3-NEXT: por %xmm15, %xmm123491; SSE2-SSSE3-NEXT: pand %xmm12, %xmm113492; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm123493; SSE2-SSSE3-NEXT: por %xmm11, %xmm123494; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm113495; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm113496; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm11[1,1,3,3]3497; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm133498; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm143499; SSE2-SSSE3-NEXT: pcmpgtd %xmm11, %xmm143500; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]3501; SSE2-SSSE3-NEXT: pand %xmm13, %xmm153502; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm14[1,1,3,3]3503; SSE2-SSSE3-NEXT: por %xmm15, %xmm113504; SSE2-SSSE3-NEXT: pand %xmm11, %xmm73505; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm113506; SSE2-SSSE3-NEXT: por %xmm7, %xmm113507; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm73508; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm73509; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3]3510; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm133511; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm83512; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm8[0,0,2,2]3513; SSE2-SSSE3-NEXT: pand %xmm13, %xmm73514; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]3515; SSE2-SSSE3-NEXT: por %xmm7, %xmm83516; SSE2-SSSE3-NEXT: pand %xmm8, %xmm03517; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm83518; SSE2-SSSE3-NEXT: por %xmm0, %xmm83519; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm03520; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm03521; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm63522; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm63523; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]3524; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm03525; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]3526; SSE2-SSSE3-NEXT: pand %xmm7, %xmm03527; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]3528; SSE2-SSSE3-NEXT: por %xmm0, %xmm63529; SSE2-SSSE3-NEXT: pand %xmm8, %xmm63530; SSE2-SSSE3-NEXT: movdqa %xmm11, %xmm03531; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm03532; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm73533; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm73534; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]3535; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm03536; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3]3537; SSE2-SSSE3-NEXT: pand %xmm8, %xmm93538; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]3539; SSE2-SSSE3-NEXT: por %xmm9, %xmm03540; SSE2-SSSE3-NEXT: pand %xmm11, %xmm03541; SSE2-SSSE3-NEXT: packuswb %xmm6, %xmm03542; SSE2-SSSE3-NEXT: movdqa %xmm12, %xmm63543; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm63544; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm73545; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm73546; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]3547; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm63548; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]3549; SSE2-SSSE3-NEXT: pand %xmm8, %xmm63550; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]3551; SSE2-SSSE3-NEXT: por %xmm6, %xmm73552; SSE2-SSSE3-NEXT: pand %xmm12, %xmm73553; SSE2-SSSE3-NEXT: movdqa %xmm10, %xmm63554; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm63555; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm83556; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm83557; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]3558; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm63559; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]3560; SSE2-SSSE3-NEXT: pand %xmm9, %xmm63561; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]3562; SSE2-SSSE3-NEXT: por %xmm6, %xmm83563; SSE2-SSSE3-NEXT: pand %xmm10, %xmm83564; SSE2-SSSE3-NEXT: packuswb %xmm7, %xmm83565; SSE2-SSSE3-NEXT: packuswb %xmm8, %xmm03566; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm63567; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm63568; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm73569; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm73570; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]3571; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm63572; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]3573; SSE2-SSSE3-NEXT: pand %xmm8, %xmm63574; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]3575; SSE2-SSSE3-NEXT: por %xmm6, %xmm73576; SSE2-SSSE3-NEXT: pand %xmm5, %xmm73577; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm53578; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm53579; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm63580; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm63581; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]3582; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm53583; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]3584; SSE2-SSSE3-NEXT: pand %xmm8, %xmm93585; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]3586; SSE2-SSSE3-NEXT: por %xmm9, %xmm53587; SSE2-SSSE3-NEXT: pand %xmm4, %xmm53588; SSE2-SSSE3-NEXT: packuswb %xmm7, %xmm53589; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm43590; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm43591; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm63592; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm63593; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]3594; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm43595; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]3596; SSE2-SSSE3-NEXT: pand %xmm7, %xmm43597; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]3598; SSE2-SSSE3-NEXT: por %xmm4, %xmm63599; SSE2-SSSE3-NEXT: pand %xmm3, %xmm63600; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm33601; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm33602; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm43603; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm43604; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]3605; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm33606; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]3607; SSE2-SSSE3-NEXT: pand %xmm7, %xmm13608; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]3609; SSE2-SSSE3-NEXT: por %xmm1, %xmm33610; SSE2-SSSE3-NEXT: pand %xmm2, %xmm33611; SSE2-SSSE3-NEXT: packuswb %xmm6, %xmm33612; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm53613; SSE2-SSSE3-NEXT: packuswb %xmm5, %xmm03614; SSE2-SSSE3-NEXT: retq3615;3616; SSE41-LABEL: trunc_packus_v16i64_v16i8:3617; SSE41: # %bb.0:3618; SSE41-NEXT: movdqa (%rdi), %xmm83619; SSE41-NEXT: movdqa 16(%rdi), %xmm73620; SSE41-NEXT: movdqa 32(%rdi), %xmm123621; SSE41-NEXT: movdqa 48(%rdi), %xmm113622; SSE41-NEXT: movdqa 80(%rdi), %xmm103623; SSE41-NEXT: movdqa 64(%rdi), %xmm63624; SSE41-NEXT: movdqa 112(%rdi), %xmm53625; SSE41-NEXT: movdqa 96(%rdi), %xmm43626; SSE41-NEXT: movapd {{.*#+}} xmm1 = [255,255]3627; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]3628; SSE41-NEXT: movdqa %xmm4, %xmm33629; SSE41-NEXT: pxor %xmm2, %xmm33630; SSE41-NEXT: pmovzxdq {{.*#+}} xmm9 = [2147483903,2147483903]3631; SSE41-NEXT: movdqa %xmm9, %xmm133632; SSE41-NEXT: pcmpgtd %xmm3, %xmm133633; SSE41-NEXT: pcmpeqd %xmm9, %xmm33634; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]3635; SSE41-NEXT: pand %xmm3, %xmm03636; SSE41-NEXT: por %xmm13, %xmm03637; SSE41-NEXT: movapd %xmm1, %xmm33638; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm33639; SSE41-NEXT: movdqa %xmm5, %xmm43640; SSE41-NEXT: pxor %xmm2, %xmm43641; SSE41-NEXT: movdqa %xmm9, %xmm133642; SSE41-NEXT: pcmpgtd %xmm4, %xmm133643; SSE41-NEXT: pcmpeqd %xmm9, %xmm43644; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]3645; SSE41-NEXT: pand %xmm4, %xmm03646; SSE41-NEXT: por %xmm13, %xmm03647; SSE41-NEXT: movapd %xmm1, %xmm43648; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm43649; SSE41-NEXT: movdqa %xmm6, %xmm53650; SSE41-NEXT: pxor %xmm2, %xmm53651; SSE41-NEXT: movdqa %xmm9, %xmm133652; SSE41-NEXT: pcmpgtd %xmm5, %xmm133653; SSE41-NEXT: pcmpeqd %xmm9, %xmm53654; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]3655; SSE41-NEXT: pand %xmm5, %xmm03656; SSE41-NEXT: por %xmm13, %xmm03657; SSE41-NEXT: movapd %xmm1, %xmm53658; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm53659; SSE41-NEXT: movdqa %xmm10, %xmm63660; SSE41-NEXT: pxor %xmm2, %xmm63661; SSE41-NEXT: movdqa %xmm9, %xmm133662; SSE41-NEXT: pcmpgtd %xmm6, %xmm133663; SSE41-NEXT: pcmpeqd %xmm9, %xmm63664; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]3665; SSE41-NEXT: pand %xmm6, %xmm03666; SSE41-NEXT: por %xmm13, %xmm03667; SSE41-NEXT: movapd %xmm1, %xmm63668; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm63669; SSE41-NEXT: movdqa %xmm12, %xmm103670; SSE41-NEXT: pxor %xmm2, %xmm103671; SSE41-NEXT: movdqa %xmm9, %xmm133672; SSE41-NEXT: pcmpgtd %xmm10, %xmm133673; SSE41-NEXT: pcmpeqd %xmm9, %xmm103674; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]3675; SSE41-NEXT: pand %xmm10, %xmm03676; SSE41-NEXT: por %xmm13, %xmm03677; SSE41-NEXT: movapd %xmm1, %xmm103678; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm103679; SSE41-NEXT: movdqa %xmm11, %xmm123680; SSE41-NEXT: pxor %xmm2, %xmm123681; SSE41-NEXT: movdqa %xmm9, %xmm133682; SSE41-NEXT: pcmpgtd %xmm12, %xmm133683; SSE41-NEXT: pcmpeqd %xmm9, %xmm123684; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]3685; SSE41-NEXT: pand %xmm12, %xmm03686; SSE41-NEXT: por %xmm13, %xmm03687; SSE41-NEXT: movapd %xmm1, %xmm123688; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm123689; SSE41-NEXT: movdqa %xmm8, %xmm113690; SSE41-NEXT: pxor %xmm2, %xmm113691; SSE41-NEXT: movdqa %xmm9, %xmm133692; SSE41-NEXT: pcmpgtd %xmm11, %xmm133693; SSE41-NEXT: pcmpeqd %xmm9, %xmm113694; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]3695; SSE41-NEXT: pand %xmm11, %xmm03696; SSE41-NEXT: por %xmm13, %xmm03697; SSE41-NEXT: movapd %xmm1, %xmm113698; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm113699; SSE41-NEXT: movdqa %xmm7, %xmm03700; SSE41-NEXT: pxor %xmm2, %xmm03701; SSE41-NEXT: movdqa %xmm0, %xmm83702; SSE41-NEXT: pcmpeqd %xmm9, %xmm83703; SSE41-NEXT: pcmpgtd %xmm0, %xmm93704; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]3705; SSE41-NEXT: pand %xmm8, %xmm03706; SSE41-NEXT: por %xmm9, %xmm03707; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm13708; SSE41-NEXT: xorpd %xmm7, %xmm73709; SSE41-NEXT: movapd %xmm1, %xmm83710; SSE41-NEXT: xorpd %xmm2, %xmm83711; SSE41-NEXT: movapd %xmm8, %xmm93712; SSE41-NEXT: pcmpeqd %xmm2, %xmm93713; SSE41-NEXT: pcmpgtd %xmm2, %xmm83714; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm8[0,0,2,2]3715; SSE41-NEXT: pand %xmm9, %xmm03716; SSE41-NEXT: por %xmm8, %xmm03717; SSE41-NEXT: pxor %xmm8, %xmm83718; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm83719; SSE41-NEXT: movapd %xmm11, %xmm13720; SSE41-NEXT: xorpd %xmm2, %xmm13721; SSE41-NEXT: movapd %xmm1, %xmm93722; SSE41-NEXT: pcmpeqd %xmm2, %xmm93723; SSE41-NEXT: pcmpgtd %xmm2, %xmm13724; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]3725; SSE41-NEXT: pand %xmm9, %xmm03726; SSE41-NEXT: por %xmm1, %xmm03727; SSE41-NEXT: pxor %xmm1, %xmm13728; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm13729; SSE41-NEXT: packusdw %xmm8, %xmm13730; SSE41-NEXT: movapd %xmm12, %xmm83731; SSE41-NEXT: xorpd %xmm2, %xmm83732; SSE41-NEXT: movapd %xmm8, %xmm93733; SSE41-NEXT: pcmpeqd %xmm2, %xmm93734; SSE41-NEXT: pcmpgtd %xmm2, %xmm83735; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm8[0,0,2,2]3736; SSE41-NEXT: pand %xmm9, %xmm03737; SSE41-NEXT: por %xmm8, %xmm03738; SSE41-NEXT: pxor %xmm8, %xmm83739; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm83740; SSE41-NEXT: movapd %xmm10, %xmm93741; SSE41-NEXT: xorpd %xmm2, %xmm93742; SSE41-NEXT: movapd %xmm9, %xmm113743; SSE41-NEXT: pcmpeqd %xmm2, %xmm113744; SSE41-NEXT: pcmpgtd %xmm2, %xmm93745; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]3746; SSE41-NEXT: pand %xmm11, %xmm03747; SSE41-NEXT: por %xmm9, %xmm03748; SSE41-NEXT: pxor %xmm9, %xmm93749; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm93750; SSE41-NEXT: packusdw %xmm8, %xmm93751; SSE41-NEXT: packusdw %xmm9, %xmm13752; SSE41-NEXT: movapd %xmm6, %xmm83753; SSE41-NEXT: xorpd %xmm2, %xmm83754; SSE41-NEXT: movapd %xmm8, %xmm93755; SSE41-NEXT: pcmpeqd %xmm2, %xmm93756; SSE41-NEXT: pcmpgtd %xmm2, %xmm83757; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm8[0,0,2,2]3758; SSE41-NEXT: pand %xmm9, %xmm03759; SSE41-NEXT: por %xmm8, %xmm03760; SSE41-NEXT: pxor %xmm8, %xmm83761; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm83762; SSE41-NEXT: movapd %xmm5, %xmm63763; SSE41-NEXT: xorpd %xmm2, %xmm63764; SSE41-NEXT: movapd %xmm6, %xmm93765; SSE41-NEXT: pcmpeqd %xmm2, %xmm93766; SSE41-NEXT: pcmpgtd %xmm2, %xmm63767; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]3768; SSE41-NEXT: pand %xmm9, %xmm03769; SSE41-NEXT: por %xmm6, %xmm03770; SSE41-NEXT: pxor %xmm6, %xmm63771; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm63772; SSE41-NEXT: packusdw %xmm8, %xmm63773; SSE41-NEXT: movapd %xmm4, %xmm53774; SSE41-NEXT: xorpd %xmm2, %xmm53775; SSE41-NEXT: movapd %xmm5, %xmm83776; SSE41-NEXT: pcmpeqd %xmm2, %xmm83777; SSE41-NEXT: pcmpgtd %xmm2, %xmm53778; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]3779; SSE41-NEXT: pand %xmm8, %xmm03780; SSE41-NEXT: por %xmm5, %xmm03781; SSE41-NEXT: pxor %xmm5, %xmm53782; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm53783; SSE41-NEXT: movapd %xmm3, %xmm43784; SSE41-NEXT: xorpd %xmm2, %xmm43785; SSE41-NEXT: movapd %xmm4, %xmm83786; SSE41-NEXT: pcmpeqd %xmm2, %xmm83787; SSE41-NEXT: pcmpgtd %xmm2, %xmm43788; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]3789; SSE41-NEXT: pand %xmm8, %xmm03790; SSE41-NEXT: por %xmm4, %xmm03791; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm73792; SSE41-NEXT: packusdw %xmm5, %xmm73793; SSE41-NEXT: packusdw %xmm7, %xmm63794; SSE41-NEXT: packuswb %xmm6, %xmm13795; SSE41-NEXT: movdqa %xmm1, %xmm03796; SSE41-NEXT: retq3797;3798; AVX1-LABEL: trunc_packus_v16i64_v16i8:3799; AVX1: # %bb.0:3800; AVX1-NEXT: vmovdqa 96(%rdi), %xmm03801; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm2 = [255,255]3802; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm13803; AVX1-NEXT: vblendvpd %xmm1, %xmm0, %xmm2, %xmm03804; AVX1-NEXT: vmovdqa 112(%rdi), %xmm13805; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm33806; AVX1-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm13807; AVX1-NEXT: vmovdqa 64(%rdi), %xmm33808; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm43809; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm2, %xmm33810; AVX1-NEXT: vmovdqa 80(%rdi), %xmm43811; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm53812; AVX1-NEXT: vblendvpd %xmm5, %xmm4, %xmm2, %xmm43813; AVX1-NEXT: vmovdqa (%rdi), %xmm53814; AVX1-NEXT: vmovdqa 16(%rdi), %xmm63815; AVX1-NEXT: vmovdqa 32(%rdi), %xmm73816; AVX1-NEXT: vmovdqa 48(%rdi), %xmm83817; AVX1-NEXT: vpcmpgtq %xmm7, %xmm2, %xmm93818; AVX1-NEXT: vblendvpd %xmm9, %xmm7, %xmm2, %xmm73819; AVX1-NEXT: vpcmpgtq %xmm8, %xmm2, %xmm93820; AVX1-NEXT: vblendvpd %xmm9, %xmm8, %xmm2, %xmm83821; AVX1-NEXT: vpcmpgtq %xmm5, %xmm2, %xmm93822; AVX1-NEXT: vblendvpd %xmm9, %xmm5, %xmm2, %xmm53823; AVX1-NEXT: vpcmpgtq %xmm6, %xmm2, %xmm93824; AVX1-NEXT: vblendvpd %xmm9, %xmm6, %xmm2, %xmm23825; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm63826; AVX1-NEXT: vpcmpgtq %xmm6, %xmm2, %xmm93827; AVX1-NEXT: vpand %xmm2, %xmm9, %xmm23828; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm93829; AVX1-NEXT: vpand %xmm5, %xmm9, %xmm53830; AVX1-NEXT: vpackusdw %xmm2, %xmm5, %xmm23831; AVX1-NEXT: vpcmpgtq %xmm6, %xmm8, %xmm53832; AVX1-NEXT: vpand %xmm5, %xmm8, %xmm53833; AVX1-NEXT: vpcmpgtq %xmm6, %xmm7, %xmm83834; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm73835; AVX1-NEXT: vpackusdw %xmm5, %xmm7, %xmm53836; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm23837; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm53838; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm43839; AVX1-NEXT: vpcmpgtq %xmm6, %xmm3, %xmm53840; AVX1-NEXT: vpand %xmm3, %xmm5, %xmm33841; AVX1-NEXT: vpackusdw %xmm4, %xmm3, %xmm33842; AVX1-NEXT: vpcmpgtq %xmm6, %xmm1, %xmm43843; AVX1-NEXT: vpand %xmm1, %xmm4, %xmm13844; AVX1-NEXT: vpcmpgtq %xmm6, %xmm0, %xmm43845; AVX1-NEXT: vpand %xmm0, %xmm4, %xmm03846; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm03847; AVX1-NEXT: vpackusdw %xmm0, %xmm3, %xmm03848; AVX1-NEXT: vpackuswb %xmm0, %xmm2, %xmm03849; AVX1-NEXT: retq3850;3851; AVX2-LABEL: trunc_packus_v16i64_v16i8:3852; AVX2: # %bb.0:3853; AVX2-NEXT: vmovdqa (%rdi), %ymm03854; AVX2-NEXT: vmovdqa 32(%rdi), %ymm13855; AVX2-NEXT: vmovdqa 64(%rdi), %ymm23856; AVX2-NEXT: vmovdqa 96(%rdi), %ymm33857; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [255,255,255,255]3858; AVX2-NEXT: vpcmpgtq %ymm2, %ymm4, %ymm53859; AVX2-NEXT: vblendvpd %ymm5, %ymm2, %ymm4, %ymm23860; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm53861; AVX2-NEXT: vblendvpd %ymm5, %ymm3, %ymm4, %ymm33862; AVX2-NEXT: vpcmpgtq %ymm0, %ymm4, %ymm53863; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm4, %ymm03864; AVX2-NEXT: vpcmpgtq %ymm1, %ymm4, %ymm53865; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm4, %ymm13866; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm43867; AVX2-NEXT: vpcmpgtq %ymm4, %ymm1, %ymm53868; AVX2-NEXT: vpand %ymm1, %ymm5, %ymm13869; AVX2-NEXT: vpcmpgtq %ymm4, %ymm0, %ymm53870; AVX2-NEXT: vpand %ymm0, %ymm5, %ymm03871; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm03872; AVX2-NEXT: vpcmpgtq %ymm4, %ymm3, %ymm13873; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm13874; AVX2-NEXT: vpcmpgtq %ymm4, %ymm2, %ymm33875; AVX2-NEXT: vpand %ymm2, %ymm3, %ymm23876; AVX2-NEXT: vpackusdw %ymm1, %ymm2, %ymm13877; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]3878; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]3879; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm03880; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13881; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm03882; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3883; AVX2-NEXT: vzeroupper3884; AVX2-NEXT: retq3885;3886; AVX512-LABEL: trunc_packus_v16i64_v16i8:3887; AVX512: # %bb.0:3888; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm03889; AVX512-NEXT: vpmaxsq 64(%rdi), %zmm0, %zmm13890; AVX512-NEXT: vpmovusqb %zmm1, %xmm13891; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm03892; AVX512-NEXT: vpmovusqb %zmm0, %xmm03893; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]3894; AVX512-NEXT: vzeroupper3895; AVX512-NEXT: retq3896;3897; SKX-LABEL: trunc_packus_v16i64_v16i8:3898; SKX: # %bb.0:3899; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm03900; SKX-NEXT: vpmaxsq 96(%rdi), %ymm0, %ymm13901; SKX-NEXT: vpmovusqb %ymm1, %xmm13902; SKX-NEXT: vpmaxsq 64(%rdi), %ymm0, %ymm23903; SKX-NEXT: vpmovusqb %ymm2, %xmm23904; SKX-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]3905; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm23906; SKX-NEXT: vpmovusqb %ymm2, %xmm23907; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm03908; SKX-NEXT: vpmovusqb %ymm0, %xmm03909; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]3910; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]3911; SKX-NEXT: vzeroupper3912; SKX-NEXT: retq3913 %a0 = load <16 x i64>, ptr %p03914 %1 = icmp slt <16 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>3915 %2 = select <16 x i1> %1, <16 x i64> %a0, <16 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>3916 %3 = icmp sgt <16 x i64> %2, zeroinitializer3917 %4 = select <16 x i1> %3, <16 x i64> %2, <16 x i64> zeroinitializer3918 %5 = trunc <16 x i64> %4 to <16 x i8>3919 ret <16 x i8> %53920}3921 3922define <4 x i8> @trunc_packus_v4i32_v4i8(<4 x i32> %a0) "min-legal-vector-width"="256" {3923; SSE-LABEL: trunc_packus_v4i32_v4i8:3924; SSE: # %bb.0:3925; SSE-NEXT: packssdw %xmm0, %xmm03926; SSE-NEXT: packuswb %xmm0, %xmm03927; SSE-NEXT: retq3928;3929; AVX-LABEL: trunc_packus_v4i32_v4i8:3930; AVX: # %bb.0:3931; AVX-NEXT: vpackssdw %xmm0, %xmm0, %xmm03932; AVX-NEXT: vpackuswb %xmm0, %xmm0, %xmm03933; AVX-NEXT: retq3934;3935; AVX512-LABEL: trunc_packus_v4i32_v4i8:3936; AVX512: # %bb.0:3937; AVX512-NEXT: vpackssdw %xmm0, %xmm0, %xmm03938; AVX512-NEXT: vpackuswb %xmm0, %xmm0, %xmm03939; AVX512-NEXT: retq3940;3941; SKX-LABEL: trunc_packus_v4i32_v4i8:3942; SKX: # %bb.0:3943; SKX-NEXT: vpackssdw %xmm0, %xmm0, %xmm03944; SKX-NEXT: vpackuswb %xmm0, %xmm0, %xmm03945; SKX-NEXT: retq3946 %1 = icmp slt <4 x i32> %a0, <i32 255, i32 255, i32 255, i32 255>3947 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 255, i32 255, i32 255, i32 255>3948 %3 = icmp sgt <4 x i32> %2, zeroinitializer3949 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> zeroinitializer3950 %5 = trunc <4 x i32> %4 to <4 x i8>3951 ret <4 x i8> %53952}3953 3954define void @trunc_packus_v4i32_v4i8_store(<4 x i32> %a0, ptr%p1) {3955; SSE-LABEL: trunc_packus_v4i32_v4i8_store:3956; SSE: # %bb.0:3957; SSE-NEXT: packssdw %xmm0, %xmm03958; SSE-NEXT: packuswb %xmm0, %xmm03959; SSE-NEXT: movd %xmm0, (%rdi)3960; SSE-NEXT: retq3961;3962; AVX-LABEL: trunc_packus_v4i32_v4i8_store:3963; AVX: # %bb.0:3964; AVX-NEXT: vpackssdw %xmm0, %xmm0, %xmm03965; AVX-NEXT: vpackuswb %xmm0, %xmm0, %xmm03966; AVX-NEXT: vmovd %xmm0, (%rdi)3967; AVX-NEXT: retq3968;3969; AVX512F-LABEL: trunc_packus_v4i32_v4i8_store:3970; AVX512F: # %bb.0:3971; AVX512F-NEXT: vpackssdw %xmm0, %xmm0, %xmm03972; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm03973; AVX512F-NEXT: vmovd %xmm0, (%rdi)3974; AVX512F-NEXT: retq3975;3976; AVX512VL-LABEL: trunc_packus_v4i32_v4i8_store:3977; AVX512VL: # %bb.0:3978; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm13979; AVX512VL-NEXT: vpmaxsd %xmm1, %xmm0, %xmm03980; AVX512VL-NEXT: vpmovusdb %xmm0, (%rdi)3981; AVX512VL-NEXT: retq3982;3983; AVX512BW-LABEL: trunc_packus_v4i32_v4i8_store:3984; AVX512BW: # %bb.0:3985; AVX512BW-NEXT: vpackssdw %xmm0, %xmm0, %xmm03986; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm03987; AVX512BW-NEXT: vmovd %xmm0, (%rdi)3988; AVX512BW-NEXT: retq3989;3990; AVX512BWVL-LABEL: trunc_packus_v4i32_v4i8_store:3991; AVX512BWVL: # %bb.0:3992; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm13993; AVX512BWVL-NEXT: vpmaxsd %xmm1, %xmm0, %xmm03994; AVX512BWVL-NEXT: vpmovusdb %xmm0, (%rdi)3995; AVX512BWVL-NEXT: retq3996;3997; SKX-LABEL: trunc_packus_v4i32_v4i8_store:3998; SKX: # %bb.0:3999; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm14000; SKX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm04001; SKX-NEXT: vpmovusdb %xmm0, (%rdi)4002; SKX-NEXT: retq4003 %1 = icmp slt <4 x i32> %a0, <i32 255, i32 255, i32 255, i32 255>4004 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 255, i32 255, i32 255, i32 255>4005 %3 = icmp sgt <4 x i32> %2, zeroinitializer4006 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> zeroinitializer4007 %5 = trunc <4 x i32> %4 to <4 x i8>4008 store <4 x i8> %5, ptr%p14009 ret void4010}4011 4012define <8 x i8> @trunc_packus_v8i32_v8i8(<8 x i32> %a0) {4013; SSE-LABEL: trunc_packus_v8i32_v8i8:4014; SSE: # %bb.0:4015; SSE-NEXT: packssdw %xmm1, %xmm04016; SSE-NEXT: packuswb %xmm0, %xmm04017; SSE-NEXT: retq4018;4019; AVX1-LABEL: trunc_packus_v8i32_v8i8:4020; AVX1: # %bb.0:4021; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm14022; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm04023; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm04024; AVX1-NEXT: vzeroupper4025; AVX1-NEXT: retq4026;4027; AVX2-LABEL: trunc_packus_v8i32_v8i8:4028; AVX2: # %bb.0:4029; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm14030; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm04031; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm04032; AVX2-NEXT: vzeroupper4033; AVX2-NEXT: retq4034;4035; AVX512F-LABEL: trunc_packus_v8i32_v8i8:4036; AVX512F: # %bb.0:4037; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm14038; AVX512F-NEXT: vpackssdw %xmm1, %xmm0, %xmm04039; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm04040; AVX512F-NEXT: vzeroupper4041; AVX512F-NEXT: retq4042;4043; AVX512VL-LABEL: trunc_packus_v8i32_v8i8:4044; AVX512VL: # %bb.0:4045; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm14046; AVX512VL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm04047; AVX512VL-NEXT: vpmovusdb %ymm0, %xmm04048; AVX512VL-NEXT: vzeroupper4049; AVX512VL-NEXT: retq4050;4051; AVX512BW-LABEL: trunc_packus_v8i32_v8i8:4052; AVX512BW: # %bb.0:4053; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm14054; AVX512BW-NEXT: vpackssdw %xmm1, %xmm0, %xmm04055; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm04056; AVX512BW-NEXT: vzeroupper4057; AVX512BW-NEXT: retq4058;4059; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i8:4060; AVX512BWVL: # %bb.0:4061; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm14062; AVX512BWVL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm04063; AVX512BWVL-NEXT: vpmovusdb %ymm0, %xmm04064; AVX512BWVL-NEXT: vzeroupper4065; AVX512BWVL-NEXT: retq4066;4067; SKX-LABEL: trunc_packus_v8i32_v8i8:4068; SKX: # %bb.0:4069; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm14070; SKX-NEXT: vpmaxsd %ymm1, %ymm0, %ymm04071; SKX-NEXT: vpmovusdb %ymm0, %xmm04072; SKX-NEXT: vzeroupper4073; SKX-NEXT: retq4074 %1 = icmp slt <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>4075 %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>4076 %3 = icmp sgt <8 x i32> %2, zeroinitializer4077 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer4078 %5 = trunc <8 x i32> %4 to <8 x i8>4079 ret <8 x i8> %54080}4081 4082define void @trunc_packus_v8i32_v8i8_store(<8 x i32> %a0, ptr%p1) {4083; SSE-LABEL: trunc_packus_v8i32_v8i8_store:4084; SSE: # %bb.0:4085; SSE-NEXT: packssdw %xmm1, %xmm04086; SSE-NEXT: packuswb %xmm0, %xmm04087; SSE-NEXT: movq %xmm0, (%rdi)4088; SSE-NEXT: retq4089;4090; AVX1-LABEL: trunc_packus_v8i32_v8i8_store:4091; AVX1: # %bb.0:4092; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm14093; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm04094; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm04095; AVX1-NEXT: vmovq %xmm0, (%rdi)4096; AVX1-NEXT: vzeroupper4097; AVX1-NEXT: retq4098;4099; AVX2-LABEL: trunc_packus_v8i32_v8i8_store:4100; AVX2: # %bb.0:4101; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm14102; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm04103; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm04104; AVX2-NEXT: vmovq %xmm0, (%rdi)4105; AVX2-NEXT: vzeroupper4106; AVX2-NEXT: retq4107;4108; AVX512F-LABEL: trunc_packus_v8i32_v8i8_store:4109; AVX512F: # %bb.0:4110; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm14111; AVX512F-NEXT: vpackssdw %xmm1, %xmm0, %xmm04112; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm04113; AVX512F-NEXT: vmovq %xmm0, (%rdi)4114; AVX512F-NEXT: vzeroupper4115; AVX512F-NEXT: retq4116;4117; AVX512VL-LABEL: trunc_packus_v8i32_v8i8_store:4118; AVX512VL: # %bb.0:4119; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm14120; AVX512VL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm04121; AVX512VL-NEXT: vpmovusdb %ymm0, (%rdi)4122; AVX512VL-NEXT: vzeroupper4123; AVX512VL-NEXT: retq4124;4125; AVX512BW-LABEL: trunc_packus_v8i32_v8i8_store:4126; AVX512BW: # %bb.0:4127; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm14128; AVX512BW-NEXT: vpackssdw %xmm1, %xmm0, %xmm04129; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm04130; AVX512BW-NEXT: vmovq %xmm0, (%rdi)4131; AVX512BW-NEXT: vzeroupper4132; AVX512BW-NEXT: retq4133;4134; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i8_store:4135; AVX512BWVL: # %bb.0:4136; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm14137; AVX512BWVL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm04138; AVX512BWVL-NEXT: vpmovusdb %ymm0, (%rdi)4139; AVX512BWVL-NEXT: vzeroupper4140; AVX512BWVL-NEXT: retq4141;4142; SKX-LABEL: trunc_packus_v8i32_v8i8_store:4143; SKX: # %bb.0:4144; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm14145; SKX-NEXT: vpmaxsd %ymm1, %ymm0, %ymm04146; SKX-NEXT: vpmovusdb %ymm0, (%rdi)4147; SKX-NEXT: vzeroupper4148; SKX-NEXT: retq4149 %1 = icmp slt <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>4150 %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>4151 %3 = icmp sgt <8 x i32> %2, zeroinitializer4152 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer4153 %5 = trunc <8 x i32> %4 to <8 x i8>4154 store <8 x i8> %5, ptr%p14155 ret void4156}4157 4158define <16 x i8> @trunc_packus_v16i32_v16i8(ptr %p0) "min-legal-vector-width"="256" {4159; SSE-LABEL: trunc_packus_v16i32_v16i8:4160; SSE: # %bb.0:4161; SSE-NEXT: movdqa (%rdi), %xmm04162; SSE-NEXT: movdqa 32(%rdi), %xmm14163; SSE-NEXT: packssdw 48(%rdi), %xmm14164; SSE-NEXT: packssdw 16(%rdi), %xmm04165; SSE-NEXT: packuswb %xmm1, %xmm04166; SSE-NEXT: retq4167;4168; AVX1-LABEL: trunc_packus_v16i32_v16i8:4169; AVX1: # %bb.0:4170; AVX1-NEXT: vmovdqa (%rdi), %xmm04171; AVX1-NEXT: vmovdqa 32(%rdi), %xmm14172; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm14173; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm04174; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm04175; AVX1-NEXT: retq4176;4177; AVX2-LABEL: trunc_packus_v16i32_v16i8:4178; AVX2: # %bb.0:4179; AVX2-NEXT: vmovdqa (%rdi), %ymm04180; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm04181; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm14182; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm04183; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]4184; AVX2-NEXT: vzeroupper4185; AVX2-NEXT: retq4186;4187; AVX512-LABEL: trunc_packus_v16i32_v16i8:4188; AVX512: # %bb.0:4189; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm04190; AVX512-NEXT: vpmaxsd (%rdi), %zmm0, %zmm04191; AVX512-NEXT: vpmovusdb %zmm0, %xmm04192; AVX512-NEXT: vzeroupper4193; AVX512-NEXT: retq4194;4195; SKX-LABEL: trunc_packus_v16i32_v16i8:4196; SKX: # %bb.0:4197; SKX-NEXT: vmovdqa (%rdi), %ymm04198; SKX-NEXT: vpackusdw 32(%rdi), %ymm0, %ymm04199; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4200; SKX-NEXT: vpmovuswb %ymm0, %xmm04201; SKX-NEXT: vzeroupper4202; SKX-NEXT: retq4203 %a0 = load <16 x i32>, ptr %p04204 %1 = icmp slt <16 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>4205 %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>4206 %3 = icmp sgt <16 x i32> %2, zeroinitializer4207 %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> zeroinitializer4208 %5 = trunc <16 x i32> %4 to <16 x i8>4209 ret <16 x i8> %54210}4211 4212define void @trunc_packus_v16i32_v16i8_store(ptr %p0, ptr %p1) "min-legal-vector-width"="256" {4213; SSE-LABEL: trunc_packus_v16i32_v16i8_store:4214; SSE: # %bb.0:4215; SSE-NEXT: movdqa (%rdi), %xmm04216; SSE-NEXT: movdqa 32(%rdi), %xmm14217; SSE-NEXT: packssdw 48(%rdi), %xmm14218; SSE-NEXT: packssdw 16(%rdi), %xmm04219; SSE-NEXT: packuswb %xmm1, %xmm04220; SSE-NEXT: movdqa %xmm0, (%rsi)4221; SSE-NEXT: retq4222;4223; AVX1-LABEL: trunc_packus_v16i32_v16i8_store:4224; AVX1: # %bb.0:4225; AVX1-NEXT: vmovdqa (%rdi), %xmm04226; AVX1-NEXT: vmovdqa 32(%rdi), %xmm14227; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm14228; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm04229; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm04230; AVX1-NEXT: vmovdqa %xmm0, (%rsi)4231; AVX1-NEXT: retq4232;4233; AVX2-LABEL: trunc_packus_v16i32_v16i8_store:4234; AVX2: # %bb.0:4235; AVX2-NEXT: vmovdqa (%rdi), %ymm04236; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm04237; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm14238; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm04239; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]4240; AVX2-NEXT: vmovdqa %xmm0, (%rsi)4241; AVX2-NEXT: vzeroupper4242; AVX2-NEXT: retq4243;4244; AVX512-LABEL: trunc_packus_v16i32_v16i8_store:4245; AVX512: # %bb.0:4246; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm04247; AVX512-NEXT: vpmaxsd (%rdi), %zmm0, %zmm04248; AVX512-NEXT: vpmovusdb %zmm0, (%rsi)4249; AVX512-NEXT: vzeroupper4250; AVX512-NEXT: retq4251;4252; SKX-LABEL: trunc_packus_v16i32_v16i8_store:4253; SKX: # %bb.0:4254; SKX-NEXT: vmovdqa (%rdi), %ymm04255; SKX-NEXT: vpackusdw 32(%rdi), %ymm0, %ymm04256; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4257; SKX-NEXT: vpmovuswb %ymm0, (%rsi)4258; SKX-NEXT: vzeroupper4259; SKX-NEXT: retq4260 %a = load <16 x i32>, ptr %p04261 %b = icmp slt <16 x i32> %a, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>4262 %c = select <16 x i1> %b, <16 x i32> %a, <16 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>4263 %d = icmp sgt <16 x i32> %c, zeroinitializer4264 %e = select <16 x i1> %d, <16 x i32> %c, <16 x i32> zeroinitializer4265 %f = trunc <16 x i32> %e to <16 x i8>4266 store <16 x i8> %f, ptr %p14267 ret void4268}4269 4270define <8 x i8> @trunc_packus_v8i16_v8i8(<8 x i16> %a0) {4271; SSE-LABEL: trunc_packus_v8i16_v8i8:4272; SSE: # %bb.0:4273; SSE-NEXT: packuswb %xmm0, %xmm04274; SSE-NEXT: retq4275;4276; AVX-LABEL: trunc_packus_v8i16_v8i8:4277; AVX: # %bb.0:4278; AVX-NEXT: vpackuswb %xmm0, %xmm0, %xmm04279; AVX-NEXT: retq4280;4281; AVX512-LABEL: trunc_packus_v8i16_v8i8:4282; AVX512: # %bb.0:4283; AVX512-NEXT: vpackuswb %xmm0, %xmm0, %xmm04284; AVX512-NEXT: retq4285;4286; SKX-LABEL: trunc_packus_v8i16_v8i8:4287; SKX: # %bb.0:4288; SKX-NEXT: vpackuswb %xmm0, %xmm0, %xmm04289; SKX-NEXT: retq4290 %1 = icmp slt <8 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>4291 %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>4292 %3 = icmp sgt <8 x i16> %2, zeroinitializer4293 %4 = select <8 x i1> %3, <8 x i16> %2, <8 x i16> zeroinitializer4294 %5 = trunc <8 x i16> %4 to <8 x i8>4295 ret <8 x i8> %54296}4297 4298define void @trunc_packus_v8i16_v8i8_store(<8 x i16> %a0, ptr%p1) {4299; SSE-LABEL: trunc_packus_v8i16_v8i8_store:4300; SSE: # %bb.0:4301; SSE-NEXT: packuswb %xmm0, %xmm04302; SSE-NEXT: movq %xmm0, (%rdi)4303; SSE-NEXT: retq4304;4305; AVX-LABEL: trunc_packus_v8i16_v8i8_store:4306; AVX: # %bb.0:4307; AVX-NEXT: vpackuswb %xmm0, %xmm0, %xmm04308; AVX-NEXT: vmovq %xmm0, (%rdi)4309; AVX-NEXT: retq4310;4311; AVX512F-LABEL: trunc_packus_v8i16_v8i8_store:4312; AVX512F: # %bb.0:4313; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm04314; AVX512F-NEXT: vmovq %xmm0, (%rdi)4315; AVX512F-NEXT: retq4316;4317; AVX512VL-LABEL: trunc_packus_v8i16_v8i8_store:4318; AVX512VL: # %bb.0:4319; AVX512VL-NEXT: vpackuswb %xmm0, %xmm0, %xmm04320; AVX512VL-NEXT: vmovq %xmm0, (%rdi)4321; AVX512VL-NEXT: retq4322;4323; AVX512BW-LABEL: trunc_packus_v8i16_v8i8_store:4324; AVX512BW: # %bb.0:4325; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm04326; AVX512BW-NEXT: vmovq %xmm0, (%rdi)4327; AVX512BW-NEXT: retq4328;4329; AVX512BWVL-LABEL: trunc_packus_v8i16_v8i8_store:4330; AVX512BWVL: # %bb.0:4331; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm14332; AVX512BWVL-NEXT: vpmaxsw %xmm1, %xmm0, %xmm04333; AVX512BWVL-NEXT: vpmovuswb %xmm0, (%rdi)4334; AVX512BWVL-NEXT: retq4335;4336; SKX-LABEL: trunc_packus_v8i16_v8i8_store:4337; SKX: # %bb.0:4338; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm14339; SKX-NEXT: vpmaxsw %xmm1, %xmm0, %xmm04340; SKX-NEXT: vpmovuswb %xmm0, (%rdi)4341; SKX-NEXT: retq4342 %1 = icmp slt <8 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>4343 %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>4344 %3 = icmp sgt <8 x i16> %2, zeroinitializer4345 %4 = select <8 x i1> %3, <8 x i16> %2, <8 x i16> zeroinitializer4346 %5 = trunc <8 x i16> %4 to <8 x i8>4347 store <8 x i8> %5, ptr%p14348 ret void4349}4350 4351define <16 x i8> @trunc_packus_v16i16_v16i8(<16 x i16> %a0) {4352; SSE-LABEL: trunc_packus_v16i16_v16i8:4353; SSE: # %bb.0:4354; SSE-NEXT: packuswb %xmm1, %xmm04355; SSE-NEXT: retq4356;4357; AVX1-LABEL: trunc_packus_v16i16_v16i8:4358; AVX1: # %bb.0:4359; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm14360; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm04361; AVX1-NEXT: vzeroupper4362; AVX1-NEXT: retq4363;4364; AVX2-LABEL: trunc_packus_v16i16_v16i8:4365; AVX2: # %bb.0:4366; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm14367; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm04368; AVX2-NEXT: vzeroupper4369; AVX2-NEXT: retq4370;4371; AVX512F-LABEL: trunc_packus_v16i16_v16i8:4372; AVX512F: # %bb.0:4373; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm14374; AVX512F-NEXT: vpackuswb %xmm1, %xmm0, %xmm04375; AVX512F-NEXT: vzeroupper4376; AVX512F-NEXT: retq4377;4378; AVX512VL-LABEL: trunc_packus_v16i16_v16i8:4379; AVX512VL: # %bb.0:4380; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm14381; AVX512VL-NEXT: vpackuswb %xmm1, %xmm0, %xmm04382; AVX512VL-NEXT: vzeroupper4383; AVX512VL-NEXT: retq4384;4385; AVX512BW-LABEL: trunc_packus_v16i16_v16i8:4386; AVX512BW: # %bb.0:4387; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm14388; AVX512BW-NEXT: vpackuswb %xmm1, %xmm0, %xmm04389; AVX512BW-NEXT: vzeroupper4390; AVX512BW-NEXT: retq4391;4392; AVX512BWVL-LABEL: trunc_packus_v16i16_v16i8:4393; AVX512BWVL: # %bb.0:4394; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm14395; AVX512BWVL-NEXT: vpmaxsw %ymm1, %ymm0, %ymm04396; AVX512BWVL-NEXT: vpmovuswb %ymm0, %xmm04397; AVX512BWVL-NEXT: vzeroupper4398; AVX512BWVL-NEXT: retq4399;4400; SKX-LABEL: trunc_packus_v16i16_v16i8:4401; SKX: # %bb.0:4402; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm14403; SKX-NEXT: vpmaxsw %ymm1, %ymm0, %ymm04404; SKX-NEXT: vpmovuswb %ymm0, %xmm04405; SKX-NEXT: vzeroupper4406; SKX-NEXT: retq4407 %1 = icmp slt <16 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>4408 %2 = select <16 x i1> %1, <16 x i16> %a0, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>4409 %3 = icmp sgt <16 x i16> %2, zeroinitializer4410 %4 = select <16 x i1> %3, <16 x i16> %2, <16 x i16> zeroinitializer4411 %5 = trunc <16 x i16> %4 to <16 x i8>4412 ret <16 x i8> %54413}4414 4415define <32 x i8> @trunc_packus_v32i16_v32i8(ptr %p0) "min-legal-vector-width"="256" {4416; SSE-LABEL: trunc_packus_v32i16_v32i8:4417; SSE: # %bb.0:4418; SSE-NEXT: movdqa (%rdi), %xmm04419; SSE-NEXT: movdqa 32(%rdi), %xmm14420; SSE-NEXT: packuswb 16(%rdi), %xmm04421; SSE-NEXT: packuswb 48(%rdi), %xmm14422; SSE-NEXT: retq4423;4424; AVX1-LABEL: trunc_packus_v32i16_v32i8:4425; AVX1: # %bb.0:4426; AVX1-NEXT: vmovdqa (%rdi), %xmm04427; AVX1-NEXT: vmovdqa 32(%rdi), %xmm14428; AVX1-NEXT: vpackuswb 48(%rdi), %xmm1, %xmm14429; AVX1-NEXT: vpackuswb 16(%rdi), %xmm0, %xmm04430; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm04431; AVX1-NEXT: retq4432;4433; AVX2-LABEL: trunc_packus_v32i16_v32i8:4434; AVX2: # %bb.0:4435; AVX2-NEXT: vmovdqa (%rdi), %ymm04436; AVX2-NEXT: vpackuswb 32(%rdi), %ymm0, %ymm04437; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4438; AVX2-NEXT: retq4439;4440; AVX512F-LABEL: trunc_packus_v32i16_v32i8:4441; AVX512F: # %bb.0:4442; AVX512F-NEXT: vmovdqa (%rdi), %ymm04443; AVX512F-NEXT: vpackuswb 32(%rdi), %ymm0, %ymm04444; AVX512F-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4445; AVX512F-NEXT: retq4446;4447; AVX512VL-LABEL: trunc_packus_v32i16_v32i8:4448; AVX512VL: # %bb.0:4449; AVX512VL-NEXT: vmovdqa (%rdi), %ymm04450; AVX512VL-NEXT: vpackuswb 32(%rdi), %ymm0, %ymm04451; AVX512VL-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4452; AVX512VL-NEXT: retq4453;4454; AVX512BW-LABEL: trunc_packus_v32i16_v32i8:4455; AVX512BW: # %bb.0:4456; AVX512BW-NEXT: vpxor %xmm0, %xmm0, %xmm04457; AVX512BW-NEXT: vpmaxsw (%rdi), %zmm0, %zmm04458; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm04459; AVX512BW-NEXT: retq4460;4461; AVX512BWVL-LABEL: trunc_packus_v32i16_v32i8:4462; AVX512BWVL: # %bb.0:4463; AVX512BWVL-NEXT: vpxor %xmm0, %xmm0, %xmm04464; AVX512BWVL-NEXT: vpmaxsw (%rdi), %zmm0, %zmm04465; AVX512BWVL-NEXT: vpmovuswb %zmm0, %ymm04466; AVX512BWVL-NEXT: retq4467;4468; SKX-LABEL: trunc_packus_v32i16_v32i8:4469; SKX: # %bb.0:4470; SKX-NEXT: vmovdqa (%rdi), %ymm04471; SKX-NEXT: vpackuswb 32(%rdi), %ymm0, %ymm04472; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4473; SKX-NEXT: retq4474 %a0 = load <32 x i16>, ptr %p04475 %1 = icmp slt <32 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>4476 %2 = select <32 x i1> %1, <32 x i16> %a0, <32 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>4477 %3 = icmp sgt <32 x i16> %2, zeroinitializer4478 %4 = select <32 x i1> %3, <32 x i16> %2, <32 x i16> zeroinitializer4479 %5 = trunc <32 x i16> %4 to <32 x i8>4480 ret <32 x i8> %54481}4482 4483define <32 x i8> @trunc_packus_v32i32_v32i8(ptr %p0) "min-legal-vector-width"="256" {4484; SSE-LABEL: trunc_packus_v32i32_v32i8:4485; SSE: # %bb.0:4486; SSE-NEXT: movdqa (%rdi), %xmm04487; SSE-NEXT: movdqa 32(%rdi), %xmm24488; SSE-NEXT: movdqa 64(%rdi), %xmm14489; SSE-NEXT: movdqa 96(%rdi), %xmm34490; SSE-NEXT: packssdw 48(%rdi), %xmm24491; SSE-NEXT: packssdw 16(%rdi), %xmm04492; SSE-NEXT: packuswb %xmm2, %xmm04493; SSE-NEXT: packssdw 112(%rdi), %xmm34494; SSE-NEXT: packssdw 80(%rdi), %xmm14495; SSE-NEXT: packuswb %xmm3, %xmm14496; SSE-NEXT: retq4497;4498; AVX1-LABEL: trunc_packus_v32i32_v32i8:4499; AVX1: # %bb.0:4500; AVX1-NEXT: vmovdqa (%rdi), %xmm04501; AVX1-NEXT: vmovdqa 32(%rdi), %xmm14502; AVX1-NEXT: vmovdqa 64(%rdi), %xmm24503; AVX1-NEXT: vmovdqa 96(%rdi), %xmm34504; AVX1-NEXT: vpackssdw 112(%rdi), %xmm3, %xmm34505; AVX1-NEXT: vpackssdw 80(%rdi), %xmm2, %xmm24506; AVX1-NEXT: vpackuswb %xmm3, %xmm2, %xmm24507; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm14508; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm04509; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm04510; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm04511; AVX1-NEXT: retq4512;4513; AVX2-LABEL: trunc_packus_v32i32_v32i8:4514; AVX2: # %bb.0:4515; AVX2-NEXT: vmovdqa (%rdi), %ymm04516; AVX2-NEXT: vmovdqa 64(%rdi), %ymm14517; AVX2-NEXT: vpackssdw 96(%rdi), %ymm1, %ymm14518; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]4519; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm04520; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4521; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm04522; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4523; AVX2-NEXT: retq4524;4525; AVX512-LABEL: trunc_packus_v32i32_v32i8:4526; AVX512: # %bb.0:4527; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm04528; AVX512-NEXT: vpmaxsd (%rdi), %zmm0, %zmm14529; AVX512-NEXT: vpmovusdb %zmm1, %xmm14530; AVX512-NEXT: vpmaxsd 64(%rdi), %zmm0, %zmm04531; AVX512-NEXT: vpmovusdb %zmm0, %xmm04532; AVX512-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm04533; AVX512-NEXT: retq4534;4535; SKX-LABEL: trunc_packus_v32i32_v32i8:4536; SKX: # %bb.0:4537; SKX-NEXT: vmovdqa (%rdi), %ymm04538; SKX-NEXT: vmovdqa 64(%rdi), %ymm14539; SKX-NEXT: vpackssdw 96(%rdi), %ymm1, %ymm14540; SKX-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]4541; SKX-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm04542; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4543; SKX-NEXT: vpackuswb %ymm1, %ymm0, %ymm04544; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4545; SKX-NEXT: retq4546 %a0 = load <32 x i32>, ptr %p04547 %1 = icmp slt <32 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>4548 %2 = select <32 x i1> %1, <32 x i32> %a0, <32 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>4549 %3 = icmp sgt <32 x i32> %2, zeroinitializer4550 %4 = select <32 x i1> %3, <32 x i32> %2, <32 x i32> zeroinitializer4551 %5 = trunc <32 x i32> %4 to <32 x i8>4552 ret <32 x i8> %54553}4554