1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-SLOW 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL 10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW 11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL 12; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=skx | FileCheck %s --check-prefixes=SKX 13 14; 15; PACKUS saturation truncation to vXi32 16; 17 18define <2 x i32> @trunc_packus_v2i64_v2i32(<2 x i64> %a0) { 19; SSE2-LABEL: trunc_packus_v2i64_v2i32: 20; SSE2: # %bb.0: 21; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 22; SSE2-NEXT: movdqa %xmm0, %xmm2 23; SSE2-NEXT: pxor %xmm1, %xmm2 24; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483647,2147483647] 25; SSE2-NEXT: movdqa %xmm3, %xmm4 26; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 27; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 28; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 29; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 30; SSE2-NEXT: pand %xmm5, %xmm2 31; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 32; SSE2-NEXT: por %xmm2, %xmm3 33; SSE2-NEXT: pand %xmm3, %xmm0 34; SSE2-NEXT: pandn {{.*}}(%rip), %xmm3 35; SSE2-NEXT: por %xmm0, %xmm3 36; SSE2-NEXT: movdqa %xmm3, %xmm0 37; SSE2-NEXT: pxor %xmm1, %xmm0 38; SSE2-NEXT: movdqa %xmm0, %xmm2 39; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 40; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 41; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 42; SSE2-NEXT: pand %xmm2, %xmm0 43; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 44; SSE2-NEXT: por %xmm0, %xmm1 45; SSE2-NEXT: pand %xmm3, %xmm1 46; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 47; SSE2-NEXT: retq 48; 49; SSSE3-LABEL: trunc_packus_v2i64_v2i32: 50; SSSE3: # %bb.0: 51; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 52; SSSE3-NEXT: movdqa %xmm0, %xmm2 53; SSSE3-NEXT: pxor %xmm1, %xmm2 54; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483647,2147483647] 55; SSSE3-NEXT: movdqa %xmm3, %xmm4 56; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 57; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 58; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2 59; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 60; SSSE3-NEXT: pand %xmm5, %xmm2 61; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 62; SSSE3-NEXT: por %xmm2, %xmm3 63; SSSE3-NEXT: pand %xmm3, %xmm0 64; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm3 65; SSSE3-NEXT: por %xmm0, %xmm3 66; SSSE3-NEXT: movdqa %xmm3, %xmm0 67; SSSE3-NEXT: pxor %xmm1, %xmm0 68; SSSE3-NEXT: movdqa %xmm0, %xmm2 69; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 70; SSSE3-NEXT: pcmpeqd %xmm1, %xmm0 71; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 72; SSSE3-NEXT: pand %xmm2, %xmm0 73; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 74; SSSE3-NEXT: por %xmm0, %xmm1 75; SSSE3-NEXT: pand %xmm3, %xmm1 76; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 77; SSSE3-NEXT: retq 78; 79; SSE41-LABEL: trunc_packus_v2i64_v2i32: 80; SSE41: # %bb.0: 81; SSE41-NEXT: movdqa %xmm0, %xmm1 82; SSE41-NEXT: movapd {{.*#+}} xmm2 = [4294967295,4294967295] 83; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 84; SSE41-NEXT: pxor %xmm3, %xmm0 85; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483647,2147483647] 86; SSE41-NEXT: movdqa %xmm4, %xmm5 87; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 88; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 89; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 90; SSE41-NEXT: pand %xmm5, %xmm0 91; SSE41-NEXT: por %xmm4, %xmm0 92; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 93; SSE41-NEXT: xorpd %xmm1, %xmm1 94; SSE41-NEXT: movapd %xmm2, %xmm4 95; SSE41-NEXT: xorpd %xmm3, %xmm4 96; SSE41-NEXT: movapd %xmm4, %xmm5 97; SSE41-NEXT: pcmpeqd %xmm3, %xmm5 98; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 99; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 100; SSE41-NEXT: pand %xmm5, %xmm0 101; SSE41-NEXT: por %xmm4, %xmm0 102; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 103; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 104; SSE41-NEXT: retq 105; 106; AVX-LABEL: trunc_packus_v2i64_v2i32: 107; AVX: # %bb.0: 108; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [4294967295,4294967295] 109; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2 110; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 111; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1 112; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1 113; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0 114; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 115; AVX-NEXT: retq 116; 117; AVX512F-LABEL: trunc_packus_v2i64_v2i32: 118; AVX512F: # %bb.0: 119; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 120; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 121; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 122; AVX512F-NEXT: vpmovusqd %zmm0, %ymm0 123; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 124; AVX512F-NEXT: vzeroupper 125; AVX512F-NEXT: retq 126; 127; AVX512VL-LABEL: trunc_packus_v2i64_v2i32: 128; AVX512VL: # %bb.0: 129; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 130; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 131; AVX512VL-NEXT: vpmovusqd %xmm0, %xmm0 132; AVX512VL-NEXT: retq 133; 134; AVX512BW-LABEL: trunc_packus_v2i64_v2i32: 135; AVX512BW: # %bb.0: 136; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 137; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 138; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 139; AVX512BW-NEXT: vpmovusqd %zmm0, %ymm0 140; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 141; AVX512BW-NEXT: vzeroupper 142; AVX512BW-NEXT: retq 143; 144; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i32: 145; AVX512BWVL: # %bb.0: 146; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 147; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 148; AVX512BWVL-NEXT: vpmovusqd %xmm0, %xmm0 149; AVX512BWVL-NEXT: retq 150; 151; SKX-LABEL: trunc_packus_v2i64_v2i32: 152; SKX: # %bb.0: 153; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 154; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 155; SKX-NEXT: vpmovusqd %xmm0, %xmm0 156; SKX-NEXT: retq 157 %1 = icmp slt <2 x i64> %a0, <i64 4294967295, i64 4294967295> 158 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 4294967295, i64 4294967295> 159 %3 = icmp sgt <2 x i64> %2, zeroinitializer 160 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer 161 %5 = trunc <2 x i64> %4 to <2 x i32> 162 ret <2 x i32> %5 163} 164 165define void @trunc_packus_v2i64_v2i32_store(<2 x i64> %a0, <2 x i32>* %p1) { 166; SSE2-LABEL: trunc_packus_v2i64_v2i32_store: 167; SSE2: # %bb.0: 168; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 169; SSE2-NEXT: movdqa %xmm0, %xmm2 170; SSE2-NEXT: pxor %xmm1, %xmm2 171; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483647,2147483647] 172; SSE2-NEXT: movdqa %xmm3, %xmm4 173; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 174; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 175; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 176; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 177; SSE2-NEXT: pand %xmm5, %xmm2 178; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 179; SSE2-NEXT: por %xmm2, %xmm3 180; SSE2-NEXT: pand %xmm3, %xmm0 181; SSE2-NEXT: pandn {{.*}}(%rip), %xmm3 182; SSE2-NEXT: por %xmm0, %xmm3 183; SSE2-NEXT: movdqa %xmm3, %xmm0 184; SSE2-NEXT: pxor %xmm1, %xmm0 185; SSE2-NEXT: movdqa %xmm0, %xmm2 186; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 187; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 188; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 189; SSE2-NEXT: pand %xmm2, %xmm0 190; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 191; SSE2-NEXT: por %xmm0, %xmm1 192; SSE2-NEXT: pand %xmm3, %xmm1 193; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 194; SSE2-NEXT: movq %xmm0, (%rdi) 195; SSE2-NEXT: retq 196; 197; SSSE3-LABEL: trunc_packus_v2i64_v2i32_store: 198; SSSE3: # %bb.0: 199; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 200; SSSE3-NEXT: movdqa %xmm0, %xmm2 201; SSSE3-NEXT: pxor %xmm1, %xmm2 202; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483647,2147483647] 203; SSSE3-NEXT: movdqa %xmm3, %xmm4 204; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 205; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 206; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2 207; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 208; SSSE3-NEXT: pand %xmm5, %xmm2 209; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 210; SSSE3-NEXT: por %xmm2, %xmm3 211; SSSE3-NEXT: pand %xmm3, %xmm0 212; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm3 213; SSSE3-NEXT: por %xmm0, %xmm3 214; SSSE3-NEXT: movdqa %xmm3, %xmm0 215; SSSE3-NEXT: pxor %xmm1, %xmm0 216; SSSE3-NEXT: movdqa %xmm0, %xmm2 217; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 218; SSSE3-NEXT: pcmpeqd %xmm1, %xmm0 219; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 220; SSSE3-NEXT: pand %xmm2, %xmm0 221; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 222; SSSE3-NEXT: por %xmm0, %xmm1 223; SSSE3-NEXT: pand %xmm3, %xmm1 224; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 225; SSSE3-NEXT: movq %xmm0, (%rdi) 226; SSSE3-NEXT: retq 227; 228; SSE41-LABEL: trunc_packus_v2i64_v2i32_store: 229; SSE41: # %bb.0: 230; SSE41-NEXT: movdqa %xmm0, %xmm1 231; SSE41-NEXT: movapd {{.*#+}} xmm2 = [4294967295,4294967295] 232; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 233; SSE41-NEXT: pxor %xmm3, %xmm0 234; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483647,2147483647] 235; SSE41-NEXT: movdqa %xmm4, %xmm5 236; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 237; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 238; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 239; SSE41-NEXT: pand %xmm5, %xmm0 240; SSE41-NEXT: por %xmm4, %xmm0 241; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 242; SSE41-NEXT: xorpd %xmm1, %xmm1 243; SSE41-NEXT: movapd %xmm2, %xmm4 244; SSE41-NEXT: xorpd %xmm3, %xmm4 245; SSE41-NEXT: movapd %xmm4, %xmm5 246; SSE41-NEXT: pcmpeqd %xmm3, %xmm5 247; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 248; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 249; SSE41-NEXT: pand %xmm5, %xmm0 250; SSE41-NEXT: por %xmm4, %xmm0 251; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 252; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 253; SSE41-NEXT: movq %xmm0, (%rdi) 254; SSE41-NEXT: retq 255; 256; AVX-LABEL: trunc_packus_v2i64_v2i32_store: 257; AVX: # %bb.0: 258; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [4294967295,4294967295] 259; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2 260; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 261; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1 262; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1 263; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0 264; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 265; AVX-NEXT: vmovq %xmm0, (%rdi) 266; AVX-NEXT: retq 267; 268; AVX512F-LABEL: trunc_packus_v2i64_v2i32_store: 269; AVX512F: # %bb.0: 270; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 271; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 272; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 273; AVX512F-NEXT: vpmovusqd %zmm0, %ymm0 274; AVX512F-NEXT: vmovq %xmm0, (%rdi) 275; AVX512F-NEXT: vzeroupper 276; AVX512F-NEXT: retq 277; 278; AVX512VL-LABEL: trunc_packus_v2i64_v2i32_store: 279; AVX512VL: # %bb.0: 280; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 281; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 282; AVX512VL-NEXT: vpmovusqd %xmm0, (%rdi) 283; AVX512VL-NEXT: retq 284; 285; AVX512BW-LABEL: trunc_packus_v2i64_v2i32_store: 286; AVX512BW: # %bb.0: 287; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 288; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 289; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 290; AVX512BW-NEXT: vpmovusqd %zmm0, %ymm0 291; AVX512BW-NEXT: vmovq %xmm0, (%rdi) 292; AVX512BW-NEXT: vzeroupper 293; AVX512BW-NEXT: retq 294; 295; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i32_store: 296; AVX512BWVL: # %bb.0: 297; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 298; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 299; AVX512BWVL-NEXT: vpmovusqd %xmm0, (%rdi) 300; AVX512BWVL-NEXT: retq 301; 302; SKX-LABEL: trunc_packus_v2i64_v2i32_store: 303; SKX: # %bb.0: 304; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 305; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 306; SKX-NEXT: vpmovusqd %xmm0, (%rdi) 307; SKX-NEXT: retq 308 %1 = icmp slt <2 x i64> %a0, <i64 4294967295, i64 4294967295> 309 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 4294967295, i64 4294967295> 310 %3 = icmp sgt <2 x i64> %2, zeroinitializer 311 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer 312 %5 = trunc <2 x i64> %4 to <2 x i32> 313 store <2 x i32> %5, <2 x i32>* %p1 314 ret void 315} 316 317define <4 x i32> @trunc_packus_v4i64_v4i32(<4 x i64> %a0) { 318; SSE2-LABEL: trunc_packus_v4i64_v4i32: 319; SSE2: # %bb.0: 320; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295] 321; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 322; SSE2-NEXT: movdqa %xmm0, %xmm3 323; SSE2-NEXT: pxor %xmm2, %xmm3 324; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483647,2147483647] 325; SSE2-NEXT: movdqa %xmm5, %xmm6 326; SSE2-NEXT: pcmpgtd %xmm3, %xmm6 327; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 328; SSE2-NEXT: pcmpeqd %xmm5, %xmm3 329; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 330; SSE2-NEXT: pand %xmm7, %xmm4 331; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 332; SSE2-NEXT: por %xmm4, %xmm3 333; SSE2-NEXT: pand %xmm3, %xmm0 334; SSE2-NEXT: pandn %xmm8, %xmm3 335; SSE2-NEXT: por %xmm0, %xmm3 336; SSE2-NEXT: movdqa %xmm1, %xmm0 337; SSE2-NEXT: pxor %xmm2, %xmm0 338; SSE2-NEXT: movdqa %xmm5, %xmm4 339; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 340; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 341; SSE2-NEXT: pcmpeqd %xmm5, %xmm0 342; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 343; SSE2-NEXT: pand %xmm6, %xmm0 344; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 345; SSE2-NEXT: por %xmm0, %xmm4 346; SSE2-NEXT: pand %xmm4, %xmm1 347; SSE2-NEXT: pandn %xmm8, %xmm4 348; SSE2-NEXT: por %xmm1, %xmm4 349; SSE2-NEXT: movdqa %xmm4, %xmm0 350; SSE2-NEXT: pxor %xmm2, %xmm0 351; SSE2-NEXT: movdqa %xmm0, %xmm1 352; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 353; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 354; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 355; SSE2-NEXT: pand %xmm1, %xmm0 356; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 357; SSE2-NEXT: por %xmm0, %xmm1 358; SSE2-NEXT: pand %xmm4, %xmm1 359; SSE2-NEXT: movdqa %xmm3, %xmm0 360; SSE2-NEXT: pxor %xmm2, %xmm0 361; SSE2-NEXT: movdqa %xmm0, %xmm4 362; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 363; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 364; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] 365; SSE2-NEXT: pand %xmm4, %xmm2 366; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 367; SSE2-NEXT: por %xmm2, %xmm0 368; SSE2-NEXT: pand %xmm3, %xmm0 369; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 370; SSE2-NEXT: retq 371; 372; SSSE3-LABEL: trunc_packus_v4i64_v4i32: 373; SSSE3: # %bb.0: 374; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295] 375; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 376; SSSE3-NEXT: movdqa %xmm0, %xmm3 377; SSSE3-NEXT: pxor %xmm2, %xmm3 378; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483647,2147483647] 379; SSSE3-NEXT: movdqa %xmm5, %xmm6 380; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6 381; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 382; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3 383; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 384; SSSE3-NEXT: pand %xmm7, %xmm4 385; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 386; SSSE3-NEXT: por %xmm4, %xmm3 387; SSSE3-NEXT: pand %xmm3, %xmm0 388; SSSE3-NEXT: pandn %xmm8, %xmm3 389; SSSE3-NEXT: por %xmm0, %xmm3 390; SSSE3-NEXT: movdqa %xmm1, %xmm0 391; SSSE3-NEXT: pxor %xmm2, %xmm0 392; SSSE3-NEXT: movdqa %xmm5, %xmm4 393; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4 394; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 395; SSSE3-NEXT: pcmpeqd %xmm5, %xmm0 396; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 397; SSSE3-NEXT: pand %xmm6, %xmm0 398; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 399; SSSE3-NEXT: por %xmm0, %xmm4 400; SSSE3-NEXT: pand %xmm4, %xmm1 401; SSSE3-NEXT: pandn %xmm8, %xmm4 402; SSSE3-NEXT: por %xmm1, %xmm4 403; SSSE3-NEXT: movdqa %xmm4, %xmm0 404; SSSE3-NEXT: pxor %xmm2, %xmm0 405; SSSE3-NEXT: movdqa %xmm0, %xmm1 406; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 407; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0 408; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 409; SSSE3-NEXT: pand %xmm1, %xmm0 410; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 411; SSSE3-NEXT: por %xmm0, %xmm1 412; SSSE3-NEXT: pand %xmm4, %xmm1 413; SSSE3-NEXT: movdqa %xmm3, %xmm0 414; SSSE3-NEXT: pxor %xmm2, %xmm0 415; SSSE3-NEXT: movdqa %xmm0, %xmm4 416; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 417; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0 418; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] 419; SSSE3-NEXT: pand %xmm4, %xmm2 420; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 421; SSSE3-NEXT: por %xmm2, %xmm0 422; SSSE3-NEXT: pand %xmm3, %xmm0 423; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 424; SSSE3-NEXT: retq 425; 426; SSE41-LABEL: trunc_packus_v4i64_v4i32: 427; SSE41: # %bb.0: 428; SSE41-NEXT: movdqa %xmm0, %xmm2 429; SSE41-NEXT: movapd {{.*#+}} xmm4 = [4294967295,4294967295] 430; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 431; SSE41-NEXT: pxor %xmm3, %xmm0 432; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147483647,2147483647] 433; SSE41-NEXT: movdqa %xmm6, %xmm5 434; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 435; SSE41-NEXT: movdqa %xmm6, %xmm7 436; SSE41-NEXT: pcmpgtd %xmm0, %xmm7 437; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2] 438; SSE41-NEXT: pand %xmm5, %xmm0 439; SSE41-NEXT: por %xmm7, %xmm0 440; SSE41-NEXT: movapd %xmm4, %xmm5 441; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5 442; SSE41-NEXT: movdqa %xmm1, %xmm0 443; SSE41-NEXT: pxor %xmm3, %xmm0 444; SSE41-NEXT: movdqa %xmm6, %xmm2 445; SSE41-NEXT: pcmpeqd %xmm0, %xmm2 446; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 447; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 448; SSE41-NEXT: pand %xmm2, %xmm0 449; SSE41-NEXT: por %xmm6, %xmm0 450; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4 451; SSE41-NEXT: xorpd %xmm1, %xmm1 452; SSE41-NEXT: movapd %xmm4, %xmm2 453; SSE41-NEXT: xorpd %xmm3, %xmm2 454; SSE41-NEXT: movapd %xmm2, %xmm6 455; SSE41-NEXT: pcmpeqd %xmm3, %xmm6 456; SSE41-NEXT: pcmpgtd %xmm3, %xmm2 457; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2] 458; SSE41-NEXT: pand %xmm6, %xmm0 459; SSE41-NEXT: por %xmm2, %xmm0 460; SSE41-NEXT: pxor %xmm2, %xmm2 461; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2 462; SSE41-NEXT: movapd %xmm5, %xmm4 463; SSE41-NEXT: xorpd %xmm3, %xmm4 464; SSE41-NEXT: movapd %xmm4, %xmm6 465; SSE41-NEXT: pcmpeqd %xmm3, %xmm6 466; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 467; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 468; SSE41-NEXT: pand %xmm6, %xmm0 469; SSE41-NEXT: por %xmm4, %xmm0 470; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1 471; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2] 472; SSE41-NEXT: movaps %xmm1, %xmm0 473; SSE41-NEXT: retq 474; 475; AVX1-LABEL: trunc_packus_v4i64_v4i32: 476; AVX1: # %bb.0: 477; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 478; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [4294967295,4294967295] 479; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3 480; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm4 481; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm2, %xmm0 482; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 483; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5 484; AVX1-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm1 485; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm2 486; AVX1-NEXT: vpand %xmm1, %xmm2, %xmm1 487; AVX1-NEXT: vpand %xmm0, %xmm5, %xmm0 488; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 489; AVX1-NEXT: vzeroupper 490; AVX1-NEXT: retq 491; 492; AVX2-SLOW-LABEL: trunc_packus_v4i64_v4i32: 493; AVX2-SLOW: # %bb.0: 494; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295] 495; AVX2-SLOW-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2 496; AVX2-SLOW-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 497; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm1, %xmm1 498; AVX2-SLOW-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1 499; AVX2-SLOW-NEXT: vpand %ymm0, %ymm1, %ymm0 500; AVX2-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm1 501; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 502; AVX2-SLOW-NEXT: vzeroupper 503; AVX2-SLOW-NEXT: retq 504; 505; AVX2-FAST-LABEL: trunc_packus_v4i64_v4i32: 506; AVX2-FAST: # %bb.0: 507; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295] 508; AVX2-FAST-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2 509; AVX2-FAST-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 510; AVX2-FAST-NEXT: vpxor %xmm1, %xmm1, %xmm1 511; AVX2-FAST-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1 512; AVX2-FAST-NEXT: vpand %ymm0, %ymm1, %ymm0 513; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm1 = <0,2,4,6,u,u,u,u> 514; AVX2-FAST-NEXT: vpermd %ymm0, %ymm1, %ymm0 515; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 516; AVX2-FAST-NEXT: vzeroupper 517; AVX2-FAST-NEXT: retq 518; 519; AVX512F-LABEL: trunc_packus_v4i64_v4i32: 520; AVX512F: # %bb.0: 521; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 522; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 523; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 524; AVX512F-NEXT: vpmovusqd %zmm0, %ymm0 525; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 526; AVX512F-NEXT: vzeroupper 527; AVX512F-NEXT: retq 528; 529; AVX512VL-LABEL: trunc_packus_v4i64_v4i32: 530; AVX512VL: # %bb.0: 531; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 532; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 533; AVX512VL-NEXT: vpmovusqd %ymm0, %xmm0 534; AVX512VL-NEXT: vzeroupper 535; AVX512VL-NEXT: retq 536; 537; AVX512BW-LABEL: trunc_packus_v4i64_v4i32: 538; AVX512BW: # %bb.0: 539; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 540; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 541; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 542; AVX512BW-NEXT: vpmovusqd %zmm0, %ymm0 543; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 544; AVX512BW-NEXT: vzeroupper 545; AVX512BW-NEXT: retq 546; 547; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i32: 548; AVX512BWVL: # %bb.0: 549; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 550; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 551; AVX512BWVL-NEXT: vpmovusqd %ymm0, %xmm0 552; AVX512BWVL-NEXT: vzeroupper 553; AVX512BWVL-NEXT: retq 554; 555; SKX-LABEL: trunc_packus_v4i64_v4i32: 556; SKX: # %bb.0: 557; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 558; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 559; SKX-NEXT: vpmovusqd %ymm0, %xmm0 560; SKX-NEXT: vzeroupper 561; SKX-NEXT: retq 562 %1 = icmp slt <4 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 563 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 564 %3 = icmp sgt <4 x i64> %2, zeroinitializer 565 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer 566 %5 = trunc <4 x i64> %4 to <4 x i32> 567 ret <4 x i32> %5 568} 569 570 571define <8 x i32> @trunc_packus_v8i64_v8i32(<8 x i64>* %p0) "min-legal-vector-width"="256" { 572; SSE2-LABEL: trunc_packus_v8i64_v8i32: 573; SSE2: # %bb.0: 574; SSE2-NEXT: movdqa (%rdi), %xmm3 575; SSE2-NEXT: movdqa 16(%rdi), %xmm7 576; SSE2-NEXT: movdqa 32(%rdi), %xmm6 577; SSE2-NEXT: movdqa 48(%rdi), %xmm9 578; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295] 579; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648] 580; SSE2-NEXT: movdqa %xmm3, %xmm2 581; SSE2-NEXT: pxor %xmm0, %xmm2 582; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483647,2147483647] 583; SSE2-NEXT: movdqa %xmm10, %xmm5 584; SSE2-NEXT: pcmpgtd %xmm2, %xmm5 585; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2] 586; SSE2-NEXT: pcmpeqd %xmm10, %xmm2 587; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 588; SSE2-NEXT: pand %xmm1, %xmm4 589; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 590; SSE2-NEXT: por %xmm4, %xmm2 591; SSE2-NEXT: pand %xmm2, %xmm3 592; SSE2-NEXT: pandn %xmm8, %xmm2 593; SSE2-NEXT: por %xmm3, %xmm2 594; SSE2-NEXT: movdqa %xmm7, %xmm1 595; SSE2-NEXT: pxor %xmm0, %xmm1 596; SSE2-NEXT: movdqa %xmm10, %xmm3 597; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 598; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 599; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 600; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 601; SSE2-NEXT: pand %xmm4, %xmm1 602; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 603; SSE2-NEXT: por %xmm1, %xmm3 604; SSE2-NEXT: pand %xmm3, %xmm7 605; SSE2-NEXT: pandn %xmm8, %xmm3 606; SSE2-NEXT: por %xmm7, %xmm3 607; SSE2-NEXT: movdqa %xmm6, %xmm1 608; SSE2-NEXT: pxor %xmm0, %xmm1 609; SSE2-NEXT: movdqa %xmm10, %xmm4 610; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 611; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 612; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 613; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 614; SSE2-NEXT: pand %xmm5, %xmm1 615; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3] 616; SSE2-NEXT: por %xmm1, %xmm7 617; SSE2-NEXT: pand %xmm7, %xmm6 618; SSE2-NEXT: pandn %xmm8, %xmm7 619; SSE2-NEXT: por %xmm6, %xmm7 620; SSE2-NEXT: movdqa %xmm9, %xmm1 621; SSE2-NEXT: pxor %xmm0, %xmm1 622; SSE2-NEXT: movdqa %xmm10, %xmm4 623; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 624; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 625; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 626; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 627; SSE2-NEXT: pand %xmm5, %xmm1 628; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 629; SSE2-NEXT: por %xmm1, %xmm4 630; SSE2-NEXT: pand %xmm4, %xmm9 631; SSE2-NEXT: pandn %xmm8, %xmm4 632; SSE2-NEXT: por %xmm9, %xmm4 633; SSE2-NEXT: movdqa %xmm4, %xmm1 634; SSE2-NEXT: pxor %xmm0, %xmm1 635; SSE2-NEXT: movdqa %xmm1, %xmm5 636; SSE2-NEXT: pcmpgtd %xmm0, %xmm5 637; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 638; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 639; SSE2-NEXT: pand %xmm5, %xmm1 640; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 641; SSE2-NEXT: por %xmm1, %xmm5 642; SSE2-NEXT: pand %xmm4, %xmm5 643; SSE2-NEXT: movdqa %xmm7, %xmm1 644; SSE2-NEXT: pxor %xmm0, %xmm1 645; SSE2-NEXT: movdqa %xmm1, %xmm4 646; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 647; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 648; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3] 649; SSE2-NEXT: pand %xmm4, %xmm6 650; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3] 651; SSE2-NEXT: por %xmm6, %xmm1 652; SSE2-NEXT: pand %xmm7, %xmm1 653; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm5[0,2] 654; SSE2-NEXT: movdqa %xmm3, %xmm4 655; SSE2-NEXT: pxor %xmm0, %xmm4 656; SSE2-NEXT: movdqa %xmm4, %xmm5 657; SSE2-NEXT: pcmpgtd %xmm0, %xmm5 658; SSE2-NEXT: pcmpeqd %xmm0, %xmm4 659; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 660; SSE2-NEXT: pand %xmm5, %xmm4 661; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 662; SSE2-NEXT: por %xmm4, %xmm5 663; SSE2-NEXT: pand %xmm3, %xmm5 664; SSE2-NEXT: movdqa %xmm2, %xmm3 665; SSE2-NEXT: pxor %xmm0, %xmm3 666; SSE2-NEXT: movdqa %xmm3, %xmm4 667; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 668; SSE2-NEXT: pcmpeqd %xmm0, %xmm3 669; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 670; SSE2-NEXT: pand %xmm4, %xmm3 671; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 672; SSE2-NEXT: por %xmm3, %xmm0 673; SSE2-NEXT: pand %xmm2, %xmm0 674; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2] 675; SSE2-NEXT: retq 676; 677; SSSE3-LABEL: trunc_packus_v8i64_v8i32: 678; SSSE3: # %bb.0: 679; SSSE3-NEXT: movdqa (%rdi), %xmm3 680; SSSE3-NEXT: movdqa 16(%rdi), %xmm7 681; SSSE3-NEXT: movdqa 32(%rdi), %xmm6 682; SSSE3-NEXT: movdqa 48(%rdi), %xmm9 683; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295] 684; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648] 685; SSSE3-NEXT: movdqa %xmm3, %xmm2 686; SSSE3-NEXT: pxor %xmm0, %xmm2 687; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147483647,2147483647] 688; SSSE3-NEXT: movdqa %xmm10, %xmm5 689; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5 690; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2] 691; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2 692; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 693; SSSE3-NEXT: pand %xmm1, %xmm4 694; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 695; SSSE3-NEXT: por %xmm4, %xmm2 696; SSSE3-NEXT: pand %xmm2, %xmm3 697; SSSE3-NEXT: pandn %xmm8, %xmm2 698; SSSE3-NEXT: por %xmm3, %xmm2 699; SSSE3-NEXT: movdqa %xmm7, %xmm1 700; SSSE3-NEXT: pxor %xmm0, %xmm1 701; SSSE3-NEXT: movdqa %xmm10, %xmm3 702; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3 703; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 704; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1 705; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 706; SSSE3-NEXT: pand %xmm4, %xmm1 707; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 708; SSSE3-NEXT: por %xmm1, %xmm3 709; SSSE3-NEXT: pand %xmm3, %xmm7 710; SSSE3-NEXT: pandn %xmm8, %xmm3 711; SSSE3-NEXT: por %xmm7, %xmm3 712; SSSE3-NEXT: movdqa %xmm6, %xmm1 713; SSSE3-NEXT: pxor %xmm0, %xmm1 714; SSSE3-NEXT: movdqa %xmm10, %xmm4 715; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 716; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 717; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1 718; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 719; SSSE3-NEXT: pand %xmm5, %xmm1 720; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3] 721; SSSE3-NEXT: por %xmm1, %xmm7 722; SSSE3-NEXT: pand %xmm7, %xmm6 723; SSSE3-NEXT: pandn %xmm8, %xmm7 724; SSSE3-NEXT: por %xmm6, %xmm7 725; SSSE3-NEXT: movdqa %xmm9, %xmm1 726; SSSE3-NEXT: pxor %xmm0, %xmm1 727; SSSE3-NEXT: movdqa %xmm10, %xmm4 728; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 729; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 730; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1 731; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 732; SSSE3-NEXT: pand %xmm5, %xmm1 733; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 734; SSSE3-NEXT: por %xmm1, %xmm4 735; SSSE3-NEXT: pand %xmm4, %xmm9 736; SSSE3-NEXT: pandn %xmm8, %xmm4 737; SSSE3-NEXT: por %xmm9, %xmm4 738; SSSE3-NEXT: movdqa %xmm4, %xmm1 739; SSSE3-NEXT: pxor %xmm0, %xmm1 740; SSSE3-NEXT: movdqa %xmm1, %xmm5 741; SSSE3-NEXT: pcmpgtd %xmm0, %xmm5 742; SSSE3-NEXT: pcmpeqd %xmm0, %xmm1 743; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 744; SSSE3-NEXT: pand %xmm5, %xmm1 745; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 746; SSSE3-NEXT: por %xmm1, %xmm5 747; SSSE3-NEXT: pand %xmm4, %xmm5 748; SSSE3-NEXT: movdqa %xmm7, %xmm1 749; SSSE3-NEXT: pxor %xmm0, %xmm1 750; SSSE3-NEXT: movdqa %xmm1, %xmm4 751; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4 752; SSSE3-NEXT: pcmpeqd %xmm0, %xmm1 753; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3] 754; SSSE3-NEXT: pand %xmm4, %xmm6 755; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3] 756; SSSE3-NEXT: por %xmm6, %xmm1 757; SSSE3-NEXT: pand %xmm7, %xmm1 758; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm5[0,2] 759; SSSE3-NEXT: movdqa %xmm3, %xmm4 760; SSSE3-NEXT: pxor %xmm0, %xmm4 761; SSSE3-NEXT: movdqa %xmm4, %xmm5 762; SSSE3-NEXT: pcmpgtd %xmm0, %xmm5 763; SSSE3-NEXT: pcmpeqd %xmm0, %xmm4 764; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 765; SSSE3-NEXT: pand %xmm5, %xmm4 766; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 767; SSSE3-NEXT: por %xmm4, %xmm5 768; SSSE3-NEXT: pand %xmm3, %xmm5 769; SSSE3-NEXT: movdqa %xmm2, %xmm3 770; SSSE3-NEXT: pxor %xmm0, %xmm3 771; SSSE3-NEXT: movdqa %xmm3, %xmm4 772; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4 773; SSSE3-NEXT: pcmpeqd %xmm0, %xmm3 774; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 775; SSSE3-NEXT: pand %xmm4, %xmm3 776; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 777; SSSE3-NEXT: por %xmm3, %xmm0 778; SSSE3-NEXT: pand %xmm2, %xmm0 779; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2] 780; SSSE3-NEXT: retq 781; 782; SSE41-LABEL: trunc_packus_v8i64_v8i32: 783; SSE41: # %bb.0: 784; SSE41-NEXT: movdqa (%rdi), %xmm5 785; SSE41-NEXT: movdqa 16(%rdi), %xmm4 786; SSE41-NEXT: movdqa 32(%rdi), %xmm10 787; SSE41-NEXT: movdqa 48(%rdi), %xmm9 788; SSE41-NEXT: movapd {{.*#+}} xmm1 = [4294967295,4294967295] 789; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 790; SSE41-NEXT: movdqa %xmm5, %xmm0 791; SSE41-NEXT: pxor %xmm3, %xmm0 792; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483647,2147483647] 793; SSE41-NEXT: movdqa %xmm2, %xmm7 794; SSE41-NEXT: pcmpeqd %xmm0, %xmm7 795; SSE41-NEXT: movdqa %xmm2, %xmm6 796; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 797; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 798; SSE41-NEXT: pand %xmm7, %xmm0 799; SSE41-NEXT: por %xmm6, %xmm0 800; SSE41-NEXT: movapd %xmm1, %xmm8 801; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm8 802; SSE41-NEXT: movdqa %xmm4, %xmm0 803; SSE41-NEXT: pxor %xmm3, %xmm0 804; SSE41-NEXT: movdqa %xmm2, %xmm5 805; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 806; SSE41-NEXT: movdqa %xmm2, %xmm6 807; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 808; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 809; SSE41-NEXT: pand %xmm5, %xmm0 810; SSE41-NEXT: por %xmm6, %xmm0 811; SSE41-NEXT: movapd %xmm1, %xmm5 812; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm5 813; SSE41-NEXT: movdqa %xmm10, %xmm0 814; SSE41-NEXT: pxor %xmm3, %xmm0 815; SSE41-NEXT: movdqa %xmm2, %xmm4 816; SSE41-NEXT: pcmpeqd %xmm0, %xmm4 817; SSE41-NEXT: movdqa %xmm2, %xmm6 818; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 819; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 820; SSE41-NEXT: pand %xmm4, %xmm0 821; SSE41-NEXT: por %xmm6, %xmm0 822; SSE41-NEXT: movapd %xmm1, %xmm4 823; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm4 824; SSE41-NEXT: movdqa %xmm9, %xmm0 825; SSE41-NEXT: pxor %xmm3, %xmm0 826; SSE41-NEXT: movdqa %xmm2, %xmm6 827; SSE41-NEXT: pcmpeqd %xmm0, %xmm6 828; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 829; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2] 830; SSE41-NEXT: pand %xmm6, %xmm0 831; SSE41-NEXT: por %xmm2, %xmm0 832; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm1 833; SSE41-NEXT: pxor %xmm2, %xmm2 834; SSE41-NEXT: movapd %xmm1, %xmm6 835; SSE41-NEXT: xorpd %xmm3, %xmm6 836; SSE41-NEXT: movapd %xmm6, %xmm7 837; SSE41-NEXT: pcmpeqd %xmm3, %xmm7 838; SSE41-NEXT: pcmpgtd %xmm3, %xmm6 839; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 840; SSE41-NEXT: pand %xmm7, %xmm0 841; SSE41-NEXT: por %xmm6, %xmm0 842; SSE41-NEXT: pxor %xmm6, %xmm6 843; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm6 844; SSE41-NEXT: movapd %xmm4, %xmm1 845; SSE41-NEXT: xorpd %xmm3, %xmm1 846; SSE41-NEXT: movapd %xmm1, %xmm7 847; SSE41-NEXT: pcmpeqd %xmm3, %xmm7 848; SSE41-NEXT: pcmpgtd %xmm3, %xmm1 849; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2] 850; SSE41-NEXT: pand %xmm7, %xmm0 851; SSE41-NEXT: por %xmm1, %xmm0 852; SSE41-NEXT: pxor %xmm1, %xmm1 853; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm1 854; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm6[0,2] 855; SSE41-NEXT: movapd %xmm5, %xmm4 856; SSE41-NEXT: xorpd %xmm3, %xmm4 857; SSE41-NEXT: movapd %xmm4, %xmm6 858; SSE41-NEXT: pcmpeqd %xmm3, %xmm6 859; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 860; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 861; SSE41-NEXT: pand %xmm6, %xmm0 862; SSE41-NEXT: por %xmm4, %xmm0 863; SSE41-NEXT: pxor %xmm4, %xmm4 864; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm4 865; SSE41-NEXT: movapd %xmm8, %xmm5 866; SSE41-NEXT: xorpd %xmm3, %xmm5 867; SSE41-NEXT: movapd %xmm5, %xmm6 868; SSE41-NEXT: pcmpeqd %xmm3, %xmm6 869; SSE41-NEXT: pcmpgtd %xmm3, %xmm5 870; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2] 871; SSE41-NEXT: pand %xmm6, %xmm0 872; SSE41-NEXT: por %xmm5, %xmm0 873; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm2 874; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm4[0,2] 875; SSE41-NEXT: movaps %xmm2, %xmm0 876; SSE41-NEXT: retq 877; 878; AVX1-LABEL: trunc_packus_v8i64_v8i32: 879; AVX1: # %bb.0: 880; AVX1-NEXT: vmovdqa (%rdi), %xmm0 881; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1 882; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2 883; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3 884; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [4294967295,4294967295] 885; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm8 886; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm6 887; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm7 888; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5 889; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0 890; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5 891; AVX1-NEXT: vpcmpgtq %xmm5, %xmm0, %xmm9 892; AVX1-NEXT: vblendvpd %xmm7, %xmm2, %xmm4, %xmm2 893; AVX1-NEXT: vpcmpgtq %xmm5, %xmm2, %xmm7 894; AVX1-NEXT: vblendvpd %xmm6, %xmm1, %xmm4, %xmm1 895; AVX1-NEXT: vpcmpgtq %xmm5, %xmm1, %xmm6 896; AVX1-NEXT: vblendvpd %xmm8, %xmm3, %xmm4, %xmm3 897; AVX1-NEXT: vpcmpgtq %xmm5, %xmm3, %xmm4 898; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm3 899; AVX1-NEXT: vpand %xmm1, %xmm6, %xmm1 900; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 901; AVX1-NEXT: vpand %xmm2, %xmm7, %xmm2 902; AVX1-NEXT: vpand %xmm0, %xmm9, %xmm0 903; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 904; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6] 905; AVX1-NEXT: retq 906; 907; AVX2-SLOW-LABEL: trunc_packus_v8i64_v8i32: 908; AVX2-SLOW: # %bb.0: 909; AVX2-SLOW-NEXT: vmovdqa (%rdi), %ymm0 910; AVX2-SLOW-NEXT: vmovdqa 32(%rdi), %ymm1 911; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295] 912; AVX2-SLOW-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3 913; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 914; AVX2-SLOW-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3 915; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 916; AVX2-SLOW-NEXT: vpxor %xmm2, %xmm2, %xmm2 917; AVX2-SLOW-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3 918; AVX2-SLOW-NEXT: vpand %ymm1, %ymm3, %ymm1 919; AVX2-SLOW-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2 920; AVX2-SLOW-NEXT: vpand %ymm0, %ymm2, %ymm0 921; AVX2-SLOW-NEXT: vperm2i128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3] 922; AVX2-SLOW-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 923; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6] 924; AVX2-SLOW-NEXT: retq 925; 926; AVX2-FAST-LABEL: trunc_packus_v8i64_v8i32: 927; AVX2-FAST: # %bb.0: 928; AVX2-FAST-NEXT: vmovdqa (%rdi), %ymm0 929; AVX2-FAST-NEXT: vmovdqa 32(%rdi), %ymm1 930; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295] 931; AVX2-FAST-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3 932; AVX2-FAST-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 933; AVX2-FAST-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3 934; AVX2-FAST-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 935; AVX2-FAST-NEXT: vpxor %xmm2, %xmm2, %xmm2 936; AVX2-FAST-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3 937; AVX2-FAST-NEXT: vpand %ymm1, %ymm3, %ymm1 938; AVX2-FAST-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2 939; AVX2-FAST-NEXT: vpand %ymm0, %ymm2, %ymm0 940; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 941; AVX2-FAST-NEXT: vpermd %ymm0, %ymm2, %ymm0 942; AVX2-FAST-NEXT: vpermd %ymm1, %ymm2, %ymm1 943; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 944; AVX2-FAST-NEXT: retq 945; 946; AVX512-LABEL: trunc_packus_v8i64_v8i32: 947; AVX512: # %bb.0: 948; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0 949; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm0 950; AVX512-NEXT: vpmovusqd %zmm0, %ymm0 951; AVX512-NEXT: retq 952; 953; SKX-LABEL: trunc_packus_v8i64_v8i32: 954; SKX: # %bb.0: 955; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm0 956; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm1 957; SKX-NEXT: vpmovusqd %ymm1, %xmm1 958; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm0 959; SKX-NEXT: vpmovusqd %ymm0, %xmm0 960; SKX-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 961; SKX-NEXT: retq 962 %a0 = load <8 x i64>, <8 x i64>* %p0 963 %1 = icmp slt <8 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 964 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 965 %3 = icmp sgt <8 x i64> %2, zeroinitializer 966 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer 967 %5 = trunc <8 x i64> %4 to <8 x i32> 968 ret <8 x i32> %5 969} 970 971; 972; PACKUS saturation truncation to vXi16 973; 974 975define <2 x i16> @trunc_packus_v2i64_v2i16(<2 x i64> %a0) { 976; SSE2-LABEL: trunc_packus_v2i64_v2i16: 977; SSE2: # %bb.0: 978; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 979; SSE2-NEXT: movdqa %xmm0, %xmm2 980; SSE2-NEXT: pxor %xmm1, %xmm2 981; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147549183,2147549183] 982; SSE2-NEXT: movdqa %xmm3, %xmm4 983; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 984; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 985; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 986; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 987; SSE2-NEXT: pand %xmm5, %xmm2 988; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 989; SSE2-NEXT: por %xmm2, %xmm3 990; SSE2-NEXT: pand %xmm3, %xmm0 991; SSE2-NEXT: pandn {{.*}}(%rip), %xmm3 992; SSE2-NEXT: por %xmm0, %xmm3 993; SSE2-NEXT: movdqa %xmm3, %xmm0 994; SSE2-NEXT: pxor %xmm1, %xmm0 995; SSE2-NEXT: movdqa %xmm0, %xmm2 996; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 997; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 998; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 999; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1000; SSE2-NEXT: pand %xmm4, %xmm0 1001; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 1002; SSE2-NEXT: por %xmm0, %xmm1 1003; SSE2-NEXT: pand %xmm3, %xmm1 1004; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1005; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1006; SSE2-NEXT: retq 1007; 1008; SSSE3-LABEL: trunc_packus_v2i64_v2i16: 1009; SSSE3: # %bb.0: 1010; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 1011; SSSE3-NEXT: movdqa %xmm0, %xmm2 1012; SSSE3-NEXT: pxor %xmm1, %xmm2 1013; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147549183,2147549183] 1014; SSSE3-NEXT: movdqa %xmm3, %xmm4 1015; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 1016; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1017; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2 1018; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1019; SSSE3-NEXT: pand %xmm5, %xmm2 1020; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1021; SSSE3-NEXT: por %xmm2, %xmm3 1022; SSSE3-NEXT: pand %xmm3, %xmm0 1023; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm3 1024; SSSE3-NEXT: por %xmm0, %xmm3 1025; SSSE3-NEXT: movdqa %xmm3, %xmm0 1026; SSSE3-NEXT: pxor %xmm1, %xmm0 1027; SSSE3-NEXT: movdqa %xmm0, %xmm2 1028; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 1029; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1030; SSSE3-NEXT: pcmpeqd %xmm1, %xmm0 1031; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1032; SSSE3-NEXT: pand %xmm4, %xmm0 1033; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 1034; SSSE3-NEXT: por %xmm0, %xmm1 1035; SSSE3-NEXT: pand %xmm3, %xmm1 1036; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1037; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1038; SSSE3-NEXT: retq 1039; 1040; SSE41-LABEL: trunc_packus_v2i64_v2i16: 1041; SSE41: # %bb.0: 1042; SSE41-NEXT: movdqa %xmm0, %xmm1 1043; SSE41-NEXT: movapd {{.*#+}} xmm2 = [65535,65535] 1044; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 1045; SSE41-NEXT: pxor %xmm3, %xmm0 1046; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147549183,2147549183] 1047; SSE41-NEXT: movdqa %xmm4, %xmm5 1048; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 1049; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 1050; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 1051; SSE41-NEXT: pand %xmm5, %xmm0 1052; SSE41-NEXT: por %xmm4, %xmm0 1053; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 1054; SSE41-NEXT: xorpd %xmm1, %xmm1 1055; SSE41-NEXT: movapd %xmm2, %xmm4 1056; SSE41-NEXT: xorpd %xmm3, %xmm4 1057; SSE41-NEXT: movapd %xmm4, %xmm5 1058; SSE41-NEXT: pcmpeqd %xmm3, %xmm5 1059; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 1060; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 1061; SSE41-NEXT: pand %xmm5, %xmm0 1062; SSE41-NEXT: por %xmm4, %xmm0 1063; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 1064; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1065; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1066; SSE41-NEXT: retq 1067; 1068; AVX1-LABEL: trunc_packus_v2i64_v2i16: 1069; AVX1: # %bb.0: 1070; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [65535,65535] 1071; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2 1072; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 1073; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 1074; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1 1075; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0 1076; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1077; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1078; AVX1-NEXT: retq 1079; 1080; AVX2-SLOW-LABEL: trunc_packus_v2i64_v2i16: 1081; AVX2-SLOW: # %bb.0: 1082; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm1 = [65535,65535] 1083; AVX2-SLOW-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2 1084; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 1085; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm1, %xmm1 1086; AVX2-SLOW-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1 1087; AVX2-SLOW-NEXT: vpand %xmm0, %xmm1, %xmm0 1088; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1089; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1090; AVX2-SLOW-NEXT: retq 1091; 1092; AVX2-FAST-LABEL: trunc_packus_v2i64_v2i16: 1093; AVX2-FAST: # %bb.0: 1094; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm1 = [65535,65535] 1095; AVX2-FAST-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2 1096; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 1097; AVX2-FAST-NEXT: vpxor %xmm1, %xmm1, %xmm1 1098; AVX2-FAST-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1 1099; AVX2-FAST-NEXT: vpand %xmm0, %xmm1, %xmm0 1100; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15] 1101; AVX2-FAST-NEXT: retq 1102; 1103; AVX512F-LABEL: trunc_packus_v2i64_v2i16: 1104; AVX512F: # %bb.0: 1105; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1106; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 1107; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 1108; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0 1109; AVX512F-NEXT: vzeroupper 1110; AVX512F-NEXT: retq 1111; 1112; AVX512VL-LABEL: trunc_packus_v2i64_v2i16: 1113; AVX512VL: # %bb.0: 1114; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1115; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 1116; AVX512VL-NEXT: vpmovusqw %xmm0, %xmm0 1117; AVX512VL-NEXT: retq 1118; 1119; AVX512BW-LABEL: trunc_packus_v2i64_v2i16: 1120; AVX512BW: # %bb.0: 1121; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1122; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 1123; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 1124; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0 1125; AVX512BW-NEXT: vzeroupper 1126; AVX512BW-NEXT: retq 1127; 1128; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i16: 1129; AVX512BWVL: # %bb.0: 1130; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1131; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 1132; AVX512BWVL-NEXT: vpmovusqw %xmm0, %xmm0 1133; AVX512BWVL-NEXT: retq 1134; 1135; SKX-LABEL: trunc_packus_v2i64_v2i16: 1136; SKX: # %bb.0: 1137; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 1138; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 1139; SKX-NEXT: vpmovusqw %xmm0, %xmm0 1140; SKX-NEXT: retq 1141 %1 = icmp slt <2 x i64> %a0, <i64 65535, i64 65535> 1142 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 65535, i64 65535> 1143 %3 = icmp sgt <2 x i64> %2, zeroinitializer 1144 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer 1145 %5 = trunc <2 x i64> %4 to <2 x i16> 1146 ret <2 x i16> %5 1147} 1148 1149define void @trunc_packus_v2i64_v2i16_store(<2 x i64> %a0, <2 x i16> *%p1) { 1150; SSE2-LABEL: trunc_packus_v2i64_v2i16_store: 1151; SSE2: # %bb.0: 1152; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 1153; SSE2-NEXT: movdqa %xmm0, %xmm2 1154; SSE2-NEXT: pxor %xmm1, %xmm2 1155; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147549183,2147549183] 1156; SSE2-NEXT: movdqa %xmm3, %xmm4 1157; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 1158; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1159; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 1160; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1161; SSE2-NEXT: pand %xmm5, %xmm2 1162; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1163; SSE2-NEXT: por %xmm2, %xmm3 1164; SSE2-NEXT: pand %xmm3, %xmm0 1165; SSE2-NEXT: pandn {{.*}}(%rip), %xmm3 1166; SSE2-NEXT: por %xmm0, %xmm3 1167; SSE2-NEXT: movdqa %xmm3, %xmm0 1168; SSE2-NEXT: pxor %xmm1, %xmm0 1169; SSE2-NEXT: movdqa %xmm0, %xmm2 1170; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 1171; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1172; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 1173; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1174; SSE2-NEXT: pand %xmm4, %xmm0 1175; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 1176; SSE2-NEXT: por %xmm0, %xmm1 1177; SSE2-NEXT: pand %xmm3, %xmm1 1178; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1179; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1180; SSE2-NEXT: movd %xmm0, (%rdi) 1181; SSE2-NEXT: retq 1182; 1183; SSSE3-LABEL: trunc_packus_v2i64_v2i16_store: 1184; SSSE3: # %bb.0: 1185; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 1186; SSSE3-NEXT: movdqa %xmm0, %xmm2 1187; SSSE3-NEXT: pxor %xmm1, %xmm2 1188; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147549183,2147549183] 1189; SSSE3-NEXT: movdqa %xmm3, %xmm4 1190; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 1191; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1192; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2 1193; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1194; SSSE3-NEXT: pand %xmm5, %xmm2 1195; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1196; SSSE3-NEXT: por %xmm2, %xmm3 1197; SSSE3-NEXT: pand %xmm3, %xmm0 1198; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm3 1199; SSSE3-NEXT: por %xmm0, %xmm3 1200; SSSE3-NEXT: movdqa %xmm3, %xmm0 1201; SSSE3-NEXT: pxor %xmm1, %xmm0 1202; SSSE3-NEXT: movdqa %xmm0, %xmm2 1203; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 1204; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1205; SSSE3-NEXT: pcmpeqd %xmm1, %xmm0 1206; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1207; SSSE3-NEXT: pand %xmm4, %xmm0 1208; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 1209; SSSE3-NEXT: por %xmm0, %xmm1 1210; SSSE3-NEXT: pand %xmm3, %xmm1 1211; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1212; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1213; SSSE3-NEXT: movd %xmm0, (%rdi) 1214; SSSE3-NEXT: retq 1215; 1216; SSE41-LABEL: trunc_packus_v2i64_v2i16_store: 1217; SSE41: # %bb.0: 1218; SSE41-NEXT: movdqa %xmm0, %xmm1 1219; SSE41-NEXT: movapd {{.*#+}} xmm2 = [65535,65535] 1220; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 1221; SSE41-NEXT: pxor %xmm3, %xmm0 1222; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147549183,2147549183] 1223; SSE41-NEXT: movdqa %xmm4, %xmm5 1224; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 1225; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 1226; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 1227; SSE41-NEXT: pand %xmm5, %xmm0 1228; SSE41-NEXT: por %xmm4, %xmm0 1229; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 1230; SSE41-NEXT: xorpd %xmm1, %xmm1 1231; SSE41-NEXT: movapd %xmm2, %xmm4 1232; SSE41-NEXT: xorpd %xmm3, %xmm4 1233; SSE41-NEXT: movapd %xmm4, %xmm5 1234; SSE41-NEXT: pcmpeqd %xmm3, %xmm5 1235; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 1236; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 1237; SSE41-NEXT: pand %xmm5, %xmm0 1238; SSE41-NEXT: por %xmm4, %xmm0 1239; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 1240; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1241; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1242; SSE41-NEXT: movd %xmm0, (%rdi) 1243; SSE41-NEXT: retq 1244; 1245; AVX1-LABEL: trunc_packus_v2i64_v2i16_store: 1246; AVX1: # %bb.0: 1247; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [65535,65535] 1248; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2 1249; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 1250; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 1251; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1 1252; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0 1253; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1254; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1255; AVX1-NEXT: vmovd %xmm0, (%rdi) 1256; AVX1-NEXT: retq 1257; 1258; AVX2-SLOW-LABEL: trunc_packus_v2i64_v2i16_store: 1259; AVX2-SLOW: # %bb.0: 1260; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm1 = [65535,65535] 1261; AVX2-SLOW-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2 1262; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 1263; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm1, %xmm1 1264; AVX2-SLOW-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1 1265; AVX2-SLOW-NEXT: vpand %xmm0, %xmm1, %xmm0 1266; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1267; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1268; AVX2-SLOW-NEXT: vmovd %xmm0, (%rdi) 1269; AVX2-SLOW-NEXT: retq 1270; 1271; AVX2-FAST-LABEL: trunc_packus_v2i64_v2i16_store: 1272; AVX2-FAST: # %bb.0: 1273; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm1 = [65535,65535] 1274; AVX2-FAST-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2 1275; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 1276; AVX2-FAST-NEXT: vpxor %xmm1, %xmm1, %xmm1 1277; AVX2-FAST-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1 1278; AVX2-FAST-NEXT: vpand %xmm0, %xmm1, %xmm0 1279; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,u,u,u,u,u,u,u,u,u,u] 1280; AVX2-FAST-NEXT: vmovd %xmm0, (%rdi) 1281; AVX2-FAST-NEXT: retq 1282; 1283; AVX512F-LABEL: trunc_packus_v2i64_v2i16_store: 1284; AVX512F: # %bb.0: 1285; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1286; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 1287; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 1288; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0 1289; AVX512F-NEXT: vmovd %xmm0, (%rdi) 1290; AVX512F-NEXT: vzeroupper 1291; AVX512F-NEXT: retq 1292; 1293; AVX512VL-LABEL: trunc_packus_v2i64_v2i16_store: 1294; AVX512VL: # %bb.0: 1295; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1296; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 1297; AVX512VL-NEXT: vpmovusqw %xmm0, (%rdi) 1298; AVX512VL-NEXT: retq 1299; 1300; AVX512BW-LABEL: trunc_packus_v2i64_v2i16_store: 1301; AVX512BW: # %bb.0: 1302; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 1303; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 1304; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 1305; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0 1306; AVX512BW-NEXT: vmovd %xmm0, (%rdi) 1307; AVX512BW-NEXT: vzeroupper 1308; AVX512BW-NEXT: retq 1309; 1310; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i16_store: 1311; AVX512BWVL: # %bb.0: 1312; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1313; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 1314; AVX512BWVL-NEXT: vpmovusqw %xmm0, (%rdi) 1315; AVX512BWVL-NEXT: retq 1316; 1317; SKX-LABEL: trunc_packus_v2i64_v2i16_store: 1318; SKX: # %bb.0: 1319; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 1320; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 1321; SKX-NEXT: vpmovusqw %xmm0, (%rdi) 1322; SKX-NEXT: retq 1323 %1 = icmp slt <2 x i64> %a0, <i64 65535, i64 65535> 1324 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 65535, i64 65535> 1325 %3 = icmp sgt <2 x i64> %2, zeroinitializer 1326 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer 1327 %5 = trunc <2 x i64> %4 to <2 x i16> 1328 store <2 x i16> %5, <2 x i16> *%p1 1329 ret void 1330} 1331 1332define <4 x i16> @trunc_packus_v4i64_v4i16(<4 x i64> %a0) { 1333; SSE2-LABEL: trunc_packus_v4i64_v4i16: 1334; SSE2: # %bb.0: 1335; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535] 1336; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 1337; SSE2-NEXT: movdqa %xmm1, %xmm3 1338; SSE2-NEXT: pxor %xmm2, %xmm3 1339; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183] 1340; SSE2-NEXT: movdqa %xmm5, %xmm6 1341; SSE2-NEXT: pcmpgtd %xmm3, %xmm6 1342; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 1343; SSE2-NEXT: pcmpeqd %xmm5, %xmm3 1344; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 1345; SSE2-NEXT: pand %xmm7, %xmm4 1346; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 1347; SSE2-NEXT: por %xmm4, %xmm3 1348; SSE2-NEXT: pand %xmm3, %xmm1 1349; SSE2-NEXT: pandn %xmm8, %xmm3 1350; SSE2-NEXT: por %xmm1, %xmm3 1351; SSE2-NEXT: movdqa %xmm0, %xmm1 1352; SSE2-NEXT: pxor %xmm2, %xmm1 1353; SSE2-NEXT: movdqa %xmm5, %xmm4 1354; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 1355; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 1356; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 1357; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1358; SSE2-NEXT: pand %xmm6, %xmm1 1359; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1360; SSE2-NEXT: por %xmm1, %xmm4 1361; SSE2-NEXT: pand %xmm4, %xmm0 1362; SSE2-NEXT: pandn %xmm8, %xmm4 1363; SSE2-NEXT: por %xmm0, %xmm4 1364; SSE2-NEXT: movdqa %xmm4, %xmm0 1365; SSE2-NEXT: pxor %xmm2, %xmm0 1366; SSE2-NEXT: movdqa %xmm0, %xmm1 1367; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 1368; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] 1369; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 1370; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1371; SSE2-NEXT: pand %xmm5, %xmm0 1372; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1373; SSE2-NEXT: por %xmm0, %xmm1 1374; SSE2-NEXT: pand %xmm4, %xmm1 1375; SSE2-NEXT: movdqa %xmm3, %xmm0 1376; SSE2-NEXT: pxor %xmm2, %xmm0 1377; SSE2-NEXT: movdqa %xmm0, %xmm4 1378; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 1379; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1380; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 1381; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1382; SSE2-NEXT: pand %xmm5, %xmm0 1383; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 1384; SSE2-NEXT: por %xmm0, %xmm2 1385; SSE2-NEXT: pand %xmm3, %xmm2 1386; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 1387; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[0,2,2,3,4,5,6,7] 1388; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1389; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1390; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1391; SSE2-NEXT: retq 1392; 1393; SSSE3-LABEL: trunc_packus_v4i64_v4i16: 1394; SSSE3: # %bb.0: 1395; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535] 1396; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 1397; SSSE3-NEXT: movdqa %xmm1, %xmm3 1398; SSSE3-NEXT: pxor %xmm2, %xmm3 1399; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183] 1400; SSSE3-NEXT: movdqa %xmm5, %xmm6 1401; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6 1402; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 1403; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3 1404; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 1405; SSSE3-NEXT: pand %xmm7, %xmm4 1406; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 1407; SSSE3-NEXT: por %xmm4, %xmm3 1408; SSSE3-NEXT: pand %xmm3, %xmm1 1409; SSSE3-NEXT: pandn %xmm8, %xmm3 1410; SSSE3-NEXT: por %xmm1, %xmm3 1411; SSSE3-NEXT: movdqa %xmm0, %xmm1 1412; SSSE3-NEXT: pxor %xmm2, %xmm1 1413; SSSE3-NEXT: movdqa %xmm5, %xmm4 1414; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 1415; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 1416; SSSE3-NEXT: pcmpeqd %xmm5, %xmm1 1417; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1418; SSSE3-NEXT: pand %xmm6, %xmm1 1419; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1420; SSSE3-NEXT: por %xmm1, %xmm4 1421; SSSE3-NEXT: pand %xmm4, %xmm0 1422; SSSE3-NEXT: pandn %xmm8, %xmm4 1423; SSSE3-NEXT: por %xmm0, %xmm4 1424; SSSE3-NEXT: movdqa %xmm4, %xmm0 1425; SSSE3-NEXT: pxor %xmm2, %xmm0 1426; SSSE3-NEXT: movdqa %xmm0, %xmm1 1427; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 1428; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] 1429; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0 1430; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1431; SSSE3-NEXT: pand %xmm5, %xmm0 1432; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1433; SSSE3-NEXT: por %xmm0, %xmm1 1434; SSSE3-NEXT: pand %xmm4, %xmm1 1435; SSSE3-NEXT: movdqa %xmm3, %xmm0 1436; SSSE3-NEXT: pxor %xmm2, %xmm0 1437; SSSE3-NEXT: movdqa %xmm0, %xmm4 1438; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 1439; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1440; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0 1441; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1442; SSSE3-NEXT: pand %xmm5, %xmm0 1443; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 1444; SSSE3-NEXT: por %xmm0, %xmm2 1445; SSSE3-NEXT: pand %xmm3, %xmm2 1446; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 1447; SSSE3-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[0,2,2,3,4,5,6,7] 1448; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] 1449; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1450; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1451; SSSE3-NEXT: retq 1452; 1453; SSE41-LABEL: trunc_packus_v4i64_v4i16: 1454; SSE41: # %bb.0: 1455; SSE41-NEXT: movdqa %xmm0, %xmm2 1456; SSE41-NEXT: movapd {{.*#+}} xmm4 = [65535,65535] 1457; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 1458; SSE41-NEXT: pxor %xmm3, %xmm0 1459; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183] 1460; SSE41-NEXT: movdqa %xmm6, %xmm5 1461; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 1462; SSE41-NEXT: movdqa %xmm6, %xmm7 1463; SSE41-NEXT: pcmpgtd %xmm0, %xmm7 1464; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2] 1465; SSE41-NEXT: pand %xmm5, %xmm0 1466; SSE41-NEXT: por %xmm7, %xmm0 1467; SSE41-NEXT: movapd %xmm4, %xmm5 1468; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5 1469; SSE41-NEXT: movdqa %xmm1, %xmm0 1470; SSE41-NEXT: pxor %xmm3, %xmm0 1471; SSE41-NEXT: movdqa %xmm6, %xmm2 1472; SSE41-NEXT: pcmpeqd %xmm0, %xmm2 1473; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 1474; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 1475; SSE41-NEXT: pand %xmm2, %xmm0 1476; SSE41-NEXT: por %xmm6, %xmm0 1477; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4 1478; SSE41-NEXT: xorpd %xmm1, %xmm1 1479; SSE41-NEXT: movapd %xmm4, %xmm2 1480; SSE41-NEXT: xorpd %xmm3, %xmm2 1481; SSE41-NEXT: movapd %xmm2, %xmm6 1482; SSE41-NEXT: pcmpeqd %xmm3, %xmm6 1483; SSE41-NEXT: pcmpgtd %xmm3, %xmm2 1484; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2] 1485; SSE41-NEXT: pand %xmm6, %xmm0 1486; SSE41-NEXT: por %xmm2, %xmm0 1487; SSE41-NEXT: pxor %xmm2, %xmm2 1488; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2 1489; SSE41-NEXT: movapd %xmm5, %xmm4 1490; SSE41-NEXT: xorpd %xmm3, %xmm4 1491; SSE41-NEXT: movapd %xmm4, %xmm6 1492; SSE41-NEXT: pcmpeqd %xmm3, %xmm6 1493; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 1494; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 1495; SSE41-NEXT: pand %xmm6, %xmm0 1496; SSE41-NEXT: por %xmm4, %xmm0 1497; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1 1498; SSE41-NEXT: packusdw %xmm2, %xmm1 1499; SSE41-NEXT: packusdw %xmm1, %xmm1 1500; SSE41-NEXT: movdqa %xmm1, %xmm0 1501; SSE41-NEXT: retq 1502; 1503; AVX1-LABEL: trunc_packus_v4i64_v4i16: 1504; AVX1: # %bb.0: 1505; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1506; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [65535,65535] 1507; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3 1508; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm4 1509; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm2, %xmm0 1510; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 1511; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5 1512; AVX1-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm1 1513; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm2 1514; AVX1-NEXT: vpand %xmm1, %xmm2, %xmm1 1515; AVX1-NEXT: vpand %xmm0, %xmm5, %xmm0 1516; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1517; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 1518; AVX1-NEXT: vzeroupper 1519; AVX1-NEXT: retq 1520; 1521; AVX2-LABEL: trunc_packus_v4i64_v4i16: 1522; AVX2: # %bb.0: 1523; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [65535,65535,65535,65535] 1524; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2 1525; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 1526; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 1527; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1 1528; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0 1529; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1530; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1531; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 1532; AVX2-NEXT: vzeroupper 1533; AVX2-NEXT: retq 1534; 1535; AVX512F-LABEL: trunc_packus_v4i64_v4i16: 1536; AVX512F: # %bb.0: 1537; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1538; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 1539; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 1540; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0 1541; AVX512F-NEXT: vzeroupper 1542; AVX512F-NEXT: retq 1543; 1544; AVX512VL-LABEL: trunc_packus_v4i64_v4i16: 1545; AVX512VL: # %bb.0: 1546; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1547; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 1548; AVX512VL-NEXT: vpmovusqw %ymm0, %xmm0 1549; AVX512VL-NEXT: vzeroupper 1550; AVX512VL-NEXT: retq 1551; 1552; AVX512BW-LABEL: trunc_packus_v4i64_v4i16: 1553; AVX512BW: # %bb.0: 1554; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1555; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 1556; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 1557; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0 1558; AVX512BW-NEXT: vzeroupper 1559; AVX512BW-NEXT: retq 1560; 1561; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i16: 1562; AVX512BWVL: # %bb.0: 1563; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1564; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 1565; AVX512BWVL-NEXT: vpmovusqw %ymm0, %xmm0 1566; AVX512BWVL-NEXT: vzeroupper 1567; AVX512BWVL-NEXT: retq 1568; 1569; SKX-LABEL: trunc_packus_v4i64_v4i16: 1570; SKX: # %bb.0: 1571; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 1572; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 1573; SKX-NEXT: vpmovusqw %ymm0, %xmm0 1574; SKX-NEXT: vzeroupper 1575; SKX-NEXT: retq 1576 %1 = icmp slt <4 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535> 1577 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 65535, i64 65535, i64 65535, i64 65535> 1578 %3 = icmp sgt <4 x i64> %2, zeroinitializer 1579 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer 1580 %5 = trunc <4 x i64> %4 to <4 x i16> 1581 ret <4 x i16> %5 1582} 1583 1584define void @trunc_packus_v4i64_v4i16_store(<4 x i64> %a0, <4 x i16> *%p1) { 1585; SSE2-LABEL: trunc_packus_v4i64_v4i16_store: 1586; SSE2: # %bb.0: 1587; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535] 1588; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 1589; SSE2-NEXT: movdqa %xmm1, %xmm3 1590; SSE2-NEXT: pxor %xmm2, %xmm3 1591; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183] 1592; SSE2-NEXT: movdqa %xmm5, %xmm6 1593; SSE2-NEXT: pcmpgtd %xmm3, %xmm6 1594; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 1595; SSE2-NEXT: pcmpeqd %xmm5, %xmm3 1596; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 1597; SSE2-NEXT: pand %xmm7, %xmm4 1598; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 1599; SSE2-NEXT: por %xmm4, %xmm3 1600; SSE2-NEXT: pand %xmm3, %xmm1 1601; SSE2-NEXT: pandn %xmm8, %xmm3 1602; SSE2-NEXT: por %xmm1, %xmm3 1603; SSE2-NEXT: movdqa %xmm0, %xmm1 1604; SSE2-NEXT: pxor %xmm2, %xmm1 1605; SSE2-NEXT: movdqa %xmm5, %xmm4 1606; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 1607; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 1608; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 1609; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1610; SSE2-NEXT: pand %xmm6, %xmm1 1611; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1612; SSE2-NEXT: por %xmm1, %xmm4 1613; SSE2-NEXT: pand %xmm4, %xmm0 1614; SSE2-NEXT: pandn %xmm8, %xmm4 1615; SSE2-NEXT: por %xmm0, %xmm4 1616; SSE2-NEXT: movdqa %xmm4, %xmm0 1617; SSE2-NEXT: pxor %xmm2, %xmm0 1618; SSE2-NEXT: movdqa %xmm0, %xmm1 1619; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 1620; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] 1621; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 1622; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1623; SSE2-NEXT: pand %xmm5, %xmm0 1624; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1625; SSE2-NEXT: por %xmm0, %xmm1 1626; SSE2-NEXT: pand %xmm4, %xmm1 1627; SSE2-NEXT: movdqa %xmm3, %xmm0 1628; SSE2-NEXT: pxor %xmm2, %xmm0 1629; SSE2-NEXT: movdqa %xmm0, %xmm4 1630; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 1631; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1632; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 1633; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1634; SSE2-NEXT: pand %xmm5, %xmm0 1635; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 1636; SSE2-NEXT: por %xmm0, %xmm2 1637; SSE2-NEXT: pand %xmm3, %xmm2 1638; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 1639; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1640; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 1641; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 1642; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 1643; SSE2-NEXT: movq %xmm1, (%rdi) 1644; SSE2-NEXT: retq 1645; 1646; SSSE3-LABEL: trunc_packus_v4i64_v4i16_store: 1647; SSSE3: # %bb.0: 1648; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535] 1649; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 1650; SSSE3-NEXT: movdqa %xmm1, %xmm3 1651; SSSE3-NEXT: pxor %xmm2, %xmm3 1652; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183] 1653; SSSE3-NEXT: movdqa %xmm5, %xmm6 1654; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6 1655; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 1656; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3 1657; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 1658; SSSE3-NEXT: pand %xmm7, %xmm4 1659; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 1660; SSSE3-NEXT: por %xmm4, %xmm3 1661; SSSE3-NEXT: pand %xmm3, %xmm1 1662; SSSE3-NEXT: pandn %xmm8, %xmm3 1663; SSSE3-NEXT: por %xmm1, %xmm3 1664; SSSE3-NEXT: movdqa %xmm0, %xmm1 1665; SSSE3-NEXT: pxor %xmm2, %xmm1 1666; SSSE3-NEXT: movdqa %xmm5, %xmm4 1667; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 1668; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 1669; SSSE3-NEXT: pcmpeqd %xmm5, %xmm1 1670; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1671; SSSE3-NEXT: pand %xmm6, %xmm1 1672; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1673; SSSE3-NEXT: por %xmm1, %xmm4 1674; SSSE3-NEXT: pand %xmm4, %xmm0 1675; SSSE3-NEXT: pandn %xmm8, %xmm4 1676; SSSE3-NEXT: por %xmm0, %xmm4 1677; SSSE3-NEXT: movdqa %xmm4, %xmm0 1678; SSSE3-NEXT: pxor %xmm2, %xmm0 1679; SSSE3-NEXT: movdqa %xmm0, %xmm1 1680; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 1681; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] 1682; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0 1683; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1684; SSSE3-NEXT: pand %xmm5, %xmm0 1685; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1686; SSSE3-NEXT: por %xmm0, %xmm1 1687; SSSE3-NEXT: pand %xmm4, %xmm1 1688; SSSE3-NEXT: movdqa %xmm3, %xmm0 1689; SSSE3-NEXT: pxor %xmm2, %xmm0 1690; SSSE3-NEXT: movdqa %xmm0, %xmm4 1691; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 1692; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1693; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0 1694; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1695; SSSE3-NEXT: pand %xmm5, %xmm0 1696; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 1697; SSSE3-NEXT: por %xmm0, %xmm2 1698; SSSE3-NEXT: pand %xmm3, %xmm2 1699; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 1700; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1701; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 1702; SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 1703; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 1704; SSSE3-NEXT: movq %xmm1, (%rdi) 1705; SSSE3-NEXT: retq 1706; 1707; SSE41-LABEL: trunc_packus_v4i64_v4i16_store: 1708; SSE41: # %bb.0: 1709; SSE41-NEXT: movdqa %xmm0, %xmm2 1710; SSE41-NEXT: movapd {{.*#+}} xmm4 = [65535,65535] 1711; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 1712; SSE41-NEXT: pxor %xmm3, %xmm0 1713; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183] 1714; SSE41-NEXT: movdqa %xmm6, %xmm5 1715; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 1716; SSE41-NEXT: movdqa %xmm6, %xmm7 1717; SSE41-NEXT: pcmpgtd %xmm0, %xmm7 1718; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2] 1719; SSE41-NEXT: pand %xmm5, %xmm0 1720; SSE41-NEXT: por %xmm7, %xmm0 1721; SSE41-NEXT: movapd %xmm4, %xmm5 1722; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5 1723; SSE41-NEXT: movdqa %xmm1, %xmm0 1724; SSE41-NEXT: pxor %xmm3, %xmm0 1725; SSE41-NEXT: movdqa %xmm6, %xmm2 1726; SSE41-NEXT: pcmpeqd %xmm0, %xmm2 1727; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 1728; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 1729; SSE41-NEXT: pand %xmm2, %xmm0 1730; SSE41-NEXT: por %xmm6, %xmm0 1731; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4 1732; SSE41-NEXT: xorpd %xmm1, %xmm1 1733; SSE41-NEXT: movapd %xmm4, %xmm2 1734; SSE41-NEXT: xorpd %xmm3, %xmm2 1735; SSE41-NEXT: movapd %xmm2, %xmm6 1736; SSE41-NEXT: pcmpeqd %xmm3, %xmm6 1737; SSE41-NEXT: pcmpgtd %xmm3, %xmm2 1738; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2] 1739; SSE41-NEXT: pand %xmm6, %xmm0 1740; SSE41-NEXT: por %xmm2, %xmm0 1741; SSE41-NEXT: pxor %xmm2, %xmm2 1742; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2 1743; SSE41-NEXT: movapd %xmm5, %xmm4 1744; SSE41-NEXT: xorpd %xmm3, %xmm4 1745; SSE41-NEXT: movapd %xmm4, %xmm6 1746; SSE41-NEXT: pcmpeqd %xmm3, %xmm6 1747; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 1748; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 1749; SSE41-NEXT: pand %xmm6, %xmm0 1750; SSE41-NEXT: por %xmm4, %xmm0 1751; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1 1752; SSE41-NEXT: packusdw %xmm2, %xmm1 1753; SSE41-NEXT: packusdw %xmm1, %xmm1 1754; SSE41-NEXT: movq %xmm1, (%rdi) 1755; SSE41-NEXT: retq 1756; 1757; AVX1-LABEL: trunc_packus_v4i64_v4i16_store: 1758; AVX1: # %bb.0: 1759; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1760; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [65535,65535] 1761; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3 1762; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm4 1763; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm2, %xmm0 1764; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 1765; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5 1766; AVX1-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm1 1767; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm2 1768; AVX1-NEXT: vpand %xmm1, %xmm2, %xmm1 1769; AVX1-NEXT: vpand %xmm0, %xmm5, %xmm0 1770; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1771; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 1772; AVX1-NEXT: vmovq %xmm0, (%rdi) 1773; AVX1-NEXT: vzeroupper 1774; AVX1-NEXT: retq 1775; 1776; AVX2-LABEL: trunc_packus_v4i64_v4i16_store: 1777; AVX2: # %bb.0: 1778; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [65535,65535,65535,65535] 1779; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2 1780; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 1781; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 1782; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1 1783; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0 1784; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1785; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1786; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 1787; AVX2-NEXT: vmovq %xmm0, (%rdi) 1788; AVX2-NEXT: vzeroupper 1789; AVX2-NEXT: retq 1790; 1791; AVX512F-LABEL: trunc_packus_v4i64_v4i16_store: 1792; AVX512F: # %bb.0: 1793; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1794; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 1795; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 1796; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0 1797; AVX512F-NEXT: vmovq %xmm0, (%rdi) 1798; AVX512F-NEXT: vzeroupper 1799; AVX512F-NEXT: retq 1800; 1801; AVX512VL-LABEL: trunc_packus_v4i64_v4i16_store: 1802; AVX512VL: # %bb.0: 1803; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1804; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 1805; AVX512VL-NEXT: vpmovusqw %ymm0, (%rdi) 1806; AVX512VL-NEXT: vzeroupper 1807; AVX512VL-NEXT: retq 1808; 1809; AVX512BW-LABEL: trunc_packus_v4i64_v4i16_store: 1810; AVX512BW: # %bb.0: 1811; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1812; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 1813; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 1814; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0 1815; AVX512BW-NEXT: vmovq %xmm0, (%rdi) 1816; AVX512BW-NEXT: vzeroupper 1817; AVX512BW-NEXT: retq 1818; 1819; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i16_store: 1820; AVX512BWVL: # %bb.0: 1821; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1822; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 1823; AVX512BWVL-NEXT: vpmovusqw %ymm0, (%rdi) 1824; AVX512BWVL-NEXT: vzeroupper 1825; AVX512BWVL-NEXT: retq 1826; 1827; SKX-LABEL: trunc_packus_v4i64_v4i16_store: 1828; SKX: # %bb.0: 1829; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 1830; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 1831; SKX-NEXT: vpmovusqw %ymm0, (%rdi) 1832; SKX-NEXT: vzeroupper 1833; SKX-NEXT: retq 1834 %1 = icmp slt <4 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535> 1835 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 65535, i64 65535, i64 65535, i64 65535> 1836 %3 = icmp sgt <4 x i64> %2, zeroinitializer 1837 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer 1838 %5 = trunc <4 x i64> %4 to <4 x i16> 1839 store <4 x i16> %5, <4 x i16> *%p1 1840 ret void 1841} 1842 1843define <8 x i16> @trunc_packus_v8i64_v8i16(<8 x i64>* %p0) "min-legal-vector-width"="256" { 1844; SSE2-LABEL: trunc_packus_v8i64_v8i16: 1845; SSE2: # %bb.0: 1846; SSE2-NEXT: movdqa (%rdi), %xmm7 1847; SSE2-NEXT: movdqa 16(%rdi), %xmm2 1848; SSE2-NEXT: movdqa 32(%rdi), %xmm9 1849; SSE2-NEXT: movdqa 48(%rdi), %xmm6 1850; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535] 1851; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [2147483648,2147483648] 1852; SSE2-NEXT: movdqa %xmm2, %xmm1 1853; SSE2-NEXT: pxor %xmm11, %xmm1 1854; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147549183,2147549183] 1855; SSE2-NEXT: movdqa %xmm10, %xmm5 1856; SSE2-NEXT: pcmpgtd %xmm1, %xmm5 1857; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm5[0,0,2,2] 1858; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 1859; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3] 1860; SSE2-NEXT: pand %xmm3, %xmm4 1861; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3] 1862; SSE2-NEXT: por %xmm4, %xmm1 1863; SSE2-NEXT: pand %xmm1, %xmm2 1864; SSE2-NEXT: pandn %xmm8, %xmm1 1865; SSE2-NEXT: por %xmm2, %xmm1 1866; SSE2-NEXT: movdqa %xmm7, %xmm2 1867; SSE2-NEXT: pxor %xmm11, %xmm2 1868; SSE2-NEXT: movdqa %xmm10, %xmm3 1869; SSE2-NEXT: pcmpgtd %xmm2, %xmm3 1870; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 1871; SSE2-NEXT: pcmpeqd %xmm10, %xmm2 1872; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3] 1873; SSE2-NEXT: pand %xmm4, %xmm5 1874; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3] 1875; SSE2-NEXT: por %xmm5, %xmm2 1876; SSE2-NEXT: pand %xmm2, %xmm7 1877; SSE2-NEXT: pandn %xmm8, %xmm2 1878; SSE2-NEXT: por %xmm7, %xmm2 1879; SSE2-NEXT: movdqa %xmm6, %xmm3 1880; SSE2-NEXT: pxor %xmm11, %xmm3 1881; SSE2-NEXT: movdqa %xmm10, %xmm4 1882; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 1883; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1884; SSE2-NEXT: pcmpeqd %xmm10, %xmm3 1885; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 1886; SSE2-NEXT: pand %xmm5, %xmm3 1887; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3] 1888; SSE2-NEXT: por %xmm3, %xmm7 1889; SSE2-NEXT: pand %xmm7, %xmm6 1890; SSE2-NEXT: pandn %xmm8, %xmm7 1891; SSE2-NEXT: por %xmm6, %xmm7 1892; SSE2-NEXT: movdqa %xmm9, %xmm3 1893; SSE2-NEXT: pxor %xmm11, %xmm3 1894; SSE2-NEXT: movdqa %xmm10, %xmm4 1895; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 1896; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1897; SSE2-NEXT: pcmpeqd %xmm10, %xmm3 1898; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 1899; SSE2-NEXT: pand %xmm5, %xmm3 1900; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1901; SSE2-NEXT: por %xmm3, %xmm4 1902; SSE2-NEXT: pand %xmm4, %xmm9 1903; SSE2-NEXT: pandn %xmm8, %xmm4 1904; SSE2-NEXT: por %xmm9, %xmm4 1905; SSE2-NEXT: movdqa %xmm4, %xmm3 1906; SSE2-NEXT: pxor %xmm11, %xmm3 1907; SSE2-NEXT: movdqa %xmm3, %xmm5 1908; SSE2-NEXT: pcmpgtd %xmm11, %xmm5 1909; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 1910; SSE2-NEXT: pcmpeqd %xmm11, %xmm3 1911; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 1912; SSE2-NEXT: pand %xmm6, %xmm0 1913; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3] 1914; SSE2-NEXT: por %xmm0, %xmm3 1915; SSE2-NEXT: pand %xmm4, %xmm3 1916; SSE2-NEXT: movdqa %xmm7, %xmm0 1917; SSE2-NEXT: pxor %xmm11, %xmm0 1918; SSE2-NEXT: movdqa %xmm0, %xmm4 1919; SSE2-NEXT: pcmpgtd %xmm11, %xmm4 1920; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1921; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 1922; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1923; SSE2-NEXT: pand %xmm5, %xmm0 1924; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1925; SSE2-NEXT: por %xmm0, %xmm4 1926; SSE2-NEXT: pand %xmm7, %xmm4 1927; SSE2-NEXT: movdqa %xmm2, %xmm0 1928; SSE2-NEXT: pxor %xmm11, %xmm0 1929; SSE2-NEXT: movdqa %xmm0, %xmm5 1930; SSE2-NEXT: pcmpgtd %xmm11, %xmm5 1931; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 1932; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 1933; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1934; SSE2-NEXT: pand %xmm6, %xmm0 1935; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1936; SSE2-NEXT: por %xmm0, %xmm5 1937; SSE2-NEXT: pand %xmm2, %xmm5 1938; SSE2-NEXT: movdqa %xmm1, %xmm0 1939; SSE2-NEXT: pxor %xmm11, %xmm0 1940; SSE2-NEXT: movdqa %xmm0, %xmm2 1941; SSE2-NEXT: pcmpgtd %xmm11, %xmm2 1942; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2] 1943; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 1944; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1945; SSE2-NEXT: pand %xmm6, %xmm0 1946; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1947; SSE2-NEXT: por %xmm0, %xmm2 1948; SSE2-NEXT: pand %xmm1, %xmm2 1949; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 1950; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1951; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm5[0,2,2,3] 1952; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 1953; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 1954; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,2,2,3] 1955; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[0,1,0,2,4,5,6,7] 1956; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 1957; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 1958; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1959; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 1960; SSE2-NEXT: retq 1961; 1962; SSSE3-LABEL: trunc_packus_v8i64_v8i16: 1963; SSSE3: # %bb.0: 1964; SSSE3-NEXT: movdqa (%rdi), %xmm7 1965; SSSE3-NEXT: movdqa 16(%rdi), %xmm2 1966; SSSE3-NEXT: movdqa 32(%rdi), %xmm9 1967; SSSE3-NEXT: movdqa 48(%rdi), %xmm6 1968; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535] 1969; SSSE3-NEXT: movdqa {{.*#+}} xmm11 = [2147483648,2147483648] 1970; SSSE3-NEXT: movdqa %xmm2, %xmm1 1971; SSSE3-NEXT: pxor %xmm11, %xmm1 1972; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147549183,2147549183] 1973; SSSE3-NEXT: movdqa %xmm10, %xmm5 1974; SSSE3-NEXT: pcmpgtd %xmm1, %xmm5 1975; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm5[0,0,2,2] 1976; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1 1977; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3] 1978; SSSE3-NEXT: pand %xmm3, %xmm4 1979; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3] 1980; SSSE3-NEXT: por %xmm4, %xmm1 1981; SSSE3-NEXT: pand %xmm1, %xmm2 1982; SSSE3-NEXT: pandn %xmm8, %xmm1 1983; SSSE3-NEXT: por %xmm2, %xmm1 1984; SSSE3-NEXT: movdqa %xmm7, %xmm2 1985; SSSE3-NEXT: pxor %xmm11, %xmm2 1986; SSSE3-NEXT: movdqa %xmm10, %xmm3 1987; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3 1988; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 1989; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2 1990; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3] 1991; SSSE3-NEXT: pand %xmm4, %xmm5 1992; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3] 1993; SSSE3-NEXT: por %xmm5, %xmm2 1994; SSSE3-NEXT: pand %xmm2, %xmm7 1995; SSSE3-NEXT: pandn %xmm8, %xmm2 1996; SSSE3-NEXT: por %xmm7, %xmm2 1997; SSSE3-NEXT: movdqa %xmm6, %xmm3 1998; SSSE3-NEXT: pxor %xmm11, %xmm3 1999; SSSE3-NEXT: movdqa %xmm10, %xmm4 2000; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4 2001; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 2002; SSSE3-NEXT: pcmpeqd %xmm10, %xmm3 2003; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2004; SSSE3-NEXT: pand %xmm5, %xmm3 2005; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3] 2006; SSSE3-NEXT: por %xmm3, %xmm7 2007; SSSE3-NEXT: pand %xmm7, %xmm6 2008; SSSE3-NEXT: pandn %xmm8, %xmm7 2009; SSSE3-NEXT: por %xmm6, %xmm7 2010; SSSE3-NEXT: movdqa %xmm9, %xmm3 2011; SSSE3-NEXT: pxor %xmm11, %xmm3 2012; SSSE3-NEXT: movdqa %xmm10, %xmm4 2013; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4 2014; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 2015; SSSE3-NEXT: pcmpeqd %xmm10, %xmm3 2016; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2017; SSSE3-NEXT: pand %xmm5, %xmm3 2018; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2019; SSSE3-NEXT: por %xmm3, %xmm4 2020; SSSE3-NEXT: pand %xmm4, %xmm9 2021; SSSE3-NEXT: pandn %xmm8, %xmm4 2022; SSSE3-NEXT: por %xmm9, %xmm4 2023; SSSE3-NEXT: movdqa %xmm4, %xmm3 2024; SSSE3-NEXT: pxor %xmm11, %xmm3 2025; SSSE3-NEXT: movdqa %xmm3, %xmm5 2026; SSSE3-NEXT: pcmpgtd %xmm11, %xmm5 2027; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 2028; SSSE3-NEXT: pcmpeqd %xmm11, %xmm3 2029; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 2030; SSSE3-NEXT: pand %xmm6, %xmm0 2031; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3] 2032; SSSE3-NEXT: por %xmm0, %xmm3 2033; SSSE3-NEXT: pand %xmm4, %xmm3 2034; SSSE3-NEXT: movdqa %xmm7, %xmm0 2035; SSSE3-NEXT: pxor %xmm11, %xmm0 2036; SSSE3-NEXT: movdqa %xmm0, %xmm4 2037; SSSE3-NEXT: pcmpgtd %xmm11, %xmm4 2038; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 2039; SSSE3-NEXT: pcmpeqd %xmm11, %xmm0 2040; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 2041; SSSE3-NEXT: pand %xmm5, %xmm0 2042; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2043; SSSE3-NEXT: por %xmm0, %xmm4 2044; SSSE3-NEXT: pand %xmm7, %xmm4 2045; SSSE3-NEXT: movdqa %xmm2, %xmm0 2046; SSSE3-NEXT: pxor %xmm11, %xmm0 2047; SSSE3-NEXT: movdqa %xmm0, %xmm5 2048; SSSE3-NEXT: pcmpgtd %xmm11, %xmm5 2049; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 2050; SSSE3-NEXT: pcmpeqd %xmm11, %xmm0 2051; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 2052; SSSE3-NEXT: pand %xmm6, %xmm0 2053; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 2054; SSSE3-NEXT: por %xmm0, %xmm5 2055; SSSE3-NEXT: pand %xmm2, %xmm5 2056; SSSE3-NEXT: movdqa %xmm1, %xmm0 2057; SSSE3-NEXT: pxor %xmm11, %xmm0 2058; SSSE3-NEXT: movdqa %xmm0, %xmm2 2059; SSSE3-NEXT: pcmpgtd %xmm11, %xmm2 2060; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2] 2061; SSSE3-NEXT: pcmpeqd %xmm11, %xmm0 2062; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 2063; SSSE3-NEXT: pand %xmm6, %xmm0 2064; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 2065; SSSE3-NEXT: por %xmm0, %xmm2 2066; SSSE3-NEXT: pand %xmm1, %xmm2 2067; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 2068; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 2069; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm5[0,2,2,3] 2070; SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 2071; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 2072; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,2,2,3] 2073; SSSE3-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[0,1,0,2,4,5,6,7] 2074; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 2075; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 2076; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 2077; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 2078; SSSE3-NEXT: retq 2079; 2080; SSE41-LABEL: trunc_packus_v8i64_v8i16: 2081; SSE41: # %bb.0: 2082; SSE41-NEXT: movdqa (%rdi), %xmm10 2083; SSE41-NEXT: movdqa 16(%rdi), %xmm9 2084; SSE41-NEXT: movdqa 32(%rdi), %xmm3 2085; SSE41-NEXT: movdqa 48(%rdi), %xmm5 2086; SSE41-NEXT: movapd {{.*#+}} xmm1 = [65535,65535] 2087; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 2088; SSE41-NEXT: movdqa %xmm3, %xmm0 2089; SSE41-NEXT: pxor %xmm2, %xmm0 2090; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147549183,2147549183] 2091; SSE41-NEXT: movdqa %xmm4, %xmm7 2092; SSE41-NEXT: pcmpeqd %xmm0, %xmm7 2093; SSE41-NEXT: movdqa %xmm4, %xmm6 2094; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 2095; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 2096; SSE41-NEXT: pand %xmm7, %xmm0 2097; SSE41-NEXT: por %xmm6, %xmm0 2098; SSE41-NEXT: movapd %xmm1, %xmm8 2099; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm8 2100; SSE41-NEXT: movdqa %xmm5, %xmm0 2101; SSE41-NEXT: pxor %xmm2, %xmm0 2102; SSE41-NEXT: movdqa %xmm4, %xmm3 2103; SSE41-NEXT: pcmpeqd %xmm0, %xmm3 2104; SSE41-NEXT: movdqa %xmm4, %xmm6 2105; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 2106; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 2107; SSE41-NEXT: pand %xmm3, %xmm0 2108; SSE41-NEXT: por %xmm6, %xmm0 2109; SSE41-NEXT: movapd %xmm1, %xmm6 2110; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm6 2111; SSE41-NEXT: movdqa %xmm10, %xmm0 2112; SSE41-NEXT: pxor %xmm2, %xmm0 2113; SSE41-NEXT: movdqa %xmm4, %xmm3 2114; SSE41-NEXT: pcmpeqd %xmm0, %xmm3 2115; SSE41-NEXT: movdqa %xmm4, %xmm5 2116; SSE41-NEXT: pcmpgtd %xmm0, %xmm5 2117; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2] 2118; SSE41-NEXT: pand %xmm3, %xmm0 2119; SSE41-NEXT: por %xmm5, %xmm0 2120; SSE41-NEXT: movapd %xmm1, %xmm3 2121; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm3 2122; SSE41-NEXT: movdqa %xmm9, %xmm0 2123; SSE41-NEXT: pxor %xmm2, %xmm0 2124; SSE41-NEXT: movdqa %xmm4, %xmm5 2125; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 2126; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 2127; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 2128; SSE41-NEXT: pand %xmm5, %xmm0 2129; SSE41-NEXT: por %xmm4, %xmm0 2130; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm1 2131; SSE41-NEXT: pxor %xmm5, %xmm5 2132; SSE41-NEXT: movapd %xmm1, %xmm4 2133; SSE41-NEXT: xorpd %xmm2, %xmm4 2134; SSE41-NEXT: movapd %xmm4, %xmm7 2135; SSE41-NEXT: pcmpeqd %xmm2, %xmm7 2136; SSE41-NEXT: pcmpgtd %xmm2, %xmm4 2137; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 2138; SSE41-NEXT: pand %xmm7, %xmm0 2139; SSE41-NEXT: por %xmm4, %xmm0 2140; SSE41-NEXT: pxor %xmm4, %xmm4 2141; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4 2142; SSE41-NEXT: movapd %xmm3, %xmm1 2143; SSE41-NEXT: xorpd %xmm2, %xmm1 2144; SSE41-NEXT: movapd %xmm1, %xmm7 2145; SSE41-NEXT: pcmpeqd %xmm2, %xmm7 2146; SSE41-NEXT: pcmpgtd %xmm2, %xmm1 2147; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2] 2148; SSE41-NEXT: pand %xmm7, %xmm0 2149; SSE41-NEXT: por %xmm1, %xmm0 2150; SSE41-NEXT: pxor %xmm1, %xmm1 2151; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1 2152; SSE41-NEXT: packusdw %xmm4, %xmm1 2153; SSE41-NEXT: movapd %xmm6, %xmm3 2154; SSE41-NEXT: xorpd %xmm2, %xmm3 2155; SSE41-NEXT: movapd %xmm3, %xmm4 2156; SSE41-NEXT: pcmpeqd %xmm2, %xmm4 2157; SSE41-NEXT: pcmpgtd %xmm2, %xmm3 2158; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2] 2159; SSE41-NEXT: pand %xmm4, %xmm0 2160; SSE41-NEXT: por %xmm3, %xmm0 2161; SSE41-NEXT: pxor %xmm3, %xmm3 2162; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm3 2163; SSE41-NEXT: movapd %xmm8, %xmm4 2164; SSE41-NEXT: xorpd %xmm2, %xmm4 2165; SSE41-NEXT: movapd %xmm4, %xmm6 2166; SSE41-NEXT: pcmpeqd %xmm2, %xmm6 2167; SSE41-NEXT: pcmpgtd %xmm2, %xmm4 2168; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 2169; SSE41-NEXT: pand %xmm6, %xmm0 2170; SSE41-NEXT: por %xmm4, %xmm0 2171; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm5 2172; SSE41-NEXT: packusdw %xmm3, %xmm5 2173; SSE41-NEXT: packusdw %xmm5, %xmm1 2174; SSE41-NEXT: movdqa %xmm1, %xmm0 2175; SSE41-NEXT: retq 2176; 2177; AVX1-LABEL: trunc_packus_v8i64_v8i16: 2178; AVX1: # %bb.0: 2179; AVX1-NEXT: vmovdqa (%rdi), %xmm0 2180; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1 2181; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2 2182; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3 2183; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [65535,65535] 2184; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm8 2185; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm6 2186; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm7 2187; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5 2188; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0 2189; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5 2190; AVX1-NEXT: vpcmpgtq %xmm5, %xmm0, %xmm9 2191; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm4, %xmm1 2192; AVX1-NEXT: vpcmpgtq %xmm5, %xmm1, %xmm7 2193; AVX1-NEXT: vblendvpd %xmm6, %xmm2, %xmm4, %xmm2 2194; AVX1-NEXT: vpcmpgtq %xmm5, %xmm2, %xmm6 2195; AVX1-NEXT: vblendvpd %xmm8, %xmm3, %xmm4, %xmm3 2196; AVX1-NEXT: vpcmpgtq %xmm5, %xmm3, %xmm4 2197; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm3 2198; AVX1-NEXT: vpand %xmm2, %xmm6, %xmm2 2199; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 2200; AVX1-NEXT: vpand %xmm1, %xmm7, %xmm1 2201; AVX1-NEXT: vpand %xmm0, %xmm9, %xmm0 2202; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2203; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 2204; AVX1-NEXT: retq 2205; 2206; AVX2-LABEL: trunc_packus_v8i64_v8i16: 2207; AVX2: # %bb.0: 2208; AVX2-NEXT: vmovdqa (%rdi), %ymm0 2209; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1 2210; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [65535,65535,65535,65535] 2211; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3 2212; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 2213; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3 2214; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 2215; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 2216; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3 2217; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm1 2218; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2 2219; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm0 2220; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 2221; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2222; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2223; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 2224; AVX2-NEXT: vzeroupper 2225; AVX2-NEXT: retq 2226; 2227; AVX512-LABEL: trunc_packus_v8i64_v8i16: 2228; AVX512: # %bb.0: 2229; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0 2230; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm0 2231; AVX512-NEXT: vpmovusqw %zmm0, %xmm0 2232; AVX512-NEXT: vzeroupper 2233; AVX512-NEXT: retq 2234; 2235; SKX-LABEL: trunc_packus_v8i64_v8i16: 2236; SKX: # %bb.0: 2237; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm0 2238; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm1 2239; SKX-NEXT: vpmovusqw %ymm1, %xmm1 2240; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm0 2241; SKX-NEXT: vpmovusqw %ymm0, %xmm0 2242; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2243; SKX-NEXT: vzeroupper 2244; SKX-NEXT: retq 2245 %a0 = load <8 x i64>, <8 x i64>* %p0 2246 %1 = icmp slt <8 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535> 2247 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535> 2248 %3 = icmp sgt <8 x i64> %2, zeroinitializer 2249 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer 2250 %5 = trunc <8 x i64> %4 to <8 x i16> 2251 ret <8 x i16> %5 2252} 2253 2254define <4 x i16> @trunc_packus_v4i32_v4i16(<4 x i32> %a0) { 2255; SSE2-LABEL: trunc_packus_v4i32_v4i16: 2256; SSE2: # %bb.0: 2257; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535] 2258; SSE2-NEXT: movdqa %xmm1, %xmm2 2259; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 2260; SSE2-NEXT: pand %xmm2, %xmm0 2261; SSE2-NEXT: pandn %xmm1, %xmm2 2262; SSE2-NEXT: por %xmm0, %xmm2 2263; SSE2-NEXT: pxor %xmm0, %xmm0 2264; SSE2-NEXT: movdqa %xmm2, %xmm1 2265; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 2266; SSE2-NEXT: pand %xmm2, %xmm1 2267; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7] 2268; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7] 2269; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2270; SSE2-NEXT: retq 2271; 2272; SSSE3-LABEL: trunc_packus_v4i32_v4i16: 2273; SSSE3: # %bb.0: 2274; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535] 2275; SSSE3-NEXT: movdqa %xmm1, %xmm2 2276; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2 2277; SSSE3-NEXT: pand %xmm2, %xmm0 2278; SSSE3-NEXT: pandn %xmm1, %xmm2 2279; SSSE3-NEXT: por %xmm0, %xmm2 2280; SSSE3-NEXT: pxor %xmm1, %xmm1 2281; SSSE3-NEXT: movdqa %xmm2, %xmm0 2282; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0 2283; SSSE3-NEXT: pand %xmm2, %xmm0 2284; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 2285; SSSE3-NEXT: retq 2286; 2287; SSE41-LABEL: trunc_packus_v4i32_v4i16: 2288; SSE41: # %bb.0: 2289; SSE41-NEXT: packusdw %xmm0, %xmm0 2290; SSE41-NEXT: retq 2291; 2292; AVX-LABEL: trunc_packus_v4i32_v4i16: 2293; AVX: # %bb.0: 2294; AVX-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 2295; AVX-NEXT: retq 2296; 2297; AVX512-LABEL: trunc_packus_v4i32_v4i16: 2298; AVX512: # %bb.0: 2299; AVX512-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 2300; AVX512-NEXT: retq 2301; 2302; SKX-LABEL: trunc_packus_v4i32_v4i16: 2303; SKX: # %bb.0: 2304; SKX-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 2305; SKX-NEXT: retq 2306 %1 = icmp slt <4 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535> 2307 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535> 2308 %3 = icmp sgt <4 x i32> %2, zeroinitializer 2309 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> zeroinitializer 2310 %5 = trunc <4 x i32> %4 to <4 x i16> 2311 ret <4 x i16> %5 2312} 2313 2314define void @trunc_packus_v4i32_v4i16_store(<4 x i32> %a0, <4 x i16> *%p1) { 2315; SSE2-LABEL: trunc_packus_v4i32_v4i16_store: 2316; SSE2: # %bb.0: 2317; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535] 2318; SSE2-NEXT: movdqa %xmm1, %xmm2 2319; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 2320; SSE2-NEXT: pand %xmm2, %xmm0 2321; SSE2-NEXT: pandn %xmm1, %xmm2 2322; SSE2-NEXT: por %xmm0, %xmm2 2323; SSE2-NEXT: pxor %xmm0, %xmm0 2324; SSE2-NEXT: movdqa %xmm2, %xmm1 2325; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 2326; SSE2-NEXT: pand %xmm2, %xmm1 2327; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7] 2328; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7] 2329; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2330; SSE2-NEXT: movq %xmm0, (%rdi) 2331; SSE2-NEXT: retq 2332; 2333; SSSE3-LABEL: trunc_packus_v4i32_v4i16_store: 2334; SSSE3: # %bb.0: 2335; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535] 2336; SSSE3-NEXT: movdqa %xmm1, %xmm2 2337; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2 2338; SSSE3-NEXT: pand %xmm2, %xmm0 2339; SSSE3-NEXT: pandn %xmm1, %xmm2 2340; SSSE3-NEXT: por %xmm0, %xmm2 2341; SSSE3-NEXT: pxor %xmm0, %xmm0 2342; SSSE3-NEXT: movdqa %xmm2, %xmm1 2343; SSSE3-NEXT: pcmpgtd %xmm0, %xmm1 2344; SSSE3-NEXT: pand %xmm2, %xmm1 2345; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u] 2346; SSSE3-NEXT: movq %xmm1, (%rdi) 2347; SSSE3-NEXT: retq 2348; 2349; SSE41-LABEL: trunc_packus_v4i32_v4i16_store: 2350; SSE41: # %bb.0: 2351; SSE41-NEXT: packusdw %xmm0, %xmm0 2352; SSE41-NEXT: movq %xmm0, (%rdi) 2353; SSE41-NEXT: retq 2354; 2355; AVX-LABEL: trunc_packus_v4i32_v4i16_store: 2356; AVX: # %bb.0: 2357; AVX-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 2358; AVX-NEXT: vmovq %xmm0, (%rdi) 2359; AVX-NEXT: retq 2360; 2361; AVX512F-LABEL: trunc_packus_v4i32_v4i16_store: 2362; AVX512F: # %bb.0: 2363; AVX512F-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 2364; AVX512F-NEXT: vmovq %xmm0, (%rdi) 2365; AVX512F-NEXT: retq 2366; 2367; AVX512VL-LABEL: trunc_packus_v4i32_v4i16_store: 2368; AVX512VL: # %bb.0: 2369; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2370; AVX512VL-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 2371; AVX512VL-NEXT: vpmovusdw %xmm0, (%rdi) 2372; AVX512VL-NEXT: retq 2373; 2374; AVX512BW-LABEL: trunc_packus_v4i32_v4i16_store: 2375; AVX512BW: # %bb.0: 2376; AVX512BW-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 2377; AVX512BW-NEXT: vmovq %xmm0, (%rdi) 2378; AVX512BW-NEXT: retq 2379; 2380; AVX512BWVL-LABEL: trunc_packus_v4i32_v4i16_store: 2381; AVX512BWVL: # %bb.0: 2382; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2383; AVX512BWVL-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 2384; AVX512BWVL-NEXT: vpmovusdw %xmm0, (%rdi) 2385; AVX512BWVL-NEXT: retq 2386; 2387; SKX-LABEL: trunc_packus_v4i32_v4i16_store: 2388; SKX: # %bb.0: 2389; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 2390; SKX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 2391; SKX-NEXT: vpmovusdw %xmm0, (%rdi) 2392; SKX-NEXT: retq 2393 %1 = icmp slt <4 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535> 2394 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535> 2395 %3 = icmp sgt <4 x i32> %2, zeroinitializer 2396 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> zeroinitializer 2397 %5 = trunc <4 x i32> %4 to <4 x i16> 2398 store <4 x i16> %5, <4 x i16> *%p1 2399 ret void 2400} 2401 2402define <8 x i16> @trunc_packus_v8i32_v8i16(<8 x i32> %a0) { 2403; SSE2-LABEL: trunc_packus_v8i32_v8i16: 2404; SSE2: # %bb.0: 2405; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535] 2406; SSE2-NEXT: movdqa %xmm2, %xmm3 2407; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 2408; SSE2-NEXT: pand %xmm3, %xmm1 2409; SSE2-NEXT: pandn %xmm2, %xmm3 2410; SSE2-NEXT: por %xmm1, %xmm3 2411; SSE2-NEXT: movdqa %xmm2, %xmm1 2412; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 2413; SSE2-NEXT: pand %xmm1, %xmm0 2414; SSE2-NEXT: pandn %xmm2, %xmm1 2415; SSE2-NEXT: por %xmm0, %xmm1 2416; SSE2-NEXT: pxor %xmm2, %xmm2 2417; SSE2-NEXT: movdqa %xmm1, %xmm0 2418; SSE2-NEXT: pcmpgtd %xmm2, %xmm0 2419; SSE2-NEXT: pand %xmm1, %xmm0 2420; SSE2-NEXT: movdqa %xmm3, %xmm1 2421; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 2422; SSE2-NEXT: pand %xmm3, %xmm1 2423; SSE2-NEXT: pslld $16, %xmm1 2424; SSE2-NEXT: psrad $16, %xmm1 2425; SSE2-NEXT: pslld $16, %xmm0 2426; SSE2-NEXT: psrad $16, %xmm0 2427; SSE2-NEXT: packssdw %xmm1, %xmm0 2428; SSE2-NEXT: retq 2429; 2430; SSSE3-LABEL: trunc_packus_v8i32_v8i16: 2431; SSSE3: # %bb.0: 2432; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535] 2433; SSSE3-NEXT: movdqa %xmm2, %xmm3 2434; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3 2435; SSSE3-NEXT: pand %xmm3, %xmm1 2436; SSSE3-NEXT: pandn %xmm2, %xmm3 2437; SSSE3-NEXT: por %xmm1, %xmm3 2438; SSSE3-NEXT: movdqa %xmm2, %xmm1 2439; SSSE3-NEXT: pcmpgtd %xmm0, %xmm1 2440; SSSE3-NEXT: pand %xmm1, %xmm0 2441; SSSE3-NEXT: pandn %xmm2, %xmm1 2442; SSSE3-NEXT: por %xmm0, %xmm1 2443; SSSE3-NEXT: pxor %xmm2, %xmm2 2444; SSSE3-NEXT: movdqa %xmm1, %xmm0 2445; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0 2446; SSSE3-NEXT: pand %xmm1, %xmm0 2447; SSSE3-NEXT: movdqa %xmm3, %xmm1 2448; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 2449; SSSE3-NEXT: pand %xmm3, %xmm1 2450; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 2451; SSSE3-NEXT: pshufb %xmm2, %xmm1 2452; SSSE3-NEXT: pshufb %xmm2, %xmm0 2453; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2454; SSSE3-NEXT: retq 2455; 2456; SSE41-LABEL: trunc_packus_v8i32_v8i16: 2457; SSE41: # %bb.0: 2458; SSE41-NEXT: packusdw %xmm1, %xmm0 2459; SSE41-NEXT: retq 2460; 2461; AVX1-LABEL: trunc_packus_v8i32_v8i16: 2462; AVX1: # %bb.0: 2463; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 2464; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2465; AVX1-NEXT: vzeroupper 2466; AVX1-NEXT: retq 2467; 2468; AVX2-LABEL: trunc_packus_v8i32_v8i16: 2469; AVX2: # %bb.0: 2470; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2471; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2472; AVX2-NEXT: vzeroupper 2473; AVX2-NEXT: retq 2474; 2475; AVX512F-LABEL: trunc_packus_v8i32_v8i16: 2476; AVX512F: # %bb.0: 2477; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 2478; AVX512F-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2479; AVX512F-NEXT: vzeroupper 2480; AVX512F-NEXT: retq 2481; 2482; AVX512VL-LABEL: trunc_packus_v8i32_v8i16: 2483; AVX512VL: # %bb.0: 2484; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2485; AVX512VL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 2486; AVX512VL-NEXT: vpmovusdw %ymm0, %xmm0 2487; AVX512VL-NEXT: vzeroupper 2488; AVX512VL-NEXT: retq 2489; 2490; AVX512BW-LABEL: trunc_packus_v8i32_v8i16: 2491; AVX512BW: # %bb.0: 2492; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 2493; AVX512BW-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2494; AVX512BW-NEXT: vzeroupper 2495; AVX512BW-NEXT: retq 2496; 2497; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i16: 2498; AVX512BWVL: # %bb.0: 2499; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2500; AVX512BWVL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 2501; AVX512BWVL-NEXT: vpmovusdw %ymm0, %xmm0 2502; AVX512BWVL-NEXT: vzeroupper 2503; AVX512BWVL-NEXT: retq 2504; 2505; SKX-LABEL: trunc_packus_v8i32_v8i16: 2506; SKX: # %bb.0: 2507; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 2508; SKX-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 2509; SKX-NEXT: vpmovusdw %ymm0, %xmm0 2510; SKX-NEXT: vzeroupper 2511; SKX-NEXT: retq 2512 %1 = icmp slt <8 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 2513 %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 2514 %3 = icmp sgt <8 x i32> %2, zeroinitializer 2515 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer 2516 %5 = trunc <8 x i32> %4 to <8 x i16> 2517 ret <8 x i16> %5 2518} 2519 2520define <16 x i16> @trunc_packus_v16i32_v16i16(<16 x i32>* %p0) "min-legal-vector-width"="256" { 2521; SSE2-LABEL: trunc_packus_v16i32_v16i16: 2522; SSE2: # %bb.0: 2523; SSE2-NEXT: movdqa (%rdi), %xmm1 2524; SSE2-NEXT: movdqa 16(%rdi), %xmm3 2525; SSE2-NEXT: movdqa 32(%rdi), %xmm0 2526; SSE2-NEXT: movdqa 48(%rdi), %xmm4 2527; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [65535,65535,65535,65535] 2528; SSE2-NEXT: movdqa %xmm5, %xmm2 2529; SSE2-NEXT: pcmpgtd %xmm3, %xmm2 2530; SSE2-NEXT: pand %xmm2, %xmm3 2531; SSE2-NEXT: pandn %xmm5, %xmm2 2532; SSE2-NEXT: por %xmm3, %xmm2 2533; SSE2-NEXT: movdqa %xmm5, %xmm3 2534; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 2535; SSE2-NEXT: pand %xmm3, %xmm1 2536; SSE2-NEXT: pandn %xmm5, %xmm3 2537; SSE2-NEXT: por %xmm1, %xmm3 2538; SSE2-NEXT: movdqa %xmm5, %xmm6 2539; SSE2-NEXT: pcmpgtd %xmm4, %xmm6 2540; SSE2-NEXT: pand %xmm6, %xmm4 2541; SSE2-NEXT: pandn %xmm5, %xmm6 2542; SSE2-NEXT: por %xmm4, %xmm6 2543; SSE2-NEXT: movdqa %xmm5, %xmm4 2544; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 2545; SSE2-NEXT: pand %xmm4, %xmm0 2546; SSE2-NEXT: pandn %xmm5, %xmm4 2547; SSE2-NEXT: por %xmm0, %xmm4 2548; SSE2-NEXT: pxor %xmm5, %xmm5 2549; SSE2-NEXT: movdqa %xmm4, %xmm1 2550; SSE2-NEXT: pcmpgtd %xmm5, %xmm1 2551; SSE2-NEXT: pand %xmm4, %xmm1 2552; SSE2-NEXT: movdqa %xmm6, %xmm4 2553; SSE2-NEXT: pcmpgtd %xmm5, %xmm4 2554; SSE2-NEXT: pand %xmm6, %xmm4 2555; SSE2-NEXT: movdqa %xmm3, %xmm0 2556; SSE2-NEXT: pcmpgtd %xmm5, %xmm0 2557; SSE2-NEXT: pand %xmm3, %xmm0 2558; SSE2-NEXT: movdqa %xmm2, %xmm3 2559; SSE2-NEXT: pcmpgtd %xmm5, %xmm3 2560; SSE2-NEXT: pand %xmm2, %xmm3 2561; SSE2-NEXT: pslld $16, %xmm3 2562; SSE2-NEXT: psrad $16, %xmm3 2563; SSE2-NEXT: pslld $16, %xmm0 2564; SSE2-NEXT: psrad $16, %xmm0 2565; SSE2-NEXT: packssdw %xmm3, %xmm0 2566; SSE2-NEXT: pslld $16, %xmm4 2567; SSE2-NEXT: psrad $16, %xmm4 2568; SSE2-NEXT: pslld $16, %xmm1 2569; SSE2-NEXT: psrad $16, %xmm1 2570; SSE2-NEXT: packssdw %xmm4, %xmm1 2571; SSE2-NEXT: retq 2572; 2573; SSSE3-LABEL: trunc_packus_v16i32_v16i16: 2574; SSSE3: # %bb.0: 2575; SSSE3-NEXT: movdqa (%rdi), %xmm1 2576; SSSE3-NEXT: movdqa 16(%rdi), %xmm3 2577; SSSE3-NEXT: movdqa 32(%rdi), %xmm0 2578; SSSE3-NEXT: movdqa 48(%rdi), %xmm4 2579; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [65535,65535,65535,65535] 2580; SSSE3-NEXT: movdqa %xmm5, %xmm2 2581; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2 2582; SSSE3-NEXT: pand %xmm2, %xmm3 2583; SSSE3-NEXT: pandn %xmm5, %xmm2 2584; SSSE3-NEXT: por %xmm3, %xmm2 2585; SSSE3-NEXT: movdqa %xmm5, %xmm3 2586; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3 2587; SSSE3-NEXT: pand %xmm3, %xmm1 2588; SSSE3-NEXT: pandn %xmm5, %xmm3 2589; SSSE3-NEXT: por %xmm1, %xmm3 2590; SSSE3-NEXT: movdqa %xmm5, %xmm6 2591; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6 2592; SSSE3-NEXT: pand %xmm6, %xmm4 2593; SSSE3-NEXT: pandn %xmm5, %xmm6 2594; SSSE3-NEXT: por %xmm4, %xmm6 2595; SSSE3-NEXT: movdqa %xmm5, %xmm4 2596; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4 2597; SSSE3-NEXT: pand %xmm4, %xmm0 2598; SSSE3-NEXT: pandn %xmm5, %xmm4 2599; SSSE3-NEXT: por %xmm0, %xmm4 2600; SSSE3-NEXT: pxor %xmm5, %xmm5 2601; SSSE3-NEXT: movdqa %xmm4, %xmm1 2602; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1 2603; SSSE3-NEXT: pand %xmm4, %xmm1 2604; SSSE3-NEXT: movdqa %xmm6, %xmm4 2605; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4 2606; SSSE3-NEXT: pand %xmm6, %xmm4 2607; SSSE3-NEXT: movdqa %xmm3, %xmm0 2608; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0 2609; SSSE3-NEXT: pand %xmm3, %xmm0 2610; SSSE3-NEXT: movdqa %xmm2, %xmm3 2611; SSSE3-NEXT: pcmpgtd %xmm5, %xmm3 2612; SSSE3-NEXT: pand %xmm2, %xmm3 2613; SSSE3-NEXT: pslld $16, %xmm3 2614; SSSE3-NEXT: psrad $16, %xmm3 2615; SSSE3-NEXT: pslld $16, %xmm0 2616; SSSE3-NEXT: psrad $16, %xmm0 2617; SSSE3-NEXT: packssdw %xmm3, %xmm0 2618; SSSE3-NEXT: pslld $16, %xmm4 2619; SSSE3-NEXT: psrad $16, %xmm4 2620; SSSE3-NEXT: pslld $16, %xmm1 2621; SSSE3-NEXT: psrad $16, %xmm1 2622; SSSE3-NEXT: packssdw %xmm4, %xmm1 2623; SSSE3-NEXT: retq 2624; 2625; SSE41-LABEL: trunc_packus_v16i32_v16i16: 2626; SSE41: # %bb.0: 2627; SSE41-NEXT: movdqa (%rdi), %xmm0 2628; SSE41-NEXT: movdqa 32(%rdi), %xmm1 2629; SSE41-NEXT: packusdw 16(%rdi), %xmm0 2630; SSE41-NEXT: packusdw 48(%rdi), %xmm1 2631; SSE41-NEXT: retq 2632; 2633; AVX1-LABEL: trunc_packus_v16i32_v16i16: 2634; AVX1: # %bb.0: 2635; AVX1-NEXT: vmovdqa (%rdi), %xmm0 2636; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1 2637; AVX1-NEXT: vpackusdw 48(%rdi), %xmm1, %xmm1 2638; AVX1-NEXT: vpackusdw 16(%rdi), %xmm0, %xmm0 2639; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 2640; AVX1-NEXT: retq 2641; 2642; AVX2-LABEL: trunc_packus_v16i32_v16i16: 2643; AVX2: # %bb.0: 2644; AVX2-NEXT: vmovdqa (%rdi), %ymm0 2645; AVX2-NEXT: vpackusdw 32(%rdi), %ymm0, %ymm0 2646; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 2647; AVX2-NEXT: retq 2648; 2649; AVX512-LABEL: trunc_packus_v16i32_v16i16: 2650; AVX512: # %bb.0: 2651; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0 2652; AVX512-NEXT: vpmaxsd (%rdi), %zmm0, %zmm0 2653; AVX512-NEXT: vpmovusdw %zmm0, %ymm0 2654; AVX512-NEXT: retq 2655; 2656; SKX-LABEL: trunc_packus_v16i32_v16i16: 2657; SKX: # %bb.0: 2658; SKX-NEXT: vmovdqa (%rdi), %ymm0 2659; SKX-NEXT: vpackusdw 32(%rdi), %ymm0, %ymm0 2660; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 2661; SKX-NEXT: retq 2662 %a0 = load <16 x i32>, <16 x i32>* %p0 2663 %1 = icmp slt <16 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 2664 %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 2665 %3 = icmp sgt <16 x i32> %2, zeroinitializer 2666 %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> zeroinitializer 2667 %5 = trunc <16 x i32> %4 to <16 x i16> 2668 ret <16 x i16> %5 2669} 2670 2671; 2672; PACKUS saturation truncation to vXi8 2673; 2674 2675define <2 x i8> @trunc_packus_v2i64_v2i8(<2 x i64> %a0) { 2676; SSE2-LABEL: trunc_packus_v2i64_v2i8: 2677; SSE2: # %bb.0: 2678; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 2679; SSE2-NEXT: movdqa %xmm0, %xmm2 2680; SSE2-NEXT: pxor %xmm1, %xmm2 2681; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903] 2682; SSE2-NEXT: movdqa %xmm3, %xmm4 2683; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 2684; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 2685; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 2686; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 2687; SSE2-NEXT: pand %xmm5, %xmm2 2688; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 2689; SSE2-NEXT: por %xmm2, %xmm3 2690; SSE2-NEXT: pand %xmm3, %xmm0 2691; SSE2-NEXT: pandn {{.*}}(%rip), %xmm3 2692; SSE2-NEXT: por %xmm0, %xmm3 2693; SSE2-NEXT: movdqa %xmm3, %xmm0 2694; SSE2-NEXT: pxor %xmm1, %xmm0 2695; SSE2-NEXT: movdqa %xmm0, %xmm2 2696; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 2697; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 2698; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 2699; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 2700; SSE2-NEXT: pand %xmm4, %xmm1 2701; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 2702; SSE2-NEXT: por %xmm1, %xmm0 2703; SSE2-NEXT: pand %xmm3, %xmm0 2704; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 2705; SSE2-NEXT: packuswb %xmm0, %xmm0 2706; SSE2-NEXT: packuswb %xmm0, %xmm0 2707; SSE2-NEXT: packuswb %xmm0, %xmm0 2708; SSE2-NEXT: retq 2709; 2710; SSSE3-LABEL: trunc_packus_v2i64_v2i8: 2711; SSSE3: # %bb.0: 2712; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 2713; SSSE3-NEXT: movdqa %xmm0, %xmm2 2714; SSSE3-NEXT: pxor %xmm1, %xmm2 2715; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903] 2716; SSSE3-NEXT: movdqa %xmm3, %xmm4 2717; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 2718; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 2719; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2 2720; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 2721; SSSE3-NEXT: pand %xmm5, %xmm2 2722; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 2723; SSSE3-NEXT: por %xmm2, %xmm3 2724; SSSE3-NEXT: pand %xmm3, %xmm0 2725; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm3 2726; SSSE3-NEXT: por %xmm0, %xmm3 2727; SSSE3-NEXT: movdqa %xmm3, %xmm0 2728; SSSE3-NEXT: pxor %xmm1, %xmm0 2729; SSSE3-NEXT: movdqa %xmm0, %xmm2 2730; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 2731; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 2732; SSSE3-NEXT: pcmpeqd %xmm1, %xmm0 2733; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 2734; SSSE3-NEXT: pand %xmm4, %xmm1 2735; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 2736; SSSE3-NEXT: por %xmm1, %xmm0 2737; SSSE3-NEXT: pand %xmm3, %xmm0 2738; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 2739; SSSE3-NEXT: retq 2740; 2741; SSE41-LABEL: trunc_packus_v2i64_v2i8: 2742; SSE41: # %bb.0: 2743; SSE41-NEXT: movdqa %xmm0, %xmm1 2744; SSE41-NEXT: movapd {{.*#+}} xmm2 = [255,255] 2745; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 2746; SSE41-NEXT: pxor %xmm3, %xmm0 2747; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483903,2147483903] 2748; SSE41-NEXT: movdqa %xmm4, %xmm5 2749; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 2750; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 2751; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 2752; SSE41-NEXT: pand %xmm5, %xmm0 2753; SSE41-NEXT: por %xmm4, %xmm0 2754; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 2755; SSE41-NEXT: xorpd %xmm1, %xmm1 2756; SSE41-NEXT: movapd %xmm2, %xmm4 2757; SSE41-NEXT: xorpd %xmm3, %xmm4 2758; SSE41-NEXT: movapd %xmm4, %xmm5 2759; SSE41-NEXT: pcmpeqd %xmm3, %xmm5 2760; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 2761; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 2762; SSE41-NEXT: pand %xmm5, %xmm0 2763; SSE41-NEXT: por %xmm4, %xmm0 2764; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 2765; SSE41-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 2766; SSE41-NEXT: movdqa %xmm1, %xmm0 2767; SSE41-NEXT: retq 2768; 2769; AVX-LABEL: trunc_packus_v2i64_v2i8: 2770; AVX: # %bb.0: 2771; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255] 2772; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2 2773; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 2774; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1 2775; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1 2776; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0 2777; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 2778; AVX-NEXT: retq 2779; 2780; AVX512F-LABEL: trunc_packus_v2i64_v2i8: 2781; AVX512F: # %bb.0: 2782; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 2783; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 2784; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 2785; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0 2786; AVX512F-NEXT: vzeroupper 2787; AVX512F-NEXT: retq 2788; 2789; AVX512VL-LABEL: trunc_packus_v2i64_v2i8: 2790; AVX512VL: # %bb.0: 2791; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2792; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 2793; AVX512VL-NEXT: vpmovusqb %xmm0, %xmm0 2794; AVX512VL-NEXT: retq 2795; 2796; AVX512BW-LABEL: trunc_packus_v2i64_v2i8: 2797; AVX512BW: # %bb.0: 2798; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 2799; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 2800; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 2801; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0 2802; AVX512BW-NEXT: vzeroupper 2803; AVX512BW-NEXT: retq 2804; 2805; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i8: 2806; AVX512BWVL: # %bb.0: 2807; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2808; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 2809; AVX512BWVL-NEXT: vpmovusqb %xmm0, %xmm0 2810; AVX512BWVL-NEXT: retq 2811; 2812; SKX-LABEL: trunc_packus_v2i64_v2i8: 2813; SKX: # %bb.0: 2814; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 2815; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 2816; SKX-NEXT: vpmovusqb %xmm0, %xmm0 2817; SKX-NEXT: retq 2818 %1 = icmp slt <2 x i64> %a0, <i64 255, i64 255> 2819 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 255, i64 255> 2820 %3 = icmp sgt <2 x i64> %2, zeroinitializer 2821 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer 2822 %5 = trunc <2 x i64> %4 to <2 x i8> 2823 ret <2 x i8> %5 2824} 2825 2826define void @trunc_packus_v2i64_v2i8_store(<2 x i64> %a0, <2 x i8> *%p1) { 2827; SSE2-LABEL: trunc_packus_v2i64_v2i8_store: 2828; SSE2: # %bb.0: 2829; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 2830; SSE2-NEXT: movdqa %xmm0, %xmm2 2831; SSE2-NEXT: pxor %xmm1, %xmm2 2832; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903] 2833; SSE2-NEXT: movdqa %xmm3, %xmm4 2834; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 2835; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 2836; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 2837; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 2838; SSE2-NEXT: pand %xmm5, %xmm2 2839; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 2840; SSE2-NEXT: por %xmm2, %xmm3 2841; SSE2-NEXT: pand %xmm3, %xmm0 2842; SSE2-NEXT: pandn {{.*}}(%rip), %xmm3 2843; SSE2-NEXT: por %xmm0, %xmm3 2844; SSE2-NEXT: movdqa %xmm3, %xmm0 2845; SSE2-NEXT: pxor %xmm1, %xmm0 2846; SSE2-NEXT: movdqa %xmm0, %xmm2 2847; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 2848; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 2849; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 2850; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 2851; SSE2-NEXT: pand %xmm4, %xmm0 2852; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 2853; SSE2-NEXT: por %xmm0, %xmm1 2854; SSE2-NEXT: pand %xmm3, %xmm1 2855; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 2856; SSE2-NEXT: packuswb %xmm1, %xmm1 2857; SSE2-NEXT: packuswb %xmm1, %xmm1 2858; SSE2-NEXT: packuswb %xmm1, %xmm1 2859; SSE2-NEXT: movd %xmm1, %eax 2860; SSE2-NEXT: movw %ax, (%rdi) 2861; SSE2-NEXT: retq 2862; 2863; SSSE3-LABEL: trunc_packus_v2i64_v2i8_store: 2864; SSSE3: # %bb.0: 2865; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 2866; SSSE3-NEXT: movdqa %xmm0, %xmm2 2867; SSSE3-NEXT: pxor %xmm1, %xmm2 2868; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903] 2869; SSSE3-NEXT: movdqa %xmm3, %xmm4 2870; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 2871; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 2872; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2 2873; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 2874; SSSE3-NEXT: pand %xmm5, %xmm2 2875; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 2876; SSSE3-NEXT: por %xmm2, %xmm3 2877; SSSE3-NEXT: pand %xmm3, %xmm0 2878; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm3 2879; SSSE3-NEXT: por %xmm0, %xmm3 2880; SSSE3-NEXT: movdqa %xmm3, %xmm0 2881; SSSE3-NEXT: pxor %xmm1, %xmm0 2882; SSSE3-NEXT: movdqa %xmm0, %xmm2 2883; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 2884; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 2885; SSSE3-NEXT: pcmpeqd %xmm1, %xmm0 2886; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 2887; SSSE3-NEXT: pand %xmm4, %xmm0 2888; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 2889; SSSE3-NEXT: por %xmm0, %xmm1 2890; SSSE3-NEXT: pand %xmm3, %xmm1 2891; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 2892; SSSE3-NEXT: movd %xmm1, %eax 2893; SSSE3-NEXT: movw %ax, (%rdi) 2894; SSSE3-NEXT: retq 2895; 2896; SSE41-LABEL: trunc_packus_v2i64_v2i8_store: 2897; SSE41: # %bb.0: 2898; SSE41-NEXT: movdqa %xmm0, %xmm1 2899; SSE41-NEXT: movapd {{.*#+}} xmm2 = [255,255] 2900; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 2901; SSE41-NEXT: pxor %xmm3, %xmm0 2902; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483903,2147483903] 2903; SSE41-NEXT: movdqa %xmm4, %xmm5 2904; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 2905; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 2906; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 2907; SSE41-NEXT: pand %xmm5, %xmm0 2908; SSE41-NEXT: por %xmm4, %xmm0 2909; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 2910; SSE41-NEXT: xorpd %xmm1, %xmm1 2911; SSE41-NEXT: movapd %xmm2, %xmm4 2912; SSE41-NEXT: xorpd %xmm3, %xmm4 2913; SSE41-NEXT: movapd %xmm4, %xmm5 2914; SSE41-NEXT: pcmpeqd %xmm3, %xmm5 2915; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 2916; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 2917; SSE41-NEXT: pand %xmm5, %xmm0 2918; SSE41-NEXT: por %xmm4, %xmm0 2919; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 2920; SSE41-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 2921; SSE41-NEXT: pextrw $0, %xmm1, (%rdi) 2922; SSE41-NEXT: retq 2923; 2924; AVX-LABEL: trunc_packus_v2i64_v2i8_store: 2925; AVX: # %bb.0: 2926; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255] 2927; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2 2928; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 2929; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1 2930; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1 2931; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0 2932; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 2933; AVX-NEXT: vpextrw $0, %xmm0, (%rdi) 2934; AVX-NEXT: retq 2935; 2936; AVX512F-LABEL: trunc_packus_v2i64_v2i8_store: 2937; AVX512F: # %bb.0: 2938; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 2939; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 2940; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 2941; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0 2942; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi) 2943; AVX512F-NEXT: vzeroupper 2944; AVX512F-NEXT: retq 2945; 2946; AVX512VL-LABEL: trunc_packus_v2i64_v2i8_store: 2947; AVX512VL: # %bb.0: 2948; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2949; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 2950; AVX512VL-NEXT: vpmovusqb %xmm0, (%rdi) 2951; AVX512VL-NEXT: retq 2952; 2953; AVX512BW-LABEL: trunc_packus_v2i64_v2i8_store: 2954; AVX512BW: # %bb.0: 2955; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 2956; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 2957; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 2958; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0 2959; AVX512BW-NEXT: vpextrw $0, %xmm0, (%rdi) 2960; AVX512BW-NEXT: vzeroupper 2961; AVX512BW-NEXT: retq 2962; 2963; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i8_store: 2964; AVX512BWVL: # %bb.0: 2965; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2966; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 2967; AVX512BWVL-NEXT: vpmovusqb %xmm0, (%rdi) 2968; AVX512BWVL-NEXT: retq 2969; 2970; SKX-LABEL: trunc_packus_v2i64_v2i8_store: 2971; SKX: # %bb.0: 2972; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 2973; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 2974; SKX-NEXT: vpmovusqb %xmm0, (%rdi) 2975; SKX-NEXT: retq 2976 %1 = icmp slt <2 x i64> %a0, <i64 255, i64 255> 2977 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 255, i64 255> 2978 %3 = icmp sgt <2 x i64> %2, zeroinitializer 2979 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer 2980 %5 = trunc <2 x i64> %4 to <2 x i8> 2981 store <2 x i8> %5, <2 x i8> *%p1 2982 ret void 2983} 2984 2985define <4 x i8> @trunc_packus_v4i64_v4i8(<4 x i64> %a0) { 2986; SSE2-LABEL: trunc_packus_v4i64_v4i8: 2987; SSE2: # %bb.0: 2988; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 2989; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 2990; SSE2-NEXT: movdqa %xmm1, %xmm4 2991; SSE2-NEXT: pxor %xmm3, %xmm4 2992; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903] 2993; SSE2-NEXT: movdqa %xmm5, %xmm6 2994; SSE2-NEXT: pcmpgtd %xmm4, %xmm6 2995; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 2996; SSE2-NEXT: pcmpeqd %xmm5, %xmm4 2997; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 2998; SSE2-NEXT: pand %xmm7, %xmm2 2999; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3] 3000; SSE2-NEXT: por %xmm2, %xmm4 3001; SSE2-NEXT: pand %xmm4, %xmm1 3002; SSE2-NEXT: pandn %xmm8, %xmm4 3003; SSE2-NEXT: por %xmm1, %xmm4 3004; SSE2-NEXT: movdqa %xmm0, %xmm1 3005; SSE2-NEXT: pxor %xmm3, %xmm1 3006; SSE2-NEXT: movdqa %xmm5, %xmm2 3007; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 3008; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2] 3009; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 3010; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 3011; SSE2-NEXT: pand %xmm6, %xmm5 3012; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 3013; SSE2-NEXT: por %xmm5, %xmm1 3014; SSE2-NEXT: pand %xmm1, %xmm0 3015; SSE2-NEXT: pandn %xmm8, %xmm1 3016; SSE2-NEXT: por %xmm0, %xmm1 3017; SSE2-NEXT: movdqa %xmm1, %xmm0 3018; SSE2-NEXT: pxor %xmm3, %xmm0 3019; SSE2-NEXT: movdqa %xmm0, %xmm2 3020; SSE2-NEXT: pcmpgtd %xmm3, %xmm2 3021; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2] 3022; SSE2-NEXT: pcmpeqd %xmm3, %xmm0 3023; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 3024; SSE2-NEXT: pand %xmm5, %xmm6 3025; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 3026; SSE2-NEXT: por %xmm6, %xmm0 3027; SSE2-NEXT: movdqa %xmm4, %xmm2 3028; SSE2-NEXT: pxor %xmm3, %xmm2 3029; SSE2-NEXT: movdqa %xmm2, %xmm5 3030; SSE2-NEXT: pcmpgtd %xmm3, %xmm5 3031; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 3032; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 3033; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 3034; SSE2-NEXT: pand %xmm6, %xmm2 3035; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3] 3036; SSE2-NEXT: por %xmm2, %xmm3 3037; SSE2-NEXT: pand %xmm8, %xmm3 3038; SSE2-NEXT: pand %xmm4, %xmm3 3039; SSE2-NEXT: pand %xmm8, %xmm0 3040; SSE2-NEXT: pand %xmm1, %xmm0 3041; SSE2-NEXT: packuswb %xmm3, %xmm0 3042; SSE2-NEXT: packuswb %xmm0, %xmm0 3043; SSE2-NEXT: packuswb %xmm0, %xmm0 3044; SSE2-NEXT: retq 3045; 3046; SSSE3-LABEL: trunc_packus_v4i64_v4i8: 3047; SSSE3: # %bb.0: 3048; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 3049; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 3050; SSSE3-NEXT: movdqa %xmm1, %xmm3 3051; SSSE3-NEXT: pxor %xmm2, %xmm3 3052; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903] 3053; SSSE3-NEXT: movdqa %xmm5, %xmm6 3054; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6 3055; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 3056; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3 3057; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 3058; SSSE3-NEXT: pand %xmm7, %xmm4 3059; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 3060; SSSE3-NEXT: por %xmm4, %xmm3 3061; SSSE3-NEXT: pand %xmm3, %xmm1 3062; SSSE3-NEXT: pandn %xmm8, %xmm3 3063; SSSE3-NEXT: por %xmm1, %xmm3 3064; SSSE3-NEXT: movdqa %xmm0, %xmm1 3065; SSSE3-NEXT: pxor %xmm2, %xmm1 3066; SSSE3-NEXT: movdqa %xmm5, %xmm4 3067; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 3068; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 3069; SSSE3-NEXT: pcmpeqd %xmm5, %xmm1 3070; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 3071; SSSE3-NEXT: pand %xmm6, %xmm1 3072; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 3073; SSSE3-NEXT: por %xmm1, %xmm4 3074; SSSE3-NEXT: pand %xmm4, %xmm0 3075; SSSE3-NEXT: pandn %xmm8, %xmm4 3076; SSSE3-NEXT: por %xmm0, %xmm4 3077; SSSE3-NEXT: movdqa %xmm4, %xmm0 3078; SSSE3-NEXT: pxor %xmm2, %xmm0 3079; SSSE3-NEXT: movdqa %xmm0, %xmm1 3080; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 3081; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] 3082; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0 3083; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 3084; SSSE3-NEXT: pand %xmm5, %xmm6 3085; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 3086; SSSE3-NEXT: por %xmm6, %xmm0 3087; SSSE3-NEXT: pand %xmm4, %xmm0 3088; SSSE3-NEXT: movdqa %xmm3, %xmm1 3089; SSSE3-NEXT: pxor %xmm2, %xmm1 3090; SSSE3-NEXT: movdqa %xmm1, %xmm4 3091; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 3092; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 3093; SSSE3-NEXT: pcmpeqd %xmm2, %xmm1 3094; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 3095; SSSE3-NEXT: pand %xmm5, %xmm1 3096; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 3097; SSSE3-NEXT: por %xmm1, %xmm2 3098; SSSE3-NEXT: pand %xmm3, %xmm2 3099; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u> 3100; SSSE3-NEXT: pshufb %xmm1, %xmm2 3101; SSSE3-NEXT: pshufb %xmm1, %xmm0 3102; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 3103; SSSE3-NEXT: retq 3104; 3105; SSE41-LABEL: trunc_packus_v4i64_v4i8: 3106; SSE41: # %bb.0: 3107; SSE41-NEXT: movdqa %xmm0, %xmm2 3108; SSE41-NEXT: movapd {{.*#+}} xmm4 = [255,255] 3109; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 3110; SSE41-NEXT: movdqa %xmm1, %xmm0 3111; SSE41-NEXT: pxor %xmm3, %xmm0 3112; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147483903,2147483903] 3113; SSE41-NEXT: movdqa %xmm6, %xmm5 3114; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 3115; SSE41-NEXT: movdqa %xmm6, %xmm7 3116; SSE41-NEXT: pcmpgtd %xmm0, %xmm7 3117; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2] 3118; SSE41-NEXT: pand %xmm5, %xmm0 3119; SSE41-NEXT: por %xmm7, %xmm0 3120; SSE41-NEXT: movapd %xmm4, %xmm5 3121; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5 3122; SSE41-NEXT: movdqa %xmm2, %xmm0 3123; SSE41-NEXT: pxor %xmm3, %xmm0 3124; SSE41-NEXT: movdqa %xmm6, %xmm1 3125; SSE41-NEXT: pcmpeqd %xmm0, %xmm1 3126; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 3127; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 3128; SSE41-NEXT: pand %xmm1, %xmm0 3129; SSE41-NEXT: por %xmm6, %xmm0 3130; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4 3131; SSE41-NEXT: xorpd %xmm2, %xmm2 3132; SSE41-NEXT: movapd %xmm4, %xmm1 3133; SSE41-NEXT: xorpd %xmm3, %xmm1 3134; SSE41-NEXT: movapd %xmm1, %xmm6 3135; SSE41-NEXT: pcmpeqd %xmm3, %xmm6 3136; SSE41-NEXT: pcmpgtd %xmm3, %xmm1 3137; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2] 3138; SSE41-NEXT: pand %xmm6, %xmm0 3139; SSE41-NEXT: por %xmm1, %xmm0 3140; SSE41-NEXT: pxor %xmm1, %xmm1 3141; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm1 3142; SSE41-NEXT: movapd %xmm5, %xmm4 3143; SSE41-NEXT: xorpd %xmm3, %xmm4 3144; SSE41-NEXT: movapd %xmm4, %xmm6 3145; SSE41-NEXT: pcmpeqd %xmm3, %xmm6 3146; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 3147; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 3148; SSE41-NEXT: pand %xmm6, %xmm0 3149; SSE41-NEXT: por %xmm4, %xmm0 3150; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm2 3151; SSE41-NEXT: movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u> 3152; SSE41-NEXT: pshufb %xmm0, %xmm2 3153; SSE41-NEXT: pshufb %xmm0, %xmm1 3154; SSE41-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 3155; SSE41-NEXT: movdqa %xmm1, %xmm0 3156; SSE41-NEXT: retq 3157; 3158; AVX1-LABEL: trunc_packus_v4i64_v4i8: 3159; AVX1: # %bb.0: 3160; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 3161; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255] 3162; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3 3163; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm4 3164; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm2, %xmm0 3165; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 3166; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5 3167; AVX1-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm1 3168; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm2 3169; AVX1-NEXT: vpand %xmm1, %xmm2, %xmm1 3170; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u> 3171; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 3172; AVX1-NEXT: vpand %xmm0, %xmm5, %xmm0 3173; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 3174; AVX1-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 3175; AVX1-NEXT: vzeroupper 3176; AVX1-NEXT: retq 3177; 3178; AVX2-LABEL: trunc_packus_v4i64_v4i8: 3179; AVX2: # %bb.0: 3180; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [255,255,255,255] 3181; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2 3182; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 3183; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 3184; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1 3185; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0 3186; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 3187; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u> 3188; AVX2-NEXT: vpshufb %xmm2, %xmm1, %xmm1 3189; AVX2-NEXT: vpshufb %xmm2, %xmm0, %xmm0 3190; AVX2-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 3191; AVX2-NEXT: vzeroupper 3192; AVX2-NEXT: retq 3193; 3194; AVX512F-LABEL: trunc_packus_v4i64_v4i8: 3195; AVX512F: # %bb.0: 3196; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 3197; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 3198; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 3199; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0 3200; AVX512F-NEXT: vzeroupper 3201; AVX512F-NEXT: retq 3202; 3203; AVX512VL-LABEL: trunc_packus_v4i64_v4i8: 3204; AVX512VL: # %bb.0: 3205; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 3206; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 3207; AVX512VL-NEXT: vpmovusqb %ymm0, %xmm0 3208; AVX512VL-NEXT: vzeroupper 3209; AVX512VL-NEXT: retq 3210; 3211; AVX512BW-LABEL: trunc_packus_v4i64_v4i8: 3212; AVX512BW: # %bb.0: 3213; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 3214; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 3215; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 3216; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0 3217; AVX512BW-NEXT: vzeroupper 3218; AVX512BW-NEXT: retq 3219; 3220; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i8: 3221; AVX512BWVL: # %bb.0: 3222; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 3223; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 3224; AVX512BWVL-NEXT: vpmovusqb %ymm0, %xmm0 3225; AVX512BWVL-NEXT: vzeroupper 3226; AVX512BWVL-NEXT: retq 3227; 3228; SKX-LABEL: trunc_packus_v4i64_v4i8: 3229; SKX: # %bb.0: 3230; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 3231; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 3232; SKX-NEXT: vpmovusqb %ymm0, %xmm0 3233; SKX-NEXT: vzeroupper 3234; SKX-NEXT: retq 3235 %1 = icmp slt <4 x i64> %a0, <i64 255, i64 255, i64 255, i64 255> 3236 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 255, i64 255, i64 255, i64 255> 3237 %3 = icmp sgt <4 x i64> %2, zeroinitializer 3238 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer 3239 %5 = trunc <4 x i64> %4 to <4 x i8> 3240 ret <4 x i8> %5 3241} 3242 3243define void @trunc_packus_v4i64_v4i8_store(<4 x i64> %a0, <4 x i8> *%p1) { 3244; SSE2-LABEL: trunc_packus_v4i64_v4i8_store: 3245; SSE2: # %bb.0: 3246; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 3247; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 3248; SSE2-NEXT: movdqa %xmm1, %xmm4 3249; SSE2-NEXT: pxor %xmm3, %xmm4 3250; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903] 3251; SSE2-NEXT: movdqa %xmm5, %xmm6 3252; SSE2-NEXT: pcmpgtd %xmm4, %xmm6 3253; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 3254; SSE2-NEXT: pcmpeqd %xmm5, %xmm4 3255; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 3256; SSE2-NEXT: pand %xmm7, %xmm2 3257; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3] 3258; SSE2-NEXT: por %xmm2, %xmm4 3259; SSE2-NEXT: pand %xmm4, %xmm1 3260; SSE2-NEXT: pandn %xmm8, %xmm4 3261; SSE2-NEXT: por %xmm1, %xmm4 3262; SSE2-NEXT: movdqa %xmm0, %xmm1 3263; SSE2-NEXT: pxor %xmm3, %xmm1 3264; SSE2-NEXT: movdqa %xmm5, %xmm2 3265; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 3266; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2] 3267; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 3268; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 3269; SSE2-NEXT: pand %xmm6, %xmm5 3270; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 3271; SSE2-NEXT: por %xmm5, %xmm1 3272; SSE2-NEXT: pand %xmm1, %xmm0 3273; SSE2-NEXT: pandn %xmm8, %xmm1 3274; SSE2-NEXT: por %xmm0, %xmm1 3275; SSE2-NEXT: movdqa %xmm1, %xmm0 3276; SSE2-NEXT: pxor %xmm3, %xmm0 3277; SSE2-NEXT: movdqa %xmm0, %xmm2 3278; SSE2-NEXT: pcmpgtd %xmm3, %xmm2 3279; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2] 3280; SSE2-NEXT: pcmpeqd %xmm3, %xmm0 3281; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 3282; SSE2-NEXT: pand %xmm5, %xmm0 3283; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 3284; SSE2-NEXT: por %xmm0, %xmm2 3285; SSE2-NEXT: movdqa %xmm4, %xmm0 3286; SSE2-NEXT: pxor %xmm3, %xmm0 3287; SSE2-NEXT: movdqa %xmm0, %xmm5 3288; SSE2-NEXT: pcmpgtd %xmm3, %xmm5 3289; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 3290; SSE2-NEXT: pcmpeqd %xmm3, %xmm0 3291; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 3292; SSE2-NEXT: pand %xmm6, %xmm0 3293; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3] 3294; SSE2-NEXT: por %xmm0, %xmm3 3295; SSE2-NEXT: pand %xmm8, %xmm3 3296; SSE2-NEXT: pand %xmm4, %xmm3 3297; SSE2-NEXT: pand %xmm8, %xmm2 3298; SSE2-NEXT: pand %xmm1, %xmm2 3299; SSE2-NEXT: packuswb %xmm3, %xmm2 3300; SSE2-NEXT: packuswb %xmm2, %xmm2 3301; SSE2-NEXT: packuswb %xmm2, %xmm2 3302; SSE2-NEXT: movd %xmm2, (%rdi) 3303; SSE2-NEXT: retq 3304; 3305; SSSE3-LABEL: trunc_packus_v4i64_v4i8_store: 3306; SSSE3: # %bb.0: 3307; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 3308; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 3309; SSSE3-NEXT: movdqa %xmm1, %xmm3 3310; SSSE3-NEXT: pxor %xmm2, %xmm3 3311; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903] 3312; SSSE3-NEXT: movdqa %xmm5, %xmm6 3313; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6 3314; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 3315; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3 3316; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 3317; SSSE3-NEXT: pand %xmm7, %xmm4 3318; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 3319; SSSE3-NEXT: por %xmm4, %xmm3 3320; SSSE3-NEXT: pand %xmm3, %xmm1 3321; SSSE3-NEXT: pandn %xmm8, %xmm3 3322; SSSE3-NEXT: por %xmm1, %xmm3 3323; SSSE3-NEXT: movdqa %xmm0, %xmm1 3324; SSSE3-NEXT: pxor %xmm2, %xmm1 3325; SSSE3-NEXT: movdqa %xmm5, %xmm4 3326; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 3327; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 3328; SSSE3-NEXT: pcmpeqd %xmm5, %xmm1 3329; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 3330; SSSE3-NEXT: pand %xmm6, %xmm1 3331; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 3332; SSSE3-NEXT: por %xmm1, %xmm4 3333; SSSE3-NEXT: pand %xmm4, %xmm0 3334; SSSE3-NEXT: pandn %xmm8, %xmm4 3335; SSSE3-NEXT: por %xmm0, %xmm4 3336; SSSE3-NEXT: movdqa %xmm4, %xmm0 3337; SSSE3-NEXT: pxor %xmm2, %xmm0 3338; SSSE3-NEXT: movdqa %xmm0, %xmm1 3339; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 3340; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] 3341; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0 3342; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 3343; SSSE3-NEXT: pand %xmm5, %xmm0 3344; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 3345; SSSE3-NEXT: por %xmm0, %xmm1 3346; SSSE3-NEXT: pand %xmm4, %xmm1 3347; SSSE3-NEXT: movdqa %xmm3, %xmm0 3348; SSSE3-NEXT: pxor %xmm2, %xmm0 3349; SSSE3-NEXT: movdqa %xmm0, %xmm4 3350; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 3351; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 3352; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0 3353; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 3354; SSSE3-NEXT: pand %xmm5, %xmm0 3355; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 3356; SSSE3-NEXT: por %xmm0, %xmm2 3357; SSSE3-NEXT: pand %xmm3, %xmm2 3358; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u> 3359; SSSE3-NEXT: pshufb %xmm0, %xmm2 3360; SSSE3-NEXT: pshufb %xmm0, %xmm1 3361; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3] 3362; SSSE3-NEXT: movd %xmm1, (%rdi) 3363; SSSE3-NEXT: retq 3364; 3365; SSE41-LABEL: trunc_packus_v4i64_v4i8_store: 3366; SSE41: # %bb.0: 3367; SSE41-NEXT: movdqa %xmm0, %xmm2 3368; SSE41-NEXT: movapd {{.*#+}} xmm4 = [255,255] 3369; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 3370; SSE41-NEXT: movdqa %xmm1, %xmm0 3371; SSE41-NEXT: pxor %xmm3, %xmm0 3372; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147483903,2147483903] 3373; SSE41-NEXT: movdqa %xmm6, %xmm5 3374; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 3375; SSE41-NEXT: movdqa %xmm6, %xmm7 3376; SSE41-NEXT: pcmpgtd %xmm0, %xmm7 3377; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2] 3378; SSE41-NEXT: pand %xmm5, %xmm0 3379; SSE41-NEXT: por %xmm7, %xmm0 3380; SSE41-NEXT: movapd %xmm4, %xmm5 3381; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5 3382; SSE41-NEXT: movdqa %xmm2, %xmm0 3383; SSE41-NEXT: pxor %xmm3, %xmm0 3384; SSE41-NEXT: movdqa %xmm6, %xmm1 3385; SSE41-NEXT: pcmpeqd %xmm0, %xmm1 3386; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 3387; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 3388; SSE41-NEXT: pand %xmm1, %xmm0 3389; SSE41-NEXT: por %xmm6, %xmm0 3390; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4 3391; SSE41-NEXT: pxor %xmm1, %xmm1 3392; SSE41-NEXT: movapd %xmm4, %xmm2 3393; SSE41-NEXT: xorpd %xmm3, %xmm2 3394; SSE41-NEXT: movapd %xmm2, %xmm6 3395; SSE41-NEXT: pcmpeqd %xmm3, %xmm6 3396; SSE41-NEXT: pcmpgtd %xmm3, %xmm2 3397; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2] 3398; SSE41-NEXT: pand %xmm6, %xmm0 3399; SSE41-NEXT: por %xmm2, %xmm0 3400; SSE41-NEXT: pxor %xmm2, %xmm2 3401; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2 3402; SSE41-NEXT: movapd %xmm5, %xmm4 3403; SSE41-NEXT: xorpd %xmm3, %xmm4 3404; SSE41-NEXT: movapd %xmm4, %xmm6 3405; SSE41-NEXT: pcmpeqd %xmm3, %xmm6 3406; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 3407; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 3408; SSE41-NEXT: pand %xmm6, %xmm0 3409; SSE41-NEXT: por %xmm4, %xmm0 3410; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1 3411; SSE41-NEXT: movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u> 3412; SSE41-NEXT: pshufb %xmm0, %xmm1 3413; SSE41-NEXT: pshufb %xmm0, %xmm2 3414; SSE41-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3] 3415; SSE41-NEXT: movd %xmm2, (%rdi) 3416; SSE41-NEXT: retq 3417; 3418; AVX1-LABEL: trunc_packus_v4i64_v4i8_store: 3419; AVX1: # %bb.0: 3420; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 3421; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255] 3422; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3 3423; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm4 3424; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm2, %xmm0 3425; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 3426; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5 3427; AVX1-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm1 3428; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm2 3429; AVX1-NEXT: vpand %xmm1, %xmm2, %xmm1 3430; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u> 3431; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1 3432; AVX1-NEXT: vpand %xmm0, %xmm5, %xmm0 3433; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0 3434; AVX1-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 3435; AVX1-NEXT: vmovd %xmm0, (%rdi) 3436; AVX1-NEXT: vzeroupper 3437; AVX1-NEXT: retq 3438; 3439; AVX2-LABEL: trunc_packus_v4i64_v4i8_store: 3440; AVX2: # %bb.0: 3441; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [255,255,255,255] 3442; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2 3443; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 3444; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 3445; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1 3446; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0 3447; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 3448; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u> 3449; AVX2-NEXT: vpshufb %xmm2, %xmm1, %xmm1 3450; AVX2-NEXT: vpshufb %xmm2, %xmm0, %xmm0 3451; AVX2-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 3452; AVX2-NEXT: vmovd %xmm0, (%rdi) 3453; AVX2-NEXT: vzeroupper 3454; AVX2-NEXT: retq 3455; 3456; AVX512F-LABEL: trunc_packus_v4i64_v4i8_store: 3457; AVX512F: # %bb.0: 3458; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 3459; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 3460; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 3461; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0 3462; AVX512F-NEXT: vmovd %xmm0, (%rdi) 3463; AVX512F-NEXT: vzeroupper 3464; AVX512F-NEXT: retq 3465; 3466; AVX512VL-LABEL: trunc_packus_v4i64_v4i8_store: 3467; AVX512VL: # %bb.0: 3468; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 3469; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 3470; AVX512VL-NEXT: vpmovusqb %ymm0, (%rdi) 3471; AVX512VL-NEXT: vzeroupper 3472; AVX512VL-NEXT: retq 3473; 3474; AVX512BW-LABEL: trunc_packus_v4i64_v4i8_store: 3475; AVX512BW: # %bb.0: 3476; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 3477; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 3478; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 3479; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0 3480; AVX512BW-NEXT: vmovd %xmm0, (%rdi) 3481; AVX512BW-NEXT: vzeroupper 3482; AVX512BW-NEXT: retq 3483; 3484; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i8_store: 3485; AVX512BWVL: # %bb.0: 3486; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 3487; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 3488; AVX512BWVL-NEXT: vpmovusqb %ymm0, (%rdi) 3489; AVX512BWVL-NEXT: vzeroupper 3490; AVX512BWVL-NEXT: retq 3491; 3492; SKX-LABEL: trunc_packus_v4i64_v4i8_store: 3493; SKX: # %bb.0: 3494; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 3495; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 3496; SKX-NEXT: vpmovusqb %ymm0, (%rdi) 3497; SKX-NEXT: vzeroupper 3498; SKX-NEXT: retq 3499 %1 = icmp slt <4 x i64> %a0, <i64 255, i64 255, i64 255, i64 255> 3500 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 255, i64 255, i64 255, i64 255> 3501 %3 = icmp sgt <4 x i64> %2, zeroinitializer 3502 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer 3503 %5 = trunc <4 x i64> %4 to <4 x i8> 3504 store <4 x i8> %5, <4 x i8> *%p1 3505 ret void 3506} 3507 3508define <8 x i8> @trunc_packus_v8i64_v8i8(<8 x i64>* %p0) "min-legal-vector-width"="256" { 3509; SSE2-LABEL: trunc_packus_v8i64_v8i8: 3510; SSE2: # %bb.0: 3511; SSE2-NEXT: movdqa (%rdi), %xmm5 3512; SSE2-NEXT: movdqa 16(%rdi), %xmm9 3513; SSE2-NEXT: movdqa 32(%rdi), %xmm3 3514; SSE2-NEXT: movdqa 48(%rdi), %xmm7 3515; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 3516; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [2147483648,2147483648] 3517; SSE2-NEXT: movdqa %xmm3, %xmm2 3518; SSE2-NEXT: pxor %xmm11, %xmm2 3519; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483903,2147483903] 3520; SSE2-NEXT: movdqa %xmm10, %xmm6 3521; SSE2-NEXT: pcmpgtd %xmm2, %xmm6 3522; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 3523; SSE2-NEXT: pcmpeqd %xmm10, %xmm2 3524; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 3525; SSE2-NEXT: pand %xmm0, %xmm4 3526; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] 3527; SSE2-NEXT: por %xmm4, %xmm2 3528; SSE2-NEXT: pand %xmm2, %xmm3 3529; SSE2-NEXT: pandn %xmm8, %xmm2 3530; SSE2-NEXT: por %xmm3, %xmm2 3531; SSE2-NEXT: movdqa %xmm7, %xmm0 3532; SSE2-NEXT: pxor %xmm11, %xmm0 3533; SSE2-NEXT: movdqa %xmm10, %xmm3 3534; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 3535; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 3536; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 3537; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 3538; SSE2-NEXT: pand %xmm4, %xmm0 3539; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 3540; SSE2-NEXT: por %xmm0, %xmm3 3541; SSE2-NEXT: pand %xmm3, %xmm7 3542; SSE2-NEXT: pandn %xmm8, %xmm3 3543; SSE2-NEXT: por %xmm7, %xmm3 3544; SSE2-NEXT: movdqa %xmm5, %xmm0 3545; SSE2-NEXT: pxor %xmm11, %xmm0 3546; SSE2-NEXT: movdqa %xmm10, %xmm4 3547; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 3548; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 3549; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 3550; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 3551; SSE2-NEXT: pand %xmm6, %xmm0 3552; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3] 3553; SSE2-NEXT: por %xmm0, %xmm7 3554; SSE2-NEXT: pand %xmm7, %xmm5 3555; SSE2-NEXT: pandn %xmm8, %xmm7 3556; SSE2-NEXT: por %xmm5, %xmm7 3557; SSE2-NEXT: movdqa %xmm9, %xmm0 3558; SSE2-NEXT: pxor %xmm11, %xmm0 3559; SSE2-NEXT: movdqa %xmm10, %xmm4 3560; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 3561; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 3562; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 3563; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 3564; SSE2-NEXT: pand %xmm5, %xmm0 3565; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 3566; SSE2-NEXT: por %xmm0, %xmm4 3567; SSE2-NEXT: pand %xmm4, %xmm9 3568; SSE2-NEXT: pandn %xmm8, %xmm4 3569; SSE2-NEXT: por %xmm9, %xmm4 3570; SSE2-NEXT: movdqa %xmm4, %xmm0 3571; SSE2-NEXT: pxor %xmm11, %xmm0 3572; SSE2-NEXT: movdqa %xmm0, %xmm5 3573; SSE2-NEXT: pcmpgtd %xmm11, %xmm5 3574; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 3575; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 3576; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 3577; SSE2-NEXT: pand %xmm6, %xmm0 3578; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 3579; SSE2-NEXT: por %xmm0, %xmm5 3580; SSE2-NEXT: pand %xmm4, %xmm5 3581; SSE2-NEXT: movdqa %xmm7, %xmm0 3582; SSE2-NEXT: pxor %xmm11, %xmm0 3583; SSE2-NEXT: movdqa %xmm0, %xmm4 3584; SSE2-NEXT: pcmpgtd %xmm11, %xmm4 3585; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 3586; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 3587; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 3588; SSE2-NEXT: pand %xmm6, %xmm1 3589; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 3590; SSE2-NEXT: por %xmm1, %xmm0 3591; SSE2-NEXT: pand %xmm7, %xmm0 3592; SSE2-NEXT: packuswb %xmm5, %xmm0 3593; SSE2-NEXT: movdqa %xmm3, %xmm1 3594; SSE2-NEXT: pxor %xmm11, %xmm1 3595; SSE2-NEXT: movdqa %xmm1, %xmm4 3596; SSE2-NEXT: pcmpgtd %xmm11, %xmm4 3597; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 3598; SSE2-NEXT: pcmpeqd %xmm11, %xmm1 3599; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 3600; SSE2-NEXT: pand %xmm5, %xmm1 3601; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 3602; SSE2-NEXT: por %xmm1, %xmm4 3603; SSE2-NEXT: pand %xmm3, %xmm4 3604; SSE2-NEXT: movdqa %xmm2, %xmm1 3605; SSE2-NEXT: pxor %xmm11, %xmm1 3606; SSE2-NEXT: movdqa %xmm1, %xmm3 3607; SSE2-NEXT: pcmpgtd %xmm11, %xmm3 3608; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2] 3609; SSE2-NEXT: pcmpeqd %xmm11, %xmm1 3610; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 3611; SSE2-NEXT: pand %xmm5, %xmm1 3612; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 3613; SSE2-NEXT: por %xmm1, %xmm3 3614; SSE2-NEXT: pand %xmm2, %xmm3 3615; SSE2-NEXT: packuswb %xmm4, %xmm3 3616; SSE2-NEXT: packuswb %xmm3, %xmm0 3617; SSE2-NEXT: packuswb %xmm0, %xmm0 3618; SSE2-NEXT: retq 3619; 3620; SSSE3-LABEL: trunc_packus_v8i64_v8i8: 3621; SSSE3: # %bb.0: 3622; SSSE3-NEXT: movdqa (%rdi), %xmm5 3623; SSSE3-NEXT: movdqa 16(%rdi), %xmm9 3624; SSSE3-NEXT: movdqa 32(%rdi), %xmm3 3625; SSSE3-NEXT: movdqa 48(%rdi), %xmm7 3626; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 3627; SSSE3-NEXT: movdqa {{.*#+}} xmm11 = [2147483648,2147483648] 3628; SSSE3-NEXT: movdqa %xmm3, %xmm2 3629; SSSE3-NEXT: pxor %xmm11, %xmm2 3630; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147483903,2147483903] 3631; SSSE3-NEXT: movdqa %xmm10, %xmm6 3632; SSSE3-NEXT: pcmpgtd %xmm2, %xmm6 3633; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 3634; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2 3635; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 3636; SSSE3-NEXT: pand %xmm0, %xmm4 3637; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] 3638; SSSE3-NEXT: por %xmm4, %xmm2 3639; SSSE3-NEXT: pand %xmm2, %xmm3 3640; SSSE3-NEXT: pandn %xmm8, %xmm2 3641; SSSE3-NEXT: por %xmm3, %xmm2 3642; SSSE3-NEXT: movdqa %xmm7, %xmm0 3643; SSSE3-NEXT: pxor %xmm11, %xmm0 3644; SSSE3-NEXT: movdqa %xmm10, %xmm3 3645; SSSE3-NEXT: pcmpgtd %xmm0, %xmm3 3646; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 3647; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0 3648; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 3649; SSSE3-NEXT: pand %xmm4, %xmm0 3650; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 3651; SSSE3-NEXT: por %xmm0, %xmm3 3652; SSSE3-NEXT: pand %xmm3, %xmm7 3653; SSSE3-NEXT: pandn %xmm8, %xmm3 3654; SSSE3-NEXT: por %xmm7, %xmm3 3655; SSSE3-NEXT: movdqa %xmm5, %xmm0 3656; SSSE3-NEXT: pxor %xmm11, %xmm0 3657; SSSE3-NEXT: movdqa %xmm10, %xmm4 3658; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4 3659; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 3660; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0 3661; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 3662; SSSE3-NEXT: pand %xmm6, %xmm0 3663; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3] 3664; SSSE3-NEXT: por %xmm0, %xmm7 3665; SSSE3-NEXT: pand %xmm7, %xmm5 3666; SSSE3-NEXT: pandn %xmm8, %xmm7 3667; SSSE3-NEXT: por %xmm5, %xmm7 3668; SSSE3-NEXT: movdqa %xmm9, %xmm0 3669; SSSE3-NEXT: pxor %xmm11, %xmm0 3670; SSSE3-NEXT: movdqa %xmm10, %xmm4 3671; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4 3672; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 3673; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0 3674; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 3675; SSSE3-NEXT: pand %xmm5, %xmm0 3676; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 3677; SSSE3-NEXT: por %xmm0, %xmm4 3678; SSSE3-NEXT: pand %xmm4, %xmm9 3679; SSSE3-NEXT: pandn %xmm8, %xmm4 3680; SSSE3-NEXT: por %xmm9, %xmm4 3681; SSSE3-NEXT: movdqa %xmm4, %xmm0 3682; SSSE3-NEXT: pxor %xmm11, %xmm0 3683; SSSE3-NEXT: movdqa %xmm0, %xmm5 3684; SSSE3-NEXT: pcmpgtd %xmm11, %xmm5 3685; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 3686; SSSE3-NEXT: pcmpeqd %xmm11, %xmm0 3687; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 3688; SSSE3-NEXT: pand %xmm6, %xmm0 3689; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 3690; SSSE3-NEXT: por %xmm0, %xmm5 3691; SSSE3-NEXT: pand %xmm4, %xmm5 3692; SSSE3-NEXT: movdqa %xmm7, %xmm0 3693; SSSE3-NEXT: pxor %xmm11, %xmm0 3694; SSSE3-NEXT: movdqa %xmm0, %xmm4 3695; SSSE3-NEXT: pcmpgtd %xmm11, %xmm4 3696; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 3697; SSSE3-NEXT: pcmpeqd %xmm11, %xmm0 3698; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 3699; SSSE3-NEXT: pand %xmm6, %xmm1 3700; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 3701; SSSE3-NEXT: por %xmm1, %xmm0 3702; SSSE3-NEXT: pand %xmm7, %xmm0 3703; SSSE3-NEXT: packuswb %xmm5, %xmm0 3704; SSSE3-NEXT: movdqa %xmm3, %xmm1 3705; SSSE3-NEXT: pxor %xmm11, %xmm1 3706; SSSE3-NEXT: movdqa %xmm1, %xmm4 3707; SSSE3-NEXT: pcmpgtd %xmm11, %xmm4 3708; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 3709; SSSE3-NEXT: pcmpeqd %xmm11, %xmm1 3710; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 3711; SSSE3-NEXT: pand %xmm5, %xmm1 3712; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 3713; SSSE3-NEXT: por %xmm1, %xmm4 3714; SSSE3-NEXT: pand %xmm3, %xmm4 3715; SSSE3-NEXT: movdqa %xmm2, %xmm1 3716; SSSE3-NEXT: pxor %xmm11, %xmm1 3717; SSSE3-NEXT: movdqa %xmm1, %xmm3 3718; SSSE3-NEXT: pcmpgtd %xmm11, %xmm3 3719; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2] 3720; SSSE3-NEXT: pcmpeqd %xmm11, %xmm1 3721; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 3722; SSSE3-NEXT: pand %xmm5, %xmm1 3723; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 3724; SSSE3-NEXT: por %xmm1, %xmm3 3725; SSSE3-NEXT: pand %xmm2, %xmm3 3726; SSSE3-NEXT: packuswb %xmm4, %xmm3 3727; SSSE3-NEXT: packuswb %xmm3, %xmm0 3728; SSSE3-NEXT: packuswb %xmm0, %xmm0 3729; SSSE3-NEXT: retq 3730; 3731; SSE41-LABEL: trunc_packus_v8i64_v8i8: 3732; SSE41: # %bb.0: 3733; SSE41-NEXT: movdqa (%rdi), %xmm10 3734; SSE41-NEXT: movdqa 16(%rdi), %xmm9 3735; SSE41-NEXT: movdqa 32(%rdi), %xmm3 3736; SSE41-NEXT: movdqa 48(%rdi), %xmm5 3737; SSE41-NEXT: movapd {{.*#+}} xmm1 = [255,255] 3738; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 3739; SSE41-NEXT: movdqa %xmm3, %xmm0 3740; SSE41-NEXT: pxor %xmm2, %xmm0 3741; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483903,2147483903] 3742; SSE41-NEXT: movdqa %xmm4, %xmm7 3743; SSE41-NEXT: pcmpeqd %xmm0, %xmm7 3744; SSE41-NEXT: movdqa %xmm4, %xmm6 3745; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 3746; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 3747; SSE41-NEXT: pand %xmm7, %xmm0 3748; SSE41-NEXT: por %xmm6, %xmm0 3749; SSE41-NEXT: movapd %xmm1, %xmm8 3750; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm8 3751; SSE41-NEXT: movdqa %xmm5, %xmm0 3752; SSE41-NEXT: pxor %xmm2, %xmm0 3753; SSE41-NEXT: movdqa %xmm4, %xmm3 3754; SSE41-NEXT: pcmpeqd %xmm0, %xmm3 3755; SSE41-NEXT: movdqa %xmm4, %xmm6 3756; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 3757; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 3758; SSE41-NEXT: pand %xmm3, %xmm0 3759; SSE41-NEXT: por %xmm6, %xmm0 3760; SSE41-NEXT: movapd %xmm1, %xmm6 3761; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm6 3762; SSE41-NEXT: movdqa %xmm10, %xmm0 3763; SSE41-NEXT: pxor %xmm2, %xmm0 3764; SSE41-NEXT: movdqa %xmm4, %xmm3 3765; SSE41-NEXT: pcmpeqd %xmm0, %xmm3 3766; SSE41-NEXT: movdqa %xmm4, %xmm5 3767; SSE41-NEXT: pcmpgtd %xmm0, %xmm5 3768; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2] 3769; SSE41-NEXT: pand %xmm3, %xmm0 3770; SSE41-NEXT: por %xmm5, %xmm0 3771; SSE41-NEXT: movapd %xmm1, %xmm3 3772; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm3 3773; SSE41-NEXT: movdqa %xmm9, %xmm0 3774; SSE41-NEXT: pxor %xmm2, %xmm0 3775; SSE41-NEXT: movdqa %xmm4, %xmm5 3776; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 3777; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 3778; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 3779; SSE41-NEXT: pand %xmm5, %xmm0 3780; SSE41-NEXT: por %xmm4, %xmm0 3781; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm1 3782; SSE41-NEXT: pxor %xmm5, %xmm5 3783; SSE41-NEXT: movapd %xmm1, %xmm4 3784; SSE41-NEXT: xorpd %xmm2, %xmm4 3785; SSE41-NEXT: movapd %xmm4, %xmm7 3786; SSE41-NEXT: pcmpeqd %xmm2, %xmm7 3787; SSE41-NEXT: pcmpgtd %xmm2, %xmm4 3788; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 3789; SSE41-NEXT: pand %xmm7, %xmm0 3790; SSE41-NEXT: por %xmm4, %xmm0 3791; SSE41-NEXT: pxor %xmm4, %xmm4 3792; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4 3793; SSE41-NEXT: movapd %xmm3, %xmm1 3794; SSE41-NEXT: xorpd %xmm2, %xmm1 3795; SSE41-NEXT: movapd %xmm1, %xmm7 3796; SSE41-NEXT: pcmpeqd %xmm2, %xmm7 3797; SSE41-NEXT: pcmpgtd %xmm2, %xmm1 3798; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2] 3799; SSE41-NEXT: pand %xmm7, %xmm0 3800; SSE41-NEXT: por %xmm1, %xmm0 3801; SSE41-NEXT: pxor %xmm1, %xmm1 3802; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1 3803; SSE41-NEXT: packusdw %xmm4, %xmm1 3804; SSE41-NEXT: movapd %xmm6, %xmm3 3805; SSE41-NEXT: xorpd %xmm2, %xmm3 3806; SSE41-NEXT: movapd %xmm3, %xmm4 3807; SSE41-NEXT: pcmpeqd %xmm2, %xmm4 3808; SSE41-NEXT: pcmpgtd %xmm2, %xmm3 3809; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2] 3810; SSE41-NEXT: pand %xmm4, %xmm0 3811; SSE41-NEXT: por %xmm3, %xmm0 3812; SSE41-NEXT: pxor %xmm3, %xmm3 3813; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm3 3814; SSE41-NEXT: movapd %xmm8, %xmm4 3815; SSE41-NEXT: xorpd %xmm2, %xmm4 3816; SSE41-NEXT: movapd %xmm4, %xmm6 3817; SSE41-NEXT: pcmpeqd %xmm2, %xmm6 3818; SSE41-NEXT: pcmpgtd %xmm2, %xmm4 3819; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 3820; SSE41-NEXT: pand %xmm6, %xmm0 3821; SSE41-NEXT: por %xmm4, %xmm0 3822; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm5 3823; SSE41-NEXT: packusdw %xmm3, %xmm5 3824; SSE41-NEXT: packusdw %xmm5, %xmm1 3825; SSE41-NEXT: packuswb %xmm1, %xmm1 3826; SSE41-NEXT: movdqa %xmm1, %xmm0 3827; SSE41-NEXT: retq 3828; 3829; AVX1-LABEL: trunc_packus_v8i64_v8i8: 3830; AVX1: # %bb.0: 3831; AVX1-NEXT: vmovdqa (%rdi), %xmm0 3832; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1 3833; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2 3834; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3 3835; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255] 3836; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm8 3837; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm6 3838; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm7 3839; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5 3840; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0 3841; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5 3842; AVX1-NEXT: vpcmpgtq %xmm5, %xmm0, %xmm9 3843; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm4, %xmm1 3844; AVX1-NEXT: vpcmpgtq %xmm5, %xmm1, %xmm7 3845; AVX1-NEXT: vblendvpd %xmm6, %xmm2, %xmm4, %xmm2 3846; AVX1-NEXT: vpcmpgtq %xmm5, %xmm2, %xmm6 3847; AVX1-NEXT: vblendvpd %xmm8, %xmm3, %xmm4, %xmm3 3848; AVX1-NEXT: vpcmpgtq %xmm5, %xmm3, %xmm4 3849; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm3 3850; AVX1-NEXT: vpand %xmm2, %xmm6, %xmm2 3851; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 3852; AVX1-NEXT: vpand %xmm1, %xmm7, %xmm1 3853; AVX1-NEXT: vpand %xmm0, %xmm9, %xmm0 3854; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 3855; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 3856; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 3857; AVX1-NEXT: retq 3858; 3859; AVX2-LABEL: trunc_packus_v8i64_v8i8: 3860; AVX2: # %bb.0: 3861; AVX2-NEXT: vmovdqa (%rdi), %ymm0 3862; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1 3863; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [255,255,255,255] 3864; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3 3865; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 3866; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3 3867; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 3868; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 3869; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3 3870; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm1 3871; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2 3872; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm0 3873; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 3874; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 3875; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 3876; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 3877; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 3878; AVX2-NEXT: vzeroupper 3879; AVX2-NEXT: retq 3880; 3881; AVX512-LABEL: trunc_packus_v8i64_v8i8: 3882; AVX512: # %bb.0: 3883; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0 3884; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm0 3885; AVX512-NEXT: vpmovusqb %zmm0, %xmm0 3886; AVX512-NEXT: vzeroupper 3887; AVX512-NEXT: retq 3888; 3889; SKX-LABEL: trunc_packus_v8i64_v8i8: 3890; SKX: # %bb.0: 3891; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm0 3892; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm1 3893; SKX-NEXT: vpmovusqb %ymm1, %xmm1 3894; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm0 3895; SKX-NEXT: vpmovusqb %ymm0, %xmm0 3896; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 3897; SKX-NEXT: vzeroupper 3898; SKX-NEXT: retq 3899 %a0 = load <8 x i64>, <8 x i64>* %p0 3900 %1 = icmp slt <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 3901 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 3902 %3 = icmp sgt <8 x i64> %2, zeroinitializer 3903 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer 3904 %5 = trunc <8 x i64> %4 to <8 x i8> 3905 ret <8 x i8> %5 3906} 3907 3908define void @trunc_packus_v8i64_v8i8_store(<8 x i64>* %p0, <8 x i8> *%p1) "min-legal-vector-width"="256" { 3909; SSE2-LABEL: trunc_packus_v8i64_v8i8_store: 3910; SSE2: # %bb.0: 3911; SSE2-NEXT: movdqa (%rdi), %xmm5 3912; SSE2-NEXT: movdqa 16(%rdi), %xmm9 3913; SSE2-NEXT: movdqa 32(%rdi), %xmm2 3914; SSE2-NEXT: movdqa 48(%rdi), %xmm7 3915; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 3916; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [2147483648,2147483648] 3917; SSE2-NEXT: movdqa %xmm2, %xmm1 3918; SSE2-NEXT: pxor %xmm11, %xmm1 3919; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483903,2147483903] 3920; SSE2-NEXT: movdqa %xmm10, %xmm6 3921; SSE2-NEXT: pcmpgtd %xmm1, %xmm6 3922; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2] 3923; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 3924; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3] 3925; SSE2-NEXT: pand %xmm3, %xmm4 3926; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3] 3927; SSE2-NEXT: por %xmm4, %xmm1 3928; SSE2-NEXT: pand %xmm1, %xmm2 3929; SSE2-NEXT: pandn %xmm8, %xmm1 3930; SSE2-NEXT: por %xmm2, %xmm1 3931; SSE2-NEXT: movdqa %xmm7, %xmm2 3932; SSE2-NEXT: pxor %xmm11, %xmm2 3933; SSE2-NEXT: movdqa %xmm10, %xmm3 3934; SSE2-NEXT: pcmpgtd %xmm2, %xmm3 3935; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 3936; SSE2-NEXT: pcmpeqd %xmm10, %xmm2 3937; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3] 3938; SSE2-NEXT: pand %xmm4, %xmm6 3939; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3] 3940; SSE2-NEXT: por %xmm6, %xmm2 3941; SSE2-NEXT: pand %xmm2, %xmm7 3942; SSE2-NEXT: pandn %xmm8, %xmm2 3943; SSE2-NEXT: por %xmm7, %xmm2 3944; SSE2-NEXT: movdqa %xmm5, %xmm3 3945; SSE2-NEXT: pxor %xmm11, %xmm3 3946; SSE2-NEXT: movdqa %xmm10, %xmm4 3947; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 3948; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 3949; SSE2-NEXT: pcmpeqd %xmm10, %xmm3 3950; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 3951; SSE2-NEXT: pand %xmm6, %xmm3 3952; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3] 3953; SSE2-NEXT: por %xmm3, %xmm7 3954; SSE2-NEXT: pand %xmm7, %xmm5 3955; SSE2-NEXT: pandn %xmm8, %xmm7 3956; SSE2-NEXT: por %xmm5, %xmm7 3957; SSE2-NEXT: movdqa %xmm9, %xmm3 3958; SSE2-NEXT: pxor %xmm11, %xmm3 3959; SSE2-NEXT: movdqa %xmm10, %xmm4 3960; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 3961; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 3962; SSE2-NEXT: pcmpeqd %xmm10, %xmm3 3963; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 3964; SSE2-NEXT: pand %xmm5, %xmm3 3965; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 3966; SSE2-NEXT: por %xmm3, %xmm4 3967; SSE2-NEXT: pand %xmm4, %xmm9 3968; SSE2-NEXT: pandn %xmm8, %xmm4 3969; SSE2-NEXT: por %xmm9, %xmm4 3970; SSE2-NEXT: movdqa %xmm4, %xmm3 3971; SSE2-NEXT: pxor %xmm11, %xmm3 3972; SSE2-NEXT: movdqa %xmm3, %xmm5 3973; SSE2-NEXT: pcmpgtd %xmm11, %xmm5 3974; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 3975; SSE2-NEXT: pcmpeqd %xmm11, %xmm3 3976; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 3977; SSE2-NEXT: pand %xmm6, %xmm3 3978; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 3979; SSE2-NEXT: por %xmm3, %xmm5 3980; SSE2-NEXT: pand %xmm4, %xmm5 3981; SSE2-NEXT: movdqa %xmm7, %xmm3 3982; SSE2-NEXT: pxor %xmm11, %xmm3 3983; SSE2-NEXT: movdqa %xmm3, %xmm4 3984; SSE2-NEXT: pcmpgtd %xmm11, %xmm4 3985; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 3986; SSE2-NEXT: pcmpeqd %xmm11, %xmm3 3987; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 3988; SSE2-NEXT: pand %xmm6, %xmm0 3989; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 3990; SSE2-NEXT: por %xmm0, %xmm3 3991; SSE2-NEXT: pand %xmm7, %xmm3 3992; SSE2-NEXT: packuswb %xmm5, %xmm3 3993; SSE2-NEXT: movdqa %xmm2, %xmm0 3994; SSE2-NEXT: pxor %xmm11, %xmm0 3995; SSE2-NEXT: movdqa %xmm0, %xmm4 3996; SSE2-NEXT: pcmpgtd %xmm11, %xmm4 3997; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 3998; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 3999; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4000; SSE2-NEXT: pand %xmm5, %xmm0 4001; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 4002; SSE2-NEXT: por %xmm0, %xmm4 4003; SSE2-NEXT: pand %xmm2, %xmm4 4004; SSE2-NEXT: movdqa %xmm1, %xmm0 4005; SSE2-NEXT: pxor %xmm11, %xmm0 4006; SSE2-NEXT: movdqa %xmm0, %xmm2 4007; SSE2-NEXT: pcmpgtd %xmm11, %xmm2 4008; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2] 4009; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 4010; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4011; SSE2-NEXT: pand %xmm5, %xmm0 4012; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 4013; SSE2-NEXT: por %xmm0, %xmm2 4014; SSE2-NEXT: pand %xmm1, %xmm2 4015; SSE2-NEXT: packuswb %xmm4, %xmm2 4016; SSE2-NEXT: packuswb %xmm2, %xmm3 4017; SSE2-NEXT: packuswb %xmm3, %xmm3 4018; SSE2-NEXT: movq %xmm3, (%rsi) 4019; SSE2-NEXT: retq 4020; 4021; SSSE3-LABEL: trunc_packus_v8i64_v8i8_store: 4022; SSSE3: # %bb.0: 4023; SSSE3-NEXT: movdqa (%rdi), %xmm5 4024; SSSE3-NEXT: movdqa 16(%rdi), %xmm9 4025; SSSE3-NEXT: movdqa 32(%rdi), %xmm2 4026; SSSE3-NEXT: movdqa 48(%rdi), %xmm7 4027; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 4028; SSSE3-NEXT: movdqa {{.*#+}} xmm11 = [2147483648,2147483648] 4029; SSSE3-NEXT: movdqa %xmm2, %xmm1 4030; SSSE3-NEXT: pxor %xmm11, %xmm1 4031; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147483903,2147483903] 4032; SSSE3-NEXT: movdqa %xmm10, %xmm6 4033; SSSE3-NEXT: pcmpgtd %xmm1, %xmm6 4034; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2] 4035; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1 4036; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3] 4037; SSSE3-NEXT: pand %xmm3, %xmm4 4038; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3] 4039; SSSE3-NEXT: por %xmm4, %xmm1 4040; SSSE3-NEXT: pand %xmm1, %xmm2 4041; SSSE3-NEXT: pandn %xmm8, %xmm1 4042; SSSE3-NEXT: por %xmm2, %xmm1 4043; SSSE3-NEXT: movdqa %xmm7, %xmm2 4044; SSSE3-NEXT: pxor %xmm11, %xmm2 4045; SSSE3-NEXT: movdqa %xmm10, %xmm3 4046; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3 4047; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 4048; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2 4049; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3] 4050; SSSE3-NEXT: pand %xmm4, %xmm6 4051; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3] 4052; SSSE3-NEXT: por %xmm6, %xmm2 4053; SSSE3-NEXT: pand %xmm2, %xmm7 4054; SSSE3-NEXT: pandn %xmm8, %xmm2 4055; SSSE3-NEXT: por %xmm7, %xmm2 4056; SSSE3-NEXT: movdqa %xmm5, %xmm3 4057; SSSE3-NEXT: pxor %xmm11, %xmm3 4058; SSSE3-NEXT: movdqa %xmm10, %xmm4 4059; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4 4060; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 4061; SSSE3-NEXT: pcmpeqd %xmm10, %xmm3 4062; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 4063; SSSE3-NEXT: pand %xmm6, %xmm3 4064; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3] 4065; SSSE3-NEXT: por %xmm3, %xmm7 4066; SSSE3-NEXT: pand %xmm7, %xmm5 4067; SSSE3-NEXT: pandn %xmm8, %xmm7 4068; SSSE3-NEXT: por %xmm5, %xmm7 4069; SSSE3-NEXT: movdqa %xmm9, %xmm3 4070; SSSE3-NEXT: pxor %xmm11, %xmm3 4071; SSSE3-NEXT: movdqa %xmm10, %xmm4 4072; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4 4073; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 4074; SSSE3-NEXT: pcmpeqd %xmm10, %xmm3 4075; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 4076; SSSE3-NEXT: pand %xmm5, %xmm3 4077; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 4078; SSSE3-NEXT: por %xmm3, %xmm4 4079; SSSE3-NEXT: pand %xmm4, %xmm9 4080; SSSE3-NEXT: pandn %xmm8, %xmm4 4081; SSSE3-NEXT: por %xmm9, %xmm4 4082; SSSE3-NEXT: movdqa %xmm4, %xmm3 4083; SSSE3-NEXT: pxor %xmm11, %xmm3 4084; SSSE3-NEXT: movdqa %xmm3, %xmm5 4085; SSSE3-NEXT: pcmpgtd %xmm11, %xmm5 4086; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 4087; SSSE3-NEXT: pcmpeqd %xmm11, %xmm3 4088; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 4089; SSSE3-NEXT: pand %xmm6, %xmm3 4090; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 4091; SSSE3-NEXT: por %xmm3, %xmm5 4092; SSSE3-NEXT: pand %xmm4, %xmm5 4093; SSSE3-NEXT: movdqa %xmm7, %xmm3 4094; SSSE3-NEXT: pxor %xmm11, %xmm3 4095; SSSE3-NEXT: movdqa %xmm3, %xmm4 4096; SSSE3-NEXT: pcmpgtd %xmm11, %xmm4 4097; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 4098; SSSE3-NEXT: pcmpeqd %xmm11, %xmm3 4099; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 4100; SSSE3-NEXT: pand %xmm6, %xmm0 4101; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 4102; SSSE3-NEXT: por %xmm0, %xmm3 4103; SSSE3-NEXT: pand %xmm7, %xmm3 4104; SSSE3-NEXT: packuswb %xmm5, %xmm3 4105; SSSE3-NEXT: movdqa %xmm2, %xmm0 4106; SSSE3-NEXT: pxor %xmm11, %xmm0 4107; SSSE3-NEXT: movdqa %xmm0, %xmm4 4108; SSSE3-NEXT: pcmpgtd %xmm11, %xmm4 4109; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 4110; SSSE3-NEXT: pcmpeqd %xmm11, %xmm0 4111; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4112; SSSE3-NEXT: pand %xmm5, %xmm0 4113; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 4114; SSSE3-NEXT: por %xmm0, %xmm4 4115; SSSE3-NEXT: pand %xmm2, %xmm4 4116; SSSE3-NEXT: movdqa %xmm1, %xmm0 4117; SSSE3-NEXT: pxor %xmm11, %xmm0 4118; SSSE3-NEXT: movdqa %xmm0, %xmm2 4119; SSSE3-NEXT: pcmpgtd %xmm11, %xmm2 4120; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2] 4121; SSSE3-NEXT: pcmpeqd %xmm11, %xmm0 4122; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4123; SSSE3-NEXT: pand %xmm5, %xmm0 4124; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 4125; SSSE3-NEXT: por %xmm0, %xmm2 4126; SSSE3-NEXT: pand %xmm1, %xmm2 4127; SSSE3-NEXT: packuswb %xmm4, %xmm2 4128; SSSE3-NEXT: packuswb %xmm2, %xmm3 4129; SSSE3-NEXT: packuswb %xmm3, %xmm3 4130; SSSE3-NEXT: movq %xmm3, (%rsi) 4131; SSSE3-NEXT: retq 4132; 4133; SSE41-LABEL: trunc_packus_v8i64_v8i8_store: 4134; SSE41: # %bb.0: 4135; SSE41-NEXT: movdqa (%rdi), %xmm10 4136; SSE41-NEXT: movdqa 16(%rdi), %xmm9 4137; SSE41-NEXT: movdqa 32(%rdi), %xmm2 4138; SSE41-NEXT: movdqa 48(%rdi), %xmm5 4139; SSE41-NEXT: movapd {{.*#+}} xmm4 = [255,255] 4140; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 4141; SSE41-NEXT: movdqa %xmm2, %xmm0 4142; SSE41-NEXT: pxor %xmm1, %xmm0 4143; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903] 4144; SSE41-NEXT: movdqa %xmm3, %xmm7 4145; SSE41-NEXT: pcmpeqd %xmm0, %xmm7 4146; SSE41-NEXT: movdqa %xmm3, %xmm6 4147; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 4148; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 4149; SSE41-NEXT: pand %xmm7, %xmm0 4150; SSE41-NEXT: por %xmm6, %xmm0 4151; SSE41-NEXT: movapd %xmm4, %xmm8 4152; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm8 4153; SSE41-NEXT: movdqa %xmm5, %xmm0 4154; SSE41-NEXT: pxor %xmm1, %xmm0 4155; SSE41-NEXT: movdqa %xmm3, %xmm2 4156; SSE41-NEXT: pcmpeqd %xmm0, %xmm2 4157; SSE41-NEXT: movdqa %xmm3, %xmm6 4158; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 4159; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2] 4160; SSE41-NEXT: pand %xmm2, %xmm0 4161; SSE41-NEXT: por %xmm6, %xmm0 4162; SSE41-NEXT: movapd %xmm4, %xmm6 4163; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm6 4164; SSE41-NEXT: movdqa %xmm10, %xmm0 4165; SSE41-NEXT: pxor %xmm1, %xmm0 4166; SSE41-NEXT: movdqa %xmm3, %xmm2 4167; SSE41-NEXT: pcmpeqd %xmm0, %xmm2 4168; SSE41-NEXT: movdqa %xmm3, %xmm5 4169; SSE41-NEXT: pcmpgtd %xmm0, %xmm5 4170; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2] 4171; SSE41-NEXT: pand %xmm2, %xmm0 4172; SSE41-NEXT: por %xmm5, %xmm0 4173; SSE41-NEXT: movapd %xmm4, %xmm2 4174; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm2 4175; SSE41-NEXT: movdqa %xmm9, %xmm0 4176; SSE41-NEXT: pxor %xmm1, %xmm0 4177; SSE41-NEXT: movdqa %xmm3, %xmm5 4178; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 4179; SSE41-NEXT: pcmpgtd %xmm0, %xmm3 4180; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2] 4181; SSE41-NEXT: pand %xmm5, %xmm0 4182; SSE41-NEXT: por %xmm3, %xmm0 4183; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm4 4184; SSE41-NEXT: pxor %xmm5, %xmm5 4185; SSE41-NEXT: movapd %xmm4, %xmm3 4186; SSE41-NEXT: xorpd %xmm1, %xmm3 4187; SSE41-NEXT: movapd %xmm3, %xmm7 4188; SSE41-NEXT: pcmpeqd %xmm1, %xmm7 4189; SSE41-NEXT: pcmpgtd %xmm1, %xmm3 4190; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2] 4191; SSE41-NEXT: pand %xmm7, %xmm0 4192; SSE41-NEXT: por %xmm3, %xmm0 4193; SSE41-NEXT: pxor %xmm3, %xmm3 4194; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm3 4195; SSE41-NEXT: movapd %xmm2, %xmm4 4196; SSE41-NEXT: xorpd %xmm1, %xmm4 4197; SSE41-NEXT: movapd %xmm4, %xmm7 4198; SSE41-NEXT: pcmpeqd %xmm1, %xmm7 4199; SSE41-NEXT: pcmpgtd %xmm1, %xmm4 4200; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 4201; SSE41-NEXT: pand %xmm7, %xmm0 4202; SSE41-NEXT: por %xmm4, %xmm0 4203; SSE41-NEXT: pxor %xmm4, %xmm4 4204; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4 4205; SSE41-NEXT: packusdw %xmm3, %xmm4 4206; SSE41-NEXT: movapd %xmm6, %xmm2 4207; SSE41-NEXT: xorpd %xmm1, %xmm2 4208; SSE41-NEXT: movapd %xmm2, %xmm3 4209; SSE41-NEXT: pcmpeqd %xmm1, %xmm3 4210; SSE41-NEXT: pcmpgtd %xmm1, %xmm2 4211; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2] 4212; SSE41-NEXT: pand %xmm3, %xmm0 4213; SSE41-NEXT: por %xmm2, %xmm0 4214; SSE41-NEXT: pxor %xmm2, %xmm2 4215; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm2 4216; SSE41-NEXT: movapd %xmm8, %xmm3 4217; SSE41-NEXT: xorpd %xmm1, %xmm3 4218; SSE41-NEXT: movapd %xmm3, %xmm6 4219; SSE41-NEXT: pcmpeqd %xmm1, %xmm6 4220; SSE41-NEXT: pcmpgtd %xmm1, %xmm3 4221; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2] 4222; SSE41-NEXT: pand %xmm6, %xmm0 4223; SSE41-NEXT: por %xmm3, %xmm0 4224; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm5 4225; SSE41-NEXT: packusdw %xmm2, %xmm5 4226; SSE41-NEXT: packusdw %xmm5, %xmm4 4227; SSE41-NEXT: packuswb %xmm4, %xmm4 4228; SSE41-NEXT: movq %xmm4, (%rsi) 4229; SSE41-NEXT: retq 4230; 4231; AVX1-LABEL: trunc_packus_v8i64_v8i8_store: 4232; AVX1: # %bb.0: 4233; AVX1-NEXT: vmovdqa (%rdi), %xmm0 4234; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1 4235; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2 4236; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3 4237; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255] 4238; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm8 4239; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm6 4240; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm7 4241; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5 4242; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0 4243; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5 4244; AVX1-NEXT: vpcmpgtq %xmm5, %xmm0, %xmm9 4245; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm4, %xmm1 4246; AVX1-NEXT: vpcmpgtq %xmm5, %xmm1, %xmm7 4247; AVX1-NEXT: vblendvpd %xmm6, %xmm2, %xmm4, %xmm2 4248; AVX1-NEXT: vpcmpgtq %xmm5, %xmm2, %xmm6 4249; AVX1-NEXT: vblendvpd %xmm8, %xmm3, %xmm4, %xmm3 4250; AVX1-NEXT: vpcmpgtq %xmm5, %xmm3, %xmm4 4251; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm3 4252; AVX1-NEXT: vpand %xmm2, %xmm6, %xmm2 4253; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 4254; AVX1-NEXT: vpand %xmm1, %xmm7, %xmm1 4255; AVX1-NEXT: vpand %xmm0, %xmm9, %xmm0 4256; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 4257; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 4258; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 4259; AVX1-NEXT: vmovq %xmm0, (%rsi) 4260; AVX1-NEXT: retq 4261; 4262; AVX2-LABEL: trunc_packus_v8i64_v8i8_store: 4263; AVX2: # %bb.0: 4264; AVX2-NEXT: vmovdqa (%rdi), %ymm0 4265; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1 4266; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [255,255,255,255] 4267; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3 4268; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 4269; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3 4270; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 4271; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 4272; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3 4273; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm1 4274; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2 4275; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm0 4276; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 4277; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 4278; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 4279; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 4280; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 4281; AVX2-NEXT: vmovq %xmm0, (%rsi) 4282; AVX2-NEXT: vzeroupper 4283; AVX2-NEXT: retq 4284; 4285; AVX512-LABEL: trunc_packus_v8i64_v8i8_store: 4286; AVX512: # %bb.0: 4287; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0 4288; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm0 4289; AVX512-NEXT: vpmovusqb %zmm0, (%rsi) 4290; AVX512-NEXT: vzeroupper 4291; AVX512-NEXT: retq 4292; 4293; SKX-LABEL: trunc_packus_v8i64_v8i8_store: 4294; SKX: # %bb.0: 4295; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm0 4296; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm1 4297; SKX-NEXT: vpmovusqb %ymm1, %xmm1 4298; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm0 4299; SKX-NEXT: vpmovusqb %ymm0, %xmm0 4300; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 4301; SKX-NEXT: vmovq %xmm0, (%rsi) 4302; SKX-NEXT: vzeroupper 4303; SKX-NEXT: retq 4304 %a0 = load <8 x i64>, <8 x i64>* %p0 4305 %1 = icmp slt <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 4306 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 4307 %3 = icmp sgt <8 x i64> %2, zeroinitializer 4308 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer 4309 %5 = trunc <8 x i64> %4 to <8 x i8> 4310 store <8 x i8> %5, <8 x i8> *%p1 4311 ret void 4312} 4313 4314define <16 x i8> @trunc_packus_v16i64_v16i8(<16 x i64>* %p0) "min-legal-vector-width"="256" { 4315; SSE2-LABEL: trunc_packus_v16i64_v16i8: 4316; SSE2: # %bb.0: 4317; SSE2-NEXT: movdqa (%rdi), %xmm10 4318; SSE2-NEXT: movdqa 16(%rdi), %xmm9 4319; SSE2-NEXT: movdqa 32(%rdi), %xmm15 4320; SSE2-NEXT: movdqa 48(%rdi), %xmm13 4321; SSE2-NEXT: movdqa 80(%rdi), %xmm7 4322; SSE2-NEXT: movdqa 64(%rdi), %xmm5 4323; SSE2-NEXT: movdqa 112(%rdi), %xmm3 4324; SSE2-NEXT: movdqa 96(%rdi), %xmm0 4325; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 4326; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 4327; SSE2-NEXT: movdqa %xmm0, %xmm4 4328; SSE2-NEXT: pxor %xmm1, %xmm4 4329; SSE2-NEXT: movdqa {{.*#+}} xmm14 = [2147483903,2147483903] 4330; SSE2-NEXT: movdqa %xmm14, %xmm6 4331; SSE2-NEXT: pcmpgtd %xmm4, %xmm6 4332; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2] 4333; SSE2-NEXT: pcmpeqd %xmm14, %xmm4 4334; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 4335; SSE2-NEXT: pand %xmm2, %xmm4 4336; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm6[1,1,3,3] 4337; SSE2-NEXT: por %xmm4, %xmm11 4338; SSE2-NEXT: pand %xmm11, %xmm0 4339; SSE2-NEXT: pandn %xmm8, %xmm11 4340; SSE2-NEXT: por %xmm0, %xmm11 4341; SSE2-NEXT: movdqa %xmm3, %xmm0 4342; SSE2-NEXT: pxor %xmm1, %xmm0 4343; SSE2-NEXT: movdqa %xmm14, %xmm2 4344; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 4345; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 4346; SSE2-NEXT: pcmpeqd %xmm14, %xmm0 4347; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4348; SSE2-NEXT: pand %xmm4, %xmm0 4349; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm2[1,1,3,3] 4350; SSE2-NEXT: por %xmm0, %xmm12 4351; SSE2-NEXT: pand %xmm12, %xmm3 4352; SSE2-NEXT: pandn %xmm8, %xmm12 4353; SSE2-NEXT: por %xmm3, %xmm12 4354; SSE2-NEXT: movdqa %xmm5, %xmm0 4355; SSE2-NEXT: pxor %xmm1, %xmm0 4356; SSE2-NEXT: movdqa %xmm14, %xmm2 4357; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 4358; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 4359; SSE2-NEXT: pcmpeqd %xmm14, %xmm0 4360; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4361; SSE2-NEXT: pand %xmm3, %xmm0 4362; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 4363; SSE2-NEXT: por %xmm0, %xmm4 4364; SSE2-NEXT: pand %xmm4, %xmm5 4365; SSE2-NEXT: pandn %xmm8, %xmm4 4366; SSE2-NEXT: por %xmm5, %xmm4 4367; SSE2-NEXT: movdqa %xmm7, %xmm0 4368; SSE2-NEXT: pxor %xmm1, %xmm0 4369; SSE2-NEXT: movdqa %xmm14, %xmm2 4370; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 4371; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 4372; SSE2-NEXT: pcmpeqd %xmm14, %xmm0 4373; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4374; SSE2-NEXT: pand %xmm3, %xmm0 4375; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3] 4376; SSE2-NEXT: por %xmm0, %xmm5 4377; SSE2-NEXT: pand %xmm5, %xmm7 4378; SSE2-NEXT: pandn %xmm8, %xmm5 4379; SSE2-NEXT: por %xmm7, %xmm5 4380; SSE2-NEXT: movdqa %xmm15, %xmm0 4381; SSE2-NEXT: pxor %xmm1, %xmm0 4382; SSE2-NEXT: movdqa %xmm14, %xmm2 4383; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 4384; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 4385; SSE2-NEXT: pcmpeqd %xmm14, %xmm0 4386; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4387; SSE2-NEXT: pand %xmm3, %xmm0 4388; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 4389; SSE2-NEXT: por %xmm0, %xmm7 4390; SSE2-NEXT: pand %xmm7, %xmm15 4391; SSE2-NEXT: pandn %xmm8, %xmm7 4392; SSE2-NEXT: por %xmm15, %xmm7 4393; SSE2-NEXT: movdqa %xmm13, %xmm0 4394; SSE2-NEXT: pxor %xmm1, %xmm0 4395; SSE2-NEXT: movdqa %xmm14, %xmm2 4396; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 4397; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 4398; SSE2-NEXT: pcmpeqd %xmm14, %xmm0 4399; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4400; SSE2-NEXT: pand %xmm3, %xmm0 4401; SSE2-NEXT: pshufd {{.*#+}} xmm15 = xmm2[1,1,3,3] 4402; SSE2-NEXT: por %xmm0, %xmm15 4403; SSE2-NEXT: pand %xmm15, %xmm13 4404; SSE2-NEXT: pandn %xmm8, %xmm15 4405; SSE2-NEXT: por %xmm13, %xmm15 4406; SSE2-NEXT: movdqa %xmm10, %xmm0 4407; SSE2-NEXT: pxor %xmm1, %xmm0 4408; SSE2-NEXT: movdqa %xmm14, %xmm3 4409; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 4410; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 4411; SSE2-NEXT: pcmpeqd %xmm14, %xmm0 4412; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4413; SSE2-NEXT: pand %xmm6, %xmm0 4414; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3] 4415; SSE2-NEXT: por %xmm0, %xmm13 4416; SSE2-NEXT: pand %xmm13, %xmm10 4417; SSE2-NEXT: pandn %xmm8, %xmm13 4418; SSE2-NEXT: por %xmm10, %xmm13 4419; SSE2-NEXT: movdqa %xmm9, %xmm0 4420; SSE2-NEXT: pxor %xmm1, %xmm0 4421; SSE2-NEXT: movdqa %xmm14, %xmm6 4422; SSE2-NEXT: pcmpgtd %xmm0, %xmm6 4423; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2] 4424; SSE2-NEXT: pcmpeqd %xmm14, %xmm0 4425; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4426; SSE2-NEXT: pand %xmm10, %xmm0 4427; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 4428; SSE2-NEXT: por %xmm0, %xmm6 4429; SSE2-NEXT: pand %xmm6, %xmm9 4430; SSE2-NEXT: pandn %xmm8, %xmm6 4431; SSE2-NEXT: por %xmm9, %xmm6 4432; SSE2-NEXT: movdqa %xmm6, %xmm0 4433; SSE2-NEXT: pxor %xmm1, %xmm0 4434; SSE2-NEXT: movdqa %xmm0, %xmm2 4435; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 4436; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm2[0,0,2,2] 4437; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 4438; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4439; SSE2-NEXT: pand %xmm8, %xmm0 4440; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 4441; SSE2-NEXT: por %xmm0, %xmm2 4442; SSE2-NEXT: pand %xmm6, %xmm2 4443; SSE2-NEXT: movdqa %xmm13, %xmm0 4444; SSE2-NEXT: pxor %xmm1, %xmm0 4445; SSE2-NEXT: movdqa %xmm0, %xmm6 4446; SSE2-NEXT: pcmpgtd %xmm1, %xmm6 4447; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2] 4448; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 4449; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 4450; SSE2-NEXT: pand %xmm8, %xmm3 4451; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 4452; SSE2-NEXT: por %xmm3, %xmm0 4453; SSE2-NEXT: pand %xmm13, %xmm0 4454; SSE2-NEXT: packuswb %xmm2, %xmm0 4455; SSE2-NEXT: movdqa %xmm15, %xmm2 4456; SSE2-NEXT: pxor %xmm1, %xmm2 4457; SSE2-NEXT: movdqa %xmm2, %xmm3 4458; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 4459; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 4460; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 4461; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 4462; SSE2-NEXT: pand %xmm6, %xmm2 4463; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 4464; SSE2-NEXT: por %xmm2, %xmm3 4465; SSE2-NEXT: pand %xmm15, %xmm3 4466; SSE2-NEXT: movdqa %xmm7, %xmm2 4467; SSE2-NEXT: pxor %xmm1, %xmm2 4468; SSE2-NEXT: movdqa %xmm2, %xmm6 4469; SSE2-NEXT: pcmpgtd %xmm1, %xmm6 4470; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2] 4471; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 4472; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 4473; SSE2-NEXT: pand %xmm8, %xmm2 4474; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 4475; SSE2-NEXT: por %xmm2, %xmm6 4476; SSE2-NEXT: pand %xmm7, %xmm6 4477; SSE2-NEXT: packuswb %xmm3, %xmm6 4478; SSE2-NEXT: packuswb %xmm6, %xmm0 4479; SSE2-NEXT: movdqa %xmm5, %xmm2 4480; SSE2-NEXT: pxor %xmm1, %xmm2 4481; SSE2-NEXT: movdqa %xmm2, %xmm3 4482; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 4483; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 4484; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 4485; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 4486; SSE2-NEXT: pand %xmm6, %xmm2 4487; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 4488; SSE2-NEXT: por %xmm2, %xmm3 4489; SSE2-NEXT: pand %xmm5, %xmm3 4490; SSE2-NEXT: movdqa %xmm4, %xmm2 4491; SSE2-NEXT: pxor %xmm1, %xmm2 4492; SSE2-NEXT: movdqa %xmm2, %xmm5 4493; SSE2-NEXT: pcmpgtd %xmm1, %xmm5 4494; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 4495; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 4496; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 4497; SSE2-NEXT: pand %xmm6, %xmm7 4498; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 4499; SSE2-NEXT: por %xmm7, %xmm2 4500; SSE2-NEXT: pand %xmm4, %xmm2 4501; SSE2-NEXT: packuswb %xmm3, %xmm2 4502; SSE2-NEXT: movdqa %xmm12, %xmm3 4503; SSE2-NEXT: pxor %xmm1, %xmm3 4504; SSE2-NEXT: movdqa %xmm3, %xmm4 4505; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 4506; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 4507; SSE2-NEXT: pcmpeqd %xmm1, %xmm3 4508; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 4509; SSE2-NEXT: pand %xmm5, %xmm3 4510; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 4511; SSE2-NEXT: por %xmm3, %xmm4 4512; SSE2-NEXT: pand %xmm12, %xmm4 4513; SSE2-NEXT: movdqa %xmm11, %xmm3 4514; SSE2-NEXT: pxor %xmm1, %xmm3 4515; SSE2-NEXT: movdqa %xmm3, %xmm5 4516; SSE2-NEXT: pcmpgtd %xmm1, %xmm5 4517; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 4518; SSE2-NEXT: pcmpeqd %xmm1, %xmm3 4519; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3] 4520; SSE2-NEXT: pand %xmm6, %xmm1 4521; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3] 4522; SSE2-NEXT: por %xmm1, %xmm3 4523; SSE2-NEXT: pand %xmm11, %xmm3 4524; SSE2-NEXT: packuswb %xmm4, %xmm3 4525; SSE2-NEXT: packuswb %xmm3, %xmm2 4526; SSE2-NEXT: packuswb %xmm2, %xmm0 4527; SSE2-NEXT: retq 4528; 4529; SSSE3-LABEL: trunc_packus_v16i64_v16i8: 4530; SSSE3: # %bb.0: 4531; SSSE3-NEXT: movdqa (%rdi), %xmm10 4532; SSSE3-NEXT: movdqa 16(%rdi), %xmm9 4533; SSSE3-NEXT: movdqa 32(%rdi), %xmm15 4534; SSSE3-NEXT: movdqa 48(%rdi), %xmm13 4535; SSSE3-NEXT: movdqa 80(%rdi), %xmm7 4536; SSSE3-NEXT: movdqa 64(%rdi), %xmm5 4537; SSSE3-NEXT: movdqa 112(%rdi), %xmm3 4538; SSSE3-NEXT: movdqa 96(%rdi), %xmm0 4539; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 4540; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] 4541; SSSE3-NEXT: movdqa %xmm0, %xmm4 4542; SSSE3-NEXT: pxor %xmm1, %xmm4 4543; SSSE3-NEXT: movdqa {{.*#+}} xmm14 = [2147483903,2147483903] 4544; SSSE3-NEXT: movdqa %xmm14, %xmm6 4545; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6 4546; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2] 4547; SSSE3-NEXT: pcmpeqd %xmm14, %xmm4 4548; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 4549; SSSE3-NEXT: pand %xmm2, %xmm4 4550; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm6[1,1,3,3] 4551; SSSE3-NEXT: por %xmm4, %xmm11 4552; SSSE3-NEXT: pand %xmm11, %xmm0 4553; SSSE3-NEXT: pandn %xmm8, %xmm11 4554; SSSE3-NEXT: por %xmm0, %xmm11 4555; SSSE3-NEXT: movdqa %xmm3, %xmm0 4556; SSSE3-NEXT: pxor %xmm1, %xmm0 4557; SSSE3-NEXT: movdqa %xmm14, %xmm2 4558; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2 4559; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 4560; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0 4561; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4562; SSSE3-NEXT: pand %xmm4, %xmm0 4563; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm2[1,1,3,3] 4564; SSSE3-NEXT: por %xmm0, %xmm12 4565; SSSE3-NEXT: pand %xmm12, %xmm3 4566; SSSE3-NEXT: pandn %xmm8, %xmm12 4567; SSSE3-NEXT: por %xmm3, %xmm12 4568; SSSE3-NEXT: movdqa %xmm5, %xmm0 4569; SSSE3-NEXT: pxor %xmm1, %xmm0 4570; SSSE3-NEXT: movdqa %xmm14, %xmm2 4571; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2 4572; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 4573; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0 4574; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4575; SSSE3-NEXT: pand %xmm3, %xmm0 4576; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 4577; SSSE3-NEXT: por %xmm0, %xmm4 4578; SSSE3-NEXT: pand %xmm4, %xmm5 4579; SSSE3-NEXT: pandn %xmm8, %xmm4 4580; SSSE3-NEXT: por %xmm5, %xmm4 4581; SSSE3-NEXT: movdqa %xmm7, %xmm0 4582; SSSE3-NEXT: pxor %xmm1, %xmm0 4583; SSSE3-NEXT: movdqa %xmm14, %xmm2 4584; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2 4585; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 4586; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0 4587; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4588; SSSE3-NEXT: pand %xmm3, %xmm0 4589; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3] 4590; SSSE3-NEXT: por %xmm0, %xmm5 4591; SSSE3-NEXT: pand %xmm5, %xmm7 4592; SSSE3-NEXT: pandn %xmm8, %xmm5 4593; SSSE3-NEXT: por %xmm7, %xmm5 4594; SSSE3-NEXT: movdqa %xmm15, %xmm0 4595; SSSE3-NEXT: pxor %xmm1, %xmm0 4596; SSSE3-NEXT: movdqa %xmm14, %xmm2 4597; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2 4598; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 4599; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0 4600; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4601; SSSE3-NEXT: pand %xmm3, %xmm0 4602; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 4603; SSSE3-NEXT: por %xmm0, %xmm7 4604; SSSE3-NEXT: pand %xmm7, %xmm15 4605; SSSE3-NEXT: pandn %xmm8, %xmm7 4606; SSSE3-NEXT: por %xmm15, %xmm7 4607; SSSE3-NEXT: movdqa %xmm13, %xmm0 4608; SSSE3-NEXT: pxor %xmm1, %xmm0 4609; SSSE3-NEXT: movdqa %xmm14, %xmm2 4610; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2 4611; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 4612; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0 4613; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4614; SSSE3-NEXT: pand %xmm3, %xmm0 4615; SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm2[1,1,3,3] 4616; SSSE3-NEXT: por %xmm0, %xmm15 4617; SSSE3-NEXT: pand %xmm15, %xmm13 4618; SSSE3-NEXT: pandn %xmm8, %xmm15 4619; SSSE3-NEXT: por %xmm13, %xmm15 4620; SSSE3-NEXT: movdqa %xmm10, %xmm0 4621; SSSE3-NEXT: pxor %xmm1, %xmm0 4622; SSSE3-NEXT: movdqa %xmm14, %xmm3 4623; SSSE3-NEXT: pcmpgtd %xmm0, %xmm3 4624; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 4625; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0 4626; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4627; SSSE3-NEXT: pand %xmm6, %xmm0 4628; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3] 4629; SSSE3-NEXT: por %xmm0, %xmm13 4630; SSSE3-NEXT: pand %xmm13, %xmm10 4631; SSSE3-NEXT: pandn %xmm8, %xmm13 4632; SSSE3-NEXT: por %xmm10, %xmm13 4633; SSSE3-NEXT: movdqa %xmm9, %xmm0 4634; SSSE3-NEXT: pxor %xmm1, %xmm0 4635; SSSE3-NEXT: movdqa %xmm14, %xmm6 4636; SSSE3-NEXT: pcmpgtd %xmm0, %xmm6 4637; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2] 4638; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0 4639; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4640; SSSE3-NEXT: pand %xmm10, %xmm0 4641; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 4642; SSSE3-NEXT: por %xmm0, %xmm6 4643; SSSE3-NEXT: pand %xmm6, %xmm9 4644; SSSE3-NEXT: pandn %xmm8, %xmm6 4645; SSSE3-NEXT: por %xmm9, %xmm6 4646; SSSE3-NEXT: movdqa %xmm6, %xmm0 4647; SSSE3-NEXT: pxor %xmm1, %xmm0 4648; SSSE3-NEXT: movdqa %xmm0, %xmm2 4649; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 4650; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm2[0,0,2,2] 4651; SSSE3-NEXT: pcmpeqd %xmm1, %xmm0 4652; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 4653; SSSE3-NEXT: pand %xmm8, %xmm0 4654; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 4655; SSSE3-NEXT: por %xmm0, %xmm2 4656; SSSE3-NEXT: pand %xmm6, %xmm2 4657; SSSE3-NEXT: movdqa %xmm13, %xmm0 4658; SSSE3-NEXT: pxor %xmm1, %xmm0 4659; SSSE3-NEXT: movdqa %xmm0, %xmm6 4660; SSSE3-NEXT: pcmpgtd %xmm1, %xmm6 4661; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2] 4662; SSSE3-NEXT: pcmpeqd %xmm1, %xmm0 4663; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 4664; SSSE3-NEXT: pand %xmm8, %xmm3 4665; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 4666; SSSE3-NEXT: por %xmm3, %xmm0 4667; SSSE3-NEXT: pand %xmm13, %xmm0 4668; SSSE3-NEXT: packuswb %xmm2, %xmm0 4669; SSSE3-NEXT: movdqa %xmm15, %xmm2 4670; SSSE3-NEXT: pxor %xmm1, %xmm2 4671; SSSE3-NEXT: movdqa %xmm2, %xmm3 4672; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3 4673; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 4674; SSSE3-NEXT: pcmpeqd %xmm1, %xmm2 4675; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 4676; SSSE3-NEXT: pand %xmm6, %xmm2 4677; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 4678; SSSE3-NEXT: por %xmm2, %xmm3 4679; SSSE3-NEXT: pand %xmm15, %xmm3 4680; SSSE3-NEXT: movdqa %xmm7, %xmm2 4681; SSSE3-NEXT: pxor %xmm1, %xmm2 4682; SSSE3-NEXT: movdqa %xmm2, %xmm6 4683; SSSE3-NEXT: pcmpgtd %xmm1, %xmm6 4684; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2] 4685; SSSE3-NEXT: pcmpeqd %xmm1, %xmm2 4686; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 4687; SSSE3-NEXT: pand %xmm8, %xmm2 4688; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 4689; SSSE3-NEXT: por %xmm2, %xmm6 4690; SSSE3-NEXT: pand %xmm7, %xmm6 4691; SSSE3-NEXT: packuswb %xmm3, %xmm6 4692; SSSE3-NEXT: packuswb %xmm6, %xmm0 4693; SSSE3-NEXT: movdqa %xmm5, %xmm2 4694; SSSE3-NEXT: pxor %xmm1, %xmm2 4695; SSSE3-NEXT: movdqa %xmm2, %xmm3 4696; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3 4697; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 4698; SSSE3-NEXT: pcmpeqd %xmm1, %xmm2 4699; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 4700; SSSE3-NEXT: pand %xmm6, %xmm2 4701; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 4702; SSSE3-NEXT: por %xmm2, %xmm3 4703; SSSE3-NEXT: pand %xmm5, %xmm3 4704; SSSE3-NEXT: movdqa %xmm4, %xmm2 4705; SSSE3-NEXT: pxor %xmm1, %xmm2 4706; SSSE3-NEXT: movdqa %xmm2, %xmm5 4707; SSSE3-NEXT: pcmpgtd %xmm1, %xmm5 4708; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 4709; SSSE3-NEXT: pcmpeqd %xmm1, %xmm2 4710; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 4711; SSSE3-NEXT: pand %xmm6, %xmm7 4712; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3] 4713; SSSE3-NEXT: por %xmm7, %xmm2 4714; SSSE3-NEXT: pand %xmm4, %xmm2 4715; SSSE3-NEXT: packuswb %xmm3, %xmm2 4716; SSSE3-NEXT: movdqa %xmm12, %xmm3 4717; SSSE3-NEXT: pxor %xmm1, %xmm3 4718; SSSE3-NEXT: movdqa %xmm3, %xmm4 4719; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 4720; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 4721; SSSE3-NEXT: pcmpeqd %xmm1, %xmm3 4722; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 4723; SSSE3-NEXT: pand %xmm5, %xmm3 4724; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 4725; SSSE3-NEXT: por %xmm3, %xmm4 4726; SSSE3-NEXT: pand %xmm12, %xmm4 4727; SSSE3-NEXT: movdqa %xmm11, %xmm3 4728; SSSE3-NEXT: pxor %xmm1, %xmm3 4729; SSSE3-NEXT: movdqa %xmm3, %xmm5 4730; SSSE3-NEXT: pcmpgtd %xmm1, %xmm5 4731; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 4732; SSSE3-NEXT: pcmpeqd %xmm1, %xmm3 4733; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3] 4734; SSSE3-NEXT: pand %xmm6, %xmm1 4735; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3] 4736; SSSE3-NEXT: por %xmm1, %xmm3 4737; SSSE3-NEXT: pand %xmm11, %xmm3 4738; SSSE3-NEXT: packuswb %xmm4, %xmm3 4739; SSSE3-NEXT: packuswb %xmm3, %xmm2 4740; SSSE3-NEXT: packuswb %xmm2, %xmm0 4741; SSSE3-NEXT: retq 4742; 4743; SSE41-LABEL: trunc_packus_v16i64_v16i8: 4744; SSE41: # %bb.0: 4745; SSE41-NEXT: movdqa (%rdi), %xmm10 4746; SSE41-NEXT: movdqa 16(%rdi), %xmm9 4747; SSE41-NEXT: movdqa 32(%rdi), %xmm14 4748; SSE41-NEXT: movdqa 48(%rdi), %xmm12 4749; SSE41-NEXT: movdqa 80(%rdi), %xmm15 4750; SSE41-NEXT: movdqa 64(%rdi), %xmm6 4751; SSE41-NEXT: movdqa 112(%rdi), %xmm13 4752; SSE41-NEXT: movdqa 96(%rdi), %xmm4 4753; SSE41-NEXT: movapd {{.*#+}} xmm1 = [255,255] 4754; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 4755; SSE41-NEXT: movdqa %xmm4, %xmm0 4756; SSE41-NEXT: pxor %xmm2, %xmm0 4757; SSE41-NEXT: movdqa {{.*#+}} xmm7 = [2147483903,2147483903] 4758; SSE41-NEXT: movdqa %xmm7, %xmm3 4759; SSE41-NEXT: pcmpeqd %xmm0, %xmm3 4760; SSE41-NEXT: movdqa %xmm7, %xmm5 4761; SSE41-NEXT: pcmpgtd %xmm0, %xmm5 4762; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2] 4763; SSE41-NEXT: pand %xmm3, %xmm0 4764; SSE41-NEXT: por %xmm5, %xmm0 4765; SSE41-NEXT: movapd %xmm1, %xmm8 4766; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm8 4767; SSE41-NEXT: movdqa %xmm13, %xmm0 4768; SSE41-NEXT: pxor %xmm2, %xmm0 4769; SSE41-NEXT: movdqa %xmm7, %xmm3 4770; SSE41-NEXT: pcmpeqd %xmm0, %xmm3 4771; SSE41-NEXT: movdqa %xmm7, %xmm4 4772; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 4773; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 4774; SSE41-NEXT: pand %xmm3, %xmm0 4775; SSE41-NEXT: por %xmm4, %xmm0 4776; SSE41-NEXT: movapd %xmm1, %xmm11 4777; SSE41-NEXT: blendvpd %xmm0, %xmm13, %xmm11 4778; SSE41-NEXT: movdqa %xmm6, %xmm0 4779; SSE41-NEXT: pxor %xmm2, %xmm0 4780; SSE41-NEXT: movdqa %xmm7, %xmm3 4781; SSE41-NEXT: pcmpeqd %xmm0, %xmm3 4782; SSE41-NEXT: movdqa %xmm7, %xmm4 4783; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 4784; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 4785; SSE41-NEXT: pand %xmm3, %xmm0 4786; SSE41-NEXT: por %xmm4, %xmm0 4787; SSE41-NEXT: movapd %xmm1, %xmm13 4788; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm13 4789; SSE41-NEXT: movdqa %xmm15, %xmm0 4790; SSE41-NEXT: pxor %xmm2, %xmm0 4791; SSE41-NEXT: movdqa %xmm7, %xmm3 4792; SSE41-NEXT: pcmpeqd %xmm0, %xmm3 4793; SSE41-NEXT: movdqa %xmm7, %xmm4 4794; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 4795; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 4796; SSE41-NEXT: pand %xmm3, %xmm0 4797; SSE41-NEXT: por %xmm4, %xmm0 4798; SSE41-NEXT: movapd %xmm1, %xmm6 4799; SSE41-NEXT: blendvpd %xmm0, %xmm15, %xmm6 4800; SSE41-NEXT: movdqa %xmm14, %xmm0 4801; SSE41-NEXT: pxor %xmm2, %xmm0 4802; SSE41-NEXT: movdqa %xmm7, %xmm3 4803; SSE41-NEXT: pcmpeqd %xmm0, %xmm3 4804; SSE41-NEXT: movdqa %xmm7, %xmm4 4805; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 4806; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 4807; SSE41-NEXT: pand %xmm3, %xmm0 4808; SSE41-NEXT: por %xmm4, %xmm0 4809; SSE41-NEXT: movapd %xmm1, %xmm15 4810; SSE41-NEXT: blendvpd %xmm0, %xmm14, %xmm15 4811; SSE41-NEXT: movdqa %xmm12, %xmm0 4812; SSE41-NEXT: pxor %xmm2, %xmm0 4813; SSE41-NEXT: movdqa %xmm7, %xmm4 4814; SSE41-NEXT: pcmpeqd %xmm0, %xmm4 4815; SSE41-NEXT: movdqa %xmm7, %xmm5 4816; SSE41-NEXT: pcmpgtd %xmm0, %xmm5 4817; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2] 4818; SSE41-NEXT: pand %xmm4, %xmm0 4819; SSE41-NEXT: por %xmm5, %xmm0 4820; SSE41-NEXT: movapd %xmm1, %xmm4 4821; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm4 4822; SSE41-NEXT: movdqa %xmm10, %xmm0 4823; SSE41-NEXT: pxor %xmm2, %xmm0 4824; SSE41-NEXT: movdqa %xmm7, %xmm5 4825; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 4826; SSE41-NEXT: movdqa %xmm7, %xmm3 4827; SSE41-NEXT: pcmpgtd %xmm0, %xmm3 4828; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2] 4829; SSE41-NEXT: pand %xmm5, %xmm0 4830; SSE41-NEXT: por %xmm3, %xmm0 4831; SSE41-NEXT: movapd %xmm1, %xmm5 4832; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm5 4833; SSE41-NEXT: movdqa %xmm9, %xmm0 4834; SSE41-NEXT: pxor %xmm2, %xmm0 4835; SSE41-NEXT: movdqa %xmm7, %xmm3 4836; SSE41-NEXT: pcmpeqd %xmm0, %xmm3 4837; SSE41-NEXT: pcmpgtd %xmm0, %xmm7 4838; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2] 4839; SSE41-NEXT: pand %xmm3, %xmm0 4840; SSE41-NEXT: por %xmm7, %xmm0 4841; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm1 4842; SSE41-NEXT: xorpd %xmm9, %xmm9 4843; SSE41-NEXT: movapd %xmm1, %xmm3 4844; SSE41-NEXT: xorpd %xmm2, %xmm3 4845; SSE41-NEXT: movapd %xmm3, %xmm7 4846; SSE41-NEXT: pcmpeqd %xmm2, %xmm7 4847; SSE41-NEXT: pcmpgtd %xmm2, %xmm3 4848; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2] 4849; SSE41-NEXT: pand %xmm7, %xmm0 4850; SSE41-NEXT: por %xmm3, %xmm0 4851; SSE41-NEXT: pxor %xmm3, %xmm3 4852; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3 4853; SSE41-NEXT: movapd %xmm5, %xmm1 4854; SSE41-NEXT: xorpd %xmm2, %xmm1 4855; SSE41-NEXT: movapd %xmm1, %xmm7 4856; SSE41-NEXT: pcmpeqd %xmm2, %xmm7 4857; SSE41-NEXT: pcmpgtd %xmm2, %xmm1 4858; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2] 4859; SSE41-NEXT: pand %xmm7, %xmm0 4860; SSE41-NEXT: por %xmm1, %xmm0 4861; SSE41-NEXT: pxor %xmm1, %xmm1 4862; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1 4863; SSE41-NEXT: packusdw %xmm3, %xmm1 4864; SSE41-NEXT: movapd %xmm4, %xmm3 4865; SSE41-NEXT: xorpd %xmm2, %xmm3 4866; SSE41-NEXT: movapd %xmm3, %xmm5 4867; SSE41-NEXT: pcmpeqd %xmm2, %xmm5 4868; SSE41-NEXT: pcmpgtd %xmm2, %xmm3 4869; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2] 4870; SSE41-NEXT: pand %xmm5, %xmm0 4871; SSE41-NEXT: por %xmm3, %xmm0 4872; SSE41-NEXT: pxor %xmm3, %xmm3 4873; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm3 4874; SSE41-NEXT: movapd %xmm15, %xmm4 4875; SSE41-NEXT: xorpd %xmm2, %xmm4 4876; SSE41-NEXT: movapd %xmm4, %xmm5 4877; SSE41-NEXT: pcmpeqd %xmm2, %xmm5 4878; SSE41-NEXT: pcmpgtd %xmm2, %xmm4 4879; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 4880; SSE41-NEXT: pand %xmm5, %xmm0 4881; SSE41-NEXT: por %xmm4, %xmm0 4882; SSE41-NEXT: pxor %xmm4, %xmm4 4883; SSE41-NEXT: blendvpd %xmm0, %xmm15, %xmm4 4884; SSE41-NEXT: packusdw %xmm3, %xmm4 4885; SSE41-NEXT: packusdw %xmm4, %xmm1 4886; SSE41-NEXT: movapd %xmm6, %xmm3 4887; SSE41-NEXT: xorpd %xmm2, %xmm3 4888; SSE41-NEXT: movapd %xmm3, %xmm4 4889; SSE41-NEXT: pcmpeqd %xmm2, %xmm4 4890; SSE41-NEXT: pcmpgtd %xmm2, %xmm3 4891; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2] 4892; SSE41-NEXT: pand %xmm4, %xmm0 4893; SSE41-NEXT: por %xmm3, %xmm0 4894; SSE41-NEXT: pxor %xmm4, %xmm4 4895; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm4 4896; SSE41-NEXT: movapd %xmm13, %xmm3 4897; SSE41-NEXT: xorpd %xmm2, %xmm3 4898; SSE41-NEXT: movapd %xmm3, %xmm5 4899; SSE41-NEXT: pcmpeqd %xmm2, %xmm5 4900; SSE41-NEXT: pcmpgtd %xmm2, %xmm3 4901; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2] 4902; SSE41-NEXT: pand %xmm5, %xmm0 4903; SSE41-NEXT: por %xmm3, %xmm0 4904; SSE41-NEXT: pxor %xmm3, %xmm3 4905; SSE41-NEXT: blendvpd %xmm0, %xmm13, %xmm3 4906; SSE41-NEXT: packusdw %xmm4, %xmm3 4907; SSE41-NEXT: movapd %xmm11, %xmm4 4908; SSE41-NEXT: xorpd %xmm2, %xmm4 4909; SSE41-NEXT: movapd %xmm4, %xmm5 4910; SSE41-NEXT: pcmpeqd %xmm2, %xmm5 4911; SSE41-NEXT: pcmpgtd %xmm2, %xmm4 4912; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 4913; SSE41-NEXT: pand %xmm5, %xmm0 4914; SSE41-NEXT: por %xmm4, %xmm0 4915; SSE41-NEXT: pxor %xmm4, %xmm4 4916; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm4 4917; SSE41-NEXT: movapd %xmm8, %xmm5 4918; SSE41-NEXT: xorpd %xmm2, %xmm5 4919; SSE41-NEXT: movapd %xmm5, %xmm6 4920; SSE41-NEXT: pcmpeqd %xmm2, %xmm6 4921; SSE41-NEXT: pcmpgtd %xmm2, %xmm5 4922; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2] 4923; SSE41-NEXT: pand %xmm6, %xmm0 4924; SSE41-NEXT: por %xmm5, %xmm0 4925; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm9 4926; SSE41-NEXT: packusdw %xmm4, %xmm9 4927; SSE41-NEXT: packusdw %xmm9, %xmm3 4928; SSE41-NEXT: packuswb %xmm3, %xmm1 4929; SSE41-NEXT: movdqa %xmm1, %xmm0 4930; SSE41-NEXT: retq 4931; 4932; AVX1-LABEL: trunc_packus_v16i64_v16i8: 4933; AVX1: # %bb.0: 4934; AVX1-NEXT: vmovdqa 112(%rdi), %xmm8 4935; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255] 4936; AVX1-NEXT: vmovdqa 96(%rdi), %xmm9 4937; AVX1-NEXT: vmovdqa 80(%rdi), %xmm3 4938; AVX1-NEXT: vmovdqa 64(%rdi), %xmm4 4939; AVX1-NEXT: vmovdqa (%rdi), %xmm5 4940; AVX1-NEXT: vmovdqa 16(%rdi), %xmm6 4941; AVX1-NEXT: vmovdqa 32(%rdi), %xmm7 4942; AVX1-NEXT: vmovdqa 48(%rdi), %xmm0 4943; AVX1-NEXT: vpcmpgtq %xmm5, %xmm1, %xmm2 4944; AVX1-NEXT: vblendvpd %xmm2, %xmm5, %xmm1, %xmm10 4945; AVX1-NEXT: vpcmpgtq %xmm6, %xmm1, %xmm5 4946; AVX1-NEXT: vblendvpd %xmm5, %xmm6, %xmm1, %xmm11 4947; AVX1-NEXT: vpcmpgtq %xmm7, %xmm1, %xmm6 4948; AVX1-NEXT: vblendvpd %xmm6, %xmm7, %xmm1, %xmm6 4949; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm7 4950; AVX1-NEXT: vblendvpd %xmm7, %xmm0, %xmm1, %xmm0 4951; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm7 4952; AVX1-NEXT: vblendvpd %xmm7, %xmm4, %xmm1, %xmm4 4953; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm7 4954; AVX1-NEXT: vblendvpd %xmm7, %xmm3, %xmm1, %xmm3 4955; AVX1-NEXT: vpcmpgtq %xmm9, %xmm1, %xmm7 4956; AVX1-NEXT: vblendvpd %xmm7, %xmm9, %xmm1, %xmm7 4957; AVX1-NEXT: vpcmpgtq %xmm8, %xmm1, %xmm2 4958; AVX1-NEXT: vblendvpd %xmm2, %xmm8, %xmm1, %xmm1 4959; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 4960; AVX1-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm5 4961; AVX1-NEXT: vpand %xmm1, %xmm5, %xmm1 4962; AVX1-NEXT: vpcmpgtq %xmm2, %xmm7, %xmm5 4963; AVX1-NEXT: vpand %xmm7, %xmm5, %xmm5 4964; AVX1-NEXT: vpackusdw %xmm1, %xmm5, %xmm1 4965; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm5 4966; AVX1-NEXT: vpand %xmm3, %xmm5, %xmm3 4967; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm5 4968; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm4 4969; AVX1-NEXT: vpackusdw %xmm3, %xmm4, %xmm3 4970; AVX1-NEXT: vpackusdw %xmm1, %xmm3, %xmm1 4971; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm3 4972; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm0 4973; AVX1-NEXT: vpcmpgtq %xmm2, %xmm6, %xmm3 4974; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3 4975; AVX1-NEXT: vpackusdw %xmm0, %xmm3, %xmm0 4976; AVX1-NEXT: vpcmpgtq %xmm2, %xmm11, %xmm3 4977; AVX1-NEXT: vpand %xmm3, %xmm11, %xmm3 4978; AVX1-NEXT: vpcmpgtq %xmm2, %xmm10, %xmm2 4979; AVX1-NEXT: vpand %xmm2, %xmm10, %xmm2 4980; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 4981; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm0 4982; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 4983; AVX1-NEXT: retq 4984; 4985; AVX2-LABEL: trunc_packus_v16i64_v16i8: 4986; AVX2: # %bb.0: 4987; AVX2-NEXT: vmovdqa (%rdi), %ymm0 4988; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1 4989; AVX2-NEXT: vmovdqa 64(%rdi), %ymm2 4990; AVX2-NEXT: vmovdqa 96(%rdi), %ymm3 4991; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [255,255,255,255] 4992; AVX2-NEXT: vpcmpgtq %ymm2, %ymm4, %ymm5 4993; AVX2-NEXT: vblendvpd %ymm5, %ymm2, %ymm4, %ymm2 4994; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm5 4995; AVX2-NEXT: vblendvpd %ymm5, %ymm3, %ymm4, %ymm3 4996; AVX2-NEXT: vpcmpgtq %ymm0, %ymm4, %ymm5 4997; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm4, %ymm0 4998; AVX2-NEXT: vpcmpgtq %ymm1, %ymm4, %ymm5 4999; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm4, %ymm1 5000; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 5001; AVX2-NEXT: vpcmpgtq %ymm4, %ymm1, %ymm5 5002; AVX2-NEXT: vpand %ymm1, %ymm5, %ymm1 5003; AVX2-NEXT: vpcmpgtq %ymm4, %ymm0, %ymm5 5004; AVX2-NEXT: vpand %ymm0, %ymm5, %ymm0 5005; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 5006; AVX2-NEXT: vpcmpgtq %ymm4, %ymm3, %ymm1 5007; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1 5008; AVX2-NEXT: vpcmpgtq %ymm4, %ymm2, %ymm3 5009; AVX2-NEXT: vpand %ymm2, %ymm3, %ymm2 5010; AVX2-NEXT: vpackusdw %ymm1, %ymm2, %ymm1 5011; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3] 5012; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 5013; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 5014; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 5015; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 5016; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 5017; AVX2-NEXT: vzeroupper 5018; AVX2-NEXT: retq 5019; 5020; AVX512-LABEL: trunc_packus_v16i64_v16i8: 5021; AVX512: # %bb.0: 5022; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0 5023; AVX512-NEXT: vpmaxsq 64(%rdi), %zmm0, %zmm1 5024; AVX512-NEXT: vpmovusqb %zmm1, %xmm1 5025; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm0 5026; AVX512-NEXT: vpmovusqb %zmm0, %xmm0 5027; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 5028; AVX512-NEXT: vzeroupper 5029; AVX512-NEXT: retq 5030; 5031; SKX-LABEL: trunc_packus_v16i64_v16i8: 5032; SKX: # %bb.0: 5033; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm0 5034; SKX-NEXT: vpmaxsq 96(%rdi), %ymm0, %ymm1 5035; SKX-NEXT: vpmovusqb %ymm1, %xmm1 5036; SKX-NEXT: vpmaxsq 64(%rdi), %ymm0, %ymm2 5037; SKX-NEXT: vpmovusqb %ymm2, %xmm2 5038; SKX-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 5039; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm2 5040; SKX-NEXT: vpmovusqb %ymm2, %xmm2 5041; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm0 5042; SKX-NEXT: vpmovusqb %ymm0, %xmm0 5043; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 5044; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 5045; SKX-NEXT: vzeroupper 5046; SKX-NEXT: retq 5047 %a0 = load <16 x i64>, <16 x i64>* %p0 5048 %1 = icmp slt <16 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 5049 %2 = select <16 x i1> %1, <16 x i64> %a0, <16 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 5050 %3 = icmp sgt <16 x i64> %2, zeroinitializer 5051 %4 = select <16 x i1> %3, <16 x i64> %2, <16 x i64> zeroinitializer 5052 %5 = trunc <16 x i64> %4 to <16 x i8> 5053 ret <16 x i8> %5 5054} 5055 5056define <4 x i8> @trunc_packus_v4i32_v4i8(<4 x i32> %a0) "min-legal-vector-width"="256" { 5057; SSE2-LABEL: trunc_packus_v4i32_v4i8: 5058; SSE2: # %bb.0: 5059; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255] 5060; SSE2-NEXT: movdqa %xmm1, %xmm2 5061; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 5062; SSE2-NEXT: pand %xmm2, %xmm0 5063; SSE2-NEXT: pandn %xmm1, %xmm2 5064; SSE2-NEXT: por %xmm0, %xmm2 5065; SSE2-NEXT: pxor %xmm1, %xmm1 5066; SSE2-NEXT: movdqa %xmm2, %xmm0 5067; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 5068; SSE2-NEXT: pand %xmm2, %xmm0 5069; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 5070; SSE2-NEXT: packuswb %xmm0, %xmm0 5071; SSE2-NEXT: packuswb %xmm0, %xmm0 5072; SSE2-NEXT: retq 5073; 5074; SSSE3-LABEL: trunc_packus_v4i32_v4i8: 5075; SSSE3: # %bb.0: 5076; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255] 5077; SSSE3-NEXT: movdqa %xmm1, %xmm2 5078; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2 5079; SSSE3-NEXT: pand %xmm2, %xmm0 5080; SSSE3-NEXT: pandn %xmm1, %xmm2 5081; SSSE3-NEXT: por %xmm0, %xmm2 5082; SSSE3-NEXT: pxor %xmm1, %xmm1 5083; SSSE3-NEXT: movdqa %xmm2, %xmm0 5084; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0 5085; SSSE3-NEXT: pand %xmm2, %xmm0 5086; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] 5087; SSSE3-NEXT: retq 5088; 5089; SSE41-LABEL: trunc_packus_v4i32_v4i8: 5090; SSE41: # %bb.0: 5091; SSE41-NEXT: pminsd {{.*}}(%rip), %xmm0 5092; SSE41-NEXT: pxor %xmm1, %xmm1 5093; SSE41-NEXT: pmaxsd %xmm0, %xmm1 5094; SSE41-NEXT: packusdw %xmm1, %xmm1 5095; SSE41-NEXT: packuswb %xmm1, %xmm1 5096; SSE41-NEXT: movdqa %xmm1, %xmm0 5097; SSE41-NEXT: retq 5098; 5099; AVX1-LABEL: trunc_packus_v4i32_v4i8: 5100; AVX1: # %bb.0: 5101; AVX1-NEXT: vpminsd {{.*}}(%rip), %xmm0, %xmm0 5102; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 5103; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 5104; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 5105; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5106; AVX1-NEXT: retq 5107; 5108; AVX2-LABEL: trunc_packus_v4i32_v4i8: 5109; AVX2: # %bb.0: 5110; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255] 5111; AVX2-NEXT: vpminsd %xmm1, %xmm0, %xmm0 5112; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 5113; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 5114; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 5115; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5116; AVX2-NEXT: retq 5117; 5118; AVX512F-LABEL: trunc_packus_v4i32_v4i8: 5119; AVX512F: # %bb.0: 5120; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 5121; AVX512F-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 5122; AVX512F-NEXT: vpmovusdb %zmm0, %xmm0 5123; AVX512F-NEXT: vzeroupper 5124; AVX512F-NEXT: retq 5125; 5126; AVX512VL-LABEL: trunc_packus_v4i32_v4i8: 5127; AVX512VL: # %bb.0: 5128; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 5129; AVX512VL-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 5130; AVX512VL-NEXT: vpmovusdb %xmm0, %xmm0 5131; AVX512VL-NEXT: retq 5132; 5133; AVX512BW-LABEL: trunc_packus_v4i32_v4i8: 5134; AVX512BW: # %bb.0: 5135; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 5136; AVX512BW-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 5137; AVX512BW-NEXT: vpmovusdb %zmm0, %xmm0 5138; AVX512BW-NEXT: vzeroupper 5139; AVX512BW-NEXT: retq 5140; 5141; AVX512BWVL-LABEL: trunc_packus_v4i32_v4i8: 5142; AVX512BWVL: # %bb.0: 5143; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 5144; AVX512BWVL-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 5145; AVX512BWVL-NEXT: vpmovusdb %xmm0, %xmm0 5146; AVX512BWVL-NEXT: retq 5147; 5148; SKX-LABEL: trunc_packus_v4i32_v4i8: 5149; SKX: # %bb.0: 5150; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 5151; SKX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 5152; SKX-NEXT: vpmovusdb %xmm0, %xmm0 5153; SKX-NEXT: retq 5154 %1 = icmp slt <4 x i32> %a0, <i32 255, i32 255, i32 255, i32 255> 5155 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 255, i32 255, i32 255, i32 255> 5156 %3 = icmp sgt <4 x i32> %2, zeroinitializer 5157 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> zeroinitializer 5158 %5 = trunc <4 x i32> %4 to <4 x i8> 5159 ret <4 x i8> %5 5160} 5161 5162define void @trunc_packus_v4i32_v4i8_store(<4 x i32> %a0, <4 x i8> *%p1) { 5163; SSE2-LABEL: trunc_packus_v4i32_v4i8_store: 5164; SSE2: # %bb.0: 5165; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255] 5166; SSE2-NEXT: movdqa %xmm1, %xmm2 5167; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 5168; SSE2-NEXT: pand %xmm2, %xmm0 5169; SSE2-NEXT: pandn %xmm1, %xmm2 5170; SSE2-NEXT: por %xmm0, %xmm2 5171; SSE2-NEXT: pxor %xmm0, %xmm0 5172; SSE2-NEXT: movdqa %xmm2, %xmm1 5173; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 5174; SSE2-NEXT: pand %xmm2, %xmm1 5175; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 5176; SSE2-NEXT: packuswb %xmm1, %xmm1 5177; SSE2-NEXT: packuswb %xmm1, %xmm1 5178; SSE2-NEXT: movd %xmm1, (%rdi) 5179; SSE2-NEXT: retq 5180; 5181; SSSE3-LABEL: trunc_packus_v4i32_v4i8_store: 5182; SSSE3: # %bb.0: 5183; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255] 5184; SSSE3-NEXT: movdqa %xmm1, %xmm2 5185; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2 5186; SSSE3-NEXT: pand %xmm2, %xmm0 5187; SSSE3-NEXT: pandn %xmm1, %xmm2 5188; SSSE3-NEXT: por %xmm0, %xmm2 5189; SSSE3-NEXT: pxor %xmm0, %xmm0 5190; SSSE3-NEXT: movdqa %xmm2, %xmm1 5191; SSSE3-NEXT: pcmpgtd %xmm0, %xmm1 5192; SSSE3-NEXT: pand %xmm2, %xmm1 5193; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] 5194; SSSE3-NEXT: movd %xmm1, (%rdi) 5195; SSSE3-NEXT: retq 5196; 5197; SSE41-LABEL: trunc_packus_v4i32_v4i8_store: 5198; SSE41: # %bb.0: 5199; SSE41-NEXT: pminsd {{.*}}(%rip), %xmm0 5200; SSE41-NEXT: pxor %xmm1, %xmm1 5201; SSE41-NEXT: pmaxsd %xmm0, %xmm1 5202; SSE41-NEXT: packusdw %xmm1, %xmm1 5203; SSE41-NEXT: packuswb %xmm1, %xmm1 5204; SSE41-NEXT: movd %xmm1, (%rdi) 5205; SSE41-NEXT: retq 5206; 5207; AVX1-LABEL: trunc_packus_v4i32_v4i8_store: 5208; AVX1: # %bb.0: 5209; AVX1-NEXT: vpminsd {{.*}}(%rip), %xmm0, %xmm0 5210; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 5211; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 5212; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 5213; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5214; AVX1-NEXT: vmovd %xmm0, (%rdi) 5215; AVX1-NEXT: retq 5216; 5217; AVX2-LABEL: trunc_packus_v4i32_v4i8_store: 5218; AVX2: # %bb.0: 5219; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255] 5220; AVX2-NEXT: vpminsd %xmm1, %xmm0, %xmm0 5221; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 5222; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 5223; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 5224; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5225; AVX2-NEXT: vmovd %xmm0, (%rdi) 5226; AVX2-NEXT: retq 5227; 5228; AVX512F-LABEL: trunc_packus_v4i32_v4i8_store: 5229; AVX512F: # %bb.0: 5230; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 5231; AVX512F-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 5232; AVX512F-NEXT: vpmovusdb %zmm0, %xmm0 5233; AVX512F-NEXT: vmovd %xmm0, (%rdi) 5234; AVX512F-NEXT: vzeroupper 5235; AVX512F-NEXT: retq 5236; 5237; AVX512VL-LABEL: trunc_packus_v4i32_v4i8_store: 5238; AVX512VL: # %bb.0: 5239; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 5240; AVX512VL-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 5241; AVX512VL-NEXT: vpmovusdb %xmm0, (%rdi) 5242; AVX512VL-NEXT: retq 5243; 5244; AVX512BW-LABEL: trunc_packus_v4i32_v4i8_store: 5245; AVX512BW: # %bb.0: 5246; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 5247; AVX512BW-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 5248; AVX512BW-NEXT: vpmovusdb %zmm0, %xmm0 5249; AVX512BW-NEXT: vmovd %xmm0, (%rdi) 5250; AVX512BW-NEXT: vzeroupper 5251; AVX512BW-NEXT: retq 5252; 5253; AVX512BWVL-LABEL: trunc_packus_v4i32_v4i8_store: 5254; AVX512BWVL: # %bb.0: 5255; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 5256; AVX512BWVL-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 5257; AVX512BWVL-NEXT: vpmovusdb %xmm0, (%rdi) 5258; AVX512BWVL-NEXT: retq 5259; 5260; SKX-LABEL: trunc_packus_v4i32_v4i8_store: 5261; SKX: # %bb.0: 5262; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 5263; SKX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 5264; SKX-NEXT: vpmovusdb %xmm0, (%rdi) 5265; SKX-NEXT: retq 5266 %1 = icmp slt <4 x i32> %a0, <i32 255, i32 255, i32 255, i32 255> 5267 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 255, i32 255, i32 255, i32 255> 5268 %3 = icmp sgt <4 x i32> %2, zeroinitializer 5269 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> zeroinitializer 5270 %5 = trunc <4 x i32> %4 to <4 x i8> 5271 store <4 x i8> %5, <4 x i8> *%p1 5272 ret void 5273} 5274 5275define <8 x i8> @trunc_packus_v8i32_v8i8(<8 x i32> %a0) { 5276; SSE-LABEL: trunc_packus_v8i32_v8i8: 5277; SSE: # %bb.0: 5278; SSE-NEXT: packssdw %xmm1, %xmm0 5279; SSE-NEXT: packuswb %xmm0, %xmm0 5280; SSE-NEXT: retq 5281; 5282; AVX1-LABEL: trunc_packus_v8i32_v8i8: 5283; AVX1: # %bb.0: 5284; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 5285; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 5286; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5287; AVX1-NEXT: vzeroupper 5288; AVX1-NEXT: retq 5289; 5290; AVX2-LABEL: trunc_packus_v8i32_v8i8: 5291; AVX2: # %bb.0: 5292; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 5293; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 5294; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5295; AVX2-NEXT: vzeroupper 5296; AVX2-NEXT: retq 5297; 5298; AVX512F-LABEL: trunc_packus_v8i32_v8i8: 5299; AVX512F: # %bb.0: 5300; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 5301; AVX512F-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 5302; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5303; AVX512F-NEXT: vzeroupper 5304; AVX512F-NEXT: retq 5305; 5306; AVX512VL-LABEL: trunc_packus_v8i32_v8i8: 5307; AVX512VL: # %bb.0: 5308; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 5309; AVX512VL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 5310; AVX512VL-NEXT: vpmovusdb %ymm0, %xmm0 5311; AVX512VL-NEXT: vzeroupper 5312; AVX512VL-NEXT: retq 5313; 5314; AVX512BW-LABEL: trunc_packus_v8i32_v8i8: 5315; AVX512BW: # %bb.0: 5316; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 5317; AVX512BW-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 5318; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5319; AVX512BW-NEXT: vzeroupper 5320; AVX512BW-NEXT: retq 5321; 5322; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i8: 5323; AVX512BWVL: # %bb.0: 5324; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 5325; AVX512BWVL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 5326; AVX512BWVL-NEXT: vpmovusdb %ymm0, %xmm0 5327; AVX512BWVL-NEXT: vzeroupper 5328; AVX512BWVL-NEXT: retq 5329; 5330; SKX-LABEL: trunc_packus_v8i32_v8i8: 5331; SKX: # %bb.0: 5332; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 5333; SKX-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 5334; SKX-NEXT: vpmovusdb %ymm0, %xmm0 5335; SKX-NEXT: vzeroupper 5336; SKX-NEXT: retq 5337 %1 = icmp slt <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 5338 %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 5339 %3 = icmp sgt <8 x i32> %2, zeroinitializer 5340 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer 5341 %5 = trunc <8 x i32> %4 to <8 x i8> 5342 ret <8 x i8> %5 5343} 5344 5345define void @trunc_packus_v8i32_v8i8_store(<8 x i32> %a0, <8 x i8> *%p1) { 5346; SSE-LABEL: trunc_packus_v8i32_v8i8_store: 5347; SSE: # %bb.0: 5348; SSE-NEXT: packssdw %xmm1, %xmm0 5349; SSE-NEXT: packuswb %xmm0, %xmm0 5350; SSE-NEXT: movq %xmm0, (%rdi) 5351; SSE-NEXT: retq 5352; 5353; AVX1-LABEL: trunc_packus_v8i32_v8i8_store: 5354; AVX1: # %bb.0: 5355; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 5356; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 5357; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5358; AVX1-NEXT: vmovq %xmm0, (%rdi) 5359; AVX1-NEXT: vzeroupper 5360; AVX1-NEXT: retq 5361; 5362; AVX2-LABEL: trunc_packus_v8i32_v8i8_store: 5363; AVX2: # %bb.0: 5364; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 5365; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 5366; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5367; AVX2-NEXT: vmovq %xmm0, (%rdi) 5368; AVX2-NEXT: vzeroupper 5369; AVX2-NEXT: retq 5370; 5371; AVX512F-LABEL: trunc_packus_v8i32_v8i8_store: 5372; AVX512F: # %bb.0: 5373; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 5374; AVX512F-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 5375; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5376; AVX512F-NEXT: vmovq %xmm0, (%rdi) 5377; AVX512F-NEXT: vzeroupper 5378; AVX512F-NEXT: retq 5379; 5380; AVX512VL-LABEL: trunc_packus_v8i32_v8i8_store: 5381; AVX512VL: # %bb.0: 5382; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 5383; AVX512VL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 5384; AVX512VL-NEXT: vpmovusdb %ymm0, (%rdi) 5385; AVX512VL-NEXT: vzeroupper 5386; AVX512VL-NEXT: retq 5387; 5388; AVX512BW-LABEL: trunc_packus_v8i32_v8i8_store: 5389; AVX512BW: # %bb.0: 5390; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 5391; AVX512BW-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 5392; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5393; AVX512BW-NEXT: vmovq %xmm0, (%rdi) 5394; AVX512BW-NEXT: vzeroupper 5395; AVX512BW-NEXT: retq 5396; 5397; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i8_store: 5398; AVX512BWVL: # %bb.0: 5399; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 5400; AVX512BWVL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 5401; AVX512BWVL-NEXT: vpmovusdb %ymm0, (%rdi) 5402; AVX512BWVL-NEXT: vzeroupper 5403; AVX512BWVL-NEXT: retq 5404; 5405; SKX-LABEL: trunc_packus_v8i32_v8i8_store: 5406; SKX: # %bb.0: 5407; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 5408; SKX-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 5409; SKX-NEXT: vpmovusdb %ymm0, (%rdi) 5410; SKX-NEXT: vzeroupper 5411; SKX-NEXT: retq 5412 %1 = icmp slt <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 5413 %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 5414 %3 = icmp sgt <8 x i32> %2, zeroinitializer 5415 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer 5416 %5 = trunc <8 x i32> %4 to <8 x i8> 5417 store <8 x i8> %5, <8 x i8> *%p1 5418 ret void 5419} 5420 5421define <16 x i8> @trunc_packus_v16i32_v16i8(<16 x i32>* %p0) "min-legal-vector-width"="256" { 5422; SSE-LABEL: trunc_packus_v16i32_v16i8: 5423; SSE: # %bb.0: 5424; SSE-NEXT: movdqa (%rdi), %xmm0 5425; SSE-NEXT: movdqa 32(%rdi), %xmm1 5426; SSE-NEXT: packssdw 48(%rdi), %xmm1 5427; SSE-NEXT: packssdw 16(%rdi), %xmm0 5428; SSE-NEXT: packuswb %xmm1, %xmm0 5429; SSE-NEXT: retq 5430; 5431; AVX1-LABEL: trunc_packus_v16i32_v16i8: 5432; AVX1: # %bb.0: 5433; AVX1-NEXT: vmovdqa (%rdi), %xmm0 5434; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1 5435; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm1 5436; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm0 5437; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 5438; AVX1-NEXT: retq 5439; 5440; AVX2-LABEL: trunc_packus_v16i32_v16i8: 5441; AVX2: # %bb.0: 5442; AVX2-NEXT: vmovdqa (%rdi), %ymm0 5443; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm0 5444; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 5445; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 5446; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 5447; AVX2-NEXT: vzeroupper 5448; AVX2-NEXT: retq 5449; 5450; AVX512-LABEL: trunc_packus_v16i32_v16i8: 5451; AVX512: # %bb.0: 5452; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0 5453; AVX512-NEXT: vpmaxsd (%rdi), %zmm0, %zmm0 5454; AVX512-NEXT: vpmovusdb %zmm0, %xmm0 5455; AVX512-NEXT: vzeroupper 5456; AVX512-NEXT: retq 5457; 5458; SKX-LABEL: trunc_packus_v16i32_v16i8: 5459; SKX: # %bb.0: 5460; SKX-NEXT: vmovdqa (%rdi), %ymm0 5461; SKX-NEXT: vpackusdw 32(%rdi), %ymm0, %ymm0 5462; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 5463; SKX-NEXT: vpmovuswb %ymm0, %xmm0 5464; SKX-NEXT: vzeroupper 5465; SKX-NEXT: retq 5466 %a0 = load <16 x i32>, <16 x i32>* %p0 5467 %1 = icmp slt <16 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 5468 %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 5469 %3 = icmp sgt <16 x i32> %2, zeroinitializer 5470 %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> zeroinitializer 5471 %5 = trunc <16 x i32> %4 to <16 x i8> 5472 ret <16 x i8> %5 5473} 5474 5475define void @trunc_packus_v16i32_v16i8_store(<16 x i32>* %p0, <16 x i8>* %p1) "min-legal-vector-width"="256" { 5476; SSE-LABEL: trunc_packus_v16i32_v16i8_store: 5477; SSE: # %bb.0: 5478; SSE-NEXT: movdqa (%rdi), %xmm0 5479; SSE-NEXT: movdqa 32(%rdi), %xmm1 5480; SSE-NEXT: packssdw 48(%rdi), %xmm1 5481; SSE-NEXT: packssdw 16(%rdi), %xmm0 5482; SSE-NEXT: packuswb %xmm1, %xmm0 5483; SSE-NEXT: movdqa %xmm0, (%rsi) 5484; SSE-NEXT: retq 5485; 5486; AVX1-LABEL: trunc_packus_v16i32_v16i8_store: 5487; AVX1: # %bb.0: 5488; AVX1-NEXT: vmovdqa (%rdi), %xmm0 5489; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1 5490; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm1 5491; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm0 5492; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 5493; AVX1-NEXT: vmovdqa %xmm0, (%rsi) 5494; AVX1-NEXT: retq 5495; 5496; AVX2-LABEL: trunc_packus_v16i32_v16i8_store: 5497; AVX2: # %bb.0: 5498; AVX2-NEXT: vmovdqa (%rdi), %ymm0 5499; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm0 5500; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 5501; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 5502; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 5503; AVX2-NEXT: vmovdqa %xmm0, (%rsi) 5504; AVX2-NEXT: vzeroupper 5505; AVX2-NEXT: retq 5506; 5507; AVX512-LABEL: trunc_packus_v16i32_v16i8_store: 5508; AVX512: # %bb.0: 5509; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0 5510; AVX512-NEXT: vpmaxsd (%rdi), %zmm0, %zmm0 5511; AVX512-NEXT: vpmovusdb %zmm0, (%rsi) 5512; AVX512-NEXT: vzeroupper 5513; AVX512-NEXT: retq 5514; 5515; SKX-LABEL: trunc_packus_v16i32_v16i8_store: 5516; SKX: # %bb.0: 5517; SKX-NEXT: vmovdqa (%rdi), %ymm0 5518; SKX-NEXT: vpackusdw 32(%rdi), %ymm0, %ymm0 5519; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 5520; SKX-NEXT: vpmovuswb %ymm0, (%rsi) 5521; SKX-NEXT: vzeroupper 5522; SKX-NEXT: retq 5523 %a = load <16 x i32>, <16 x i32>* %p0 5524 %b = icmp slt <16 x i32> %a, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 5525 %c = select <16 x i1> %b, <16 x i32> %a, <16 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 5526 %d = icmp sgt <16 x i32> %c, zeroinitializer 5527 %e = select <16 x i1> %d, <16 x i32> %c, <16 x i32> zeroinitializer 5528 %f = trunc <16 x i32> %e to <16 x i8> 5529 store <16 x i8> %f, <16 x i8>* %p1 5530 ret void 5531} 5532 5533define <8 x i8> @trunc_packus_v8i16_v8i8(<8 x i16> %a0) { 5534; SSE-LABEL: trunc_packus_v8i16_v8i8: 5535; SSE: # %bb.0: 5536; SSE-NEXT: packuswb %xmm0, %xmm0 5537; SSE-NEXT: retq 5538; 5539; AVX-LABEL: trunc_packus_v8i16_v8i8: 5540; AVX: # %bb.0: 5541; AVX-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5542; AVX-NEXT: retq 5543; 5544; AVX512-LABEL: trunc_packus_v8i16_v8i8: 5545; AVX512: # %bb.0: 5546; AVX512-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5547; AVX512-NEXT: retq 5548; 5549; SKX-LABEL: trunc_packus_v8i16_v8i8: 5550; SKX: # %bb.0: 5551; SKX-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5552; SKX-NEXT: retq 5553 %1 = icmp slt <8 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 5554 %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 5555 %3 = icmp sgt <8 x i16> %2, zeroinitializer 5556 %4 = select <8 x i1> %3, <8 x i16> %2, <8 x i16> zeroinitializer 5557 %5 = trunc <8 x i16> %4 to <8 x i8> 5558 ret <8 x i8> %5 5559} 5560 5561define void @trunc_packus_v8i16_v8i8_store(<8 x i16> %a0, <8 x i8> *%p1) { 5562; SSE-LABEL: trunc_packus_v8i16_v8i8_store: 5563; SSE: # %bb.0: 5564; SSE-NEXT: packuswb %xmm0, %xmm0 5565; SSE-NEXT: movq %xmm0, (%rdi) 5566; SSE-NEXT: retq 5567; 5568; AVX-LABEL: trunc_packus_v8i16_v8i8_store: 5569; AVX: # %bb.0: 5570; AVX-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5571; AVX-NEXT: vmovq %xmm0, (%rdi) 5572; AVX-NEXT: retq 5573; 5574; AVX512F-LABEL: trunc_packus_v8i16_v8i8_store: 5575; AVX512F: # %bb.0: 5576; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5577; AVX512F-NEXT: vmovq %xmm0, (%rdi) 5578; AVX512F-NEXT: retq 5579; 5580; AVX512VL-LABEL: trunc_packus_v8i16_v8i8_store: 5581; AVX512VL: # %bb.0: 5582; AVX512VL-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5583; AVX512VL-NEXT: vmovq %xmm0, (%rdi) 5584; AVX512VL-NEXT: retq 5585; 5586; AVX512BW-LABEL: trunc_packus_v8i16_v8i8_store: 5587; AVX512BW: # %bb.0: 5588; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 5589; AVX512BW-NEXT: vmovq %xmm0, (%rdi) 5590; AVX512BW-NEXT: retq 5591; 5592; AVX512BWVL-LABEL: trunc_packus_v8i16_v8i8_store: 5593; AVX512BWVL: # %bb.0: 5594; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 5595; AVX512BWVL-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 5596; AVX512BWVL-NEXT: vpmovuswb %xmm0, (%rdi) 5597; AVX512BWVL-NEXT: retq 5598; 5599; SKX-LABEL: trunc_packus_v8i16_v8i8_store: 5600; SKX: # %bb.0: 5601; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 5602; SKX-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 5603; SKX-NEXT: vpmovuswb %xmm0, (%rdi) 5604; SKX-NEXT: retq 5605 %1 = icmp slt <8 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 5606 %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 5607 %3 = icmp sgt <8 x i16> %2, zeroinitializer 5608 %4 = select <8 x i1> %3, <8 x i16> %2, <8 x i16> zeroinitializer 5609 %5 = trunc <8 x i16> %4 to <8 x i8> 5610 store <8 x i8> %5, <8 x i8> *%p1 5611 ret void 5612} 5613 5614define <16 x i8> @trunc_packus_v16i16_v16i8(<16 x i16> %a0) { 5615; SSE-LABEL: trunc_packus_v16i16_v16i8: 5616; SSE: # %bb.0: 5617; SSE-NEXT: packuswb %xmm1, %xmm0 5618; SSE-NEXT: retq 5619; 5620; AVX1-LABEL: trunc_packus_v16i16_v16i8: 5621; AVX1: # %bb.0: 5622; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 5623; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 5624; AVX1-NEXT: vzeroupper 5625; AVX1-NEXT: retq 5626; 5627; AVX2-LABEL: trunc_packus_v16i16_v16i8: 5628; AVX2: # %bb.0: 5629; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 5630; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 5631; AVX2-NEXT: vzeroupper 5632; AVX2-NEXT: retq 5633; 5634; AVX512F-LABEL: trunc_packus_v16i16_v16i8: 5635; AVX512F: # %bb.0: 5636; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 5637; AVX512F-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 5638; AVX512F-NEXT: vzeroupper 5639; AVX512F-NEXT: retq 5640; 5641; AVX512VL-LABEL: trunc_packus_v16i16_v16i8: 5642; AVX512VL: # %bb.0: 5643; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1 5644; AVX512VL-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 5645; AVX512VL-NEXT: vzeroupper 5646; AVX512VL-NEXT: retq 5647; 5648; AVX512BW-LABEL: trunc_packus_v16i16_v16i8: 5649; AVX512BW: # %bb.0: 5650; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 5651; AVX512BW-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 5652; AVX512BW-NEXT: vzeroupper 5653; AVX512BW-NEXT: retq 5654; 5655; AVX512BWVL-LABEL: trunc_packus_v16i16_v16i8: 5656; AVX512BWVL: # %bb.0: 5657; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 5658; AVX512BWVL-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 5659; AVX512BWVL-NEXT: vpmovuswb %ymm0, %xmm0 5660; AVX512BWVL-NEXT: vzeroupper 5661; AVX512BWVL-NEXT: retq 5662; 5663; SKX-LABEL: trunc_packus_v16i16_v16i8: 5664; SKX: # %bb.0: 5665; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 5666; SKX-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 5667; SKX-NEXT: vpmovuswb %ymm0, %xmm0 5668; SKX-NEXT: vzeroupper 5669; SKX-NEXT: retq 5670 %1 = icmp slt <16 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 5671 %2 = select <16 x i1> %1, <16 x i16> %a0, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 5672 %3 = icmp sgt <16 x i16> %2, zeroinitializer 5673 %4 = select <16 x i1> %3, <16 x i16> %2, <16 x i16> zeroinitializer 5674 %5 = trunc <16 x i16> %4 to <16 x i8> 5675 ret <16 x i8> %5 5676} 5677 5678define <32 x i8> @trunc_packus_v32i16_v32i8(<32 x i16>* %p0) "min-legal-vector-width"="256" { 5679; SSE-LABEL: trunc_packus_v32i16_v32i8: 5680; SSE: # %bb.0: 5681; SSE-NEXT: movdqa (%rdi), %xmm0 5682; SSE-NEXT: movdqa 32(%rdi), %xmm1 5683; SSE-NEXT: packuswb 16(%rdi), %xmm0 5684; SSE-NEXT: packuswb 48(%rdi), %xmm1 5685; SSE-NEXT: retq 5686; 5687; AVX1-LABEL: trunc_packus_v32i16_v32i8: 5688; AVX1: # %bb.0: 5689; AVX1-NEXT: vmovdqa (%rdi), %xmm0 5690; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1 5691; AVX1-NEXT: vpackuswb 48(%rdi), %xmm1, %xmm1 5692; AVX1-NEXT: vpackuswb 16(%rdi), %xmm0, %xmm0 5693; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 5694; AVX1-NEXT: retq 5695; 5696; AVX2-LABEL: trunc_packus_v32i16_v32i8: 5697; AVX2: # %bb.0: 5698; AVX2-NEXT: vmovdqa (%rdi), %ymm0 5699; AVX2-NEXT: vpackuswb 32(%rdi), %ymm0, %ymm0 5700; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 5701; AVX2-NEXT: retq 5702; 5703; AVX512F-LABEL: trunc_packus_v32i16_v32i8: 5704; AVX512F: # %bb.0: 5705; AVX512F-NEXT: vmovdqa (%rdi), %ymm0 5706; AVX512F-NEXT: vpackuswb 32(%rdi), %ymm0, %ymm0 5707; AVX512F-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 5708; AVX512F-NEXT: retq 5709; 5710; AVX512VL-LABEL: trunc_packus_v32i16_v32i8: 5711; AVX512VL: # %bb.0: 5712; AVX512VL-NEXT: vmovdqa (%rdi), %ymm0 5713; AVX512VL-NEXT: vpackuswb 32(%rdi), %ymm0, %ymm0 5714; AVX512VL-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 5715; AVX512VL-NEXT: retq 5716; 5717; AVX512BW-LABEL: trunc_packus_v32i16_v32i8: 5718; AVX512BW: # %bb.0: 5719; AVX512BW-NEXT: vpxor %xmm0, %xmm0, %xmm0 5720; AVX512BW-NEXT: vpmaxsw (%rdi), %zmm0, %zmm0 5721; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm0 5722; AVX512BW-NEXT: retq 5723; 5724; AVX512BWVL-LABEL: trunc_packus_v32i16_v32i8: 5725; AVX512BWVL: # %bb.0: 5726; AVX512BWVL-NEXT: vpxor %xmm0, %xmm0, %xmm0 5727; AVX512BWVL-NEXT: vpmaxsw (%rdi), %zmm0, %zmm0 5728; AVX512BWVL-NEXT: vpmovuswb %zmm0, %ymm0 5729; AVX512BWVL-NEXT: retq 5730; 5731; SKX-LABEL: trunc_packus_v32i16_v32i8: 5732; SKX: # %bb.0: 5733; SKX-NEXT: vmovdqa (%rdi), %ymm0 5734; SKX-NEXT: vpackuswb 32(%rdi), %ymm0, %ymm0 5735; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 5736; SKX-NEXT: retq 5737 %a0 = load <32 x i16>, <32 x i16>* %p0 5738 %1 = icmp slt <32 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 5739 %2 = select <32 x i1> %1, <32 x i16> %a0, <32 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 5740 %3 = icmp sgt <32 x i16> %2, zeroinitializer 5741 %4 = select <32 x i1> %3, <32 x i16> %2, <32 x i16> zeroinitializer 5742 %5 = trunc <32 x i16> %4 to <32 x i8> 5743 ret <32 x i8> %5 5744} 5745 5746define <32 x i8> @trunc_packus_v32i32_v32i8(<32 x i32>* %p0) "min-legal-vector-width"="256" { 5747; SSE-LABEL: trunc_packus_v32i32_v32i8: 5748; SSE: # %bb.0: 5749; SSE-NEXT: movdqa (%rdi), %xmm0 5750; SSE-NEXT: movdqa 32(%rdi), %xmm2 5751; SSE-NEXT: movdqa 64(%rdi), %xmm1 5752; SSE-NEXT: movdqa 96(%rdi), %xmm3 5753; SSE-NEXT: packssdw 48(%rdi), %xmm2 5754; SSE-NEXT: packssdw 16(%rdi), %xmm0 5755; SSE-NEXT: packuswb %xmm2, %xmm0 5756; SSE-NEXT: packssdw 112(%rdi), %xmm3 5757; SSE-NEXT: packssdw 80(%rdi), %xmm1 5758; SSE-NEXT: packuswb %xmm3, %xmm1 5759; SSE-NEXT: retq 5760; 5761; AVX1-LABEL: trunc_packus_v32i32_v32i8: 5762; AVX1: # %bb.0: 5763; AVX1-NEXT: vmovdqa (%rdi), %xmm0 5764; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1 5765; AVX1-NEXT: vmovdqa 64(%rdi), %xmm2 5766; AVX1-NEXT: vmovdqa 96(%rdi), %xmm3 5767; AVX1-NEXT: vpackssdw 112(%rdi), %xmm3, %xmm3 5768; AVX1-NEXT: vpackssdw 80(%rdi), %xmm2, %xmm2 5769; AVX1-NEXT: vpackuswb %xmm3, %xmm2, %xmm2 5770; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm1 5771; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm0 5772; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 5773; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 5774; AVX1-NEXT: retq 5775; 5776; AVX2-LABEL: trunc_packus_v32i32_v32i8: 5777; AVX2: # %bb.0: 5778; AVX2-NEXT: vmovdqa (%rdi), %ymm0 5779; AVX2-NEXT: vmovdqa 64(%rdi), %ymm1 5780; AVX2-NEXT: vpackssdw 96(%rdi), %ymm1, %ymm1 5781; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3] 5782; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm0 5783; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 5784; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 5785; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 5786; AVX2-NEXT: retq 5787; 5788; AVX512-LABEL: trunc_packus_v32i32_v32i8: 5789; AVX512: # %bb.0: 5790; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0 5791; AVX512-NEXT: vpmaxsd (%rdi), %zmm0, %zmm1 5792; AVX512-NEXT: vpmovusdb %zmm1, %xmm1 5793; AVX512-NEXT: vpmaxsd 64(%rdi), %zmm0, %zmm0 5794; AVX512-NEXT: vpmovusdb %zmm0, %xmm0 5795; AVX512-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 5796; AVX512-NEXT: retq 5797; 5798; SKX-LABEL: trunc_packus_v32i32_v32i8: 5799; SKX: # %bb.0: 5800; SKX-NEXT: vmovdqa (%rdi), %ymm0 5801; SKX-NEXT: vmovdqa 64(%rdi), %ymm1 5802; SKX-NEXT: vpackssdw 96(%rdi), %ymm1, %ymm1 5803; SKX-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3] 5804; SKX-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm0 5805; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 5806; SKX-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 5807; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 5808; SKX-NEXT: retq 5809 %a0 = load <32 x i32>, <32 x i32>* %p0 5810 %1 = icmp slt <32 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 5811 %2 = select <32 x i1> %1, <32 x i32> %a0, <32 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 5812 %3 = icmp sgt <32 x i32> %2, zeroinitializer 5813 %4 = select <32 x i1> %3, <32 x i32> %2, <32 x i32> zeroinitializer 5814 %5 = trunc <32 x i32> %4 to <32 x i8> 5815 ret <32 x i8> %5 5816} 5817