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