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