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