4820 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; Signed saturation truncation to vXi3220;21 22define <2 x i32> @trunc_ssat_v2i64_v2i32(<2 x i64> %a0) {23; SSE2-SSSE3-LABEL: trunc_ssat_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 = [4294967295,4294967295]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: pxor %xmm3, %xmm141; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]42; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm243; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm244; SSE2-SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm145; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]46; SSE2-SSSE3-NEXT: pand %xmm2, %xmm047; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]48; SSE2-SSSE3-NEXT: por %xmm0, %xmm149; SSE2-SSSE3-NEXT: pand %xmm1, %xmm350; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm151; SSE2-SSSE3-NEXT: por %xmm3, %xmm152; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]53; SSE2-SSSE3-NEXT: retq54;55; SSE41-LABEL: trunc_ssat_v2i64_v2i32:56; SSE41: # %bb.0:57; SSE41-NEXT: movdqa %xmm0, %xmm158; SSE41-NEXT: movapd {{.*#+}} xmm2 = [2147483647,2147483647]59; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]60; SSE41-NEXT: pxor %xmm3, %xmm061; SSE41-NEXT: pmovsxbd {{.*#+}} xmm4 = [4294967295,0,4294967295,0]62; SSE41-NEXT: movdqa %xmm0, %xmm563; SSE41-NEXT: pcmpeqd %xmm4, %xmm564; SSE41-NEXT: pcmpgtd %xmm0, %xmm465; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]66; SSE41-NEXT: pand %xmm5, %xmm067; SSE41-NEXT: por %xmm4, %xmm068; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm269; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]70; SSE41-NEXT: pxor %xmm2, %xmm371; SSE41-NEXT: pmovsxbd {{.*#+}} xmm0 = [0,4294967295,0,4294967295]72; SSE41-NEXT: movdqa %xmm3, %xmm473; SSE41-NEXT: pcmpeqd %xmm0, %xmm474; SSE41-NEXT: pcmpgtd %xmm0, %xmm375; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]76; SSE41-NEXT: pand %xmm4, %xmm077; SSE41-NEXT: por %xmm3, %xmm078; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm179; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]80; SSE41-NEXT: retq81;82; AVX1-LABEL: trunc_ssat_v2i64_v2i32:83; AVX1: # %bb.0:84; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [2147483647,2147483647]85; AVX1-NEXT: # xmm1 = mem[0,0]86; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm287; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm088; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]89; AVX1-NEXT: # xmm1 = mem[0,0]90; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm291; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm092; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]93; AVX1-NEXT: retq94;95; AVX2-LABEL: trunc_ssat_v2i64_v2i32:96; AVX2: # %bb.0:97; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [2147483647,2147483647]98; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm299; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0100; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]101; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2102; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0103; AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]104; AVX2-NEXT: retq105;106; AVX512F-LABEL: trunc_ssat_v2i64_v2i32:107; AVX512F: # %bb.0:108; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0109; AVX512F-NEXT: vpmovsqd %zmm0, %ymm0110; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0111; AVX512F-NEXT: vzeroupper112; AVX512F-NEXT: retq113;114; AVX512VL-LABEL: trunc_ssat_v2i64_v2i32:115; AVX512VL: # %bb.0:116; AVX512VL-NEXT: vpmovsqd %xmm0, %xmm0117; AVX512VL-NEXT: retq118;119; AVX512BW-LABEL: trunc_ssat_v2i64_v2i32:120; AVX512BW: # %bb.0:121; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0122; AVX512BW-NEXT: vpmovsqd %zmm0, %ymm0123; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0124; AVX512BW-NEXT: vzeroupper125; AVX512BW-NEXT: retq126;127; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i32:128; AVX512BWVL: # %bb.0:129; AVX512BWVL-NEXT: vpmovsqd %xmm0, %xmm0130; AVX512BWVL-NEXT: retq131;132; SKX-LABEL: trunc_ssat_v2i64_v2i32:133; SKX: # %bb.0:134; SKX-NEXT: vpmovsqd %xmm0, %xmm0135; SKX-NEXT: retq136 %1 = icmp slt <2 x i64> %a0, <i64 2147483647, i64 2147483647>137 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 2147483647, i64 2147483647>138 %3 = icmp sgt <2 x i64> %2, <i64 -2147483648, i64 -2147483648>139 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -2147483648, i64 -2147483648>140 %5 = trunc <2 x i64> %4 to <2 x i32>141 ret <2 x i32> %5142}143 144define void @trunc_ssat_v2i64_v2i32_store(<2 x i64> %a0, ptr %p1) {145; SSE2-SSSE3-LABEL: trunc_ssat_v2i64_v2i32_store:146; SSE2-SSSE3: # %bb.0:147; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]148; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2149; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2150; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]151; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm4152; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4153; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [4294967295,4294967295]154; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm3155; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]156; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2157; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]158; SSE2-SSSE3-NEXT: por %xmm2, %xmm3159; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0160; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3161; SSE2-SSSE3-NEXT: por %xmm0, %xmm3162; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm1163; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]164; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm2165; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm2166; SSE2-SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1167; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]168; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0169; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]170; SSE2-SSSE3-NEXT: por %xmm0, %xmm1171; SSE2-SSSE3-NEXT: pand %xmm1, %xmm3172; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1173; SSE2-SSSE3-NEXT: por %xmm3, %xmm1174; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]175; SSE2-SSSE3-NEXT: movq %xmm0, (%rdi)176; SSE2-SSSE3-NEXT: retq177;178; SSE41-LABEL: trunc_ssat_v2i64_v2i32_store:179; SSE41: # %bb.0:180; SSE41-NEXT: movdqa %xmm0, %xmm1181; SSE41-NEXT: movapd {{.*#+}} xmm2 = [2147483647,2147483647]182; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]183; SSE41-NEXT: pxor %xmm3, %xmm0184; SSE41-NEXT: pmovsxbd {{.*#+}} xmm4 = [4294967295,0,4294967295,0]185; SSE41-NEXT: movdqa %xmm0, %xmm5186; SSE41-NEXT: pcmpeqd %xmm4, %xmm5187; SSE41-NEXT: pcmpgtd %xmm0, %xmm4188; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]189; SSE41-NEXT: pand %xmm5, %xmm0190; SSE41-NEXT: por %xmm4, %xmm0191; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2192; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]193; SSE41-NEXT: pxor %xmm2, %xmm3194; SSE41-NEXT: pmovsxbd {{.*#+}} xmm0 = [0,4294967295,0,4294967295]195; SSE41-NEXT: movdqa %xmm3, %xmm4196; SSE41-NEXT: pcmpeqd %xmm0, %xmm4197; SSE41-NEXT: pcmpgtd %xmm0, %xmm3198; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]199; SSE41-NEXT: pand %xmm4, %xmm0200; SSE41-NEXT: por %xmm3, %xmm0201; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1202; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]203; SSE41-NEXT: movq %xmm0, (%rdi)204; SSE41-NEXT: retq205;206; AVX1-LABEL: trunc_ssat_v2i64_v2i32_store:207; AVX1: # %bb.0:208; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [2147483647,2147483647]209; AVX1-NEXT: # xmm1 = mem[0,0]210; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2211; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0212; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]213; AVX1-NEXT: # xmm1 = mem[0,0]214; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2215; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0216; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]217; AVX1-NEXT: vmovlpd %xmm0, (%rdi)218; AVX1-NEXT: retq219;220; AVX2-LABEL: trunc_ssat_v2i64_v2i32_store:221; AVX2: # %bb.0:222; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [2147483647,2147483647]223; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2224; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0225; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]226; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2227; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0228; AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]229; AVX2-NEXT: vmovlpd %xmm0, (%rdi)230; AVX2-NEXT: retq231;232; AVX512F-LABEL: trunc_ssat_v2i64_v2i32_store:233; AVX512F: # %bb.0:234; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0235; AVX512F-NEXT: vpmovsqd %zmm0, %ymm0236; AVX512F-NEXT: vmovq %xmm0, (%rdi)237; AVX512F-NEXT: vzeroupper238; AVX512F-NEXT: retq239;240; AVX512VL-LABEL: trunc_ssat_v2i64_v2i32_store:241; AVX512VL: # %bb.0:242; AVX512VL-NEXT: vpmovsqd %xmm0, (%rdi)243; AVX512VL-NEXT: retq244;245; AVX512BW-LABEL: trunc_ssat_v2i64_v2i32_store:246; AVX512BW: # %bb.0:247; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0248; AVX512BW-NEXT: vpmovsqd %zmm0, %ymm0249; AVX512BW-NEXT: vmovq %xmm0, (%rdi)250; AVX512BW-NEXT: vzeroupper251; AVX512BW-NEXT: retq252;253; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i32_store:254; AVX512BWVL: # %bb.0:255; AVX512BWVL-NEXT: vpmovsqd %xmm0, (%rdi)256; AVX512BWVL-NEXT: retq257;258; SKX-LABEL: trunc_ssat_v2i64_v2i32_store:259; SKX: # %bb.0:260; SKX-NEXT: vpmovsqd %xmm0, (%rdi)261; SKX-NEXT: retq262 %1 = icmp slt <2 x i64> %a0, <i64 2147483647, i64 2147483647>263 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 2147483647, i64 2147483647>264 %3 = icmp sgt <2 x i64> %2, <i64 -2147483648, i64 -2147483648>265 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -2147483648, i64 -2147483648>266 %5 = trunc <2 x i64> %4 to <2 x i32>267 store <2 x i32> %5, ptr %p1268 ret void269}270 271define <4 x i32> @trunc_ssat_v4i64_v4i32(<4 x i64> %a0) {272; SSE2-SSSE3-LABEL: trunc_ssat_v4i64_v4i32:273; SSE2-SSSE3: # %bb.0:274; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483647,2147483647]275; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]276; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm4277; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm4278; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]279; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm6280; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm5281; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [4294967295,4294967295]282; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm8283; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm8284; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm8[0,0,2,2]285; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4286; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]287; SSE2-SSSE3-NEXT: por %xmm4, %xmm5288; SSE2-SSSE3-NEXT: pand %xmm5, %xmm0289; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm5290; SSE2-SSSE3-NEXT: por %xmm5, %xmm0291; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4292; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm4293; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]294; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm5295; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm7296; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]297; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4298; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]299; SSE2-SSSE3-NEXT: por %xmm4, %xmm5300; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1301; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm5302; SSE2-SSSE3-NEXT: por %xmm1, %xmm5303; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]304; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm3305; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm3306; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]307; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm6308; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm4309; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [18446744069414584320,18446744069414584320]310; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm3311; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]312; SSE2-SSSE3-NEXT: pand %xmm4, %xmm8313; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]314; SSE2-SSSE3-NEXT: por %xmm8, %xmm3315; SSE2-SSSE3-NEXT: pand %xmm3, %xmm5316; SSE2-SSSE3-NEXT: pandn %xmm1, %xmm3317; SSE2-SSSE3-NEXT: por %xmm5, %xmm3318; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm2319; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]320; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm4321; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm2322; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]323; SSE2-SSSE3-NEXT: pand %xmm4, %xmm5324; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]325; SSE2-SSSE3-NEXT: por %xmm5, %xmm2326; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0327; SSE2-SSSE3-NEXT: pandn %xmm1, %xmm2328; SSE2-SSSE3-NEXT: por %xmm2, %xmm0329; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]330; SSE2-SSSE3-NEXT: retq331;332; SSE41-LABEL: trunc_ssat_v4i64_v4i32:333; SSE41: # %bb.0:334; SSE41-NEXT: movdqa %xmm0, %xmm2335; SSE41-NEXT: movapd {{.*#+}} xmm4 = [2147483647,2147483647]336; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]337; SSE41-NEXT: movdqa %xmm0, %xmm5338; SSE41-NEXT: pxor %xmm3, %xmm5339; SSE41-NEXT: pmovsxbd {{.*#+}} xmm6 = [4294967295,0,4294967295,0]340; SSE41-NEXT: movdqa %xmm6, %xmm7341; SSE41-NEXT: pcmpgtd %xmm5, %xmm7342; SSE41-NEXT: pcmpeqd %xmm6, %xmm5343; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]344; SSE41-NEXT: pand %xmm5, %xmm0345; SSE41-NEXT: por %xmm7, %xmm0346; SSE41-NEXT: movapd %xmm4, %xmm5347; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5348; SSE41-NEXT: movdqa %xmm1, %xmm0349; SSE41-NEXT: pxor %xmm3, %xmm0350; SSE41-NEXT: movdqa %xmm0, %xmm2351; SSE41-NEXT: pcmpeqd %xmm6, %xmm2352; SSE41-NEXT: pcmpgtd %xmm0, %xmm6353; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]354; SSE41-NEXT: pand %xmm2, %xmm0355; SSE41-NEXT: por %xmm6, %xmm0356; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4357; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]358; SSE41-NEXT: movapd %xmm4, %xmm2359; SSE41-NEXT: xorpd %xmm3, %xmm2360; SSE41-NEXT: pmovsxbd {{.*#+}} xmm6 = [0,4294967295,0,4294967295]361; SSE41-NEXT: movapd %xmm2, %xmm7362; SSE41-NEXT: pcmpeqd %xmm6, %xmm7363; SSE41-NEXT: pcmpgtd %xmm6, %xmm2364; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]365; SSE41-NEXT: pand %xmm7, %xmm0366; SSE41-NEXT: por %xmm2, %xmm0367; SSE41-NEXT: movapd %xmm1, %xmm2368; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2369; SSE41-NEXT: xorpd %xmm5, %xmm3370; SSE41-NEXT: movapd %xmm3, %xmm4371; SSE41-NEXT: pcmpeqd %xmm6, %xmm4372; SSE41-NEXT: pcmpgtd %xmm6, %xmm3373; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]374; SSE41-NEXT: pand %xmm4, %xmm0375; SSE41-NEXT: por %xmm3, %xmm0376; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1377; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]378; SSE41-NEXT: movaps %xmm1, %xmm0379; SSE41-NEXT: retq380;381; AVX1-LABEL: trunc_ssat_v4i64_v4i32:382; AVX1: # %bb.0:383; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [2147483647,2147483647]384; AVX1-NEXT: # xmm1 = mem[0,0]385; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2386; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm2387; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0388; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm3389; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0390; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]391; AVX1-NEXT: # xmm1 = mem[0,0]392; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm3393; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0394; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3395; AVX1-NEXT: vblendvpd %xmm3, %xmm2, %xmm1, %xmm1396; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm1[0,2],xmm0[0,2]397; AVX1-NEXT: vzeroupper398; AVX1-NEXT: retq399;400; AVX2-SLOW-LABEL: trunc_ssat_v4i64_v4i32:401; AVX2-SLOW: # %bb.0:402; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]403; AVX2-SLOW-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2404; AVX2-SLOW-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0405; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]406; AVX2-SLOW-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2407; AVX2-SLOW-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0408; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1409; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]410; AVX2-SLOW-NEXT: vzeroupper411; AVX2-SLOW-NEXT: retq412;413; AVX2-FAST-ALL-LABEL: trunc_ssat_v4i64_v4i32:414; AVX2-FAST-ALL: # %bb.0:415; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]416; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2417; AVX2-FAST-ALL-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0418; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]419; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2420; AVX2-FAST-ALL-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0421; AVX2-FAST-ALL-NEXT: vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]422; AVX2-FAST-ALL-NEXT: # ymm1 = mem[0,1,0,1]423; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm1, %ymm0424; AVX2-FAST-ALL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0425; AVX2-FAST-ALL-NEXT: vzeroupper426; AVX2-FAST-ALL-NEXT: retq427;428; AVX2-FAST-PERLANE-LABEL: trunc_ssat_v4i64_v4i32:429; AVX2-FAST-PERLANE: # %bb.0:430; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]431; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2432; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0433; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]434; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2435; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0436; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm1437; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]438; AVX2-FAST-PERLANE-NEXT: vzeroupper439; AVX2-FAST-PERLANE-NEXT: retq440;441; AVX512F-LABEL: trunc_ssat_v4i64_v4i32:442; AVX512F: # %bb.0:443; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0444; AVX512F-NEXT: vpmovsqd %zmm0, %ymm0445; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0446; AVX512F-NEXT: vzeroupper447; AVX512F-NEXT: retq448;449; AVX512VL-LABEL: trunc_ssat_v4i64_v4i32:450; AVX512VL: # %bb.0:451; AVX512VL-NEXT: vpmovsqd %ymm0, %xmm0452; AVX512VL-NEXT: vzeroupper453; AVX512VL-NEXT: retq454;455; AVX512BW-LABEL: trunc_ssat_v4i64_v4i32:456; AVX512BW: # %bb.0:457; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0458; AVX512BW-NEXT: vpmovsqd %zmm0, %ymm0459; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0460; AVX512BW-NEXT: vzeroupper461; AVX512BW-NEXT: retq462;463; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i32:464; AVX512BWVL: # %bb.0:465; AVX512BWVL-NEXT: vpmovsqd %ymm0, %xmm0466; AVX512BWVL-NEXT: vzeroupper467; AVX512BWVL-NEXT: retq468;469; SKX-LABEL: trunc_ssat_v4i64_v4i32:470; SKX: # %bb.0:471; SKX-NEXT: vpmovsqd %ymm0, %xmm0472; SKX-NEXT: vzeroupper473; SKX-NEXT: retq474 %1 = icmp slt <4 x i64> %a0, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>475 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>476 %3 = icmp sgt <4 x i64> %2, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>477 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>478 %5 = trunc <4 x i64> %4 to <4 x i32>479 ret <4 x i32> %5480}481 482 483define <8 x i32> @trunc_ssat_v8i64_v8i32(ptr %p0) "min-legal-vector-width"="256" {484; SSE2-SSSE3-LABEL: trunc_ssat_v8i64_v8i32:485; SSE2-SSSE3: # %bb.0:486; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm3487; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm5488; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm7489; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm1490; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483647,2147483647]491; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648]492; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm2493; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm2494; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]495; SSE2-SSSE3-NEXT: pxor %xmm8, %xmm8496; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm9497; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [4294967295,4294967295]498; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm10499; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm10500; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]501; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11502; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]503; SSE2-SSSE3-NEXT: por %xmm11, %xmm2504; SSE2-SSSE3-NEXT: pand %xmm2, %xmm3505; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm2506; SSE2-SSSE3-NEXT: por %xmm3, %xmm2507; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm3508; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm3509; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]510; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm9511; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm10512; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm10513; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]514; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11515; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm10[1,1,3,3]516; SSE2-SSSE3-NEXT: por %xmm11, %xmm3517; SSE2-SSSE3-NEXT: pand %xmm3, %xmm5518; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm3519; SSE2-SSSE3-NEXT: por %xmm5, %xmm3520; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm5521; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm5522; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]523; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm9524; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm10525; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm10526; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]527; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11528; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm10[1,1,3,3]529; SSE2-SSSE3-NEXT: por %xmm11, %xmm5530; SSE2-SSSE3-NEXT: pand %xmm5, %xmm7531; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm5532; SSE2-SSSE3-NEXT: por %xmm7, %xmm5533; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm7534; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm7535; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm7[1,1,3,3]536; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm9537; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm6538; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]539; SSE2-SSSE3-NEXT: pand %xmm9, %xmm7540; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]541; SSE2-SSSE3-NEXT: por %xmm7, %xmm8542; SSE2-SSSE3-NEXT: pand %xmm8, %xmm1543; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm8544; SSE2-SSSE3-NEXT: por %xmm1, %xmm8545; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [18446744071562067968,18446744071562067968]546; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm1547; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm1548; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm1[1,1,3,3]549; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm6550; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm9551; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [18446744069414584320,18446744069414584320]552; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm1553; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]554; SSE2-SSSE3-NEXT: pand %xmm9, %xmm10555; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm1[1,1,3,3]556; SSE2-SSSE3-NEXT: por %xmm10, %xmm9557; SSE2-SSSE3-NEXT: pand %xmm9, %xmm8558; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm9559; SSE2-SSSE3-NEXT: por %xmm8, %xmm9560; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm1561; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm1562; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm1[1,1,3,3]563; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm8564; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm1565; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]566; SSE2-SSSE3-NEXT: pand %xmm8, %xmm10567; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]568; SSE2-SSSE3-NEXT: por %xmm10, %xmm1569; SSE2-SSSE3-NEXT: pand %xmm1, %xmm5570; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm1571; SSE2-SSSE3-NEXT: por %xmm5, %xmm1572; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm9[0,2]573; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm5574; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm5575; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm5[1,1,3,3]576; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm8577; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm5578; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]579; SSE2-SSSE3-NEXT: pand %xmm8, %xmm9580; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]581; SSE2-SSSE3-NEXT: por %xmm9, %xmm5582; SSE2-SSSE3-NEXT: pand %xmm5, %xmm3583; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm5584; SSE2-SSSE3-NEXT: por %xmm3, %xmm5585; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm0586; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]587; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm3588; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm0589; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]590; SSE2-SSSE3-NEXT: pand %xmm3, %xmm6591; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]592; SSE2-SSSE3-NEXT: por %xmm6, %xmm0593; SSE2-SSSE3-NEXT: pand %xmm0, %xmm2594; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm0595; SSE2-SSSE3-NEXT: por %xmm2, %xmm0596; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2]597; SSE2-SSSE3-NEXT: retq598;599; SSE41-LABEL: trunc_ssat_v8i64_v8i32:600; SSE41: # %bb.0:601; SSE41-NEXT: movdqa (%rdi), %xmm5602; SSE41-NEXT: movdqa 16(%rdi), %xmm8603; SSE41-NEXT: movdqa 32(%rdi), %xmm7604; SSE41-NEXT: movdqa 48(%rdi), %xmm2605; SSE41-NEXT: movapd {{.*#+}} xmm1 = [2147483647,2147483647]606; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]607; SSE41-NEXT: movdqa %xmm5, %xmm4608; SSE41-NEXT: pxor %xmm3, %xmm4609; SSE41-NEXT: pmovsxbd {{.*#+}} xmm6 = [4294967295,0,4294967295,0]610; SSE41-NEXT: movdqa %xmm6, %xmm9611; SSE41-NEXT: pcmpgtd %xmm4, %xmm9612; SSE41-NEXT: pcmpeqd %xmm6, %xmm4613; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]614; SSE41-NEXT: pand %xmm4, %xmm0615; SSE41-NEXT: por %xmm9, %xmm0616; SSE41-NEXT: movapd %xmm1, %xmm4617; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm4618; SSE41-NEXT: movdqa %xmm8, %xmm5619; SSE41-NEXT: pxor %xmm3, %xmm5620; SSE41-NEXT: movdqa %xmm6, %xmm9621; SSE41-NEXT: pcmpgtd %xmm5, %xmm9622; SSE41-NEXT: pcmpeqd %xmm6, %xmm5623; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]624; SSE41-NEXT: pand %xmm5, %xmm0625; SSE41-NEXT: por %xmm9, %xmm0626; SSE41-NEXT: movapd %xmm1, %xmm5627; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm5628; SSE41-NEXT: movdqa %xmm7, %xmm8629; SSE41-NEXT: pxor %xmm3, %xmm8630; SSE41-NEXT: movdqa %xmm6, %xmm9631; SSE41-NEXT: pcmpgtd %xmm8, %xmm9632; SSE41-NEXT: pcmpeqd %xmm6, %xmm8633; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]634; SSE41-NEXT: pand %xmm8, %xmm0635; SSE41-NEXT: por %xmm9, %xmm0636; SSE41-NEXT: movapd %xmm1, %xmm8637; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm8638; SSE41-NEXT: movdqa %xmm2, %xmm0639; SSE41-NEXT: pxor %xmm3, %xmm0640; SSE41-NEXT: movdqa %xmm0, %xmm7641; SSE41-NEXT: pcmpeqd %xmm6, %xmm7642; SSE41-NEXT: pcmpgtd %xmm0, %xmm6643; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]644; SSE41-NEXT: pand %xmm7, %xmm0645; SSE41-NEXT: por %xmm6, %xmm0646; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1647; SSE41-NEXT: movapd {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968]648; SSE41-NEXT: movapd %xmm1, %xmm7649; SSE41-NEXT: xorpd %xmm3, %xmm7650; SSE41-NEXT: pmovsxbd {{.*#+}} xmm6 = [0,4294967295,0,4294967295]651; SSE41-NEXT: movapd %xmm7, %xmm9652; SSE41-NEXT: pcmpeqd %xmm6, %xmm9653; SSE41-NEXT: pcmpgtd %xmm6, %xmm7654; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]655; SSE41-NEXT: pand %xmm9, %xmm0656; SSE41-NEXT: por %xmm7, %xmm0657; SSE41-NEXT: movapd %xmm2, %xmm7658; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm7659; SSE41-NEXT: movapd %xmm8, %xmm1660; SSE41-NEXT: xorpd %xmm3, %xmm1661; SSE41-NEXT: movapd %xmm1, %xmm9662; SSE41-NEXT: pcmpeqd %xmm6, %xmm9663; SSE41-NEXT: pcmpgtd %xmm6, %xmm1664; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]665; SSE41-NEXT: pand %xmm9, %xmm0666; SSE41-NEXT: por %xmm1, %xmm0667; SSE41-NEXT: movapd %xmm2, %xmm1668; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1669; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm7[0,2]670; SSE41-NEXT: movapd %xmm5, %xmm7671; SSE41-NEXT: xorpd %xmm3, %xmm7672; SSE41-NEXT: movapd %xmm7, %xmm8673; SSE41-NEXT: pcmpeqd %xmm6, %xmm8674; SSE41-NEXT: pcmpgtd %xmm6, %xmm7675; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]676; SSE41-NEXT: pand %xmm8, %xmm0677; SSE41-NEXT: por %xmm7, %xmm0678; SSE41-NEXT: movapd %xmm2, %xmm7679; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm7680; SSE41-NEXT: xorpd %xmm4, %xmm3681; SSE41-NEXT: movapd %xmm3, %xmm5682; SSE41-NEXT: pcmpeqd %xmm6, %xmm5683; SSE41-NEXT: pcmpgtd %xmm6, %xmm3684; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]685; SSE41-NEXT: pand %xmm5, %xmm0686; SSE41-NEXT: por %xmm3, %xmm0687; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2688; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm7[0,2]689; SSE41-NEXT: movaps %xmm2, %xmm0690; SSE41-NEXT: retq691;692; AVX1-LABEL: trunc_ssat_v8i64_v8i32:693; AVX1: # %bb.0:694; AVX1-NEXT: vmovdqa (%rdi), %xmm0695; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1696; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2697; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3698; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [2147483647,2147483647]699; AVX1-NEXT: # xmm4 = mem[0,0]700; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm5701; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm4, %xmm2702; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm5703; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm4, %xmm3704; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5705; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0706; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm5707; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm1708; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [18446744071562067968,18446744071562067968]709; AVX1-NEXT: # xmm4 = mem[0,0]710; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm5711; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm1712; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5713; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0714; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]715; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm1716; AVX1-NEXT: vblendvpd %xmm1, %xmm3, %xmm4, %xmm1717; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm3718; AVX1-NEXT: vblendvpd %xmm3, %xmm2, %xmm4, %xmm2719; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm2[0,2],xmm1[0,2]720; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0721; AVX1-NEXT: retq722;723; AVX2-LABEL: trunc_ssat_v8i64_v8i32:724; AVX2: # %bb.0:725; AVX2-NEXT: vmovdqa (%rdi), %ymm0726; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1727; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647]728; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3729; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0730; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3731; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1732; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]733; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3734; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1735; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm3736; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0737; AVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]738; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]739; AVX2-NEXT: retq740;741; AVX512-LABEL: trunc_ssat_v8i64_v8i32:742; AVX512: # %bb.0:743; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0744; AVX512-NEXT: vpmovsqd %zmm0, %ymm0745; AVX512-NEXT: retq746;747; SKX-LABEL: trunc_ssat_v8i64_v8i32:748; SKX: # %bb.0:749; SKX-NEXT: vmovdqa (%rdi), %ymm0750; SKX-NEXT: vmovdqa 32(%rdi), %ymm1751; SKX-NEXT: vpmovsqd %ymm0, %xmm0752; SKX-NEXT: vpmovsqd %ymm1, %xmm1753; SKX-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0754; SKX-NEXT: retq755 %a0 = load <8 x i64>, ptr %p0756 %1 = icmp slt <8 x i64> %a0, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>757 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>758 %3 = icmp sgt <8 x i64> %2, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>759 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>760 %5 = trunc <8 x i64> %4 to <8 x i32>761 ret <8 x i32> %5762}763 764;765; Signed saturation truncation to vXi16766;767 768define <2 x i16> @trunc_ssat_v2i64_v2i16(<2 x i64> %a0) {769; SSE2-SSSE3-LABEL: trunc_ssat_v2i64_v2i16:770; SSE2-SSSE3: # %bb.0:771; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]772; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2773; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2774; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]775; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm4776; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4777; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147516415,2147516415]778; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm3779; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]780; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2781; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]782; SSE2-SSSE3-NEXT: por %xmm2, %xmm3783; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0784; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3785; SSE2-SSSE3-NEXT: por %xmm0, %xmm3786; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm1787; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]788; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm2789; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm2790; SSE2-SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1791; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]792; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0793; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]794; SSE2-SSSE3-NEXT: por %xmm0, %xmm1795; SSE2-SSSE3-NEXT: pand %xmm1, %xmm3796; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1797; SSE2-SSSE3-NEXT: por %xmm3, %xmm1798; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]799; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]800; SSE2-SSSE3-NEXT: retq801;802; SSE41-LABEL: trunc_ssat_v2i64_v2i16:803; SSE41: # %bb.0:804; SSE41-NEXT: movdqa %xmm0, %xmm1805; SSE41-NEXT: movapd {{.*#+}} xmm2 = [32767,32767]806; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]807; SSE41-NEXT: pxor %xmm3, %xmm0808; SSE41-NEXT: pmovzxdq {{.*#+}} xmm4 = [2147516415,2147516415]809; SSE41-NEXT: movdqa %xmm0, %xmm5810; SSE41-NEXT: pcmpeqd %xmm4, %xmm5811; SSE41-NEXT: pcmpgtd %xmm0, %xmm4812; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]813; SSE41-NEXT: pand %xmm5, %xmm0814; SSE41-NEXT: por %xmm4, %xmm0815; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2816; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]817; SSE41-NEXT: pxor %xmm2, %xmm3818; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]819; SSE41-NEXT: movdqa %xmm3, %xmm4820; SSE41-NEXT: pcmpeqd %xmm0, %xmm4821; SSE41-NEXT: pcmpgtd %xmm0, %xmm3822; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]823; SSE41-NEXT: pand %xmm4, %xmm0824; SSE41-NEXT: por %xmm3, %xmm0825; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1826; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]827; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]828; SSE41-NEXT: retq829;830; AVX1-LABEL: trunc_ssat_v2i64_v2i16:831; AVX1: # %bb.0:832; AVX1-NEXT: vpmovsxwq {{.*#+}} xmm1 = [32767,32767]833; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2834; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0835; AVX1-NEXT: vpmovsxwq {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]836; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2837; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0838; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]839; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]840; AVX1-NEXT: retq841;842; AVX2-SLOW-LABEL: trunc_ssat_v2i64_v2i16:843; AVX2-SLOW: # %bb.0:844; AVX2-SLOW-NEXT: vpmovsxwq {{.*#+}} xmm1 = [32767,32767]845; AVX2-SLOW-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2846; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0847; AVX2-SLOW-NEXT: vpmovsxwq {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]848; AVX2-SLOW-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2849; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0850; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]851; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]852; AVX2-SLOW-NEXT: retq853;854; AVX2-FAST-LABEL: trunc_ssat_v2i64_v2i16:855; AVX2-FAST: # %bb.0:856; AVX2-FAST-NEXT: vpmovsxwq {{.*#+}} xmm1 = [32767,32767]857; AVX2-FAST-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2858; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0859; AVX2-FAST-NEXT: vpmovsxwq {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]860; AVX2-FAST-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2861; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0862; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]863; AVX2-FAST-NEXT: retq864;865; AVX512F-LABEL: trunc_ssat_v2i64_v2i16:866; AVX512F: # %bb.0:867; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0868; AVX512F-NEXT: vpmovsqw %zmm0, %xmm0869; AVX512F-NEXT: vzeroupper870; AVX512F-NEXT: retq871;872; AVX512VL-LABEL: trunc_ssat_v2i64_v2i16:873; AVX512VL: # %bb.0:874; AVX512VL-NEXT: vpmovsqw %xmm0, %xmm0875; AVX512VL-NEXT: retq876;877; AVX512BW-LABEL: trunc_ssat_v2i64_v2i16:878; AVX512BW: # %bb.0:879; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0880; AVX512BW-NEXT: vpmovsqw %zmm0, %xmm0881; AVX512BW-NEXT: vzeroupper882; AVX512BW-NEXT: retq883;884; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i16:885; AVX512BWVL: # %bb.0:886; AVX512BWVL-NEXT: vpmovsqw %xmm0, %xmm0887; AVX512BWVL-NEXT: retq888;889; SKX-LABEL: trunc_ssat_v2i64_v2i16:890; SKX: # %bb.0:891; SKX-NEXT: vpmovsqw %xmm0, %xmm0892; SKX-NEXT: retq893 %1 = icmp slt <2 x i64> %a0, <i64 32767, i64 32767>894 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 32767, i64 32767>895 %3 = icmp sgt <2 x i64> %2, <i64 -32768, i64 -32768>896 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -32768, i64 -32768>897 %5 = trunc <2 x i64> %4 to <2 x i16>898 ret <2 x i16> %5899}900 901define void @trunc_ssat_v2i64_v2i16_store(<2 x i64> %a0, ptr%p1) {902; SSE2-SSSE3-LABEL: trunc_ssat_v2i64_v2i16_store:903; SSE2-SSSE3: # %bb.0:904; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]905; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2906; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2907; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]908; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm4909; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4910; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147516415,2147516415]911; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm3912; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]913; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2914; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]915; SSE2-SSSE3-NEXT: por %xmm2, %xmm3916; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0917; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3918; SSE2-SSSE3-NEXT: por %xmm0, %xmm3919; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm1920; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]921; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm2922; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm2923; SSE2-SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1924; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]925; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0926; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]927; SSE2-SSSE3-NEXT: por %xmm0, %xmm1928; SSE2-SSSE3-NEXT: pand %xmm1, %xmm3929; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1930; SSE2-SSSE3-NEXT: por %xmm3, %xmm1931; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]932; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]933; SSE2-SSSE3-NEXT: movd %xmm0, (%rdi)934; SSE2-SSSE3-NEXT: retq935;936; SSE41-LABEL: trunc_ssat_v2i64_v2i16_store:937; SSE41: # %bb.0:938; SSE41-NEXT: movdqa %xmm0, %xmm1939; SSE41-NEXT: movapd {{.*#+}} xmm2 = [32767,32767]940; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]941; SSE41-NEXT: pxor %xmm3, %xmm0942; SSE41-NEXT: pmovzxdq {{.*#+}} xmm4 = [2147516415,2147516415]943; SSE41-NEXT: movdqa %xmm0, %xmm5944; SSE41-NEXT: pcmpeqd %xmm4, %xmm5945; SSE41-NEXT: pcmpgtd %xmm0, %xmm4946; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]947; SSE41-NEXT: pand %xmm5, %xmm0948; SSE41-NEXT: por %xmm4, %xmm0949; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2950; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]951; SSE41-NEXT: pxor %xmm2, %xmm3952; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]953; SSE41-NEXT: movdqa %xmm3, %xmm4954; SSE41-NEXT: pcmpeqd %xmm0, %xmm4955; SSE41-NEXT: pcmpgtd %xmm0, %xmm3956; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]957; SSE41-NEXT: pand %xmm4, %xmm0958; SSE41-NEXT: por %xmm3, %xmm0959; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1960; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]961; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]962; SSE41-NEXT: movd %xmm0, (%rdi)963; SSE41-NEXT: retq964;965; AVX1-LABEL: trunc_ssat_v2i64_v2i16_store:966; AVX1: # %bb.0:967; AVX1-NEXT: vpmovsxwq {{.*#+}} xmm1 = [32767,32767]968; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2969; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0970; AVX1-NEXT: vpmovsxwq {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]971; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2972; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0973; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]974; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]975; AVX1-NEXT: vmovd %xmm0, (%rdi)976; AVX1-NEXT: retq977;978; AVX2-SLOW-LABEL: trunc_ssat_v2i64_v2i16_store:979; AVX2-SLOW: # %bb.0:980; AVX2-SLOW-NEXT: vpmovsxwq {{.*#+}} xmm1 = [32767,32767]981; AVX2-SLOW-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2982; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0983; AVX2-SLOW-NEXT: vpmovsxwq {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]984; AVX2-SLOW-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2985; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0986; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]987; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]988; AVX2-SLOW-NEXT: vmovd %xmm0, (%rdi)989; AVX2-SLOW-NEXT: retq990;991; AVX2-FAST-LABEL: trunc_ssat_v2i64_v2i16_store:992; AVX2-FAST: # %bb.0:993; AVX2-FAST-NEXT: vpmovsxwq {{.*#+}} xmm1 = [32767,32767]994; AVX2-FAST-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2995; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0996; AVX2-FAST-NEXT: vpmovsxwq {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]997; AVX2-FAST-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2998; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0999; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,u,u,u,u,u,u,u,u,u,u]1000; AVX2-FAST-NEXT: vmovd %xmm0, (%rdi)1001; AVX2-FAST-NEXT: retq1002;1003; AVX512F-LABEL: trunc_ssat_v2i64_v2i16_store:1004; AVX512F: # %bb.0:1005; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01006; AVX512F-NEXT: vpmovsqw %zmm0, %xmm01007; AVX512F-NEXT: vmovd %xmm0, (%rdi)1008; AVX512F-NEXT: vzeroupper1009; AVX512F-NEXT: retq1010;1011; AVX512VL-LABEL: trunc_ssat_v2i64_v2i16_store:1012; AVX512VL: # %bb.0:1013; AVX512VL-NEXT: vpmovsqw %xmm0, (%rdi)1014; AVX512VL-NEXT: retq1015;1016; AVX512BW-LABEL: trunc_ssat_v2i64_v2i16_store:1017; AVX512BW: # %bb.0:1018; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01019; AVX512BW-NEXT: vpmovsqw %zmm0, %xmm01020; AVX512BW-NEXT: vmovd %xmm0, (%rdi)1021; AVX512BW-NEXT: vzeroupper1022; AVX512BW-NEXT: retq1023;1024; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i16_store:1025; AVX512BWVL: # %bb.0:1026; AVX512BWVL-NEXT: vpmovsqw %xmm0, (%rdi)1027; AVX512BWVL-NEXT: retq1028;1029; SKX-LABEL: trunc_ssat_v2i64_v2i16_store:1030; SKX: # %bb.0:1031; SKX-NEXT: vpmovsqw %xmm0, (%rdi)1032; SKX-NEXT: retq1033 %1 = icmp slt <2 x i64> %a0, <i64 32767, i64 32767>1034 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 32767, i64 32767>1035 %3 = icmp sgt <2 x i64> %2, <i64 -32768, i64 -32768>1036 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -32768, i64 -32768>1037 %5 = trunc <2 x i64> %4 to <2 x i16>1038 store <2 x i16> %5, ptr%p11039 ret void1040}1041 1042define <4 x i16> @trunc_ssat_v4i64_v4i16(<4 x i64> %a0) {1043; SSE2-SSSE3-LABEL: trunc_ssat_v4i64_v4i16:1044; SSE2-SSSE3: # %bb.0:1045; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [32767,32767]1046; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]1047; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm41048; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm41049; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]1050; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm61051; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm51052; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147516415,2147516415]1053; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm81054; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm81055; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm8[0,0,2,2]1056; SSE2-SSSE3-NEXT: pand %xmm5, %xmm41057; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]1058; SSE2-SSSE3-NEXT: por %xmm4, %xmm51059; SSE2-SSSE3-NEXT: pand %xmm5, %xmm01060; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm51061; SSE2-SSSE3-NEXT: por %xmm5, %xmm01062; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm41063; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm41064; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]1065; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm51066; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm71067; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]1068; SSE2-SSSE3-NEXT: pand %xmm5, %xmm41069; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]1070; SSE2-SSSE3-NEXT: por %xmm4, %xmm51071; SSE2-SSSE3-NEXT: pand %xmm5, %xmm11072; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm51073; SSE2-SSSE3-NEXT: por %xmm1, %xmm51074; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]1075; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm31076; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm31077; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]1078; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm61079; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm41080; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [18446744071562035200,18446744071562035200]1081; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm31082; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]1083; SSE2-SSSE3-NEXT: pand %xmm4, %xmm81084; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]1085; SSE2-SSSE3-NEXT: por %xmm8, %xmm31086; SSE2-SSSE3-NEXT: pand %xmm3, %xmm51087; SSE2-SSSE3-NEXT: pandn %xmm1, %xmm31088; SSE2-SSSE3-NEXT: por %xmm5, %xmm31089; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm21090; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]1091; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm41092; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm21093; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]1094; SSE2-SSSE3-NEXT: pand %xmm4, %xmm51095; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1096; SSE2-SSSE3-NEXT: por %xmm5, %xmm21097; SSE2-SSSE3-NEXT: pand %xmm2, %xmm01098; SSE2-SSSE3-NEXT: pandn %xmm1, %xmm21099; SSE2-SSSE3-NEXT: por %xmm2, %xmm01100; SSE2-SSSE3-NEXT: packssdw %xmm3, %xmm01101; SSE2-SSSE3-NEXT: packssdw %xmm0, %xmm01102; SSE2-SSSE3-NEXT: retq1103;1104; SSE41-LABEL: trunc_ssat_v4i64_v4i16:1105; SSE41: # %bb.0:1106; SSE41-NEXT: movdqa %xmm0, %xmm21107; SSE41-NEXT: movapd {{.*#+}} xmm4 = [32767,32767]1108; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]1109; SSE41-NEXT: movdqa %xmm0, %xmm51110; SSE41-NEXT: pxor %xmm3, %xmm51111; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147516415,2147516415]1112; SSE41-NEXT: movdqa %xmm6, %xmm71113; SSE41-NEXT: pcmpgtd %xmm5, %xmm71114; SSE41-NEXT: pcmpeqd %xmm6, %xmm51115; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]1116; SSE41-NEXT: pand %xmm5, %xmm01117; SSE41-NEXT: por %xmm7, %xmm01118; SSE41-NEXT: movapd %xmm4, %xmm51119; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm51120; SSE41-NEXT: movdqa %xmm1, %xmm01121; SSE41-NEXT: pxor %xmm3, %xmm01122; SSE41-NEXT: movdqa %xmm0, %xmm21123; SSE41-NEXT: pcmpeqd %xmm6, %xmm21124; SSE41-NEXT: pcmpgtd %xmm0, %xmm61125; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]1126; SSE41-NEXT: pand %xmm2, %xmm01127; SSE41-NEXT: por %xmm6, %xmm01128; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm41129; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]1130; SSE41-NEXT: movapd %xmm4, %xmm21131; SSE41-NEXT: xorpd %xmm3, %xmm21132; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200]1133; SSE41-NEXT: movapd %xmm2, %xmm71134; SSE41-NEXT: pcmpeqd %xmm6, %xmm71135; SSE41-NEXT: pcmpgtd %xmm6, %xmm21136; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]1137; SSE41-NEXT: pand %xmm7, %xmm01138; SSE41-NEXT: por %xmm2, %xmm01139; SSE41-NEXT: movapd %xmm1, %xmm21140; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm21141; SSE41-NEXT: xorpd %xmm5, %xmm31142; SSE41-NEXT: movapd %xmm3, %xmm41143; SSE41-NEXT: pcmpeqd %xmm6, %xmm41144; SSE41-NEXT: pcmpgtd %xmm6, %xmm31145; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]1146; SSE41-NEXT: pand %xmm4, %xmm01147; SSE41-NEXT: por %xmm3, %xmm01148; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm11149; SSE41-NEXT: packssdw %xmm2, %xmm11150; SSE41-NEXT: packssdw %xmm1, %xmm11151; SSE41-NEXT: movdqa %xmm1, %xmm01152; SSE41-NEXT: retq1153;1154; AVX1-LABEL: trunc_ssat_v4i64_v4i16:1155; AVX1: # %bb.0:1156; AVX1-NEXT: vpmovsxwq {{.*#+}} xmm1 = [32767,32767]1157; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm21158; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm21159; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01160; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm31161; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm01162; AVX1-NEXT: vpmovsxwq {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]1163; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm31164; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm01165; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm31166; AVX1-NEXT: vblendvpd %xmm3, %xmm2, %xmm1, %xmm11167; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm01168; AVX1-NEXT: vpackssdw %xmm0, %xmm0, %xmm01169; AVX1-NEXT: vzeroupper1170; AVX1-NEXT: retq1171;1172; AVX2-LABEL: trunc_ssat_v4i64_v4i16:1173; AVX2: # %bb.0:1174; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [32767,32767,32767,32767]1175; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm21176; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm01177; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]1178; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm21179; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm01180; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm11181; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm01182; AVX2-NEXT: vpackssdw %xmm0, %xmm0, %xmm01183; AVX2-NEXT: vzeroupper1184; AVX2-NEXT: retq1185;1186; AVX512F-LABEL: trunc_ssat_v4i64_v4i16:1187; AVX512F: # %bb.0:1188; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01189; AVX512F-NEXT: vpmovsqw %zmm0, %xmm01190; AVX512F-NEXT: vzeroupper1191; AVX512F-NEXT: retq1192;1193; AVX512VL-LABEL: trunc_ssat_v4i64_v4i16:1194; AVX512VL: # %bb.0:1195; AVX512VL-NEXT: vpmovsqw %ymm0, %xmm01196; AVX512VL-NEXT: vzeroupper1197; AVX512VL-NEXT: retq1198;1199; AVX512BW-LABEL: trunc_ssat_v4i64_v4i16:1200; AVX512BW: # %bb.0:1201; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01202; AVX512BW-NEXT: vpmovsqw %zmm0, %xmm01203; AVX512BW-NEXT: vzeroupper1204; AVX512BW-NEXT: retq1205;1206; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i16:1207; AVX512BWVL: # %bb.0:1208; AVX512BWVL-NEXT: vpmovsqw %ymm0, %xmm01209; AVX512BWVL-NEXT: vzeroupper1210; AVX512BWVL-NEXT: retq1211;1212; SKX-LABEL: trunc_ssat_v4i64_v4i16:1213; SKX: # %bb.0:1214; SKX-NEXT: vpmovsqw %ymm0, %xmm01215; SKX-NEXT: vzeroupper1216; SKX-NEXT: retq1217 %1 = icmp slt <4 x i64> %a0, <i64 32767, i64 32767, i64 32767, i64 32767>1218 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 32767, i64 32767, i64 32767, i64 32767>1219 %3 = icmp sgt <4 x i64> %2, <i64 -32768, i64 -32768, i64 -32768, i64 -32768>1220 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768>1221 %5 = trunc <4 x i64> %4 to <4 x i16>1222 ret <4 x i16> %51223}1224 1225define void @trunc_ssat_v4i64_v4i16_store(<4 x i64> %a0, ptr%p1) {1226; SSE2-SSSE3-LABEL: trunc_ssat_v4i64_v4i16_store:1227; SSE2-SSSE3: # %bb.0:1228; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [32767,32767]1229; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]1230; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm31231; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm31232; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]1233; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm61234; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm51235; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147516415,2147516415]1236; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm81237; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm81238; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]1239; SSE2-SSSE3-NEXT: pand %xmm5, %xmm91240; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm8[1,1,3,3]1241; SSE2-SSSE3-NEXT: por %xmm9, %xmm31242; SSE2-SSSE3-NEXT: pand %xmm3, %xmm01243; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm31244; SSE2-SSSE3-NEXT: por %xmm0, %xmm31245; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm01246; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm01247; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]1248; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm51249; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm71250; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]1251; SSE2-SSSE3-NEXT: pand %xmm5, %xmm01252; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]1253; SSE2-SSSE3-NEXT: por %xmm0, %xmm51254; SSE2-SSSE3-NEXT: pand %xmm5, %xmm11255; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm51256; SSE2-SSSE3-NEXT: por %xmm1, %xmm51257; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [18446744073709518848,18446744073709518848]1258; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm11259; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm11260; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]1261; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm61262; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm41263; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [18446744071562035200,18446744071562035200]1264; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm11265; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm1[0,0,2,2]1266; SSE2-SSSE3-NEXT: pand %xmm4, %xmm81267; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1268; SSE2-SSSE3-NEXT: por %xmm8, %xmm11269; SSE2-SSSE3-NEXT: pand %xmm1, %xmm51270; SSE2-SSSE3-NEXT: pandn %xmm0, %xmm11271; SSE2-SSSE3-NEXT: por %xmm5, %xmm11272; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm21273; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]1274; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm41275; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm21276; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]1277; SSE2-SSSE3-NEXT: pand %xmm4, %xmm51278; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1279; SSE2-SSSE3-NEXT: por %xmm5, %xmm21280; SSE2-SSSE3-NEXT: pand %xmm2, %xmm31281; SSE2-SSSE3-NEXT: pandn %xmm0, %xmm21282; SSE2-SSSE3-NEXT: por %xmm3, %xmm21283; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm21284; SSE2-SSSE3-NEXT: packssdw %xmm2, %xmm21285; SSE2-SSSE3-NEXT: movq %xmm2, (%rdi)1286; SSE2-SSSE3-NEXT: retq1287;1288; SSE41-LABEL: trunc_ssat_v4i64_v4i16_store:1289; SSE41: # %bb.0:1290; SSE41-NEXT: movdqa %xmm0, %xmm21291; SSE41-NEXT: movapd {{.*#+}} xmm4 = [32767,32767]1292; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]1293; SSE41-NEXT: movdqa %xmm0, %xmm51294; SSE41-NEXT: pxor %xmm3, %xmm51295; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147516415,2147516415]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: movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]1314; SSE41-NEXT: movapd %xmm4, %xmm21315; SSE41-NEXT: xorpd %xmm3, %xmm21316; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200]1317; SSE41-NEXT: movapd %xmm2, %xmm71318; SSE41-NEXT: pcmpeqd %xmm6, %xmm71319; SSE41-NEXT: pcmpgtd %xmm6, %xmm21320; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]1321; SSE41-NEXT: pand %xmm7, %xmm01322; SSE41-NEXT: por %xmm2, %xmm01323; SSE41-NEXT: movapd %xmm1, %xmm21324; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm21325; SSE41-NEXT: xorpd %xmm5, %xmm31326; SSE41-NEXT: movapd %xmm3, %xmm41327; SSE41-NEXT: pcmpeqd %xmm6, %xmm41328; SSE41-NEXT: pcmpgtd %xmm6, %xmm31329; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]1330; SSE41-NEXT: pand %xmm4, %xmm01331; SSE41-NEXT: por %xmm3, %xmm01332; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm11333; SSE41-NEXT: packssdw %xmm2, %xmm11334; SSE41-NEXT: packssdw %xmm1, %xmm11335; SSE41-NEXT: movq %xmm1, (%rdi)1336; SSE41-NEXT: retq1337;1338; AVX1-LABEL: trunc_ssat_v4i64_v4i16_store:1339; AVX1: # %bb.0:1340; AVX1-NEXT: vpmovsxwq {{.*#+}} xmm1 = [32767,32767]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: vpmovsxwq {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]1347; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm31348; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm01349; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm31350; AVX1-NEXT: vblendvpd %xmm3, %xmm2, %xmm1, %xmm11351; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm01352; AVX1-NEXT: vpackssdw %xmm0, %xmm0, %xmm01353; AVX1-NEXT: vmovq %xmm0, (%rdi)1354; AVX1-NEXT: vzeroupper1355; AVX1-NEXT: retq1356;1357; AVX2-LABEL: trunc_ssat_v4i64_v4i16_store:1358; AVX2: # %bb.0:1359; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [32767,32767,32767,32767]1360; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm21361; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm01362; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]1363; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm21364; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm01365; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm11366; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm01367; AVX2-NEXT: vpackssdw %xmm0, %xmm0, %xmm01368; AVX2-NEXT: vmovq %xmm0, (%rdi)1369; AVX2-NEXT: vzeroupper1370; AVX2-NEXT: retq1371;1372; AVX512F-LABEL: trunc_ssat_v4i64_v4i16_store:1373; AVX512F: # %bb.0:1374; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01375; AVX512F-NEXT: vpmovsqw %zmm0, %xmm01376; AVX512F-NEXT: vmovq %xmm0, (%rdi)1377; AVX512F-NEXT: vzeroupper1378; AVX512F-NEXT: retq1379;1380; AVX512VL-LABEL: trunc_ssat_v4i64_v4i16_store:1381; AVX512VL: # %bb.0:1382; AVX512VL-NEXT: vpmovsqw %ymm0, (%rdi)1383; AVX512VL-NEXT: vzeroupper1384; AVX512VL-NEXT: retq1385;1386; AVX512BW-LABEL: trunc_ssat_v4i64_v4i16_store:1387; AVX512BW: # %bb.0:1388; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01389; AVX512BW-NEXT: vpmovsqw %zmm0, %xmm01390; AVX512BW-NEXT: vmovq %xmm0, (%rdi)1391; AVX512BW-NEXT: vzeroupper1392; AVX512BW-NEXT: retq1393;1394; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i16_store:1395; AVX512BWVL: # %bb.0:1396; AVX512BWVL-NEXT: vpmovsqw %ymm0, (%rdi)1397; AVX512BWVL-NEXT: vzeroupper1398; AVX512BWVL-NEXT: retq1399;1400; SKX-LABEL: trunc_ssat_v4i64_v4i16_store:1401; SKX: # %bb.0:1402; SKX-NEXT: vpmovsqw %ymm0, (%rdi)1403; SKX-NEXT: vzeroupper1404; SKX-NEXT: retq1405 %1 = icmp slt <4 x i64> %a0, <i64 32767, i64 32767, i64 32767, i64 32767>1406 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 32767, i64 32767, i64 32767, i64 32767>1407 %3 = icmp sgt <4 x i64> %2, <i64 -32768, i64 -32768, i64 -32768, i64 -32768>1408 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768>1409 %5 = trunc <4 x i64> %4 to <4 x i16>1410 store <4 x i16> %5, ptr%p11411 ret void1412}1413 1414define <8 x i16> @trunc_ssat_v8i64_v8i16(ptr %p0) "min-legal-vector-width"="256" {1415; SSE2-SSSE3-LABEL: trunc_ssat_v8i64_v8i16:1416; SSE2-SSSE3: # %bb.0:1417; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm61418; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm01419; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm31420; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm51421; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [32767,32767]1422; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]1423; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm21424; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm21425; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]1426; SSE2-SSSE3-NEXT: pxor %xmm8, %xmm81427; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm91428; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147516415,2147516415]1429; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm101430; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm101431; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]1432; SSE2-SSSE3-NEXT: pand %xmm9, %xmm111433; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]1434; SSE2-SSSE3-NEXT: por %xmm11, %xmm21435; SSE2-SSSE3-NEXT: pand %xmm2, %xmm31436; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm21437; SSE2-SSSE3-NEXT: por %xmm3, %xmm21438; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm31439; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm31440; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]1441; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm91442; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm101443; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm101444; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]1445; SSE2-SSSE3-NEXT: pand %xmm9, %xmm111446; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm10[1,1,3,3]1447; SSE2-SSSE3-NEXT: por %xmm11, %xmm31448; SSE2-SSSE3-NEXT: pand %xmm3, %xmm51449; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm31450; SSE2-SSSE3-NEXT: por %xmm5, %xmm31451; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm51452; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm51453; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]1454; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm91455; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm101456; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm101457; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]1458; SSE2-SSSE3-NEXT: pand %xmm9, %xmm111459; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm10[1,1,3,3]1460; SSE2-SSSE3-NEXT: por %xmm11, %xmm51461; SSE2-SSSE3-NEXT: pand %xmm5, %xmm61462; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm51463; SSE2-SSSE3-NEXT: por %xmm6, %xmm51464; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm61465; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm61466; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm6[1,1,3,3]1467; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm91468; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm71469; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2]1470; SSE2-SSSE3-NEXT: pand %xmm9, %xmm61471; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3]1472; SSE2-SSSE3-NEXT: por %xmm6, %xmm81473; SSE2-SSSE3-NEXT: pand %xmm8, %xmm01474; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm81475; SSE2-SSSE3-NEXT: por %xmm0, %xmm81476; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [18446744073709518848,18446744073709518848]1477; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm01478; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm01479; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3]1480; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm61481; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm91482; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [18446744071562035200,18446744071562035200]1483; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm01484; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]1485; SSE2-SSSE3-NEXT: pand %xmm9, %xmm101486; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3]1487; SSE2-SSSE3-NEXT: por %xmm10, %xmm91488; SSE2-SSSE3-NEXT: pand %xmm9, %xmm81489; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm91490; SSE2-SSSE3-NEXT: por %xmm8, %xmm91491; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm01492; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm01493; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm0[1,1,3,3]1494; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm81495; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm01496; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]1497; SSE2-SSSE3-NEXT: pand %xmm8, %xmm101498; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1499; SSE2-SSSE3-NEXT: por %xmm10, %xmm01500; SSE2-SSSE3-NEXT: pand %xmm0, %xmm51501; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm01502; SSE2-SSSE3-NEXT: por %xmm5, %xmm01503; SSE2-SSSE3-NEXT: packssdw %xmm9, %xmm01504; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm51505; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm51506; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm5[1,1,3,3]1507; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm81508; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm51509; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]1510; SSE2-SSSE3-NEXT: pand %xmm8, %xmm91511; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]1512; SSE2-SSSE3-NEXT: por %xmm9, %xmm51513; SSE2-SSSE3-NEXT: pand %xmm5, %xmm31514; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm51515; SSE2-SSSE3-NEXT: por %xmm3, %xmm51516; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm11517; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]1518; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm31519; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm11520; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]1521; SSE2-SSSE3-NEXT: pand %xmm3, %xmm61522; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1523; SSE2-SSSE3-NEXT: por %xmm6, %xmm11524; SSE2-SSSE3-NEXT: pand %xmm1, %xmm21525; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm11526; SSE2-SSSE3-NEXT: por %xmm2, %xmm11527; SSE2-SSSE3-NEXT: packssdw %xmm5, %xmm11528; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm01529; SSE2-SSSE3-NEXT: retq1530;1531; SSE41-LABEL: trunc_ssat_v8i64_v8i16:1532; SSE41: # %bb.0:1533; SSE41-NEXT: movdqa (%rdi), %xmm71534; SSE41-NEXT: movdqa 16(%rdi), %xmm51535; SSE41-NEXT: movdqa 32(%rdi), %xmm41536; SSE41-NEXT: movdqa 48(%rdi), %xmm81537; SSE41-NEXT: movapd {{.*#+}} xmm1 = [32767,32767]1538; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]1539; SSE41-NEXT: movdqa %xmm4, %xmm31540; SSE41-NEXT: pxor %xmm2, %xmm31541; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147516415,2147516415]1542; SSE41-NEXT: movdqa %xmm6, %xmm91543; SSE41-NEXT: pcmpgtd %xmm3, %xmm91544; SSE41-NEXT: pcmpeqd %xmm6, %xmm31545; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]1546; SSE41-NEXT: pand %xmm3, %xmm01547; SSE41-NEXT: por %xmm9, %xmm01548; SSE41-NEXT: movapd %xmm1, %xmm31549; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm31550; SSE41-NEXT: movdqa %xmm8, %xmm41551; SSE41-NEXT: pxor %xmm2, %xmm41552; SSE41-NEXT: movdqa %xmm6, %xmm91553; SSE41-NEXT: pcmpgtd %xmm4, %xmm91554; SSE41-NEXT: pcmpeqd %xmm6, %xmm41555; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]1556; SSE41-NEXT: pand %xmm4, %xmm01557; SSE41-NEXT: por %xmm9, %xmm01558; SSE41-NEXT: movapd %xmm1, %xmm41559; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm41560; SSE41-NEXT: movdqa %xmm7, %xmm81561; SSE41-NEXT: pxor %xmm2, %xmm81562; SSE41-NEXT: movdqa %xmm6, %xmm91563; SSE41-NEXT: pcmpgtd %xmm8, %xmm91564; SSE41-NEXT: pcmpeqd %xmm6, %xmm81565; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]1566; SSE41-NEXT: pand %xmm8, %xmm01567; SSE41-NEXT: por %xmm9, %xmm01568; SSE41-NEXT: movapd %xmm1, %xmm81569; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm81570; SSE41-NEXT: movdqa %xmm5, %xmm01571; SSE41-NEXT: pxor %xmm2, %xmm01572; SSE41-NEXT: movdqa %xmm0, %xmm71573; SSE41-NEXT: pcmpeqd %xmm6, %xmm71574; SSE41-NEXT: pcmpgtd %xmm0, %xmm61575; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]1576; SSE41-NEXT: pand %xmm7, %xmm01577; SSE41-NEXT: por %xmm6, %xmm01578; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm11579; SSE41-NEXT: movapd {{.*#+}} xmm5 = [18446744073709518848,18446744073709518848]1580; SSE41-NEXT: movapd %xmm1, %xmm71581; SSE41-NEXT: xorpd %xmm2, %xmm71582; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200]1583; SSE41-NEXT: movapd %xmm7, %xmm91584; SSE41-NEXT: pcmpeqd %xmm6, %xmm91585; SSE41-NEXT: pcmpgtd %xmm6, %xmm71586; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]1587; SSE41-NEXT: pand %xmm9, %xmm01588; SSE41-NEXT: por %xmm7, %xmm01589; SSE41-NEXT: movapd %xmm5, %xmm71590; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm71591; SSE41-NEXT: movapd %xmm8, %xmm11592; SSE41-NEXT: xorpd %xmm2, %xmm11593; SSE41-NEXT: movapd %xmm1, %xmm91594; SSE41-NEXT: pcmpeqd %xmm6, %xmm91595; SSE41-NEXT: pcmpgtd %xmm6, %xmm11596; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]1597; SSE41-NEXT: pand %xmm9, %xmm01598; SSE41-NEXT: por %xmm1, %xmm01599; SSE41-NEXT: movapd %xmm5, %xmm11600; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm11601; SSE41-NEXT: packssdw %xmm7, %xmm11602; SSE41-NEXT: movapd %xmm4, %xmm71603; SSE41-NEXT: xorpd %xmm2, %xmm71604; SSE41-NEXT: movapd %xmm7, %xmm81605; SSE41-NEXT: pcmpeqd %xmm6, %xmm81606; SSE41-NEXT: pcmpgtd %xmm6, %xmm71607; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]1608; SSE41-NEXT: pand %xmm8, %xmm01609; SSE41-NEXT: por %xmm7, %xmm01610; SSE41-NEXT: movapd %xmm5, %xmm71611; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm71612; SSE41-NEXT: xorpd %xmm3, %xmm21613; SSE41-NEXT: movapd %xmm2, %xmm41614; SSE41-NEXT: pcmpeqd %xmm6, %xmm41615; SSE41-NEXT: pcmpgtd %xmm6, %xmm21616; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]1617; SSE41-NEXT: pand %xmm4, %xmm01618; SSE41-NEXT: por %xmm2, %xmm01619; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm51620; SSE41-NEXT: packssdw %xmm7, %xmm51621; SSE41-NEXT: packssdw %xmm5, %xmm11622; SSE41-NEXT: movdqa %xmm1, %xmm01623; SSE41-NEXT: retq1624;1625; AVX1-LABEL: trunc_ssat_v8i64_v8i16:1626; AVX1: # %bb.0:1627; AVX1-NEXT: vmovdqa (%rdi), %xmm01628; AVX1-NEXT: vmovdqa 16(%rdi), %xmm11629; AVX1-NEXT: vmovdqa 32(%rdi), %xmm21630; AVX1-NEXT: vmovdqa 48(%rdi), %xmm31631; AVX1-NEXT: vpmovsxwq {{.*#+}} xmm4 = [32767,32767]1632; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm51633; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm4, %xmm21634; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm51635; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm4, %xmm31636; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm51637; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm01638; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm51639; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm11640; AVX1-NEXT: vpmovsxwq {{.*#+}} xmm4 = [18446744073709518848,18446744073709518848]1641; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm51642; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm11643; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm51644; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm01645; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm01646; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm11647; AVX1-NEXT: vblendvpd %xmm1, %xmm3, %xmm4, %xmm11648; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm31649; AVX1-NEXT: vblendvpd %xmm3, %xmm2, %xmm4, %xmm21650; AVX1-NEXT: vpackssdw %xmm1, %xmm2, %xmm11651; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm01652; AVX1-NEXT: retq1653;1654; AVX2-LABEL: trunc_ssat_v8i64_v8i16:1655; AVX2: # %bb.0:1656; AVX2-NEXT: vmovdqa (%rdi), %ymm01657; AVX2-NEXT: vmovdqa 32(%rdi), %ymm11658; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [32767,32767,32767,32767]1659; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm31660; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm01661; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm31662; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm11663; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]1664; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm31665; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm11666; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm31667; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm01668; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm01669; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11670; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm01671; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]1672; AVX2-NEXT: vzeroupper1673; AVX2-NEXT: retq1674;1675; AVX512-LABEL: trunc_ssat_v8i64_v8i16:1676; AVX512: # %bb.0:1677; AVX512-NEXT: vmovdqa64 (%rdi), %zmm01678; AVX512-NEXT: vpmovsqw %zmm0, %xmm01679; AVX512-NEXT: vzeroupper1680; AVX512-NEXT: retq1681;1682; SKX-LABEL: trunc_ssat_v8i64_v8i16:1683; SKX: # %bb.0:1684; SKX-NEXT: vmovdqa (%rdi), %ymm01685; SKX-NEXT: vmovdqa 32(%rdi), %ymm11686; SKX-NEXT: vpmovsqw %ymm1, %xmm11687; SKX-NEXT: vpmovsqw %ymm0, %xmm01688; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1689; SKX-NEXT: vzeroupper1690; SKX-NEXT: retq1691 %a0 = load <8 x i64>, ptr %p01692 %1 = icmp slt <8 x i64> %a0, <i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767>1693 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767>1694 %3 = icmp sgt <8 x i64> %2, <i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768>1695 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768>1696 %5 = trunc <8 x i64> %4 to <8 x i16>1697 ret <8 x i16> %51698}1699 1700define <4 x i16> @trunc_ssat_v4i32_v4i16(<4 x i32> %a0) {1701; SSE-LABEL: trunc_ssat_v4i32_v4i16:1702; SSE: # %bb.0:1703; SSE-NEXT: packssdw %xmm0, %xmm01704; SSE-NEXT: retq1705;1706; AVX-LABEL: trunc_ssat_v4i32_v4i16:1707; AVX: # %bb.0:1708; AVX-NEXT: vpackssdw %xmm0, %xmm0, %xmm01709; AVX-NEXT: retq1710;1711; AVX512-LABEL: trunc_ssat_v4i32_v4i16:1712; AVX512: # %bb.0:1713; AVX512-NEXT: vpackssdw %xmm0, %xmm0, %xmm01714; AVX512-NEXT: retq1715;1716; SKX-LABEL: trunc_ssat_v4i32_v4i16:1717; SKX: # %bb.0:1718; SKX-NEXT: vpackssdw %xmm0, %xmm0, %xmm01719; SKX-NEXT: retq1720 %1 = icmp slt <4 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767>1721 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>1722 %3 = icmp sgt <4 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768>1723 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>1724 %5 = trunc <4 x i32> %4 to <4 x i16>1725 ret <4 x i16> %51726}1727 1728define void @trunc_ssat_v4i32_v4i16_store(<4 x i32> %a0, ptr%p1) {1729; SSE-LABEL: trunc_ssat_v4i32_v4i16_store:1730; SSE: # %bb.0:1731; SSE-NEXT: packssdw %xmm0, %xmm01732; SSE-NEXT: movq %xmm0, (%rdi)1733; SSE-NEXT: retq1734;1735; AVX-LABEL: trunc_ssat_v4i32_v4i16_store:1736; AVX: # %bb.0:1737; AVX-NEXT: vpackssdw %xmm0, %xmm0, %xmm01738; AVX-NEXT: vmovq %xmm0, (%rdi)1739; AVX-NEXT: retq1740;1741; AVX512F-LABEL: trunc_ssat_v4i32_v4i16_store:1742; AVX512F: # %bb.0:1743; AVX512F-NEXT: vpackssdw %xmm0, %xmm0, %xmm01744; AVX512F-NEXT: vmovq %xmm0, (%rdi)1745; AVX512F-NEXT: retq1746;1747; AVX512VL-LABEL: trunc_ssat_v4i32_v4i16_store:1748; AVX512VL: # %bb.0:1749; AVX512VL-NEXT: vpmovsdw %xmm0, (%rdi)1750; AVX512VL-NEXT: retq1751;1752; AVX512BW-LABEL: trunc_ssat_v4i32_v4i16_store:1753; AVX512BW: # %bb.0:1754; AVX512BW-NEXT: vpackssdw %xmm0, %xmm0, %xmm01755; AVX512BW-NEXT: vmovq %xmm0, (%rdi)1756; AVX512BW-NEXT: retq1757;1758; AVX512BWVL-LABEL: trunc_ssat_v4i32_v4i16_store:1759; AVX512BWVL: # %bb.0:1760; AVX512BWVL-NEXT: vpmovsdw %xmm0, (%rdi)1761; AVX512BWVL-NEXT: retq1762;1763; SKX-LABEL: trunc_ssat_v4i32_v4i16_store:1764; SKX: # %bb.0:1765; SKX-NEXT: vpmovsdw %xmm0, (%rdi)1766; SKX-NEXT: retq1767 %1 = icmp slt <4 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767>1768 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>1769 %3 = icmp sgt <4 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768>1770 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>1771 %5 = trunc <4 x i32> %4 to <4 x i16>1772 store <4 x i16> %5, ptr%p11773 ret void1774}1775 1776define <8 x i16> @trunc_ssat_v8i32_v8i16(<8 x i32> %a0) {1777; SSE-LABEL: trunc_ssat_v8i32_v8i16:1778; SSE: # %bb.0:1779; SSE-NEXT: packssdw %xmm1, %xmm01780; SSE-NEXT: retq1781;1782; AVX1-LABEL: trunc_ssat_v8i32_v8i16:1783; AVX1: # %bb.0:1784; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11785; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm01786; AVX1-NEXT: vzeroupper1787; AVX1-NEXT: retq1788;1789; AVX2-LABEL: trunc_ssat_v8i32_v8i16:1790; AVX2: # %bb.0:1791; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11792; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm01793; AVX2-NEXT: vzeroupper1794; AVX2-NEXT: retq1795;1796; AVX512F-LABEL: trunc_ssat_v8i32_v8i16:1797; AVX512F: # %bb.0:1798; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm11799; AVX512F-NEXT: vpackssdw %xmm1, %xmm0, %xmm01800; AVX512F-NEXT: vzeroupper1801; AVX512F-NEXT: retq1802;1803; AVX512VL-LABEL: trunc_ssat_v8i32_v8i16:1804; AVX512VL: # %bb.0:1805; AVX512VL-NEXT: vpmovsdw %ymm0, %xmm01806; AVX512VL-NEXT: vzeroupper1807; AVX512VL-NEXT: retq1808;1809; AVX512BW-LABEL: trunc_ssat_v8i32_v8i16:1810; AVX512BW: # %bb.0:1811; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm11812; AVX512BW-NEXT: vpackssdw %xmm1, %xmm0, %xmm01813; AVX512BW-NEXT: vzeroupper1814; AVX512BW-NEXT: retq1815;1816; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i16:1817; AVX512BWVL: # %bb.0:1818; AVX512BWVL-NEXT: vpmovsdw %ymm0, %xmm01819; AVX512BWVL-NEXT: vzeroupper1820; AVX512BWVL-NEXT: retq1821;1822; SKX-LABEL: trunc_ssat_v8i32_v8i16:1823; SKX: # %bb.0:1824; SKX-NEXT: vpmovsdw %ymm0, %xmm01825; SKX-NEXT: vzeroupper1826; SKX-NEXT: retq1827 %1 = icmp slt <8 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>1828 %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>1829 %3 = icmp sgt <8 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>1830 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>1831 %5 = trunc <8 x i32> %4 to <8 x i16>1832 ret <8 x i16> %51833}1834 1835define <16 x i16> @trunc_ssat_v16i32_v16i16(ptr %p0) "min-legal-vector-width"="256" {1836; SSE-LABEL: trunc_ssat_v16i32_v16i16:1837; SSE: # %bb.0:1838; SSE-NEXT: movdqa (%rdi), %xmm01839; SSE-NEXT: movdqa 32(%rdi), %xmm11840; SSE-NEXT: packssdw 16(%rdi), %xmm01841; SSE-NEXT: packssdw 48(%rdi), %xmm11842; SSE-NEXT: retq1843;1844; AVX1-LABEL: trunc_ssat_v16i32_v16i16:1845; AVX1: # %bb.0:1846; AVX1-NEXT: vmovdqa (%rdi), %xmm01847; AVX1-NEXT: vmovdqa 32(%rdi), %xmm11848; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm11849; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm01850; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01851; AVX1-NEXT: retq1852;1853; AVX2-LABEL: trunc_ssat_v16i32_v16i16:1854; AVX2: # %bb.0:1855; AVX2-NEXT: vmovdqa (%rdi), %ymm01856; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm01857; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1858; AVX2-NEXT: retq1859;1860; AVX512-LABEL: trunc_ssat_v16i32_v16i16:1861; AVX512: # %bb.0:1862; AVX512-NEXT: vmovdqa64 (%rdi), %zmm01863; AVX512-NEXT: vpmovsdw %zmm0, %ymm01864; AVX512-NEXT: retq1865;1866; SKX-LABEL: trunc_ssat_v16i32_v16i16:1867; SKX: # %bb.0:1868; SKX-NEXT: vmovdqa (%rdi), %ymm01869; SKX-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm01870; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1871; SKX-NEXT: retq1872 %a0 = load <16 x i32>, ptr %p01873 %1 = icmp slt <16 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>1874 %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>1875 %3 = icmp sgt <16 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>1876 %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>1877 %5 = trunc <16 x i32> %4 to <16 x i16>1878 ret <16 x i16> %51879}1880 1881;1882; Signed saturation truncation to vXi81883;1884 1885define <2 x i8> @trunc_ssat_v2i64_v2i8(<2 x i64> %a0) {1886; SSE2-LABEL: trunc_ssat_v2i64_v2i8:1887; SSE2: # %bb.0:1888; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]1889; SSE2-NEXT: movdqa %xmm0, %xmm21890; SSE2-NEXT: pxor %xmm1, %xmm21891; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]1892; SSE2-NEXT: pxor %xmm4, %xmm41893; SSE2-NEXT: pcmpeqd %xmm3, %xmm41894; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483775,2147483775]1895; SSE2-NEXT: pcmpgtd %xmm2, %xmm31896; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]1897; SSE2-NEXT: pand %xmm4, %xmm21898; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]1899; SSE2-NEXT: por %xmm2, %xmm31900; SSE2-NEXT: pand %xmm3, %xmm01901; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31902; SSE2-NEXT: por %xmm3, %xmm01903; SSE2-NEXT: pxor %xmm0, %xmm11904; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]1905; SSE2-NEXT: pcmpeqd %xmm3, %xmm31906; SSE2-NEXT: pcmpeqd %xmm2, %xmm31907; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11908; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]1909; SSE2-NEXT: pand %xmm3, %xmm21910; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1911; SSE2-NEXT: por %xmm2, %xmm11912; SSE2-NEXT: pand %xmm1, %xmm01913; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11914; SSE2-NEXT: por %xmm1, %xmm01915; SSE2-NEXT: packssdw %xmm0, %xmm01916; SSE2-NEXT: packssdw %xmm0, %xmm01917; SSE2-NEXT: packsswb %xmm0, %xmm01918; SSE2-NEXT: retq1919;1920; SSSE3-LABEL: trunc_ssat_v2i64_v2i8:1921; SSSE3: # %bb.0:1922; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]1923; SSSE3-NEXT: movdqa %xmm0, %xmm21924; SSSE3-NEXT: pxor %xmm1, %xmm21925; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]1926; SSSE3-NEXT: pxor %xmm4, %xmm41927; SSSE3-NEXT: pcmpeqd %xmm3, %xmm41928; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483775,2147483775]1929; SSSE3-NEXT: pcmpgtd %xmm2, %xmm31930; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]1931; SSSE3-NEXT: pand %xmm4, %xmm21932; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]1933; SSSE3-NEXT: por %xmm2, %xmm31934; SSSE3-NEXT: pand %xmm3, %xmm01935; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31936; SSSE3-NEXT: por %xmm3, %xmm01937; SSSE3-NEXT: pxor %xmm0, %xmm11938; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]1939; SSSE3-NEXT: pcmpeqd %xmm3, %xmm31940; SSSE3-NEXT: pcmpeqd %xmm2, %xmm31941; SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11942; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]1943; SSSE3-NEXT: pand %xmm3, %xmm21944; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]1945; SSSE3-NEXT: por %xmm2, %xmm11946; SSSE3-NEXT: pand %xmm1, %xmm01947; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11948; SSSE3-NEXT: por %xmm1, %xmm01949; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]1950; SSSE3-NEXT: retq1951;1952; SSE41-LABEL: trunc_ssat_v2i64_v2i8:1953; SSE41: # %bb.0:1954; SSE41-NEXT: movdqa %xmm0, %xmm11955; SSE41-NEXT: movapd {{.*#+}} xmm2 = [127,127]1956; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]1957; SSE41-NEXT: pxor %xmm3, %xmm01958; SSE41-NEXT: pmovzxdq {{.*#+}} xmm4 = [2147483775,2147483775]1959; SSE41-NEXT: movdqa %xmm0, %xmm51960; SSE41-NEXT: pcmpeqd %xmm4, %xmm51961; SSE41-NEXT: pcmpgtd %xmm0, %xmm41962; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]1963; SSE41-NEXT: pand %xmm5, %xmm01964; SSE41-NEXT: por %xmm4, %xmm01965; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm21966; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]1967; SSE41-NEXT: pxor %xmm2, %xmm31968; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]1969; SSE41-NEXT: movdqa %xmm3, %xmm41970; SSE41-NEXT: pcmpeqd %xmm0, %xmm41971; SSE41-NEXT: pcmpgtd %xmm0, %xmm31972; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]1973; SSE41-NEXT: pand %xmm4, %xmm01974; SSE41-NEXT: por %xmm3, %xmm01975; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm11976; SSE41-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]1977; SSE41-NEXT: movdqa %xmm1, %xmm01978; SSE41-NEXT: retq1979;1980; AVX-LABEL: trunc_ssat_v2i64_v2i8:1981; AVX: # %bb.0:1982; AVX-NEXT: vpmovsxbq {{.*#+}} xmm1 = [127,127]1983; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm21984; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm01985; AVX-NEXT: vpmovsxbq {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]1986; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm21987; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm01988; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]1989; AVX-NEXT: retq1990;1991; AVX512F-LABEL: trunc_ssat_v2i64_v2i8:1992; AVX512F: # %bb.0:1993; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01994; AVX512F-NEXT: vpmovsqb %zmm0, %xmm01995; AVX512F-NEXT: vzeroupper1996; AVX512F-NEXT: retq1997;1998; AVX512VL-LABEL: trunc_ssat_v2i64_v2i8:1999; AVX512VL: # %bb.0:2000; AVX512VL-NEXT: vpmovsqb %xmm0, %xmm02001; AVX512VL-NEXT: retq2002;2003; AVX512BW-LABEL: trunc_ssat_v2i64_v2i8:2004; AVX512BW: # %bb.0:2005; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02006; AVX512BW-NEXT: vpmovsqb %zmm0, %xmm02007; AVX512BW-NEXT: vzeroupper2008; AVX512BW-NEXT: retq2009;2010; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i8:2011; AVX512BWVL: # %bb.0:2012; AVX512BWVL-NEXT: vpmovsqb %xmm0, %xmm02013; AVX512BWVL-NEXT: retq2014;2015; SKX-LABEL: trunc_ssat_v2i64_v2i8:2016; SKX: # %bb.0:2017; SKX-NEXT: vpmovsqb %xmm0, %xmm02018; SKX-NEXT: retq2019 %1 = icmp slt <2 x i64> %a0, <i64 127, i64 127>2020 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 127, i64 127>2021 %3 = icmp sgt <2 x i64> %2, <i64 -128, i64 -128>2022 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -128, i64 -128>2023 %5 = trunc <2 x i64> %4 to <2 x i8>2024 ret <2 x i8> %52025}2026 2027define void @trunc_ssat_v2i64_v2i8_store(<2 x i64> %a0, ptr%p1) {2028; SSE2-LABEL: trunc_ssat_v2i64_v2i8_store:2029; SSE2: # %bb.0:2030; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]2031; SSE2-NEXT: movdqa %xmm0, %xmm22032; SSE2-NEXT: pxor %xmm1, %xmm22033; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]2034; SSE2-NEXT: pxor %xmm4, %xmm42035; SSE2-NEXT: pcmpeqd %xmm3, %xmm42036; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483775,2147483775]2037; SSE2-NEXT: pcmpgtd %xmm2, %xmm32038; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]2039; SSE2-NEXT: pand %xmm4, %xmm22040; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]2041; SSE2-NEXT: por %xmm2, %xmm32042; SSE2-NEXT: pand %xmm3, %xmm02043; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm32044; SSE2-NEXT: por %xmm0, %xmm32045; SSE2-NEXT: pxor %xmm3, %xmm12046; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]2047; SSE2-NEXT: pcmpeqd %xmm2, %xmm22048; SSE2-NEXT: pcmpeqd %xmm0, %xmm22049; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12050; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]2051; SSE2-NEXT: pand %xmm2, %xmm02052; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]2053; SSE2-NEXT: por %xmm0, %xmm12054; SSE2-NEXT: pand %xmm1, %xmm32055; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12056; SSE2-NEXT: por %xmm3, %xmm12057; SSE2-NEXT: packssdw %xmm1, %xmm12058; SSE2-NEXT: packssdw %xmm1, %xmm12059; SSE2-NEXT: packsswb %xmm1, %xmm12060; SSE2-NEXT: movd %xmm1, %eax2061; SSE2-NEXT: movw %ax, (%rdi)2062; SSE2-NEXT: retq2063;2064; SSSE3-LABEL: trunc_ssat_v2i64_v2i8_store:2065; SSSE3: # %bb.0:2066; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]2067; SSSE3-NEXT: movdqa %xmm0, %xmm22068; SSSE3-NEXT: pxor %xmm1, %xmm22069; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]2070; SSSE3-NEXT: pxor %xmm4, %xmm42071; SSSE3-NEXT: pcmpeqd %xmm3, %xmm42072; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483775,2147483775]2073; SSSE3-NEXT: pcmpgtd %xmm2, %xmm32074; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]2075; SSSE3-NEXT: pand %xmm4, %xmm22076; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]2077; SSSE3-NEXT: por %xmm2, %xmm32078; SSSE3-NEXT: pand %xmm3, %xmm02079; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm32080; SSSE3-NEXT: por %xmm0, %xmm32081; SSSE3-NEXT: pxor %xmm3, %xmm12082; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]2083; SSSE3-NEXT: pcmpeqd %xmm2, %xmm22084; SSSE3-NEXT: pcmpeqd %xmm0, %xmm22085; SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12086; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]2087; SSSE3-NEXT: pand %xmm2, %xmm02088; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]2089; SSSE3-NEXT: por %xmm0, %xmm12090; SSSE3-NEXT: pand %xmm1, %xmm32091; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12092; SSSE3-NEXT: por %xmm3, %xmm12093; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]2094; SSSE3-NEXT: movd %xmm1, %eax2095; SSSE3-NEXT: movw %ax, (%rdi)2096; SSSE3-NEXT: retq2097;2098; SSE41-LABEL: trunc_ssat_v2i64_v2i8_store:2099; SSE41: # %bb.0:2100; SSE41-NEXT: movdqa %xmm0, %xmm12101; SSE41-NEXT: movapd {{.*#+}} xmm2 = [127,127]2102; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]2103; SSE41-NEXT: pxor %xmm3, %xmm02104; SSE41-NEXT: pmovzxdq {{.*#+}} xmm4 = [2147483775,2147483775]2105; SSE41-NEXT: movdqa %xmm0, %xmm52106; SSE41-NEXT: pcmpeqd %xmm4, %xmm52107; SSE41-NEXT: pcmpgtd %xmm0, %xmm42108; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]2109; SSE41-NEXT: pand %xmm5, %xmm02110; SSE41-NEXT: por %xmm4, %xmm02111; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm22112; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]2113; SSE41-NEXT: pxor %xmm2, %xmm32114; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]2115; SSE41-NEXT: movdqa %xmm3, %xmm42116; SSE41-NEXT: pcmpeqd %xmm0, %xmm42117; SSE41-NEXT: pcmpgtd %xmm0, %xmm32118; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]2119; SSE41-NEXT: pand %xmm4, %xmm02120; SSE41-NEXT: por %xmm3, %xmm02121; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm12122; SSE41-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]2123; SSE41-NEXT: pextrw $0, %xmm1, (%rdi)2124; SSE41-NEXT: retq2125;2126; AVX-LABEL: trunc_ssat_v2i64_v2i8_store:2127; AVX: # %bb.0:2128; AVX-NEXT: vpmovsxbq {{.*#+}} xmm1 = [127,127]2129; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm22130; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm02131; AVX-NEXT: vpmovsxbq {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]2132; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm22133; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm02134; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]2135; AVX-NEXT: vpextrw $0, %xmm0, (%rdi)2136; AVX-NEXT: retq2137;2138; AVX512F-LABEL: trunc_ssat_v2i64_v2i8_store:2139; AVX512F: # %bb.0:2140; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02141; AVX512F-NEXT: vpmovsqb %zmm0, %xmm02142; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi)2143; AVX512F-NEXT: vzeroupper2144; AVX512F-NEXT: retq2145;2146; AVX512VL-LABEL: trunc_ssat_v2i64_v2i8_store:2147; AVX512VL: # %bb.0:2148; AVX512VL-NEXT: vpmovsqb %xmm0, (%rdi)2149; AVX512VL-NEXT: retq2150;2151; AVX512BW-LABEL: trunc_ssat_v2i64_v2i8_store:2152; AVX512BW: # %bb.0:2153; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02154; AVX512BW-NEXT: vpmovsqb %zmm0, %xmm02155; AVX512BW-NEXT: vpextrw $0, %xmm0, (%rdi)2156; AVX512BW-NEXT: vzeroupper2157; AVX512BW-NEXT: retq2158;2159; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i8_store:2160; AVX512BWVL: # %bb.0:2161; AVX512BWVL-NEXT: vpmovsqb %xmm0, (%rdi)2162; AVX512BWVL-NEXT: retq2163;2164; SKX-LABEL: trunc_ssat_v2i64_v2i8_store:2165; SKX: # %bb.0:2166; SKX-NEXT: vpmovsqb %xmm0, (%rdi)2167; SKX-NEXT: retq2168 %1 = icmp slt <2 x i64> %a0, <i64 127, i64 127>2169 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 127, i64 127>2170 %3 = icmp sgt <2 x i64> %2, <i64 -128, i64 -128>2171 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -128, i64 -128>2172 %5 = trunc <2 x i64> %4 to <2 x i8>2173 store <2 x i8> %5, ptr%p12174 ret void2175}2176 2177define <4 x i8> @trunc_ssat_v4i64_v4i8(<4 x i64> %a0) {2178; SSE2-SSSE3-LABEL: trunc_ssat_v4i64_v4i8:2179; SSE2-SSSE3: # %bb.0:2180; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [127,127]2181; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]2182; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm42183; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm42184; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]2185; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm62186; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm52187; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147483775,2147483775]2188; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm82189; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm82190; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm8[0,0,2,2]2191; SSE2-SSSE3-NEXT: pand %xmm5, %xmm42192; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]2193; SSE2-SSSE3-NEXT: por %xmm4, %xmm52194; SSE2-SSSE3-NEXT: pand %xmm5, %xmm02195; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm52196; SSE2-SSSE3-NEXT: por %xmm5, %xmm02197; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm42198; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm42199; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]2200; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm52201; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm72202; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]2203; SSE2-SSSE3-NEXT: pand %xmm5, %xmm42204; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]2205; SSE2-SSSE3-NEXT: por %xmm4, %xmm52206; SSE2-SSSE3-NEXT: pand %xmm5, %xmm12207; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm52208; SSE2-SSSE3-NEXT: por %xmm1, %xmm52209; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]2210; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm32211; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm32212; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]2213; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm62214; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm42215; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [18446744071562067840,18446744071562067840]2216; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm32217; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]2218; SSE2-SSSE3-NEXT: pand %xmm4, %xmm82219; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]2220; SSE2-SSSE3-NEXT: por %xmm8, %xmm32221; SSE2-SSSE3-NEXT: pand %xmm3, %xmm52222; SSE2-SSSE3-NEXT: pandn %xmm1, %xmm32223; SSE2-SSSE3-NEXT: por %xmm5, %xmm32224; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm22225; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]2226; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm42227; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm22228; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]2229; SSE2-SSSE3-NEXT: pand %xmm4, %xmm52230; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]2231; SSE2-SSSE3-NEXT: por %xmm5, %xmm22232; SSE2-SSSE3-NEXT: pand %xmm2, %xmm02233; SSE2-SSSE3-NEXT: pandn %xmm1, %xmm22234; SSE2-SSSE3-NEXT: por %xmm2, %xmm02235; SSE2-SSSE3-NEXT: packssdw %xmm3, %xmm02236; SSE2-SSSE3-NEXT: packssdw %xmm0, %xmm02237; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm02238; SSE2-SSSE3-NEXT: retq2239;2240; SSE41-LABEL: trunc_ssat_v4i64_v4i8:2241; SSE41: # %bb.0:2242; SSE41-NEXT: movdqa %xmm0, %xmm22243; SSE41-NEXT: movapd {{.*#+}} xmm4 = [127,127]2244; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]2245; SSE41-NEXT: movdqa %xmm0, %xmm52246; SSE41-NEXT: pxor %xmm3, %xmm52247; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147483775,2147483775]2248; SSE41-NEXT: movdqa %xmm6, %xmm72249; SSE41-NEXT: pcmpgtd %xmm5, %xmm72250; SSE41-NEXT: pcmpeqd %xmm6, %xmm52251; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]2252; SSE41-NEXT: pand %xmm5, %xmm02253; SSE41-NEXT: por %xmm7, %xmm02254; SSE41-NEXT: movapd %xmm4, %xmm52255; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm52256; SSE41-NEXT: movdqa %xmm1, %xmm02257; SSE41-NEXT: pxor %xmm3, %xmm02258; SSE41-NEXT: movdqa %xmm0, %xmm22259; SSE41-NEXT: pcmpeqd %xmm6, %xmm22260; SSE41-NEXT: pcmpgtd %xmm0, %xmm62261; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]2262; SSE41-NEXT: pand %xmm2, %xmm02263; SSE41-NEXT: por %xmm6, %xmm02264; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm42265; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]2266; SSE41-NEXT: movapd %xmm4, %xmm22267; SSE41-NEXT: xorpd %xmm3, %xmm22268; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]2269; SSE41-NEXT: movapd %xmm2, %xmm72270; SSE41-NEXT: pcmpeqd %xmm6, %xmm72271; SSE41-NEXT: pcmpgtd %xmm6, %xmm22272; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]2273; SSE41-NEXT: pand %xmm7, %xmm02274; SSE41-NEXT: por %xmm2, %xmm02275; SSE41-NEXT: movapd %xmm1, %xmm22276; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm22277; SSE41-NEXT: xorpd %xmm5, %xmm32278; SSE41-NEXT: movapd %xmm3, %xmm42279; SSE41-NEXT: pcmpeqd %xmm6, %xmm42280; SSE41-NEXT: pcmpgtd %xmm6, %xmm32281; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]2282; SSE41-NEXT: pand %xmm4, %xmm02283; SSE41-NEXT: por %xmm3, %xmm02284; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm12285; SSE41-NEXT: packssdw %xmm2, %xmm12286; SSE41-NEXT: packssdw %xmm1, %xmm12287; SSE41-NEXT: packsswb %xmm1, %xmm12288; SSE41-NEXT: movdqa %xmm1, %xmm02289; SSE41-NEXT: retq2290;2291; AVX1-LABEL: trunc_ssat_v4i64_v4i8:2292; AVX1: # %bb.0:2293; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm1 = [127,127]2294; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm22295; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm22296; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02297; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm32298; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm02299; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]2300; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm32301; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm02302; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm32303; AVX1-NEXT: vblendvpd %xmm3, %xmm2, %xmm1, %xmm12304; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm02305; AVX1-NEXT: vpackssdw %xmm0, %xmm0, %xmm02306; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm02307; AVX1-NEXT: vzeroupper2308; AVX1-NEXT: retq2309;2310; AVX2-LABEL: trunc_ssat_v4i64_v4i8:2311; AVX2: # %bb.0:2312; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [127,127,127,127]2313; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm22314; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm02315; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]2316; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm22317; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm02318; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm12319; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm02320; AVX2-NEXT: vpackssdw %xmm0, %xmm0, %xmm02321; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm02322; AVX2-NEXT: vzeroupper2323; AVX2-NEXT: retq2324;2325; AVX512F-LABEL: trunc_ssat_v4i64_v4i8:2326; AVX512F: # %bb.0:2327; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02328; AVX512F-NEXT: vpmovsqb %zmm0, %xmm02329; AVX512F-NEXT: vzeroupper2330; AVX512F-NEXT: retq2331;2332; AVX512VL-LABEL: trunc_ssat_v4i64_v4i8:2333; AVX512VL: # %bb.0:2334; AVX512VL-NEXT: vpmovsqb %ymm0, %xmm02335; AVX512VL-NEXT: vzeroupper2336; AVX512VL-NEXT: retq2337;2338; AVX512BW-LABEL: trunc_ssat_v4i64_v4i8:2339; AVX512BW: # %bb.0:2340; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02341; AVX512BW-NEXT: vpmovsqb %zmm0, %xmm02342; AVX512BW-NEXT: vzeroupper2343; AVX512BW-NEXT: retq2344;2345; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i8:2346; AVX512BWVL: # %bb.0:2347; AVX512BWVL-NEXT: vpmovsqb %ymm0, %xmm02348; AVX512BWVL-NEXT: vzeroupper2349; AVX512BWVL-NEXT: retq2350;2351; SKX-LABEL: trunc_ssat_v4i64_v4i8:2352; SKX: # %bb.0:2353; SKX-NEXT: vpmovsqb %ymm0, %xmm02354; SKX-NEXT: vzeroupper2355; SKX-NEXT: retq2356 %1 = icmp slt <4 x i64> %a0, <i64 127, i64 127, i64 127, i64 127>2357 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 127, i64 127, i64 127, i64 127>2358 %3 = icmp sgt <4 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128>2359 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -128, i64 -128, i64 -128, i64 -128>2360 %5 = trunc <4 x i64> %4 to <4 x i8>2361 ret <4 x i8> %52362}2363 2364define void @trunc_ssat_v4i64_v4i8_store(<4 x i64> %a0, ptr%p1) {2365; SSE2-SSSE3-LABEL: trunc_ssat_v4i64_v4i8_store:2366; SSE2-SSSE3: # %bb.0:2367; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [127,127]2368; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]2369; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm32370; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm32371; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]2372; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm62373; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm52374; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147483775,2147483775]2375; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm82376; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm82377; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]2378; SSE2-SSSE3-NEXT: pand %xmm5, %xmm92379; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm8[1,1,3,3]2380; SSE2-SSSE3-NEXT: por %xmm9, %xmm32381; SSE2-SSSE3-NEXT: pand %xmm3, %xmm02382; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm32383; SSE2-SSSE3-NEXT: por %xmm0, %xmm32384; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm02385; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm02386; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]2387; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm52388; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm72389; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]2390; SSE2-SSSE3-NEXT: pand %xmm5, %xmm02391; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]2392; SSE2-SSSE3-NEXT: por %xmm0, %xmm52393; SSE2-SSSE3-NEXT: pand %xmm5, %xmm12394; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm52395; SSE2-SSSE3-NEXT: por %xmm1, %xmm52396; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [18446744073709551488,18446744073709551488]2397; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm12398; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm12399; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]2400; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm62401; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm42402; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [18446744071562067840,18446744071562067840]2403; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm12404; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm1[0,0,2,2]2405; SSE2-SSSE3-NEXT: pand %xmm4, %xmm82406; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]2407; SSE2-SSSE3-NEXT: por %xmm8, %xmm12408; SSE2-SSSE3-NEXT: pand %xmm1, %xmm52409; SSE2-SSSE3-NEXT: pandn %xmm0, %xmm12410; SSE2-SSSE3-NEXT: por %xmm5, %xmm12411; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm22412; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]2413; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm42414; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm22415; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]2416; SSE2-SSSE3-NEXT: pand %xmm4, %xmm52417; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]2418; SSE2-SSSE3-NEXT: por %xmm5, %xmm22419; SSE2-SSSE3-NEXT: pand %xmm2, %xmm32420; SSE2-SSSE3-NEXT: pandn %xmm0, %xmm22421; SSE2-SSSE3-NEXT: por %xmm3, %xmm22422; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm22423; SSE2-SSSE3-NEXT: packssdw %xmm2, %xmm22424; SSE2-SSSE3-NEXT: packsswb %xmm2, %xmm22425; SSE2-SSSE3-NEXT: movd %xmm2, (%rdi)2426; SSE2-SSSE3-NEXT: retq2427;2428; SSE41-LABEL: trunc_ssat_v4i64_v4i8_store:2429; SSE41: # %bb.0:2430; SSE41-NEXT: movdqa %xmm0, %xmm22431; SSE41-NEXT: movapd {{.*#+}} xmm4 = [127,127]2432; SSE41-NEXT: pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]2433; SSE41-NEXT: movdqa %xmm0, %xmm52434; SSE41-NEXT: pxor %xmm3, %xmm52435; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147483775,2147483775]2436; SSE41-NEXT: movdqa %xmm6, %xmm72437; SSE41-NEXT: pcmpgtd %xmm5, %xmm72438; SSE41-NEXT: pcmpeqd %xmm6, %xmm52439; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]2440; SSE41-NEXT: pand %xmm5, %xmm02441; SSE41-NEXT: por %xmm7, %xmm02442; SSE41-NEXT: movapd %xmm4, %xmm52443; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm52444; SSE41-NEXT: movdqa %xmm1, %xmm02445; SSE41-NEXT: pxor %xmm3, %xmm02446; SSE41-NEXT: movdqa %xmm0, %xmm22447; SSE41-NEXT: pcmpeqd %xmm6, %xmm22448; SSE41-NEXT: pcmpgtd %xmm0, %xmm62449; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]2450; SSE41-NEXT: pand %xmm2, %xmm02451; SSE41-NEXT: por %xmm6, %xmm02452; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm42453; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]2454; SSE41-NEXT: movapd %xmm4, %xmm22455; SSE41-NEXT: xorpd %xmm3, %xmm22456; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]2457; SSE41-NEXT: movapd %xmm2, %xmm72458; SSE41-NEXT: pcmpeqd %xmm6, %xmm72459; SSE41-NEXT: pcmpgtd %xmm6, %xmm22460; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]2461; SSE41-NEXT: pand %xmm7, %xmm02462; SSE41-NEXT: por %xmm2, %xmm02463; SSE41-NEXT: movapd %xmm1, %xmm22464; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm22465; SSE41-NEXT: xorpd %xmm5, %xmm32466; SSE41-NEXT: movapd %xmm3, %xmm42467; SSE41-NEXT: pcmpeqd %xmm6, %xmm42468; SSE41-NEXT: pcmpgtd %xmm6, %xmm32469; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]2470; SSE41-NEXT: pand %xmm4, %xmm02471; SSE41-NEXT: por %xmm3, %xmm02472; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm12473; SSE41-NEXT: packssdw %xmm2, %xmm12474; SSE41-NEXT: packssdw %xmm1, %xmm12475; SSE41-NEXT: packsswb %xmm1, %xmm12476; SSE41-NEXT: movd %xmm1, (%rdi)2477; SSE41-NEXT: retq2478;2479; AVX1-LABEL: trunc_ssat_v4i64_v4i8_store:2480; AVX1: # %bb.0:2481; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm1 = [127,127]2482; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm22483; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm22484; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm02485; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm32486; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm02487; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]2488; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm32489; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm02490; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm32491; AVX1-NEXT: vblendvpd %xmm3, %xmm2, %xmm1, %xmm12492; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm02493; AVX1-NEXT: vpackssdw %xmm0, %xmm0, %xmm02494; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm02495; AVX1-NEXT: vmovd %xmm0, (%rdi)2496; AVX1-NEXT: vzeroupper2497; AVX1-NEXT: retq2498;2499; AVX2-LABEL: trunc_ssat_v4i64_v4i8_store:2500; AVX2: # %bb.0:2501; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [127,127,127,127]2502; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm22503; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm02504; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]2505; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm22506; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm02507; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm12508; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm02509; AVX2-NEXT: vpackssdw %xmm0, %xmm0, %xmm02510; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm02511; AVX2-NEXT: vmovd %xmm0, (%rdi)2512; AVX2-NEXT: vzeroupper2513; AVX2-NEXT: retq2514;2515; AVX512F-LABEL: trunc_ssat_v4i64_v4i8_store:2516; AVX512F: # %bb.0:2517; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02518; AVX512F-NEXT: vpmovsqb %zmm0, %xmm02519; AVX512F-NEXT: vmovd %xmm0, (%rdi)2520; AVX512F-NEXT: vzeroupper2521; AVX512F-NEXT: retq2522;2523; AVX512VL-LABEL: trunc_ssat_v4i64_v4i8_store:2524; AVX512VL: # %bb.0:2525; AVX512VL-NEXT: vpmovsqb %ymm0, (%rdi)2526; AVX512VL-NEXT: vzeroupper2527; AVX512VL-NEXT: retq2528;2529; AVX512BW-LABEL: trunc_ssat_v4i64_v4i8_store:2530; AVX512BW: # %bb.0:2531; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02532; AVX512BW-NEXT: vpmovsqb %zmm0, %xmm02533; AVX512BW-NEXT: vmovd %xmm0, (%rdi)2534; AVX512BW-NEXT: vzeroupper2535; AVX512BW-NEXT: retq2536;2537; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i8_store:2538; AVX512BWVL: # %bb.0:2539; AVX512BWVL-NEXT: vpmovsqb %ymm0, (%rdi)2540; AVX512BWVL-NEXT: vzeroupper2541; AVX512BWVL-NEXT: retq2542;2543; SKX-LABEL: trunc_ssat_v4i64_v4i8_store:2544; SKX: # %bb.0:2545; SKX-NEXT: vpmovsqb %ymm0, (%rdi)2546; SKX-NEXT: vzeroupper2547; SKX-NEXT: retq2548 %1 = icmp slt <4 x i64> %a0, <i64 127, i64 127, i64 127, i64 127>2549 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 127, i64 127, i64 127, i64 127>2550 %3 = icmp sgt <4 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128>2551 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -128, i64 -128, i64 -128, i64 -128>2552 %5 = trunc <4 x i64> %4 to <4 x i8>2553 store <4 x i8> %5, ptr%p12554 ret void2555}2556 2557define <8 x i8> @trunc_ssat_v8i64_v8i8(ptr %p0) "min-legal-vector-width"="256" {2558; SSE2-SSSE3-LABEL: trunc_ssat_v8i64_v8i8:2559; SSE2-SSSE3: # %bb.0:2560; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm62561; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm02562; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm32563; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm52564; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [127,127]2565; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]2566; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm22567; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm22568; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]2569; SSE2-SSSE3-NEXT: pxor %xmm8, %xmm82570; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm92571; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147483775,2147483775]2572; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm102573; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm102574; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]2575; SSE2-SSSE3-NEXT: pand %xmm9, %xmm112576; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]2577; SSE2-SSSE3-NEXT: por %xmm11, %xmm22578; SSE2-SSSE3-NEXT: pand %xmm2, %xmm32579; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm22580; SSE2-SSSE3-NEXT: por %xmm3, %xmm22581; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm32582; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm32583; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]2584; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm92585; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm102586; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm102587; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]2588; SSE2-SSSE3-NEXT: pand %xmm9, %xmm112589; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm10[1,1,3,3]2590; SSE2-SSSE3-NEXT: por %xmm11, %xmm32591; SSE2-SSSE3-NEXT: pand %xmm3, %xmm52592; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm32593; SSE2-SSSE3-NEXT: por %xmm5, %xmm32594; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm52595; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm52596; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]2597; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm92598; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm102599; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm102600; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]2601; SSE2-SSSE3-NEXT: pand %xmm9, %xmm112602; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm10[1,1,3,3]2603; SSE2-SSSE3-NEXT: por %xmm11, %xmm52604; SSE2-SSSE3-NEXT: pand %xmm5, %xmm62605; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm52606; SSE2-SSSE3-NEXT: por %xmm6, %xmm52607; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm62608; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm62609; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm6[1,1,3,3]2610; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm92611; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm72612; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2]2613; SSE2-SSSE3-NEXT: pand %xmm9, %xmm62614; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3]2615; SSE2-SSSE3-NEXT: por %xmm6, %xmm82616; SSE2-SSSE3-NEXT: pand %xmm8, %xmm02617; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm82618; SSE2-SSSE3-NEXT: por %xmm0, %xmm82619; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [18446744073709551488,18446744073709551488]2620; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm02621; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm02622; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3]2623; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm62624; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm92625; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [18446744071562067840,18446744071562067840]2626; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm02627; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]2628; SSE2-SSSE3-NEXT: pand %xmm9, %xmm102629; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3]2630; SSE2-SSSE3-NEXT: por %xmm10, %xmm92631; SSE2-SSSE3-NEXT: pand %xmm9, %xmm82632; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm92633; SSE2-SSSE3-NEXT: por %xmm8, %xmm92634; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm02635; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm02636; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm0[1,1,3,3]2637; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm82638; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm02639; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]2640; SSE2-SSSE3-NEXT: pand %xmm8, %xmm102641; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]2642; SSE2-SSSE3-NEXT: por %xmm10, %xmm02643; SSE2-SSSE3-NEXT: pand %xmm0, %xmm52644; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm02645; SSE2-SSSE3-NEXT: por %xmm5, %xmm02646; SSE2-SSSE3-NEXT: packssdw %xmm9, %xmm02647; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm52648; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm52649; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm5[1,1,3,3]2650; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm82651; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm52652; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]2653; SSE2-SSSE3-NEXT: pand %xmm8, %xmm92654; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]2655; SSE2-SSSE3-NEXT: por %xmm9, %xmm52656; SSE2-SSSE3-NEXT: pand %xmm5, %xmm32657; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm52658; SSE2-SSSE3-NEXT: por %xmm3, %xmm52659; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm12660; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]2661; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm32662; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm12663; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]2664; SSE2-SSSE3-NEXT: pand %xmm3, %xmm62665; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]2666; SSE2-SSSE3-NEXT: por %xmm6, %xmm12667; SSE2-SSSE3-NEXT: pand %xmm1, %xmm22668; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm12669; SSE2-SSSE3-NEXT: por %xmm2, %xmm12670; SSE2-SSSE3-NEXT: packssdw %xmm5, %xmm12671; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm02672; SSE2-SSSE3-NEXT: packsswb %xmm0, %xmm02673; SSE2-SSSE3-NEXT: retq2674;2675; SSE41-LABEL: trunc_ssat_v8i64_v8i8:2676; SSE41: # %bb.0:2677; SSE41-NEXT: movdqa (%rdi), %xmm72678; SSE41-NEXT: movdqa 16(%rdi), %xmm52679; SSE41-NEXT: movdqa 32(%rdi), %xmm42680; SSE41-NEXT: movdqa 48(%rdi), %xmm82681; SSE41-NEXT: movapd {{.*#+}} xmm1 = [127,127]2682; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]2683; SSE41-NEXT: movdqa %xmm4, %xmm32684; SSE41-NEXT: pxor %xmm2, %xmm32685; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147483775,2147483775]2686; SSE41-NEXT: movdqa %xmm6, %xmm92687; SSE41-NEXT: pcmpgtd %xmm3, %xmm92688; SSE41-NEXT: pcmpeqd %xmm6, %xmm32689; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]2690; SSE41-NEXT: pand %xmm3, %xmm02691; SSE41-NEXT: por %xmm9, %xmm02692; SSE41-NEXT: movapd %xmm1, %xmm32693; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm32694; SSE41-NEXT: movdqa %xmm8, %xmm42695; SSE41-NEXT: pxor %xmm2, %xmm42696; SSE41-NEXT: movdqa %xmm6, %xmm92697; SSE41-NEXT: pcmpgtd %xmm4, %xmm92698; SSE41-NEXT: pcmpeqd %xmm6, %xmm42699; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]2700; SSE41-NEXT: pand %xmm4, %xmm02701; SSE41-NEXT: por %xmm9, %xmm02702; SSE41-NEXT: movapd %xmm1, %xmm42703; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm42704; SSE41-NEXT: movdqa %xmm7, %xmm82705; SSE41-NEXT: pxor %xmm2, %xmm82706; SSE41-NEXT: movdqa %xmm6, %xmm92707; SSE41-NEXT: pcmpgtd %xmm8, %xmm92708; SSE41-NEXT: pcmpeqd %xmm6, %xmm82709; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]2710; SSE41-NEXT: pand %xmm8, %xmm02711; SSE41-NEXT: por %xmm9, %xmm02712; SSE41-NEXT: movapd %xmm1, %xmm82713; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm82714; SSE41-NEXT: movdqa %xmm5, %xmm02715; SSE41-NEXT: pxor %xmm2, %xmm02716; SSE41-NEXT: movdqa %xmm0, %xmm72717; SSE41-NEXT: pcmpeqd %xmm6, %xmm72718; SSE41-NEXT: pcmpgtd %xmm0, %xmm62719; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]2720; SSE41-NEXT: pand %xmm7, %xmm02721; SSE41-NEXT: por %xmm6, %xmm02722; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm12723; SSE41-NEXT: movapd {{.*#+}} xmm5 = [18446744073709551488,18446744073709551488]2724; SSE41-NEXT: movapd %xmm1, %xmm72725; SSE41-NEXT: xorpd %xmm2, %xmm72726; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]2727; SSE41-NEXT: movapd %xmm7, %xmm92728; SSE41-NEXT: pcmpeqd %xmm6, %xmm92729; SSE41-NEXT: pcmpgtd %xmm6, %xmm72730; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]2731; SSE41-NEXT: pand %xmm9, %xmm02732; SSE41-NEXT: por %xmm7, %xmm02733; SSE41-NEXT: movapd %xmm5, %xmm72734; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm72735; SSE41-NEXT: movapd %xmm8, %xmm12736; SSE41-NEXT: xorpd %xmm2, %xmm12737; SSE41-NEXT: movapd %xmm1, %xmm92738; SSE41-NEXT: pcmpeqd %xmm6, %xmm92739; SSE41-NEXT: pcmpgtd %xmm6, %xmm12740; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]2741; SSE41-NEXT: pand %xmm9, %xmm02742; SSE41-NEXT: por %xmm1, %xmm02743; SSE41-NEXT: movapd %xmm5, %xmm12744; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm12745; SSE41-NEXT: packssdw %xmm7, %xmm12746; SSE41-NEXT: movapd %xmm4, %xmm72747; SSE41-NEXT: xorpd %xmm2, %xmm72748; SSE41-NEXT: movapd %xmm7, %xmm82749; SSE41-NEXT: pcmpeqd %xmm6, %xmm82750; SSE41-NEXT: pcmpgtd %xmm6, %xmm72751; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]2752; SSE41-NEXT: pand %xmm8, %xmm02753; SSE41-NEXT: por %xmm7, %xmm02754; SSE41-NEXT: movapd %xmm5, %xmm72755; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm72756; SSE41-NEXT: xorpd %xmm3, %xmm22757; SSE41-NEXT: movapd %xmm2, %xmm42758; SSE41-NEXT: pcmpeqd %xmm6, %xmm42759; SSE41-NEXT: pcmpgtd %xmm6, %xmm22760; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]2761; SSE41-NEXT: pand %xmm4, %xmm02762; SSE41-NEXT: por %xmm2, %xmm02763; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm52764; SSE41-NEXT: packssdw %xmm7, %xmm52765; SSE41-NEXT: packssdw %xmm5, %xmm12766; SSE41-NEXT: packsswb %xmm1, %xmm12767; SSE41-NEXT: movdqa %xmm1, %xmm02768; SSE41-NEXT: retq2769;2770; AVX1-LABEL: trunc_ssat_v8i64_v8i8:2771; AVX1: # %bb.0:2772; AVX1-NEXT: vmovdqa (%rdi), %xmm02773; AVX1-NEXT: vmovdqa 16(%rdi), %xmm12774; AVX1-NEXT: vmovdqa 32(%rdi), %xmm22775; AVX1-NEXT: vmovdqa 48(%rdi), %xmm32776; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm4 = [127,127]2777; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm52778; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm4, %xmm22779; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm52780; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm4, %xmm32781; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm52782; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm02783; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm52784; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm12785; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm4 = [18446744073709551488,18446744073709551488]2786; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm52787; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm12788; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm52789; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm02790; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm02791; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm12792; AVX1-NEXT: vblendvpd %xmm1, %xmm3, %xmm4, %xmm12793; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm32794; AVX1-NEXT: vblendvpd %xmm3, %xmm2, %xmm4, %xmm22795; AVX1-NEXT: vpackssdw %xmm1, %xmm2, %xmm12796; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm02797; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm02798; AVX1-NEXT: retq2799;2800; AVX2-LABEL: trunc_ssat_v8i64_v8i8:2801; AVX2: # %bb.0:2802; AVX2-NEXT: vmovdqa (%rdi), %ymm02803; AVX2-NEXT: vmovdqa 32(%rdi), %ymm12804; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [127,127,127,127]2805; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm32806; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm02807; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm32808; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm12809; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]2810; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm32811; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm12812; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm32813; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm02814; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm02815; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12816; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm02817; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]2818; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm02819; AVX2-NEXT: vzeroupper2820; AVX2-NEXT: retq2821;2822; AVX512-LABEL: trunc_ssat_v8i64_v8i8:2823; AVX512: # %bb.0:2824; AVX512-NEXT: vmovdqa64 (%rdi), %zmm02825; AVX512-NEXT: vpmovsqb %zmm0, %xmm02826; AVX512-NEXT: vzeroupper2827; AVX512-NEXT: retq2828;2829; SKX-LABEL: trunc_ssat_v8i64_v8i8:2830; SKX: # %bb.0:2831; SKX-NEXT: vmovdqa (%rdi), %ymm02832; SKX-NEXT: vmovdqa 32(%rdi), %ymm12833; SKX-NEXT: vpmovsqb %ymm1, %xmm12834; SKX-NEXT: vpmovsqb %ymm0, %xmm02835; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]2836; SKX-NEXT: vzeroupper2837; SKX-NEXT: retq2838 %a0 = load <8 x i64>, ptr %p02839 %1 = icmp slt <8 x i64> %a0, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>2840 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>2841 %3 = icmp sgt <8 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>2842 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>2843 %5 = trunc <8 x i64> %4 to <8 x i8>2844 ret <8 x i8> %52845}2846 2847; TODO: The AVX1 codegen shows a missed opportunity to narrow blendv+logic to 128-bit.2848 2849define void @trunc_ssat_v8i64_v8i8_store(ptr %p0, ptr%p1) "min-legal-vector-width"="256" {2850; SSE2-SSSE3-LABEL: trunc_ssat_v8i64_v8i8_store:2851; SSE2-SSSE3: # %bb.0:2852; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm62853; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm32854; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm22855; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm52856; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [127,127]2857; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648]2858; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm12859; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm12860; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm1[1,1,3,3]2861; SSE2-SSSE3-NEXT: pxor %xmm8, %xmm82862; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm92863; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147483775,2147483775]2864; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm102865; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm102866; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]2867; SSE2-SSSE3-NEXT: pand %xmm9, %xmm112868; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm10[1,1,3,3]2869; SSE2-SSSE3-NEXT: por %xmm11, %xmm12870; SSE2-SSSE3-NEXT: pand %xmm1, %xmm22871; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm12872; SSE2-SSSE3-NEXT: por %xmm2, %xmm12873; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm22874; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm22875; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]2876; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm92877; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm102878; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm102879; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]2880; SSE2-SSSE3-NEXT: pand %xmm9, %xmm112881; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]2882; SSE2-SSSE3-NEXT: por %xmm11, %xmm22883; SSE2-SSSE3-NEXT: pand %xmm2, %xmm52884; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm22885; SSE2-SSSE3-NEXT: por %xmm5, %xmm22886; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm52887; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm52888; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]2889; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm92890; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm102891; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm102892; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]2893; SSE2-SSSE3-NEXT: pand %xmm9, %xmm112894; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm10[1,1,3,3]2895; SSE2-SSSE3-NEXT: por %xmm11, %xmm52896; SSE2-SSSE3-NEXT: pand %xmm5, %xmm62897; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm52898; SSE2-SSSE3-NEXT: por %xmm6, %xmm52899; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm62900; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm62901; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm6[1,1,3,3]2902; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm92903; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm72904; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2]2905; SSE2-SSSE3-NEXT: pand %xmm9, %xmm62906; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]2907; SSE2-SSSE3-NEXT: por %xmm6, %xmm72908; SSE2-SSSE3-NEXT: pand %xmm7, %xmm32909; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm72910; SSE2-SSSE3-NEXT: por %xmm3, %xmm72911; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [18446744073709551488,18446744073709551488]2912; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm82913; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm82914; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,1,3,3]2915; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm42916; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm92917; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]2918; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm82919; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm8[0,0,2,2]2920; SSE2-SSSE3-NEXT: pand %xmm9, %xmm102921; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]2922; SSE2-SSSE3-NEXT: por %xmm10, %xmm82923; SSE2-SSSE3-NEXT: pand %xmm8, %xmm72924; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm82925; SSE2-SSSE3-NEXT: por %xmm7, %xmm82926; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm72927; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm72928; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm7[1,1,3,3]2929; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm92930; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm72931; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]2932; SSE2-SSSE3-NEXT: pand %xmm9, %xmm102933; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]2934; SSE2-SSSE3-NEXT: por %xmm10, %xmm72935; SSE2-SSSE3-NEXT: pand %xmm7, %xmm52936; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm72937; SSE2-SSSE3-NEXT: por %xmm5, %xmm72938; SSE2-SSSE3-NEXT: packssdw %xmm8, %xmm72939; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm52940; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm52941; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm5[1,1,3,3]2942; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm82943; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm52944; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]2945; SSE2-SSSE3-NEXT: pand %xmm8, %xmm92946; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]2947; SSE2-SSSE3-NEXT: por %xmm9, %xmm52948; SSE2-SSSE3-NEXT: pand %xmm5, %xmm22949; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm52950; SSE2-SSSE3-NEXT: por %xmm2, %xmm52951; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm02952; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]2953; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm22954; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm02955; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]2956; SSE2-SSSE3-NEXT: pand %xmm2, %xmm42957; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]2958; SSE2-SSSE3-NEXT: por %xmm4, %xmm02959; SSE2-SSSE3-NEXT: pand %xmm0, %xmm12960; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm02961; SSE2-SSSE3-NEXT: por %xmm1, %xmm02962; SSE2-SSSE3-NEXT: packssdw %xmm5, %xmm02963; SSE2-SSSE3-NEXT: packssdw %xmm0, %xmm72964; SSE2-SSSE3-NEXT: packsswb %xmm7, %xmm72965; SSE2-SSSE3-NEXT: movq %xmm7, (%rsi)2966; SSE2-SSSE3-NEXT: retq2967;2968; SSE41-LABEL: trunc_ssat_v8i64_v8i8_store:2969; SSE41: # %bb.0:2970; SSE41-NEXT: movdqa (%rdi), %xmm72971; SSE41-NEXT: movdqa 16(%rdi), %xmm52972; SSE41-NEXT: movdqa 32(%rdi), %xmm32973; SSE41-NEXT: movdqa 48(%rdi), %xmm82974; SSE41-NEXT: movapd {{.*#+}} xmm4 = [127,127]2975; SSE41-NEXT: pmovzxdq {{.*#+}} xmm1 = [2147483648,2147483648]2976; SSE41-NEXT: movdqa %xmm3, %xmm22977; SSE41-NEXT: pxor %xmm1, %xmm22978; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147483775,2147483775]2979; SSE41-NEXT: movdqa %xmm6, %xmm92980; SSE41-NEXT: pcmpgtd %xmm2, %xmm92981; SSE41-NEXT: pcmpeqd %xmm6, %xmm22982; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]2983; SSE41-NEXT: pand %xmm2, %xmm02984; SSE41-NEXT: por %xmm9, %xmm02985; SSE41-NEXT: movapd %xmm4, %xmm22986; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm22987; SSE41-NEXT: movdqa %xmm8, %xmm32988; SSE41-NEXT: pxor %xmm1, %xmm32989; SSE41-NEXT: movdqa %xmm6, %xmm92990; SSE41-NEXT: pcmpgtd %xmm3, %xmm92991; SSE41-NEXT: pcmpeqd %xmm6, %xmm32992; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]2993; SSE41-NEXT: pand %xmm3, %xmm02994; SSE41-NEXT: por %xmm9, %xmm02995; SSE41-NEXT: movapd %xmm4, %xmm32996; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm32997; SSE41-NEXT: movdqa %xmm7, %xmm82998; SSE41-NEXT: pxor %xmm1, %xmm82999; SSE41-NEXT: movdqa %xmm6, %xmm93000; SSE41-NEXT: pcmpgtd %xmm8, %xmm93001; SSE41-NEXT: pcmpeqd %xmm6, %xmm83002; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]3003; SSE41-NEXT: pand %xmm8, %xmm03004; SSE41-NEXT: por %xmm9, %xmm03005; SSE41-NEXT: movapd %xmm4, %xmm83006; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm83007; SSE41-NEXT: movdqa %xmm5, %xmm03008; SSE41-NEXT: pxor %xmm1, %xmm03009; SSE41-NEXT: movdqa %xmm0, %xmm73010; SSE41-NEXT: pcmpeqd %xmm6, %xmm73011; SSE41-NEXT: pcmpgtd %xmm0, %xmm63012; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]3013; SSE41-NEXT: pand %xmm7, %xmm03014; SSE41-NEXT: por %xmm6, %xmm03015; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm43016; SSE41-NEXT: movapd {{.*#+}} xmm5 = [18446744073709551488,18446744073709551488]3017; SSE41-NEXT: movapd %xmm4, %xmm73018; SSE41-NEXT: xorpd %xmm1, %xmm73019; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]3020; SSE41-NEXT: movapd %xmm7, %xmm93021; SSE41-NEXT: pcmpeqd %xmm6, %xmm93022; SSE41-NEXT: pcmpgtd %xmm6, %xmm73023; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]3024; SSE41-NEXT: pand %xmm9, %xmm03025; SSE41-NEXT: por %xmm7, %xmm03026; SSE41-NEXT: movapd %xmm5, %xmm73027; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm73028; SSE41-NEXT: movapd %xmm8, %xmm43029; SSE41-NEXT: xorpd %xmm1, %xmm43030; SSE41-NEXT: movapd %xmm4, %xmm93031; SSE41-NEXT: pcmpeqd %xmm6, %xmm93032; SSE41-NEXT: pcmpgtd %xmm6, %xmm43033; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]3034; SSE41-NEXT: pand %xmm9, %xmm03035; SSE41-NEXT: por %xmm4, %xmm03036; SSE41-NEXT: movapd %xmm5, %xmm43037; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm43038; SSE41-NEXT: packssdw %xmm7, %xmm43039; SSE41-NEXT: movapd %xmm3, %xmm73040; SSE41-NEXT: xorpd %xmm1, %xmm73041; SSE41-NEXT: movapd %xmm7, %xmm83042; SSE41-NEXT: pcmpeqd %xmm6, %xmm83043; SSE41-NEXT: pcmpgtd %xmm6, %xmm73044; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]3045; SSE41-NEXT: pand %xmm8, %xmm03046; SSE41-NEXT: por %xmm7, %xmm03047; SSE41-NEXT: movapd %xmm5, %xmm73048; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm73049; SSE41-NEXT: xorpd %xmm2, %xmm13050; SSE41-NEXT: movapd %xmm1, %xmm33051; SSE41-NEXT: pcmpeqd %xmm6, %xmm33052; SSE41-NEXT: pcmpgtd %xmm6, %xmm13053; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]3054; SSE41-NEXT: pand %xmm3, %xmm03055; SSE41-NEXT: por %xmm1, %xmm03056; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm53057; SSE41-NEXT: packssdw %xmm7, %xmm53058; SSE41-NEXT: packssdw %xmm5, %xmm43059; SSE41-NEXT: packsswb %xmm4, %xmm43060; SSE41-NEXT: movq %xmm4, (%rsi)3061; SSE41-NEXT: retq3062;3063; AVX1-LABEL: trunc_ssat_v8i64_v8i8_store:3064; AVX1: # %bb.0:3065; AVX1-NEXT: vmovdqa (%rdi), %xmm03066; AVX1-NEXT: vmovdqa 16(%rdi), %xmm13067; AVX1-NEXT: vmovdqa 32(%rdi), %xmm23068; AVX1-NEXT: vmovdqa 48(%rdi), %xmm33069; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm4 = [127,127]3070; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm53071; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm4, %xmm23072; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm53073; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm4, %xmm33074; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm53075; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm03076; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm53077; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm13078; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm4 = [18446744073709551488,18446744073709551488]3079; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm53080; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm13081; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm53082; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm03083; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm03084; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm13085; AVX1-NEXT: vblendvpd %xmm1, %xmm3, %xmm4, %xmm13086; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm33087; AVX1-NEXT: vblendvpd %xmm3, %xmm2, %xmm4, %xmm23088; AVX1-NEXT: vpackssdw %xmm1, %xmm2, %xmm13089; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm03090; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm03091; AVX1-NEXT: vmovq %xmm0, (%rsi)3092; AVX1-NEXT: retq3093;3094; AVX2-LABEL: trunc_ssat_v8i64_v8i8_store:3095; AVX2: # %bb.0:3096; AVX2-NEXT: vmovdqa (%rdi), %ymm03097; AVX2-NEXT: vmovdqa 32(%rdi), %ymm13098; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [127,127,127,127]3099; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm33100; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm03101; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm33102; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm13103; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]3104; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm33105; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm13106; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm33107; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm03108; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm03109; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13110; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm03111; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3112; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm03113; AVX2-NEXT: vmovq %xmm0, (%rsi)3114; AVX2-NEXT: vzeroupper3115; AVX2-NEXT: retq3116;3117; AVX512-LABEL: trunc_ssat_v8i64_v8i8_store:3118; AVX512: # %bb.0:3119; AVX512-NEXT: vmovdqa64 (%rdi), %zmm03120; AVX512-NEXT: vpmovsqb %zmm0, (%rsi)3121; AVX512-NEXT: vzeroupper3122; AVX512-NEXT: retq3123;3124; SKX-LABEL: trunc_ssat_v8i64_v8i8_store:3125; SKX: # %bb.0:3126; SKX-NEXT: vmovdqa (%rdi), %ymm03127; SKX-NEXT: vmovdqa 32(%rdi), %ymm13128; SKX-NEXT: vpmovsqb %ymm1, %xmm13129; SKX-NEXT: vpmovsqb %ymm0, %xmm03130; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3131; SKX-NEXT: vmovq %xmm0, (%rsi)3132; SKX-NEXT: vzeroupper3133; SKX-NEXT: retq3134 %a0 = load <8 x i64>, ptr %p03135 %1 = icmp slt <8 x i64> %a0, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>3136 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>3137 %3 = icmp sgt <8 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>3138 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>3139 %5 = trunc <8 x i64> %4 to <8 x i8>3140 store <8 x i8> %5, ptr%p13141 ret void3142}3143 3144define <16 x i8> @trunc_ssat_v16i64_v16i8(ptr %p0) "min-legal-vector-width"="256" {3145; SSE2-SSSE3-LABEL: trunc_ssat_v16i64_v16i8:3146; SSE2-SSSE3: # %bb.0:3147; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm83148; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm03149; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm123150; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm113151; SSE2-SSSE3-NEXT: movdqa 80(%rdi), %xmm73152; SSE2-SSSE3-NEXT: movdqa 64(%rdi), %xmm53153; SSE2-SSSE3-NEXT: movdqa 112(%rdi), %xmm43154; SSE2-SSSE3-NEXT: movdqa 96(%rdi), %xmm33155; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [127,127]3156; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]3157; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm23158; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm23159; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm2[1,1,3,3]3160; SSE2-SSSE3-NEXT: pxor %xmm10, %xmm103161; SSE2-SSSE3-NEXT: pcmpeqd %xmm10, %xmm133162; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [2147483775,2147483775]3163; SSE2-SSSE3-NEXT: movdqa %xmm9, %xmm143164; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm143165; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]3166; SSE2-SSSE3-NEXT: pand %xmm13, %xmm153167; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm14[1,1,3,3]3168; SSE2-SSSE3-NEXT: por %xmm15, %xmm23169; SSE2-SSSE3-NEXT: pand %xmm2, %xmm33170; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm23171; SSE2-SSSE3-NEXT: por %xmm3, %xmm23172; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm33173; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm33174; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]3175; SSE2-SSSE3-NEXT: pcmpeqd %xmm10, %xmm133176; SSE2-SSSE3-NEXT: movdqa %xmm9, %xmm143177; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm143178; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]3179; SSE2-SSSE3-NEXT: pand %xmm13, %xmm153180; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm14[1,1,3,3]3181; SSE2-SSSE3-NEXT: por %xmm15, %xmm33182; SSE2-SSSE3-NEXT: pand %xmm3, %xmm43183; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm33184; SSE2-SSSE3-NEXT: por %xmm4, %xmm33185; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm43186; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm43187; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm4[1,1,3,3]3188; SSE2-SSSE3-NEXT: pcmpeqd %xmm10, %xmm133189; SSE2-SSSE3-NEXT: movdqa %xmm9, %xmm143190; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm143191; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]3192; SSE2-SSSE3-NEXT: pand %xmm13, %xmm153193; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm14[1,1,3,3]3194; SSE2-SSSE3-NEXT: por %xmm15, %xmm43195; SSE2-SSSE3-NEXT: pand %xmm4, %xmm53196; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm43197; SSE2-SSSE3-NEXT: por %xmm5, %xmm43198; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm53199; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm53200; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm5[1,1,3,3]3201; SSE2-SSSE3-NEXT: pcmpeqd %xmm10, %xmm133202; SSE2-SSSE3-NEXT: movdqa %xmm9, %xmm143203; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm143204; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]3205; SSE2-SSSE3-NEXT: pand %xmm13, %xmm153206; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm14[1,1,3,3]3207; SSE2-SSSE3-NEXT: por %xmm15, %xmm53208; SSE2-SSSE3-NEXT: pand %xmm5, %xmm73209; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm53210; SSE2-SSSE3-NEXT: por %xmm7, %xmm53211; SSE2-SSSE3-NEXT: movdqa %xmm12, %xmm73212; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm73213; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3]3214; SSE2-SSSE3-NEXT: pcmpeqd %xmm10, %xmm133215; SSE2-SSSE3-NEXT: movdqa %xmm9, %xmm143216; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm143217; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]3218; SSE2-SSSE3-NEXT: pand %xmm13, %xmm153219; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm14[1,1,3,3]3220; SSE2-SSSE3-NEXT: por %xmm15, %xmm73221; SSE2-SSSE3-NEXT: pand %xmm7, %xmm123222; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm73223; SSE2-SSSE3-NEXT: por %xmm12, %xmm73224; SSE2-SSSE3-NEXT: movdqa %xmm11, %xmm123225; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm123226; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm12[1,1,3,3]3227; SSE2-SSSE3-NEXT: pcmpeqd %xmm10, %xmm133228; SSE2-SSSE3-NEXT: movdqa %xmm9, %xmm143229; SSE2-SSSE3-NEXT: pcmpgtd %xmm12, %xmm143230; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]3231; SSE2-SSSE3-NEXT: pand %xmm13, %xmm153232; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm14[1,1,3,3]3233; SSE2-SSSE3-NEXT: por %xmm15, %xmm123234; SSE2-SSSE3-NEXT: pand %xmm12, %xmm113235; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm123236; SSE2-SSSE3-NEXT: por %xmm11, %xmm123237; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm113238; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm113239; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm11[1,1,3,3]3240; SSE2-SSSE3-NEXT: pcmpeqd %xmm10, %xmm133241; SSE2-SSSE3-NEXT: movdqa %xmm9, %xmm143242; SSE2-SSSE3-NEXT: pcmpgtd %xmm11, %xmm143243; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]3244; SSE2-SSSE3-NEXT: pand %xmm13, %xmm153245; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm14[1,1,3,3]3246; SSE2-SSSE3-NEXT: por %xmm15, %xmm113247; SSE2-SSSE3-NEXT: pand %xmm11, %xmm83248; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm113249; SSE2-SSSE3-NEXT: por %xmm8, %xmm113250; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm83251; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm83252; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm8[1,1,3,3]3253; SSE2-SSSE3-NEXT: pcmpeqd %xmm10, %xmm133254; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm93255; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm9[0,0,2,2]3256; SSE2-SSSE3-NEXT: pand %xmm13, %xmm83257; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm9[1,1,3,3]3258; SSE2-SSSE3-NEXT: por %xmm8, %xmm103259; SSE2-SSSE3-NEXT: pand %xmm10, %xmm03260; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm103261; SSE2-SSSE3-NEXT: por %xmm0, %xmm103262; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [18446744073709551488,18446744073709551488]3263; SSE2-SSSE3-NEXT: movdqa %xmm10, %xmm03264; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm03265; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm0[1,1,3,3]3266; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm83267; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm133268; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]3269; SSE2-SSSE3-NEXT: pcmpgtd %xmm9, %xmm03270; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm14 = xmm0[0,0,2,2]3271; SSE2-SSSE3-NEXT: pand %xmm13, %xmm143272; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm0[1,1,3,3]3273; SSE2-SSSE3-NEXT: por %xmm14, %xmm133274; SSE2-SSSE3-NEXT: pand %xmm13, %xmm103275; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm133276; SSE2-SSSE3-NEXT: por %xmm10, %xmm133277; SSE2-SSSE3-NEXT: movdqa %xmm11, %xmm03278; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm03279; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm0[1,1,3,3]3280; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm103281; SSE2-SSSE3-NEXT: pcmpgtd %xmm9, %xmm03282; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm14 = xmm0[0,0,2,2]3283; SSE2-SSSE3-NEXT: pand %xmm10, %xmm143284; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]3285; SSE2-SSSE3-NEXT: por %xmm14, %xmm03286; SSE2-SSSE3-NEXT: pand %xmm0, %xmm113287; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm03288; SSE2-SSSE3-NEXT: por %xmm11, %xmm03289; SSE2-SSSE3-NEXT: packssdw %xmm13, %xmm03290; SSE2-SSSE3-NEXT: movdqa %xmm12, %xmm103291; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm103292; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[1,1,3,3]3293; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm113294; SSE2-SSSE3-NEXT: pcmpgtd %xmm9, %xmm103295; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm10[0,0,2,2]3296; SSE2-SSSE3-NEXT: pand %xmm11, %xmm133297; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]3298; SSE2-SSSE3-NEXT: por %xmm13, %xmm103299; SSE2-SSSE3-NEXT: pand %xmm10, %xmm123300; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm103301; SSE2-SSSE3-NEXT: por %xmm12, %xmm103302; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm113303; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm113304; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[1,1,3,3]3305; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm123306; SSE2-SSSE3-NEXT: pcmpgtd %xmm9, %xmm113307; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm11[0,0,2,2]3308; SSE2-SSSE3-NEXT: pand %xmm12, %xmm133309; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]3310; SSE2-SSSE3-NEXT: por %xmm13, %xmm113311; SSE2-SSSE3-NEXT: pand %xmm11, %xmm73312; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm113313; SSE2-SSSE3-NEXT: por %xmm7, %xmm113314; SSE2-SSSE3-NEXT: packssdw %xmm10, %xmm113315; SSE2-SSSE3-NEXT: packssdw %xmm11, %xmm03316; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm73317; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm73318; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm7[1,1,3,3]3319; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm103320; SSE2-SSSE3-NEXT: pcmpgtd %xmm9, %xmm73321; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm7[0,0,2,2]3322; SSE2-SSSE3-NEXT: pand %xmm10, %xmm113323; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]3324; SSE2-SSSE3-NEXT: por %xmm11, %xmm73325; SSE2-SSSE3-NEXT: pand %xmm7, %xmm53326; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm73327; SSE2-SSSE3-NEXT: por %xmm5, %xmm73328; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm53329; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm53330; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm5[1,1,3,3]3331; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm103332; SSE2-SSSE3-NEXT: pcmpgtd %xmm9, %xmm53333; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm5[0,0,2,2]3334; SSE2-SSSE3-NEXT: pand %xmm10, %xmm113335; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]3336; SSE2-SSSE3-NEXT: por %xmm11, %xmm53337; SSE2-SSSE3-NEXT: pand %xmm5, %xmm43338; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm53339; SSE2-SSSE3-NEXT: por %xmm4, %xmm53340; SSE2-SSSE3-NEXT: packssdw %xmm7, %xmm53341; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm43342; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm43343; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]3344; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm73345; SSE2-SSSE3-NEXT: pcmpgtd %xmm9, %xmm43346; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]3347; SSE2-SSSE3-NEXT: pand %xmm7, %xmm103348; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]3349; SSE2-SSSE3-NEXT: por %xmm10, %xmm43350; SSE2-SSSE3-NEXT: pand %xmm4, %xmm33351; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm43352; SSE2-SSSE3-NEXT: por %xmm3, %xmm43353; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm13354; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]3355; SSE2-SSSE3-NEXT: pcmpeqd %xmm8, %xmm33356; SSE2-SSSE3-NEXT: pcmpgtd %xmm9, %xmm13357; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2]3358; SSE2-SSSE3-NEXT: pand %xmm3, %xmm73359; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]3360; SSE2-SSSE3-NEXT: por %xmm7, %xmm13361; SSE2-SSSE3-NEXT: pand %xmm1, %xmm23362; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm13363; SSE2-SSSE3-NEXT: por %xmm2, %xmm13364; SSE2-SSSE3-NEXT: packssdw %xmm4, %xmm13365; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm53366; SSE2-SSSE3-NEXT: packsswb %xmm5, %xmm03367; SSE2-SSSE3-NEXT: retq3368;3369; SSE41-LABEL: trunc_ssat_v16i64_v16i8:3370; SSE41: # %bb.0:3371; SSE41-NEXT: movdqa (%rdi), %xmm83372; SSE41-NEXT: movdqa 16(%rdi), %xmm73373; SSE41-NEXT: movdqa 32(%rdi), %xmm123374; SSE41-NEXT: movdqa 48(%rdi), %xmm113375; SSE41-NEXT: movdqa 80(%rdi), %xmm103376; SSE41-NEXT: movdqa 64(%rdi), %xmm63377; SSE41-NEXT: movdqa 112(%rdi), %xmm53378; SSE41-NEXT: movdqa 96(%rdi), %xmm43379; SSE41-NEXT: movapd {{.*#+}} xmm1 = [127,127]3380; SSE41-NEXT: pmovzxdq {{.*#+}} xmm2 = [2147483648,2147483648]3381; SSE41-NEXT: movdqa %xmm4, %xmm33382; SSE41-NEXT: pxor %xmm2, %xmm33383; SSE41-NEXT: pmovzxdq {{.*#+}} xmm9 = [2147483775,2147483775]3384; SSE41-NEXT: movdqa %xmm9, %xmm133385; SSE41-NEXT: pcmpgtd %xmm3, %xmm133386; SSE41-NEXT: pcmpeqd %xmm9, %xmm33387; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]3388; SSE41-NEXT: pand %xmm3, %xmm03389; SSE41-NEXT: por %xmm13, %xmm03390; SSE41-NEXT: movapd %xmm1, %xmm33391; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm33392; SSE41-NEXT: movdqa %xmm5, %xmm43393; SSE41-NEXT: pxor %xmm2, %xmm43394; SSE41-NEXT: movdqa %xmm9, %xmm133395; SSE41-NEXT: pcmpgtd %xmm4, %xmm133396; SSE41-NEXT: pcmpeqd %xmm9, %xmm43397; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]3398; SSE41-NEXT: pand %xmm4, %xmm03399; SSE41-NEXT: por %xmm13, %xmm03400; SSE41-NEXT: movapd %xmm1, %xmm43401; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm43402; SSE41-NEXT: movdqa %xmm6, %xmm53403; SSE41-NEXT: pxor %xmm2, %xmm53404; SSE41-NEXT: movdqa %xmm9, %xmm133405; SSE41-NEXT: pcmpgtd %xmm5, %xmm133406; SSE41-NEXT: pcmpeqd %xmm9, %xmm53407; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]3408; SSE41-NEXT: pand %xmm5, %xmm03409; SSE41-NEXT: por %xmm13, %xmm03410; SSE41-NEXT: movapd %xmm1, %xmm53411; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm53412; SSE41-NEXT: movdqa %xmm10, %xmm63413; SSE41-NEXT: pxor %xmm2, %xmm63414; SSE41-NEXT: movdqa %xmm9, %xmm133415; SSE41-NEXT: pcmpgtd %xmm6, %xmm133416; SSE41-NEXT: pcmpeqd %xmm9, %xmm63417; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]3418; SSE41-NEXT: pand %xmm6, %xmm03419; SSE41-NEXT: por %xmm13, %xmm03420; SSE41-NEXT: movapd %xmm1, %xmm63421; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm63422; SSE41-NEXT: movdqa %xmm12, %xmm103423; SSE41-NEXT: pxor %xmm2, %xmm103424; SSE41-NEXT: movdqa %xmm9, %xmm133425; SSE41-NEXT: pcmpgtd %xmm10, %xmm133426; SSE41-NEXT: pcmpeqd %xmm9, %xmm103427; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]3428; SSE41-NEXT: pand %xmm10, %xmm03429; SSE41-NEXT: por %xmm13, %xmm03430; SSE41-NEXT: movapd %xmm1, %xmm103431; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm103432; SSE41-NEXT: movdqa %xmm11, %xmm123433; SSE41-NEXT: pxor %xmm2, %xmm123434; SSE41-NEXT: movdqa %xmm9, %xmm133435; SSE41-NEXT: pcmpgtd %xmm12, %xmm133436; SSE41-NEXT: pcmpeqd %xmm9, %xmm123437; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]3438; SSE41-NEXT: pand %xmm12, %xmm03439; SSE41-NEXT: por %xmm13, %xmm03440; SSE41-NEXT: movapd %xmm1, %xmm123441; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm123442; SSE41-NEXT: movdqa %xmm8, %xmm113443; SSE41-NEXT: pxor %xmm2, %xmm113444; SSE41-NEXT: movdqa %xmm9, %xmm133445; SSE41-NEXT: pcmpgtd %xmm11, %xmm133446; SSE41-NEXT: pcmpeqd %xmm9, %xmm113447; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]3448; SSE41-NEXT: pand %xmm11, %xmm03449; SSE41-NEXT: por %xmm13, %xmm03450; SSE41-NEXT: movapd %xmm1, %xmm113451; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm113452; SSE41-NEXT: movdqa %xmm7, %xmm03453; SSE41-NEXT: pxor %xmm2, %xmm03454; SSE41-NEXT: movdqa %xmm0, %xmm83455; SSE41-NEXT: pcmpeqd %xmm9, %xmm83456; SSE41-NEXT: pcmpgtd %xmm0, %xmm93457; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]3458; SSE41-NEXT: pand %xmm8, %xmm03459; SSE41-NEXT: por %xmm9, %xmm03460; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm13461; SSE41-NEXT: movapd {{.*#+}} xmm7 = [18446744073709551488,18446744073709551488]3462; SSE41-NEXT: movapd %xmm1, %xmm93463; SSE41-NEXT: xorpd %xmm2, %xmm93464; SSE41-NEXT: movdqa {{.*#+}} xmm8 = [18446744071562067840,18446744071562067840]3465; SSE41-NEXT: movapd %xmm9, %xmm133466; SSE41-NEXT: pcmpeqd %xmm8, %xmm133467; SSE41-NEXT: pcmpgtd %xmm8, %xmm93468; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]3469; SSE41-NEXT: pand %xmm13, %xmm03470; SSE41-NEXT: por %xmm9, %xmm03471; SSE41-NEXT: movapd %xmm7, %xmm93472; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm93473; SSE41-NEXT: movapd %xmm11, %xmm13474; SSE41-NEXT: xorpd %xmm2, %xmm13475; SSE41-NEXT: movapd %xmm1, %xmm133476; SSE41-NEXT: pcmpeqd %xmm8, %xmm133477; SSE41-NEXT: pcmpgtd %xmm8, %xmm13478; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]3479; SSE41-NEXT: pand %xmm13, %xmm03480; SSE41-NEXT: por %xmm1, %xmm03481; SSE41-NEXT: movapd %xmm7, %xmm13482; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm13483; SSE41-NEXT: packssdw %xmm9, %xmm13484; SSE41-NEXT: movapd %xmm12, %xmm93485; SSE41-NEXT: xorpd %xmm2, %xmm93486; SSE41-NEXT: movapd %xmm9, %xmm113487; SSE41-NEXT: pcmpeqd %xmm8, %xmm113488; SSE41-NEXT: pcmpgtd %xmm8, %xmm93489; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]3490; SSE41-NEXT: pand %xmm11, %xmm03491; SSE41-NEXT: por %xmm9, %xmm03492; SSE41-NEXT: movapd %xmm7, %xmm93493; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm93494; SSE41-NEXT: movapd %xmm10, %xmm113495; SSE41-NEXT: xorpd %xmm2, %xmm113496; SSE41-NEXT: movapd %xmm11, %xmm123497; SSE41-NEXT: pcmpeqd %xmm8, %xmm123498; SSE41-NEXT: pcmpgtd %xmm8, %xmm113499; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm11[0,0,2,2]3500; SSE41-NEXT: pand %xmm12, %xmm03501; SSE41-NEXT: por %xmm11, %xmm03502; SSE41-NEXT: movapd %xmm7, %xmm113503; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm113504; SSE41-NEXT: packssdw %xmm9, %xmm113505; SSE41-NEXT: packssdw %xmm11, %xmm13506; SSE41-NEXT: movapd %xmm6, %xmm93507; SSE41-NEXT: xorpd %xmm2, %xmm93508; SSE41-NEXT: movapd %xmm9, %xmm103509; SSE41-NEXT: pcmpeqd %xmm8, %xmm103510; SSE41-NEXT: pcmpgtd %xmm8, %xmm93511; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]3512; SSE41-NEXT: pand %xmm10, %xmm03513; SSE41-NEXT: por %xmm9, %xmm03514; SSE41-NEXT: movapd %xmm7, %xmm93515; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm93516; SSE41-NEXT: movapd %xmm5, %xmm63517; SSE41-NEXT: xorpd %xmm2, %xmm63518; SSE41-NEXT: movapd %xmm6, %xmm103519; SSE41-NEXT: pcmpeqd %xmm8, %xmm103520; SSE41-NEXT: pcmpgtd %xmm8, %xmm63521; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]3522; SSE41-NEXT: pand %xmm10, %xmm03523; SSE41-NEXT: por %xmm6, %xmm03524; SSE41-NEXT: movapd %xmm7, %xmm63525; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm63526; SSE41-NEXT: packssdw %xmm9, %xmm63527; SSE41-NEXT: movapd %xmm4, %xmm53528; SSE41-NEXT: xorpd %xmm2, %xmm53529; SSE41-NEXT: movapd %xmm5, %xmm93530; SSE41-NEXT: pcmpeqd %xmm8, %xmm93531; SSE41-NEXT: pcmpgtd %xmm8, %xmm53532; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]3533; SSE41-NEXT: pand %xmm9, %xmm03534; SSE41-NEXT: por %xmm5, %xmm03535; SSE41-NEXT: movapd %xmm7, %xmm53536; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm53537; SSE41-NEXT: xorpd %xmm3, %xmm23538; SSE41-NEXT: movapd %xmm2, %xmm43539; SSE41-NEXT: pcmpeqd %xmm8, %xmm43540; SSE41-NEXT: pcmpgtd %xmm8, %xmm23541; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]3542; SSE41-NEXT: pand %xmm4, %xmm03543; SSE41-NEXT: por %xmm2, %xmm03544; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm73545; SSE41-NEXT: packssdw %xmm5, %xmm73546; SSE41-NEXT: packssdw %xmm7, %xmm63547; SSE41-NEXT: packsswb %xmm6, %xmm13548; SSE41-NEXT: movdqa %xmm1, %xmm03549; SSE41-NEXT: retq3550;3551; AVX1-LABEL: trunc_ssat_v16i64_v16i8:3552; AVX1: # %bb.0:3553; AVX1-NEXT: vmovdqa 96(%rdi), %xmm03554; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm2 = [127,127]3555; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm13556; AVX1-NEXT: vblendvpd %xmm1, %xmm0, %xmm2, %xmm03557; AVX1-NEXT: vmovdqa 112(%rdi), %xmm13558; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm33559; AVX1-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm13560; AVX1-NEXT: vmovdqa 64(%rdi), %xmm33561; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm43562; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm2, %xmm33563; AVX1-NEXT: vmovdqa 80(%rdi), %xmm43564; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm53565; AVX1-NEXT: vblendvpd %xmm5, %xmm4, %xmm2, %xmm43566; AVX1-NEXT: vmovdqa (%rdi), %xmm53567; AVX1-NEXT: vmovdqa 16(%rdi), %xmm63568; AVX1-NEXT: vmovdqa 32(%rdi), %xmm73569; AVX1-NEXT: vmovdqa 48(%rdi), %xmm83570; AVX1-NEXT: vpcmpgtq %xmm7, %xmm2, %xmm93571; AVX1-NEXT: vblendvpd %xmm9, %xmm7, %xmm2, %xmm73572; AVX1-NEXT: vpcmpgtq %xmm8, %xmm2, %xmm93573; AVX1-NEXT: vblendvpd %xmm9, %xmm8, %xmm2, %xmm83574; AVX1-NEXT: vpcmpgtq %xmm5, %xmm2, %xmm93575; AVX1-NEXT: vblendvpd %xmm9, %xmm5, %xmm2, %xmm53576; AVX1-NEXT: vpcmpgtq %xmm6, %xmm2, %xmm93577; AVX1-NEXT: vblendvpd %xmm9, %xmm6, %xmm2, %xmm23578; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm6 = [18446744073709551488,18446744073709551488]3579; AVX1-NEXT: vpcmpgtq %xmm6, %xmm2, %xmm93580; AVX1-NEXT: vblendvpd %xmm9, %xmm2, %xmm6, %xmm23581; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm93582; AVX1-NEXT: vblendvpd %xmm9, %xmm5, %xmm6, %xmm53583; AVX1-NEXT: vpackssdw %xmm2, %xmm5, %xmm23584; AVX1-NEXT: vpcmpgtq %xmm6, %xmm8, %xmm53585; AVX1-NEXT: vblendvpd %xmm5, %xmm8, %xmm6, %xmm53586; AVX1-NEXT: vpcmpgtq %xmm6, %xmm7, %xmm83587; AVX1-NEXT: vblendvpd %xmm8, %xmm7, %xmm6, %xmm73588; AVX1-NEXT: vpackssdw %xmm5, %xmm7, %xmm53589; AVX1-NEXT: vpackssdw %xmm5, %xmm2, %xmm23590; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm53591; AVX1-NEXT: vblendvpd %xmm5, %xmm4, %xmm6, %xmm43592; AVX1-NEXT: vpcmpgtq %xmm6, %xmm3, %xmm53593; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm6, %xmm33594; AVX1-NEXT: vpackssdw %xmm4, %xmm3, %xmm33595; AVX1-NEXT: vpcmpgtq %xmm6, %xmm1, %xmm43596; AVX1-NEXT: vblendvpd %xmm4, %xmm1, %xmm6, %xmm13597; AVX1-NEXT: vpcmpgtq %xmm6, %xmm0, %xmm43598; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm6, %xmm03599; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm03600; AVX1-NEXT: vpackssdw %xmm0, %xmm3, %xmm03601; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm03602; AVX1-NEXT: retq3603;3604; AVX2-LABEL: trunc_ssat_v16i64_v16i8:3605; AVX2: # %bb.0:3606; AVX2-NEXT: vmovdqa (%rdi), %ymm03607; AVX2-NEXT: vmovdqa 32(%rdi), %ymm13608; AVX2-NEXT: vmovdqa 64(%rdi), %ymm23609; AVX2-NEXT: vmovdqa 96(%rdi), %ymm33610; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [127,127,127,127]3611; AVX2-NEXT: vpcmpgtq %ymm2, %ymm4, %ymm53612; AVX2-NEXT: vblendvpd %ymm5, %ymm2, %ymm4, %ymm23613; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm53614; AVX2-NEXT: vblendvpd %ymm5, %ymm3, %ymm4, %ymm33615; AVX2-NEXT: vpcmpgtq %ymm0, %ymm4, %ymm53616; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm4, %ymm03617; AVX2-NEXT: vpcmpgtq %ymm1, %ymm4, %ymm53618; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm4, %ymm13619; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]3620; AVX2-NEXT: vpcmpgtq %ymm4, %ymm1, %ymm53621; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm4, %ymm13622; AVX2-NEXT: vpcmpgtq %ymm4, %ymm0, %ymm53623; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm4, %ymm03624; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm03625; AVX2-NEXT: vpcmpgtq %ymm4, %ymm3, %ymm13626; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm4, %ymm13627; AVX2-NEXT: vpcmpgtq %ymm4, %ymm2, %ymm33628; AVX2-NEXT: vblendvpd %ymm3, %ymm2, %ymm4, %ymm23629; AVX2-NEXT: vpackssdw %ymm1, %ymm2, %ymm13630; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]3631; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]3632; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm03633; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13634; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm03635; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3636; AVX2-NEXT: vzeroupper3637; AVX2-NEXT: retq3638;3639; AVX512-LABEL: trunc_ssat_v16i64_v16i8:3640; AVX512: # %bb.0:3641; AVX512-NEXT: vmovdqa64 (%rdi), %zmm03642; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm13643; AVX512-NEXT: vpmovsqb %zmm1, %xmm13644; AVX512-NEXT: vpmovsqb %zmm0, %xmm03645; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]3646; AVX512-NEXT: vzeroupper3647; AVX512-NEXT: retq3648;3649; SKX-LABEL: trunc_ssat_v16i64_v16i8:3650; SKX: # %bb.0:3651; SKX-NEXT: vmovdqa (%rdi), %ymm03652; SKX-NEXT: vmovdqa 32(%rdi), %ymm13653; SKX-NEXT: vmovdqa 64(%rdi), %ymm23654; SKX-NEXT: vmovdqa 96(%rdi), %ymm33655; SKX-NEXT: vpmovsqb %ymm3, %xmm33656; SKX-NEXT: vpmovsqb %ymm2, %xmm23657; SKX-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]3658; SKX-NEXT: vpmovsqb %ymm1, %xmm13659; SKX-NEXT: vpmovsqb %ymm0, %xmm03660; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3661; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]3662; SKX-NEXT: vzeroupper3663; SKX-NEXT: retq3664 %a0 = load <16 x i64>, ptr %p03665 %1 = icmp slt <16 x i64> %a0, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>3666 %2 = select <16 x i1> %1, <16 x i64> %a0, <16 x i64> <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>3667 %3 = icmp sgt <16 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>3668 %4 = select <16 x i1> %3, <16 x i64> %2, <16 x i64> <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>3669 %5 = trunc <16 x i64> %4 to <16 x i8>3670 ret <16 x i8> %53671}3672 3673define <4 x i8> @trunc_ssat_v4i32_v4i8(<4 x i32> %a0) {3674; SSE-LABEL: trunc_ssat_v4i32_v4i8:3675; SSE: # %bb.0:3676; SSE-NEXT: packssdw %xmm0, %xmm03677; SSE-NEXT: packsswb %xmm0, %xmm03678; SSE-NEXT: retq3679;3680; AVX-LABEL: trunc_ssat_v4i32_v4i8:3681; AVX: # %bb.0:3682; AVX-NEXT: vpackssdw %xmm0, %xmm0, %xmm03683; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm03684; AVX-NEXT: retq3685;3686; AVX512-LABEL: trunc_ssat_v4i32_v4i8:3687; AVX512: # %bb.0:3688; AVX512-NEXT: vpackssdw %xmm0, %xmm0, %xmm03689; AVX512-NEXT: vpacksswb %xmm0, %xmm0, %xmm03690; AVX512-NEXT: retq3691;3692; SKX-LABEL: trunc_ssat_v4i32_v4i8:3693; SKX: # %bb.0:3694; SKX-NEXT: vpackssdw %xmm0, %xmm0, %xmm03695; SKX-NEXT: vpacksswb %xmm0, %xmm0, %xmm03696; SKX-NEXT: retq3697 %1 = icmp slt <4 x i32> %a0, <i32 127, i32 127, i32 127, i32 127>3698 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 127, i32 127, i32 127, i32 127>3699 %3 = icmp sgt <4 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128>3700 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -128, i32 -128, i32 -128, i32 -128>3701 %5 = trunc <4 x i32> %4 to <4 x i8>3702 ret <4 x i8> %53703}3704 3705define void @trunc_ssat_v4i32_v4i8_store(<4 x i32> %a0, ptr%p1) {3706; SSE-LABEL: trunc_ssat_v4i32_v4i8_store:3707; SSE: # %bb.0:3708; SSE-NEXT: packssdw %xmm0, %xmm03709; SSE-NEXT: packsswb %xmm0, %xmm03710; SSE-NEXT: movd %xmm0, (%rdi)3711; SSE-NEXT: retq3712;3713; AVX-LABEL: trunc_ssat_v4i32_v4i8_store:3714; AVX: # %bb.0:3715; AVX-NEXT: vpackssdw %xmm0, %xmm0, %xmm03716; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm03717; AVX-NEXT: vmovd %xmm0, (%rdi)3718; AVX-NEXT: retq3719;3720; AVX512F-LABEL: trunc_ssat_v4i32_v4i8_store:3721; AVX512F: # %bb.0:3722; AVX512F-NEXT: vpackssdw %xmm0, %xmm0, %xmm03723; AVX512F-NEXT: vpacksswb %xmm0, %xmm0, %xmm03724; AVX512F-NEXT: vmovd %xmm0, (%rdi)3725; AVX512F-NEXT: retq3726;3727; AVX512VL-LABEL: trunc_ssat_v4i32_v4i8_store:3728; AVX512VL: # %bb.0:3729; AVX512VL-NEXT: vpmovsdb %xmm0, (%rdi)3730; AVX512VL-NEXT: retq3731;3732; AVX512BW-LABEL: trunc_ssat_v4i32_v4i8_store:3733; AVX512BW: # %bb.0:3734; AVX512BW-NEXT: vpackssdw %xmm0, %xmm0, %xmm03735; AVX512BW-NEXT: vpacksswb %xmm0, %xmm0, %xmm03736; AVX512BW-NEXT: vmovd %xmm0, (%rdi)3737; AVX512BW-NEXT: retq3738;3739; AVX512BWVL-LABEL: trunc_ssat_v4i32_v4i8_store:3740; AVX512BWVL: # %bb.0:3741; AVX512BWVL-NEXT: vpmovsdb %xmm0, (%rdi)3742; AVX512BWVL-NEXT: retq3743;3744; SKX-LABEL: trunc_ssat_v4i32_v4i8_store:3745; SKX: # %bb.0:3746; SKX-NEXT: vpmovsdb %xmm0, (%rdi)3747; SKX-NEXT: retq3748 %1 = icmp slt <4 x i32> %a0, <i32 127, i32 127, i32 127, i32 127>3749 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 127, i32 127, i32 127, i32 127>3750 %3 = icmp sgt <4 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128>3751 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -128, i32 -128, i32 -128, i32 -128>3752 %5 = trunc <4 x i32> %4 to <4 x i8>3753 store <4 x i8> %5, ptr%p13754 ret void3755}3756 3757define <8 x i8> @trunc_ssat_v8i32_v8i8(<8 x i32> %a0) {3758; SSE-LABEL: trunc_ssat_v8i32_v8i8:3759; SSE: # %bb.0:3760; SSE-NEXT: packssdw %xmm1, %xmm03761; SSE-NEXT: packsswb %xmm0, %xmm03762; SSE-NEXT: retq3763;3764; AVX1-LABEL: trunc_ssat_v8i32_v8i8:3765; AVX1: # %bb.0:3766; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm13767; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm03768; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm03769; AVX1-NEXT: vzeroupper3770; AVX1-NEXT: retq3771;3772; AVX2-LABEL: trunc_ssat_v8i32_v8i8:3773; AVX2: # %bb.0:3774; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13775; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm03776; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm03777; AVX2-NEXT: vzeroupper3778; AVX2-NEXT: retq3779;3780; AVX512F-LABEL: trunc_ssat_v8i32_v8i8:3781; AVX512F: # %bb.0:3782; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm13783; AVX512F-NEXT: vpackssdw %xmm1, %xmm0, %xmm03784; AVX512F-NEXT: vpacksswb %xmm0, %xmm0, %xmm03785; AVX512F-NEXT: vzeroupper3786; AVX512F-NEXT: retq3787;3788; AVX512VL-LABEL: trunc_ssat_v8i32_v8i8:3789; AVX512VL: # %bb.0:3790; AVX512VL-NEXT: vpmovsdb %ymm0, %xmm03791; AVX512VL-NEXT: vzeroupper3792; AVX512VL-NEXT: retq3793;3794; AVX512BW-LABEL: trunc_ssat_v8i32_v8i8:3795; AVX512BW: # %bb.0:3796; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm13797; AVX512BW-NEXT: vpackssdw %xmm1, %xmm0, %xmm03798; AVX512BW-NEXT: vpacksswb %xmm0, %xmm0, %xmm03799; AVX512BW-NEXT: vzeroupper3800; AVX512BW-NEXT: retq3801;3802; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i8:3803; AVX512BWVL: # %bb.0:3804; AVX512BWVL-NEXT: vpmovsdb %ymm0, %xmm03805; AVX512BWVL-NEXT: vzeroupper3806; AVX512BWVL-NEXT: retq3807;3808; SKX-LABEL: trunc_ssat_v8i32_v8i8:3809; SKX: # %bb.0:3810; SKX-NEXT: vpmovsdb %ymm0, %xmm03811; SKX-NEXT: vzeroupper3812; SKX-NEXT: retq3813 %1 = icmp slt <8 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>3814 %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>3815 %3 = icmp sgt <8 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>3816 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>3817 %5 = trunc <8 x i32> %4 to <8 x i8>3818 ret <8 x i8> %53819}3820 3821define void @trunc_ssat_v8i32_v8i8_store(<8 x i32> %a0, ptr%p1) {3822; SSE-LABEL: trunc_ssat_v8i32_v8i8_store:3823; SSE: # %bb.0:3824; SSE-NEXT: packssdw %xmm1, %xmm03825; SSE-NEXT: packsswb %xmm0, %xmm03826; SSE-NEXT: movq %xmm0, (%rdi)3827; SSE-NEXT: retq3828;3829; AVX1-LABEL: trunc_ssat_v8i32_v8i8_store:3830; AVX1: # %bb.0:3831; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm13832; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm03833; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm03834; AVX1-NEXT: vmovq %xmm0, (%rdi)3835; AVX1-NEXT: vzeroupper3836; AVX1-NEXT: retq3837;3838; AVX2-LABEL: trunc_ssat_v8i32_v8i8_store:3839; AVX2: # %bb.0:3840; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13841; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm03842; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm03843; AVX2-NEXT: vmovq %xmm0, (%rdi)3844; AVX2-NEXT: vzeroupper3845; AVX2-NEXT: retq3846;3847; AVX512F-LABEL: trunc_ssat_v8i32_v8i8_store:3848; AVX512F: # %bb.0:3849; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm13850; AVX512F-NEXT: vpackssdw %xmm1, %xmm0, %xmm03851; AVX512F-NEXT: vpacksswb %xmm0, %xmm0, %xmm03852; AVX512F-NEXT: vmovq %xmm0, (%rdi)3853; AVX512F-NEXT: vzeroupper3854; AVX512F-NEXT: retq3855;3856; AVX512VL-LABEL: trunc_ssat_v8i32_v8i8_store:3857; AVX512VL: # %bb.0:3858; AVX512VL-NEXT: vpmovsdb %ymm0, (%rdi)3859; AVX512VL-NEXT: vzeroupper3860; AVX512VL-NEXT: retq3861;3862; AVX512BW-LABEL: trunc_ssat_v8i32_v8i8_store:3863; AVX512BW: # %bb.0:3864; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm13865; AVX512BW-NEXT: vpackssdw %xmm1, %xmm0, %xmm03866; AVX512BW-NEXT: vpacksswb %xmm0, %xmm0, %xmm03867; AVX512BW-NEXT: vmovq %xmm0, (%rdi)3868; AVX512BW-NEXT: vzeroupper3869; AVX512BW-NEXT: retq3870;3871; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i8_store:3872; AVX512BWVL: # %bb.0:3873; AVX512BWVL-NEXT: vpmovsdb %ymm0, (%rdi)3874; AVX512BWVL-NEXT: vzeroupper3875; AVX512BWVL-NEXT: retq3876;3877; SKX-LABEL: trunc_ssat_v8i32_v8i8_store:3878; SKX: # %bb.0:3879; SKX-NEXT: vpmovsdb %ymm0, (%rdi)3880; SKX-NEXT: vzeroupper3881; SKX-NEXT: retq3882 %1 = icmp slt <8 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>3883 %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>3884 %3 = icmp sgt <8 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>3885 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>3886 %5 = trunc <8 x i32> %4 to <8 x i8>3887 store <8 x i8> %5, ptr%p13888 ret void3889}3890 3891define <16 x i8> @trunc_ssat_v16i32_v16i8(ptr %p0) "min-legal-vector-width"="256" {3892; SSE-LABEL: trunc_ssat_v16i32_v16i8:3893; SSE: # %bb.0:3894; SSE-NEXT: movdqa (%rdi), %xmm03895; SSE-NEXT: movdqa 32(%rdi), %xmm13896; SSE-NEXT: packssdw 48(%rdi), %xmm13897; SSE-NEXT: packssdw 16(%rdi), %xmm03898; SSE-NEXT: packsswb %xmm1, %xmm03899; SSE-NEXT: retq3900;3901; AVX1-LABEL: trunc_ssat_v16i32_v16i8:3902; AVX1: # %bb.0:3903; AVX1-NEXT: vmovdqa (%rdi), %xmm03904; AVX1-NEXT: vmovdqa 32(%rdi), %xmm13905; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm13906; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm03907; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm03908; AVX1-NEXT: retq3909;3910; AVX2-LABEL: trunc_ssat_v16i32_v16i8:3911; AVX2: # %bb.0:3912; AVX2-NEXT: vmovdqa (%rdi), %ymm03913; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm03914; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13915; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm03916; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3917; AVX2-NEXT: vzeroupper3918; AVX2-NEXT: retq3919;3920; AVX512-LABEL: trunc_ssat_v16i32_v16i8:3921; AVX512: # %bb.0:3922; AVX512-NEXT: vmovdqa64 (%rdi), %zmm03923; AVX512-NEXT: vpmovsdb %zmm0, %xmm03924; AVX512-NEXT: vzeroupper3925; AVX512-NEXT: retq3926;3927; SKX-LABEL: trunc_ssat_v16i32_v16i8:3928; SKX: # %bb.0:3929; SKX-NEXT: vmovdqa (%rdi), %ymm03930; SKX-NEXT: vmovdqa 32(%rdi), %ymm13931; SKX-NEXT: vpmovsdb %ymm1, %xmm13932; SKX-NEXT: vpmovsdb %ymm0, %xmm03933; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]3934; SKX-NEXT: vzeroupper3935; SKX-NEXT: retq3936 %a0 = load <16 x i32>, ptr %p03937 %1 = icmp slt <16 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>3938 %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>3939 %3 = icmp sgt <16 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>3940 %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>3941 %5 = trunc <16 x i32> %4 to <16 x i8>3942 ret <16 x i8> %53943}3944 3945define void @trunc_ssat_v16i32_v16i8_store(ptr %p0, ptr %p1) "min-legal-vector-width"="256" {3946; SSE-LABEL: trunc_ssat_v16i32_v16i8_store:3947; SSE: # %bb.0:3948; SSE-NEXT: movdqa (%rdi), %xmm03949; SSE-NEXT: movdqa 32(%rdi), %xmm13950; SSE-NEXT: packssdw 48(%rdi), %xmm13951; SSE-NEXT: packssdw 16(%rdi), %xmm03952; SSE-NEXT: packsswb %xmm1, %xmm03953; SSE-NEXT: movdqa %xmm0, (%rsi)3954; SSE-NEXT: retq3955;3956; AVX1-LABEL: trunc_ssat_v16i32_v16i8_store:3957; AVX1: # %bb.0:3958; AVX1-NEXT: vmovdqa (%rdi), %xmm03959; AVX1-NEXT: vmovdqa 32(%rdi), %xmm13960; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm13961; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm03962; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm03963; AVX1-NEXT: vmovdqa %xmm0, (%rsi)3964; AVX1-NEXT: retq3965;3966; AVX2-LABEL: trunc_ssat_v16i32_v16i8_store:3967; AVX2: # %bb.0:3968; AVX2-NEXT: vmovdqa (%rdi), %ymm03969; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm03970; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm13971; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm03972; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]3973; AVX2-NEXT: vmovdqa %xmm0, (%rsi)3974; AVX2-NEXT: vzeroupper3975; AVX2-NEXT: retq3976;3977; AVX512-LABEL: trunc_ssat_v16i32_v16i8_store:3978; AVX512: # %bb.0:3979; AVX512-NEXT: vmovdqa64 (%rdi), %zmm03980; AVX512-NEXT: vpmovsdb %zmm0, (%rsi)3981; AVX512-NEXT: vzeroupper3982; AVX512-NEXT: retq3983;3984; SKX-LABEL: trunc_ssat_v16i32_v16i8_store:3985; SKX: # %bb.0:3986; SKX-NEXT: vmovdqa (%rdi), %ymm03987; SKX-NEXT: vmovdqa 32(%rdi), %ymm13988; SKX-NEXT: vpmovsdb %ymm1, %xmm13989; SKX-NEXT: vpmovsdb %ymm0, %xmm03990; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]3991; SKX-NEXT: vmovdqa %xmm0, (%rsi)3992; SKX-NEXT: vzeroupper3993; SKX-NEXT: retq3994 %a0 = load <16 x i32>, ptr %p03995 %1 = icmp slt <16 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>3996 %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>3997 %3 = icmp sgt <16 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>3998 %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>3999 %5 = trunc <16 x i32> %4 to <16 x i8>4000 store <16 x i8> %5, ptr %p14001 ret void4002}4003 4004define <8 x i8> @trunc_ssat_v8i16_v8i8(<8 x i16> %a0) {4005; SSE-LABEL: trunc_ssat_v8i16_v8i8:4006; SSE: # %bb.0:4007; SSE-NEXT: packsswb %xmm0, %xmm04008; SSE-NEXT: retq4009;4010; AVX-LABEL: trunc_ssat_v8i16_v8i8:4011; AVX: # %bb.0:4012; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm04013; AVX-NEXT: retq4014;4015; AVX512-LABEL: trunc_ssat_v8i16_v8i8:4016; AVX512: # %bb.0:4017; AVX512-NEXT: vpacksswb %xmm0, %xmm0, %xmm04018; AVX512-NEXT: retq4019;4020; SKX-LABEL: trunc_ssat_v8i16_v8i8:4021; SKX: # %bb.0:4022; SKX-NEXT: vpacksswb %xmm0, %xmm0, %xmm04023; SKX-NEXT: retq4024 %1 = icmp slt <8 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>4025 %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>4026 %3 = icmp sgt <8 x i16> %2, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>4027 %4 = select <8 x i1> %3, <8 x i16> %2, <8 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>4028 %5 = trunc <8 x i16> %4 to <8 x i8>4029 ret <8 x i8> %54030}4031 4032define void @trunc_ssat_v8i16_v8i8_store(<8 x i16> %a0, ptr%p1) {4033; SSE-LABEL: trunc_ssat_v8i16_v8i8_store:4034; SSE: # %bb.0:4035; SSE-NEXT: packsswb %xmm0, %xmm04036; SSE-NEXT: movq %xmm0, (%rdi)4037; SSE-NEXT: retq4038;4039; AVX-LABEL: trunc_ssat_v8i16_v8i8_store:4040; AVX: # %bb.0:4041; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm04042; AVX-NEXT: vmovq %xmm0, (%rdi)4043; AVX-NEXT: retq4044;4045; AVX512F-LABEL: trunc_ssat_v8i16_v8i8_store:4046; AVX512F: # %bb.0:4047; AVX512F-NEXT: vpacksswb %xmm0, %xmm0, %xmm04048; AVX512F-NEXT: vmovq %xmm0, (%rdi)4049; AVX512F-NEXT: retq4050;4051; AVX512VL-LABEL: trunc_ssat_v8i16_v8i8_store:4052; AVX512VL: # %bb.0:4053; AVX512VL-NEXT: vpacksswb %xmm0, %xmm0, %xmm04054; AVX512VL-NEXT: vmovq %xmm0, (%rdi)4055; AVX512VL-NEXT: retq4056;4057; AVX512BW-LABEL: trunc_ssat_v8i16_v8i8_store:4058; AVX512BW: # %bb.0:4059; AVX512BW-NEXT: vpacksswb %xmm0, %xmm0, %xmm04060; AVX512BW-NEXT: vmovq %xmm0, (%rdi)4061; AVX512BW-NEXT: retq4062;4063; AVX512BWVL-LABEL: trunc_ssat_v8i16_v8i8_store:4064; AVX512BWVL: # %bb.0:4065; AVX512BWVL-NEXT: vpmovswb %xmm0, (%rdi)4066; AVX512BWVL-NEXT: retq4067;4068; SKX-LABEL: trunc_ssat_v8i16_v8i8_store:4069; SKX: # %bb.0:4070; SKX-NEXT: vpmovswb %xmm0, (%rdi)4071; SKX-NEXT: retq4072 %1 = icmp slt <8 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>4073 %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>4074 %3 = icmp sgt <8 x i16> %2, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>4075 %4 = select <8 x i1> %3, <8 x i16> %2, <8 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>4076 %5 = trunc <8 x i16> %4 to <8 x i8>4077 store <8 x i8> %5, ptr%p14078 ret void4079}4080 4081define <16 x i8> @trunc_ssat_v16i16_v16i8(<16 x i16> %a0) {4082; SSE-LABEL: trunc_ssat_v16i16_v16i8:4083; SSE: # %bb.0:4084; SSE-NEXT: packsswb %xmm1, %xmm04085; SSE-NEXT: retq4086;4087; AVX1-LABEL: trunc_ssat_v16i16_v16i8:4088; AVX1: # %bb.0:4089; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm14090; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm04091; AVX1-NEXT: vzeroupper4092; AVX1-NEXT: retq4093;4094; AVX2-LABEL: trunc_ssat_v16i16_v16i8:4095; AVX2: # %bb.0:4096; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm14097; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm04098; AVX2-NEXT: vzeroupper4099; AVX2-NEXT: retq4100;4101; AVX512F-LABEL: trunc_ssat_v16i16_v16i8:4102; AVX512F: # %bb.0:4103; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm14104; AVX512F-NEXT: vpacksswb %xmm1, %xmm0, %xmm04105; AVX512F-NEXT: vzeroupper4106; AVX512F-NEXT: retq4107;4108; AVX512VL-LABEL: trunc_ssat_v16i16_v16i8:4109; AVX512VL: # %bb.0:4110; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm14111; AVX512VL-NEXT: vpacksswb %xmm1, %xmm0, %xmm04112; AVX512VL-NEXT: vzeroupper4113; AVX512VL-NEXT: retq4114;4115; AVX512BW-LABEL: trunc_ssat_v16i16_v16i8:4116; AVX512BW: # %bb.0:4117; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm14118; AVX512BW-NEXT: vpacksswb %xmm1, %xmm0, %xmm04119; AVX512BW-NEXT: vzeroupper4120; AVX512BW-NEXT: retq4121;4122; AVX512BWVL-LABEL: trunc_ssat_v16i16_v16i8:4123; AVX512BWVL: # %bb.0:4124; AVX512BWVL-NEXT: vpmovswb %ymm0, %xmm04125; AVX512BWVL-NEXT: vzeroupper4126; AVX512BWVL-NEXT: retq4127;4128; SKX-LABEL: trunc_ssat_v16i16_v16i8:4129; SKX: # %bb.0:4130; SKX-NEXT: vpmovswb %ymm0, %xmm04131; SKX-NEXT: vzeroupper4132; SKX-NEXT: retq4133 %1 = icmp slt <16 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>4134 %2 = select <16 x i1> %1, <16 x i16> %a0, <16 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>4135 %3 = icmp sgt <16 x i16> %2, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>4136 %4 = select <16 x i1> %3, <16 x i16> %2, <16 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>4137 %5 = trunc <16 x i16> %4 to <16 x i8>4138 ret <16 x i8> %54139}4140 4141define <32 x i8> @trunc_ssat_v32i16_v32i8(ptr %p0) "min-legal-vector-width"="256" {4142; SSE-LABEL: trunc_ssat_v32i16_v32i8:4143; SSE: # %bb.0:4144; SSE-NEXT: movdqa (%rdi), %xmm04145; SSE-NEXT: movdqa 32(%rdi), %xmm14146; SSE-NEXT: packsswb 16(%rdi), %xmm04147; SSE-NEXT: packsswb 48(%rdi), %xmm14148; SSE-NEXT: retq4149;4150; AVX1-LABEL: trunc_ssat_v32i16_v32i8:4151; AVX1: # %bb.0:4152; AVX1-NEXT: vmovdqa (%rdi), %xmm04153; AVX1-NEXT: vmovdqa 32(%rdi), %xmm14154; AVX1-NEXT: vpacksswb 48(%rdi), %xmm1, %xmm14155; AVX1-NEXT: vpacksswb 16(%rdi), %xmm0, %xmm04156; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm04157; AVX1-NEXT: retq4158;4159; AVX2-LABEL: trunc_ssat_v32i16_v32i8:4160; AVX2: # %bb.0:4161; AVX2-NEXT: vmovdqa (%rdi), %ymm04162; AVX2-NEXT: vpacksswb 32(%rdi), %ymm0, %ymm04163; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4164; AVX2-NEXT: retq4165;4166; AVX512F-LABEL: trunc_ssat_v32i16_v32i8:4167; AVX512F: # %bb.0:4168; AVX512F-NEXT: vmovdqa (%rdi), %ymm04169; AVX512F-NEXT: vpacksswb 32(%rdi), %ymm0, %ymm04170; AVX512F-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4171; AVX512F-NEXT: retq4172;4173; AVX512VL-LABEL: trunc_ssat_v32i16_v32i8:4174; AVX512VL: # %bb.0:4175; AVX512VL-NEXT: vmovdqa (%rdi), %ymm04176; AVX512VL-NEXT: vpacksswb 32(%rdi), %ymm0, %ymm04177; AVX512VL-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4178; AVX512VL-NEXT: retq4179;4180; AVX512BW-LABEL: trunc_ssat_v32i16_v32i8:4181; AVX512BW: # %bb.0:4182; AVX512BW-NEXT: vmovdqa64 (%rdi), %zmm04183; AVX512BW-NEXT: vpmovswb %zmm0, %ymm04184; AVX512BW-NEXT: retq4185;4186; AVX512BWVL-LABEL: trunc_ssat_v32i16_v32i8:4187; AVX512BWVL: # %bb.0:4188; AVX512BWVL-NEXT: vmovdqa64 (%rdi), %zmm04189; AVX512BWVL-NEXT: vpmovswb %zmm0, %ymm04190; AVX512BWVL-NEXT: retq4191;4192; SKX-LABEL: trunc_ssat_v32i16_v32i8:4193; SKX: # %bb.0:4194; SKX-NEXT: vmovdqa (%rdi), %ymm04195; SKX-NEXT: vpacksswb 32(%rdi), %ymm0, %ymm04196; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4197; SKX-NEXT: retq4198 %a0 = load <32 x i16>, ptr %p04199 %1 = icmp slt <32 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>4200 %2 = select <32 x i1> %1, <32 x i16> %a0, <32 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>4201 %3 = icmp sgt <32 x i16> %2, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>4202 %4 = select <32 x i1> %3, <32 x i16> %2, <32 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>4203 %5 = trunc <32 x i16> %4 to <32 x i8>4204 ret <32 x i8> %54205}4206 4207define <32 x i8> @trunc_ssat_v32i32_v32i8(ptr %p0) "min-legal-vector-width"="256" {4208; SSE-LABEL: trunc_ssat_v32i32_v32i8:4209; SSE: # %bb.0:4210; SSE-NEXT: movdqa (%rdi), %xmm04211; SSE-NEXT: movdqa 32(%rdi), %xmm24212; SSE-NEXT: movdqa 64(%rdi), %xmm14213; SSE-NEXT: movdqa 96(%rdi), %xmm34214; SSE-NEXT: packssdw 48(%rdi), %xmm24215; SSE-NEXT: packssdw 16(%rdi), %xmm04216; SSE-NEXT: packsswb %xmm2, %xmm04217; SSE-NEXT: packssdw 112(%rdi), %xmm34218; SSE-NEXT: packssdw 80(%rdi), %xmm14219; SSE-NEXT: packsswb %xmm3, %xmm14220; SSE-NEXT: retq4221;4222; AVX1-LABEL: trunc_ssat_v32i32_v32i8:4223; AVX1: # %bb.0:4224; AVX1-NEXT: vmovdqa (%rdi), %xmm04225; AVX1-NEXT: vmovdqa 32(%rdi), %xmm14226; AVX1-NEXT: vmovdqa 64(%rdi), %xmm24227; AVX1-NEXT: vmovdqa 96(%rdi), %xmm34228; AVX1-NEXT: vpackssdw 112(%rdi), %xmm3, %xmm34229; AVX1-NEXT: vpackssdw 80(%rdi), %xmm2, %xmm24230; AVX1-NEXT: vpacksswb %xmm3, %xmm2, %xmm24231; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm14232; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm04233; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm04234; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm04235; AVX1-NEXT: retq4236;4237; AVX2-LABEL: trunc_ssat_v32i32_v32i8:4238; AVX2: # %bb.0:4239; AVX2-NEXT: vmovdqa (%rdi), %ymm04240; AVX2-NEXT: vmovdqa 64(%rdi), %ymm14241; AVX2-NEXT: vpackssdw 96(%rdi), %ymm1, %ymm14242; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]4243; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm04244; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4245; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm04246; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4247; AVX2-NEXT: retq4248;4249; AVX512-LABEL: trunc_ssat_v32i32_v32i8:4250; AVX512: # %bb.0:4251; AVX512-NEXT: vmovdqa64 (%rdi), %zmm04252; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm14253; AVX512-NEXT: vpmovsdb %zmm0, %xmm04254; AVX512-NEXT: vpmovsdb %zmm1, %xmm14255; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm04256; AVX512-NEXT: retq4257;4258; SKX-LABEL: trunc_ssat_v32i32_v32i8:4259; SKX: # %bb.0:4260; SKX-NEXT: vmovdqa (%rdi), %ymm04261; SKX-NEXT: vmovdqa 64(%rdi), %ymm14262; SKX-NEXT: vpackssdw 96(%rdi), %ymm1, %ymm14263; SKX-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]4264; SKX-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm04265; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4266; SKX-NEXT: vpacksswb %ymm1, %ymm0, %ymm04267; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]4268; SKX-NEXT: retq4269 %a0 = load <32 x i32>, ptr %p04270 %1 = icmp slt <32 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>4271 %2 = select <32 x i1> %1, <32 x i32> %a0, <32 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>4272 %3 = icmp sgt <32 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>4273 %4 = select <32 x i1> %3, <32 x i32> %2, <32 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>4274 %5 = trunc <32 x i32> %4 to <32 x i8>4275 ret <32 x i8> %54276}4277 4278; This used to crash with avx512 due because we were missing a check for4279; unsupported element types like i24.4280define void @trunc_ssat_v16i32_v16i24(<16 x i32> %x, ptr %y) nounwind {4281; SSE2-SSSE3-LABEL: trunc_ssat_v16i32_v16i24:4282; SSE2-SSSE3: # %bb.0:4283; SSE2-SSSE3-NEXT: pushq %rbp4284; SSE2-SSSE3-NEXT: pushq %r154285; SSE2-SSSE3-NEXT: pushq %r144286; SSE2-SSSE3-NEXT: pushq %r124287; SSE2-SSSE3-NEXT: pushq %rbx4288; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [8388607,8388607,8388607,8388607]4289; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm44290; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm44291; SSE2-SSSE3-NEXT: pand %xmm4, %xmm34292; SSE2-SSSE3-NEXT: pandn %xmm5, %xmm44293; SSE2-SSSE3-NEXT: por %xmm3, %xmm44294; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm34295; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm34296; SSE2-SSSE3-NEXT: pand %xmm3, %xmm24297; SSE2-SSSE3-NEXT: pandn %xmm5, %xmm34298; SSE2-SSSE3-NEXT: por %xmm2, %xmm34299; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm24300; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm24301; SSE2-SSSE3-NEXT: pand %xmm2, %xmm14302; SSE2-SSSE3-NEXT: pandn %xmm5, %xmm24303; SSE2-SSSE3-NEXT: por %xmm1, %xmm24304; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm14305; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm14306; SSE2-SSSE3-NEXT: pand %xmm1, %xmm04307; SSE2-SSSE3-NEXT: pandn %xmm5, %xmm14308; SSE2-SSSE3-NEXT: por %xmm0, %xmm14309; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [4286578688,4286578688,4286578688,4286578688]4310; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm04311; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm04312; SSE2-SSSE3-NEXT: pand %xmm0, %xmm14313; SSE2-SSSE3-NEXT: pandn %xmm5, %xmm04314; SSE2-SSSE3-NEXT: por %xmm1, %xmm04315; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm14316; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm14317; SSE2-SSSE3-NEXT: pand %xmm1, %xmm24318; SSE2-SSSE3-NEXT: pandn %xmm5, %xmm14319; SSE2-SSSE3-NEXT: por %xmm2, %xmm14320; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm24321; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm24322; SSE2-SSSE3-NEXT: pand %xmm2, %xmm34323; SSE2-SSSE3-NEXT: pandn %xmm5, %xmm24324; SSE2-SSSE3-NEXT: por %xmm3, %xmm24325; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm34326; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm34327; SSE2-SSSE3-NEXT: pand %xmm3, %xmm44328; SSE2-SSSE3-NEXT: pandn %xmm5, %xmm34329; SSE2-SSSE3-NEXT: por %xmm4, %xmm34330; SSE2-SSSE3-NEXT: movd %xmm3, %r8d4331; SSE2-SSSE3-NEXT: movw %r8w, 36(%rdi)4332; SSE2-SSSE3-NEXT: movd %xmm2, %r11d4333; SSE2-SSSE3-NEXT: movw %r11w, 24(%rdi)4334; SSE2-SSSE3-NEXT: movd %xmm1, %r14d4335; SSE2-SSSE3-NEXT: movw %r14w, 12(%rdi)4336; SSE2-SSSE3-NEXT: movd %xmm0, %eax4337; SSE2-SSSE3-NEXT: movw %ax, (%rdi)4338; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[3,3,3,3]4339; SSE2-SSSE3-NEXT: movd %xmm4, %ecx4340; SSE2-SSSE3-NEXT: movw %cx, 45(%rdi)4341; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[2,3,2,3]4342; SSE2-SSSE3-NEXT: movd %xmm4, %edx4343; SSE2-SSSE3-NEXT: movw %dx, 42(%rdi)4344; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,1,1]4345; SSE2-SSSE3-NEXT: movd %xmm3, %esi4346; SSE2-SSSE3-NEXT: movw %si, 39(%rdi)4347; SSE2-SSSE3-NEXT: shrl $16, %r8d4348; SSE2-SSSE3-NEXT: movb %r8b, 38(%rdi)4349; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3]4350; SSE2-SSSE3-NEXT: movd %xmm3, %r8d4351; SSE2-SSSE3-NEXT: movw %r8w, 33(%rdi)4352; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]4353; SSE2-SSSE3-NEXT: movd %xmm3, %r9d4354; SSE2-SSSE3-NEXT: movw %r9w, 30(%rdi)4355; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,1,1]4356; SSE2-SSSE3-NEXT: movd %xmm2, %r10d4357; SSE2-SSSE3-NEXT: movw %r10w, 27(%rdi)4358; SSE2-SSSE3-NEXT: shrl $16, %r11d4359; SSE2-SSSE3-NEXT: movb %r11b, 26(%rdi)4360; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]4361; SSE2-SSSE3-NEXT: movd %xmm2, %r11d4362; SSE2-SSSE3-NEXT: movw %r11w, 21(%rdi)4363; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]4364; SSE2-SSSE3-NEXT: movd %xmm2, %ebx4365; SSE2-SSSE3-NEXT: movw %bx, 18(%rdi)4366; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]4367; SSE2-SSSE3-NEXT: movd %xmm1, %ebp4368; SSE2-SSSE3-NEXT: movw %bp, 15(%rdi)4369; SSE2-SSSE3-NEXT: shrl $16, %r14d4370; SSE2-SSSE3-NEXT: movb %r14b, 14(%rdi)4371; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]4372; SSE2-SSSE3-NEXT: movd %xmm1, %r14d4373; SSE2-SSSE3-NEXT: movw %r14w, 9(%rdi)4374; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]4375; SSE2-SSSE3-NEXT: movd %xmm1, %r15d4376; SSE2-SSSE3-NEXT: movw %r15w, 6(%rdi)4377; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]4378; SSE2-SSSE3-NEXT: movd %xmm0, %r12d4379; SSE2-SSSE3-NEXT: movw %r12w, 3(%rdi)4380; SSE2-SSSE3-NEXT: shrl $16, %eax4381; SSE2-SSSE3-NEXT: movb %al, 2(%rdi)4382; SSE2-SSSE3-NEXT: shrl $16, %ecx4383; SSE2-SSSE3-NEXT: movb %cl, 47(%rdi)4384; SSE2-SSSE3-NEXT: shrl $16, %edx4385; SSE2-SSSE3-NEXT: movb %dl, 44(%rdi)4386; SSE2-SSSE3-NEXT: shrl $16, %esi4387; SSE2-SSSE3-NEXT: movb %sil, 41(%rdi)4388; SSE2-SSSE3-NEXT: shrl $16, %r8d4389; SSE2-SSSE3-NEXT: movb %r8b, 35(%rdi)4390; SSE2-SSSE3-NEXT: shrl $16, %r9d4391; SSE2-SSSE3-NEXT: movb %r9b, 32(%rdi)4392; SSE2-SSSE3-NEXT: shrl $16, %r10d4393; SSE2-SSSE3-NEXT: movb %r10b, 29(%rdi)4394; SSE2-SSSE3-NEXT: shrl $16, %r11d4395; SSE2-SSSE3-NEXT: movb %r11b, 23(%rdi)4396; SSE2-SSSE3-NEXT: shrl $16, %ebx4397; SSE2-SSSE3-NEXT: movb %bl, 20(%rdi)4398; SSE2-SSSE3-NEXT: shrl $16, %ebp4399; SSE2-SSSE3-NEXT: movb %bpl, 17(%rdi)4400; SSE2-SSSE3-NEXT: shrl $16, %r14d4401; SSE2-SSSE3-NEXT: movb %r14b, 11(%rdi)4402; SSE2-SSSE3-NEXT: shrl $16, %r15d4403; SSE2-SSSE3-NEXT: movb %r15b, 8(%rdi)4404; SSE2-SSSE3-NEXT: shrl $16, %r12d4405; SSE2-SSSE3-NEXT: movb %r12b, 5(%rdi)4406; SSE2-SSSE3-NEXT: popq %rbx4407; SSE2-SSSE3-NEXT: popq %r124408; SSE2-SSSE3-NEXT: popq %r144409; SSE2-SSSE3-NEXT: popq %r154410; SSE2-SSSE3-NEXT: popq %rbp4411; SSE2-SSSE3-NEXT: retq4412;4413; SSE41-LABEL: trunc_ssat_v16i32_v16i24:4414; SSE41: # %bb.0:4415; SSE41-NEXT: pmovsxbw {{.*#+}} xmm4 = [65535,127,65535,127,65535,127,65535,127]4416; SSE41-NEXT: pminsd %xmm4, %xmm34417; SSE41-NEXT: pminsd %xmm4, %xmm24418; SSE41-NEXT: pminsd %xmm4, %xmm14419; SSE41-NEXT: pminsd %xmm4, %xmm04420; SSE41-NEXT: pmovsxbw {{.*#+}} xmm4 = [0,65408,0,65408,0,65408,0,65408]4421; SSE41-NEXT: pmaxsd %xmm4, %xmm04422; SSE41-NEXT: pmaxsd %xmm4, %xmm14423; SSE41-NEXT: pmaxsd %xmm4, %xmm24424; SSE41-NEXT: pmaxsd %xmm4, %xmm34425; SSE41-NEXT: pextrd $3, %xmm3, %eax4426; SSE41-NEXT: movw %ax, 45(%rdi)4427; SSE41-NEXT: shrl $16, %eax4428; SSE41-NEXT: movb %al, 47(%rdi)4429; SSE41-NEXT: pextrd $2, %xmm3, %eax4430; SSE41-NEXT: movw %ax, 42(%rdi)4431; SSE41-NEXT: shrl $16, %eax4432; SSE41-NEXT: movb %al, 44(%rdi)4433; SSE41-NEXT: pextrd $1, %xmm3, %eax4434; SSE41-NEXT: movw %ax, 39(%rdi)4435; SSE41-NEXT: shrl $16, %eax4436; SSE41-NEXT: movb %al, 41(%rdi)4437; SSE41-NEXT: movd %xmm3, %eax4438; SSE41-NEXT: movw %ax, 36(%rdi)4439; SSE41-NEXT: shrl $16, %eax4440; SSE41-NEXT: movb %al, 38(%rdi)4441; SSE41-NEXT: pextrd $3, %xmm2, %eax4442; SSE41-NEXT: movw %ax, 33(%rdi)4443; SSE41-NEXT: shrl $16, %eax4444; SSE41-NEXT: movb %al, 35(%rdi)4445; SSE41-NEXT: pextrd $2, %xmm2, %eax4446; SSE41-NEXT: movw %ax, 30(%rdi)4447; SSE41-NEXT: shrl $16, %eax4448; SSE41-NEXT: movb %al, 32(%rdi)4449; SSE41-NEXT: pextrd $1, %xmm2, %eax4450; SSE41-NEXT: movw %ax, 27(%rdi)4451; SSE41-NEXT: shrl $16, %eax4452; SSE41-NEXT: movb %al, 29(%rdi)4453; SSE41-NEXT: movd %xmm2, %eax4454; SSE41-NEXT: movw %ax, 24(%rdi)4455; SSE41-NEXT: shrl $16, %eax4456; SSE41-NEXT: movb %al, 26(%rdi)4457; SSE41-NEXT: pextrd $3, %xmm1, %eax4458; SSE41-NEXT: movw %ax, 21(%rdi)4459; SSE41-NEXT: shrl $16, %eax4460; SSE41-NEXT: movb %al, 23(%rdi)4461; SSE41-NEXT: pextrd $2, %xmm1, %eax4462; SSE41-NEXT: movw %ax, 18(%rdi)4463; SSE41-NEXT: shrl $16, %eax4464; SSE41-NEXT: movb %al, 20(%rdi)4465; SSE41-NEXT: pextrd $1, %xmm1, %eax4466; SSE41-NEXT: movw %ax, 15(%rdi)4467; SSE41-NEXT: shrl $16, %eax4468; SSE41-NEXT: movb %al, 17(%rdi)4469; SSE41-NEXT: movd %xmm1, %eax4470; SSE41-NEXT: movw %ax, 12(%rdi)4471; SSE41-NEXT: shrl $16, %eax4472; SSE41-NEXT: movb %al, 14(%rdi)4473; SSE41-NEXT: pextrd $3, %xmm0, %eax4474; SSE41-NEXT: movw %ax, 9(%rdi)4475; SSE41-NEXT: shrl $16, %eax4476; SSE41-NEXT: movb %al, 11(%rdi)4477; SSE41-NEXT: pextrd $2, %xmm0, %eax4478; SSE41-NEXT: movw %ax, 6(%rdi)4479; SSE41-NEXT: shrl $16, %eax4480; SSE41-NEXT: movb %al, 8(%rdi)4481; SSE41-NEXT: pextrd $1, %xmm0, %eax4482; SSE41-NEXT: movw %ax, 3(%rdi)4483; SSE41-NEXT: shrl $16, %eax4484; SSE41-NEXT: movb %al, 5(%rdi)4485; SSE41-NEXT: movd %xmm0, %eax4486; SSE41-NEXT: movw %ax, (%rdi)4487; SSE41-NEXT: shrl $16, %eax4488; SSE41-NEXT: movb %al, 2(%rdi)4489; SSE41-NEXT: retq4490;4491; AVX1-LABEL: trunc_ssat_v16i32_v16i24:4492; AVX1: # %bb.0:4493; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm24494; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [8388607,8388607,8388607,8388607]4495; AVX1-NEXT: vpminsd %xmm3, %xmm2, %xmm44496; AVX1-NEXT: vpminsd %xmm3, %xmm1, %xmm24497; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm14498; AVX1-NEXT: vpminsd %xmm3, %xmm1, %xmm14499; AVX1-NEXT: vpminsd %xmm3, %xmm0, %xmm04500; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [4286578688,4286578688,4286578688,4286578688]4501; AVX1-NEXT: vpmaxsd %xmm3, %xmm0, %xmm04502; AVX1-NEXT: vpmaxsd %xmm3, %xmm1, %xmm14503; AVX1-NEXT: vpmaxsd %xmm3, %xmm2, %xmm24504; AVX1-NEXT: vpmaxsd %xmm3, %xmm4, %xmm34505; AVX1-NEXT: vpextrd $3, %xmm3, %eax4506; AVX1-NEXT: movw %ax, 45(%rdi)4507; AVX1-NEXT: shrl $16, %eax4508; AVX1-NEXT: movb %al, 47(%rdi)4509; AVX1-NEXT: vpextrd $2, %xmm3, %eax4510; AVX1-NEXT: movw %ax, 42(%rdi)4511; AVX1-NEXT: shrl $16, %eax4512; AVX1-NEXT: movb %al, 44(%rdi)4513; AVX1-NEXT: vpextrd $1, %xmm3, %eax4514; AVX1-NEXT: movw %ax, 39(%rdi)4515; AVX1-NEXT: shrl $16, %eax4516; AVX1-NEXT: movb %al, 41(%rdi)4517; AVX1-NEXT: vmovd %xmm3, %eax4518; AVX1-NEXT: movw %ax, 36(%rdi)4519; AVX1-NEXT: shrl $16, %eax4520; AVX1-NEXT: movb %al, 38(%rdi)4521; AVX1-NEXT: vpextrd $3, %xmm2, %eax4522; AVX1-NEXT: movw %ax, 33(%rdi)4523; AVX1-NEXT: shrl $16, %eax4524; AVX1-NEXT: movb %al, 35(%rdi)4525; AVX1-NEXT: vpextrd $2, %xmm2, %eax4526; AVX1-NEXT: movw %ax, 30(%rdi)4527; AVX1-NEXT: shrl $16, %eax4528; AVX1-NEXT: movb %al, 32(%rdi)4529; AVX1-NEXT: vpextrd $1, %xmm2, %eax4530; AVX1-NEXT: movw %ax, 27(%rdi)4531; AVX1-NEXT: shrl $16, %eax4532; AVX1-NEXT: movb %al, 29(%rdi)4533; AVX1-NEXT: vmovd %xmm2, %eax4534; AVX1-NEXT: movw %ax, 24(%rdi)4535; AVX1-NEXT: shrl $16, %eax4536; AVX1-NEXT: movb %al, 26(%rdi)4537; AVX1-NEXT: vpextrd $3, %xmm1, %eax4538; AVX1-NEXT: movw %ax, 21(%rdi)4539; AVX1-NEXT: shrl $16, %eax4540; AVX1-NEXT: movb %al, 23(%rdi)4541; AVX1-NEXT: vpextrd $2, %xmm1, %eax4542; AVX1-NEXT: movw %ax, 18(%rdi)4543; AVX1-NEXT: shrl $16, %eax4544; AVX1-NEXT: movb %al, 20(%rdi)4545; AVX1-NEXT: vpextrd $1, %xmm1, %eax4546; AVX1-NEXT: movw %ax, 15(%rdi)4547; AVX1-NEXT: shrl $16, %eax4548; AVX1-NEXT: movb %al, 17(%rdi)4549; AVX1-NEXT: vmovd %xmm1, %eax4550; AVX1-NEXT: movw %ax, 12(%rdi)4551; AVX1-NEXT: shrl $16, %eax4552; AVX1-NEXT: movb %al, 14(%rdi)4553; AVX1-NEXT: vpextrd $3, %xmm0, %eax4554; AVX1-NEXT: movw %ax, 9(%rdi)4555; AVX1-NEXT: shrl $16, %eax4556; AVX1-NEXT: movb %al, 11(%rdi)4557; AVX1-NEXT: vpextrd $2, %xmm0, %eax4558; AVX1-NEXT: movw %ax, 6(%rdi)4559; AVX1-NEXT: shrl $16, %eax4560; AVX1-NEXT: movb %al, 8(%rdi)4561; AVX1-NEXT: vpextrd $1, %xmm0, %eax4562; AVX1-NEXT: movw %ax, 3(%rdi)4563; AVX1-NEXT: shrl $16, %eax4564; AVX1-NEXT: movb %al, 5(%rdi)4565; AVX1-NEXT: vmovd %xmm0, %eax4566; AVX1-NEXT: movw %ax, (%rdi)4567; AVX1-NEXT: shrl $16, %eax4568; AVX1-NEXT: movb %al, 2(%rdi)4569; AVX1-NEXT: vzeroupper4570; AVX1-NEXT: retq4571;4572; AVX2-LABEL: trunc_ssat_v16i32_v16i24:4573; AVX2: # %bb.0:4574; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [8388607,8388607,8388607,8388607,8388607,8388607,8388607,8388607]4575; AVX2-NEXT: vpminsd %ymm2, %ymm1, %ymm14576; AVX2-NEXT: vpminsd %ymm2, %ymm0, %ymm04577; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [4286578688,4286578688,4286578688,4286578688,4286578688,4286578688,4286578688,4286578688]4578; AVX2-NEXT: vpmaxsd %ymm2, %ymm0, %ymm04579; AVX2-NEXT: vpmaxsd %ymm2, %ymm1, %ymm14580; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm24581; AVX2-NEXT: vpextrd $3, %xmm2, %eax4582; AVX2-NEXT: movw %ax, 45(%rdi)4583; AVX2-NEXT: shrl $16, %eax4584; AVX2-NEXT: movb %al, 47(%rdi)4585; AVX2-NEXT: vpextrd $2, %xmm2, %eax4586; AVX2-NEXT: movw %ax, 42(%rdi)4587; AVX2-NEXT: shrl $16, %eax4588; AVX2-NEXT: movb %al, 44(%rdi)4589; AVX2-NEXT: vpextrd $1, %xmm2, %eax4590; AVX2-NEXT: movw %ax, 39(%rdi)4591; AVX2-NEXT: shrl $16, %eax4592; AVX2-NEXT: movb %al, 41(%rdi)4593; AVX2-NEXT: vmovd %xmm2, %eax4594; AVX2-NEXT: movw %ax, 36(%rdi)4595; AVX2-NEXT: shrl $16, %eax4596; AVX2-NEXT: movb %al, 38(%rdi)4597; AVX2-NEXT: vpextrd $3, %xmm1, %eax4598; AVX2-NEXT: movw %ax, 33(%rdi)4599; AVX2-NEXT: shrl $16, %eax4600; AVX2-NEXT: movb %al, 35(%rdi)4601; AVX2-NEXT: vpextrd $2, %xmm1, %eax4602; AVX2-NEXT: movw %ax, 30(%rdi)4603; AVX2-NEXT: shrl $16, %eax4604; AVX2-NEXT: movb %al, 32(%rdi)4605; AVX2-NEXT: vpextrd $1, %xmm1, %eax4606; AVX2-NEXT: movw %ax, 27(%rdi)4607; AVX2-NEXT: shrl $16, %eax4608; AVX2-NEXT: movb %al, 29(%rdi)4609; AVX2-NEXT: vmovd %xmm1, %eax4610; AVX2-NEXT: movw %ax, 24(%rdi)4611; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm14612; AVX2-NEXT: shrl $16, %eax4613; AVX2-NEXT: movb %al, 26(%rdi)4614; AVX2-NEXT: vpextrd $3, %xmm1, %eax4615; AVX2-NEXT: movw %ax, 21(%rdi)4616; AVX2-NEXT: shrl $16, %eax4617; AVX2-NEXT: movb %al, 23(%rdi)4618; AVX2-NEXT: vpextrd $2, %xmm1, %eax4619; AVX2-NEXT: movw %ax, 18(%rdi)4620; AVX2-NEXT: shrl $16, %eax4621; AVX2-NEXT: movb %al, 20(%rdi)4622; AVX2-NEXT: vpextrd $1, %xmm1, %eax4623; AVX2-NEXT: movw %ax, 15(%rdi)4624; AVX2-NEXT: shrl $16, %eax4625; AVX2-NEXT: movb %al, 17(%rdi)4626; AVX2-NEXT: vmovd %xmm1, %eax4627; AVX2-NEXT: movw %ax, 12(%rdi)4628; AVX2-NEXT: shrl $16, %eax4629; AVX2-NEXT: movb %al, 14(%rdi)4630; AVX2-NEXT: vpextrd $3, %xmm0, %eax4631; AVX2-NEXT: movw %ax, 9(%rdi)4632; AVX2-NEXT: shrl $16, %eax4633; AVX2-NEXT: movb %al, 11(%rdi)4634; AVX2-NEXT: vpextrd $2, %xmm0, %eax4635; AVX2-NEXT: movw %ax, 6(%rdi)4636; AVX2-NEXT: shrl $16, %eax4637; AVX2-NEXT: movb %al, 8(%rdi)4638; AVX2-NEXT: vpextrd $1, %xmm0, %eax4639; AVX2-NEXT: movw %ax, 3(%rdi)4640; AVX2-NEXT: shrl $16, %eax4641; AVX2-NEXT: movb %al, 5(%rdi)4642; AVX2-NEXT: vmovd %xmm0, %eax4643; AVX2-NEXT: movw %ax, (%rdi)4644; AVX2-NEXT: shrl $16, %eax4645; AVX2-NEXT: movb %al, 2(%rdi)4646; AVX2-NEXT: vzeroupper4647; AVX2-NEXT: retq4648;4649; AVX512-LABEL: trunc_ssat_v16i32_v16i24:4650; AVX512: # %bb.0:4651; AVX512-NEXT: pushq %rbp4652; AVX512-NEXT: pushq %r154653; AVX512-NEXT: pushq %r144654; AVX512-NEXT: pushq %rbx4655; AVX512-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm04656; AVX512-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm04657; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm14658; AVX512-NEXT: vpextrd $3, %xmm1, %r15d4659; AVX512-NEXT: movw %r15w, 45(%rdi)4660; AVX512-NEXT: vpextrd $2, %xmm1, %r14d4661; AVX512-NEXT: movw %r14w, 42(%rdi)4662; AVX512-NEXT: vpextrd $1, %xmm1, %ebp4663; AVX512-NEXT: movw %bp, 39(%rdi)4664; AVX512-NEXT: vmovd %xmm1, %r11d4665; AVX512-NEXT: movw %r11w, 36(%rdi)4666; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm14667; AVX512-NEXT: vpextrd $3, %xmm1, %ebx4668; AVX512-NEXT: movw %bx, 33(%rdi)4669; AVX512-NEXT: vpextrd $2, %xmm1, %r10d4670; AVX512-NEXT: movw %r10w, 30(%rdi)4671; AVX512-NEXT: vpextrd $1, %xmm1, %r9d4672; AVX512-NEXT: movw %r9w, 27(%rdi)4673; AVX512-NEXT: vmovd %xmm1, %r8d4674; AVX512-NEXT: movw %r8w, 24(%rdi)4675; AVX512-NEXT: vpextrd $3, %xmm0, %esi4676; AVX512-NEXT: movw %si, 9(%rdi)4677; AVX512-NEXT: vpextrd $2, %xmm0, %edx4678; AVX512-NEXT: movw %dx, 6(%rdi)4679; AVX512-NEXT: vpextrd $1, %xmm0, %ecx4680; AVX512-NEXT: movw %cx, 3(%rdi)4681; AVX512-NEXT: vmovd %xmm0, %eax4682; AVX512-NEXT: movw %ax, (%rdi)4683; AVX512-NEXT: shrl $16, %r15d4684; AVX512-NEXT: movb %r15b, 47(%rdi)4685; AVX512-NEXT: shrl $16, %r14d4686; AVX512-NEXT: movb %r14b, 44(%rdi)4687; AVX512-NEXT: shrl $16, %ebp4688; AVX512-NEXT: movb %bpl, 41(%rdi)4689; AVX512-NEXT: shrl $16, %r11d4690; AVX512-NEXT: movb %r11b, 38(%rdi)4691; AVX512-NEXT: shrl $16, %ebx4692; AVX512-NEXT: movb %bl, 35(%rdi)4693; AVX512-NEXT: shrl $16, %r10d4694; AVX512-NEXT: movb %r10b, 32(%rdi)4695; AVX512-NEXT: shrl $16, %r9d4696; AVX512-NEXT: movb %r9b, 29(%rdi)4697; AVX512-NEXT: shrl $16, %r8d4698; AVX512-NEXT: movb %r8b, 26(%rdi)4699; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm04700; AVX512-NEXT: vpextrd $3, %xmm0, %r11d4701; AVX512-NEXT: movw %r11w, 21(%rdi)4702; AVX512-NEXT: vpextrd $2, %xmm0, %r10d4703; AVX512-NEXT: movw %r10w, 18(%rdi)4704; AVX512-NEXT: vpextrd $1, %xmm0, %r9d4705; AVX512-NEXT: movw %r9w, 15(%rdi)4706; AVX512-NEXT: vmovd %xmm0, %r8d4707; AVX512-NEXT: movw %r8w, 12(%rdi)4708; AVX512-NEXT: shrl $16, %esi4709; AVX512-NEXT: movb %sil, 11(%rdi)4710; AVX512-NEXT: shrl $16, %edx4711; AVX512-NEXT: movb %dl, 8(%rdi)4712; AVX512-NEXT: shrl $16, %ecx4713; AVX512-NEXT: movb %cl, 5(%rdi)4714; AVX512-NEXT: shrl $16, %eax4715; AVX512-NEXT: movb %al, 2(%rdi)4716; AVX512-NEXT: shrl $16, %r11d4717; AVX512-NEXT: movb %r11b, 23(%rdi)4718; AVX512-NEXT: shrl $16, %r10d4719; AVX512-NEXT: movb %r10b, 20(%rdi)4720; AVX512-NEXT: shrl $16, %r9d4721; AVX512-NEXT: movb %r9b, 17(%rdi)4722; AVX512-NEXT: shrl $16, %r8d4723; AVX512-NEXT: movb %r8b, 14(%rdi)4724; AVX512-NEXT: popq %rbx4725; AVX512-NEXT: popq %r144726; AVX512-NEXT: popq %r154727; AVX512-NEXT: popq %rbp4728; AVX512-NEXT: vzeroupper4729; AVX512-NEXT: retq4730;4731; SKX-LABEL: trunc_ssat_v16i32_v16i24:4732; SKX: # %bb.0:4733; SKX-NEXT: pushq %rbp4734; SKX-NEXT: pushq %r154735; SKX-NEXT: pushq %r144736; SKX-NEXT: pushq %rbx4737; SKX-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm04738; SKX-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm04739; SKX-NEXT: vextracti32x4 $3, %zmm0, %xmm14740; SKX-NEXT: vpextrd $3, %xmm1, %r15d4741; SKX-NEXT: movw %r15w, 45(%rdi)4742; SKX-NEXT: vpextrd $2, %xmm1, %r14d4743; SKX-NEXT: movw %r14w, 42(%rdi)4744; SKX-NEXT: vpextrd $1, %xmm1, %ebp4745; SKX-NEXT: movw %bp, 39(%rdi)4746; SKX-NEXT: vmovd %xmm1, %r11d4747; SKX-NEXT: movw %r11w, 36(%rdi)4748; SKX-NEXT: vextracti32x4 $2, %zmm0, %xmm14749; SKX-NEXT: vpextrd $3, %xmm1, %ebx4750; SKX-NEXT: movw %bx, 33(%rdi)4751; SKX-NEXT: vpextrd $2, %xmm1, %r10d4752; SKX-NEXT: movw %r10w, 30(%rdi)4753; SKX-NEXT: vpextrd $1, %xmm1, %r9d4754; SKX-NEXT: movw %r9w, 27(%rdi)4755; SKX-NEXT: vmovd %xmm1, %r8d4756; SKX-NEXT: vpextrd $3, %xmm0, %edx4757; SKX-NEXT: movw %r8w, 24(%rdi)4758; SKX-NEXT: movw %dx, 9(%rdi)4759; SKX-NEXT: vpextrd $2, %xmm0, %esi4760; SKX-NEXT: vpextrd $1, %xmm0, %eax4761; SKX-NEXT: movw %si, 6(%rdi)4762; SKX-NEXT: movw %ax, 3(%rdi)4763; SKX-NEXT: vmovd %xmm0, %ecx4764; SKX-NEXT: movw %cx, (%rdi)4765; SKX-NEXT: shrl $16, %r15d4766; SKX-NEXT: movb %r15b, 47(%rdi)4767; SKX-NEXT: shrl $16, %r14d4768; SKX-NEXT: movb %r14b, 44(%rdi)4769; SKX-NEXT: shrl $16, %ebp4770; SKX-NEXT: movb %bpl, 41(%rdi)4771; SKX-NEXT: shrl $16, %r11d4772; SKX-NEXT: movb %r11b, 38(%rdi)4773; SKX-NEXT: shrl $16, %ebx4774; SKX-NEXT: movb %bl, 35(%rdi)4775; SKX-NEXT: shrl $16, %r10d4776; SKX-NEXT: movb %r10b, 32(%rdi)4777; SKX-NEXT: shrl $16, %r9d4778; SKX-NEXT: movb %r9b, 29(%rdi)4779; SKX-NEXT: shrl $16, %r8d4780; SKX-NEXT: movb %r8b, 26(%rdi)4781; SKX-NEXT: vextracti128 $1, %ymm0, %xmm04782; SKX-NEXT: vpextrd $3, %xmm0, %r11d4783; SKX-NEXT: movw %r11w, 21(%rdi)4784; SKX-NEXT: vpextrd $2, %xmm0, %r10d4785; SKX-NEXT: movw %r10w, 18(%rdi)4786; SKX-NEXT: vpextrd $1, %xmm0, %r9d4787; SKX-NEXT: movw %r9w, 15(%rdi)4788; SKX-NEXT: vmovd %xmm0, %r8d4789; SKX-NEXT: movw %r8w, 12(%rdi)4790; SKX-NEXT: shrl $16, %edx4791; SKX-NEXT: movb %dl, 11(%rdi)4792; SKX-NEXT: shrl $16, %esi4793; SKX-NEXT: movb %sil, 8(%rdi)4794; SKX-NEXT: shrl $16, %eax4795; SKX-NEXT: movb %al, 5(%rdi)4796; SKX-NEXT: shrl $16, %ecx4797; SKX-NEXT: movb %cl, 2(%rdi)4798; SKX-NEXT: shrl $16, %r11d4799; SKX-NEXT: movb %r11b, 23(%rdi)4800; SKX-NEXT: shrl $16, %r10d4801; SKX-NEXT: movb %r10b, 20(%rdi)4802; SKX-NEXT: shrl $16, %r9d4803; SKX-NEXT: movb %r9b, 17(%rdi)4804; SKX-NEXT: shrl $16, %r8d4805; SKX-NEXT: movb %r8b, 14(%rdi)4806; SKX-NEXT: popq %rbx4807; SKX-NEXT: popq %r144808; SKX-NEXT: popq %r154809; SKX-NEXT: popq %rbp4810; SKX-NEXT: vzeroupper4811; SKX-NEXT: retq4812 %a = call <16 x i32> @llvm.smin.v16i32(<16 x i32> %x, <16 x i32> <i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607>)4813 %b = call <16 x i32> @llvm.smax.v16i32(<16 x i32> %a, <16 x i32> <i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608>)4814 %c = trunc <16 x i32> %b to <16 x i24>4815 store <16 x i24> %c, ptr %y4816 ret void4817}4818declare <16 x i32> @llvm.smax.v16i32(<16 x i32>, <16 x i32>)4819declare <16 x i32> @llvm.smin.v16i32(<16 x i32>, <16 x i32>)4820