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