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 13; 14; Unsigned saturation truncation to vXi32 15; 16 17define <4 x i32> @trunc_usat_v4i64_v4i32(<4 x i64> %a0) { 18; SSE2-LABEL: trunc_usat_v4i64_v4i32: 19; SSE2: # %bb.0: 20; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 21; SSE2-NEXT: movdqa %xmm0, %xmm3 22; SSE2-NEXT: pxor %xmm2, %xmm3 23; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455] 24; SSE2-NEXT: movdqa %xmm4, %xmm5 25; SSE2-NEXT: pcmpgtd %xmm3, %xmm5 26; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 27; SSE2-NEXT: pcmpeqd %xmm4, %xmm3 28; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 29; SSE2-NEXT: pand %xmm6, %xmm3 30; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 31; SSE2-NEXT: por %xmm3, %xmm5 32; SSE2-NEXT: pxor %xmm1, %xmm2 33; SSE2-NEXT: movdqa %xmm4, %xmm3 34; SSE2-NEXT: pcmpgtd %xmm2, %xmm3 35; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 36; SSE2-NEXT: pcmpeqd %xmm4, %xmm2 37; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 38; SSE2-NEXT: pand %xmm6, %xmm2 39; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 40; SSE2-NEXT: por %xmm2, %xmm3 41; SSE2-NEXT: pand %xmm3, %xmm1 42; SSE2-NEXT: pandn {{.*}}(%rip), %xmm3 43; SSE2-NEXT: por %xmm1, %xmm3 44; SSE2-NEXT: pand %xmm5, %xmm0 45; SSE2-NEXT: pandn {{.*}}(%rip), %xmm5 46; SSE2-NEXT: por %xmm5, %xmm0 47; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2] 48; SSE2-NEXT: retq 49; 50; SSSE3-LABEL: trunc_usat_v4i64_v4i32: 51; SSSE3: # %bb.0: 52; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 53; SSSE3-NEXT: movdqa %xmm0, %xmm3 54; SSSE3-NEXT: pxor %xmm2, %xmm3 55; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455] 56; SSSE3-NEXT: movdqa %xmm4, %xmm5 57; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5 58; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 59; SSSE3-NEXT: pcmpeqd %xmm4, %xmm3 60; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 61; SSSE3-NEXT: pand %xmm6, %xmm3 62; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 63; SSSE3-NEXT: por %xmm3, %xmm5 64; SSSE3-NEXT: pxor %xmm1, %xmm2 65; SSSE3-NEXT: movdqa %xmm4, %xmm3 66; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3 67; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 68; SSSE3-NEXT: pcmpeqd %xmm4, %xmm2 69; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 70; SSSE3-NEXT: pand %xmm6, %xmm2 71; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 72; SSSE3-NEXT: por %xmm2, %xmm3 73; SSSE3-NEXT: pand %xmm3, %xmm1 74; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm3 75; SSSE3-NEXT: por %xmm1, %xmm3 76; SSSE3-NEXT: pand %xmm5, %xmm0 77; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm5 78; SSSE3-NEXT: por %xmm5, %xmm0 79; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2] 80; SSSE3-NEXT: retq 81; 82; SSE41-LABEL: trunc_usat_v4i64_v4i32: 83; SSE41: # %bb.0: 84; SSE41-NEXT: movdqa %xmm0, %xmm2 85; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456] 86; SSE41-NEXT: movdqa %xmm2, %xmm3 87; SSE41-NEXT: pxor %xmm0, %xmm3 88; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455] 89; SSE41-NEXT: movdqa %xmm4, %xmm5 90; SSE41-NEXT: pcmpgtd %xmm3, %xmm5 91; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 92; SSE41-NEXT: pcmpeqd %xmm4, %xmm3 93; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 94; SSE41-NEXT: pand %xmm6, %xmm3 95; SSE41-NEXT: por %xmm5, %xmm3 96; SSE41-NEXT: pxor %xmm1, %xmm0 97; SSE41-NEXT: movdqa %xmm4, %xmm5 98; SSE41-NEXT: pcmpgtd %xmm0, %xmm5 99; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 100; SSE41-NEXT: pcmpeqd %xmm4, %xmm0 101; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 102; SSE41-NEXT: pand %xmm6, %xmm0 103; SSE41-NEXT: por %xmm5, %xmm0 104; SSE41-NEXT: movapd {{.*#+}} xmm4 = [4294967295,4294967295] 105; SSE41-NEXT: movapd {{.*#+}} xmm5 = [4294967295,429496729] 106; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5 107; SSE41-NEXT: movdqa %xmm3, %xmm0 108; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4 109; SSE41-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2] 110; SSE41-NEXT: movaps %xmm4, %xmm0 111; SSE41-NEXT: retq 112; 113; AVX1-LABEL: trunc_usat_v4i64_v4i32: 114; AVX1: # %bb.0: 115; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 116; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 117; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 118; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103] 119; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1 120; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm2 121; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2 122; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1 123; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729] 124; AVX1-NEXT: vblendvpd %ymm1, %ymm0, %ymm2, %ymm0 125; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 126; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 127; AVX1-NEXT: vzeroupper 128; AVX1-NEXT: retq 129; 130; AVX2-SLOW-LABEL: trunc_usat_v4i64_v4i32: 131; AVX2-SLOW: # %bb.0: 132; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 133; AVX2-SLOW-NEXT: vpxor %ymm1, %ymm0, %ymm1 134; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103] 135; AVX2-SLOW-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm1 136; AVX2-SLOW-NEXT: vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729] 137; AVX2-SLOW-NEXT: vblendvpd %ymm1, %ymm0, %ymm2, %ymm0 138; AVX2-SLOW-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7] 139; AVX2-SLOW-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,2,3] 140; AVX2-SLOW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 141; AVX2-SLOW-NEXT: vzeroupper 142; AVX2-SLOW-NEXT: retq 143; 144; AVX2-FAST-LABEL: trunc_usat_v4i64_v4i32: 145; AVX2-FAST: # %bb.0: 146; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 147; AVX2-FAST-NEXT: vpxor %ymm1, %ymm0, %ymm1 148; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103] 149; AVX2-FAST-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm1 150; AVX2-FAST-NEXT: vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729] 151; AVX2-FAST-NEXT: vblendvpd %ymm1, %ymm0, %ymm2, %ymm0 152; AVX2-FAST-NEXT: vmovapd {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7] 153; AVX2-FAST-NEXT: vpermps %ymm0, %ymm1, %ymm0 154; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 155; AVX2-FAST-NEXT: vzeroupper 156; AVX2-FAST-NEXT: retq 157; 158; AVX512F-LABEL: trunc_usat_v4i64_v4i32: 159; AVX512F: # %bb.0: 160; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 161; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295] 162; AVX512F-NEXT: vpcmpltuq %zmm1, %zmm0, %k1 163; AVX512F-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729] 164; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1} 165; AVX512F-NEXT: vpmovqd %zmm1, %ymm0 166; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 167; AVX512F-NEXT: vzeroupper 168; AVX512F-NEXT: retq 169; 170; AVX512VL-LABEL: trunc_usat_v4i64_v4i32: 171; AVX512VL: # %bb.0: 172; AVX512VL-NEXT: vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1 173; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729] 174; AVX512VL-NEXT: vmovdqa64 %ymm0, %ymm1 {%k1} 175; AVX512VL-NEXT: vpmovqd %ymm1, %xmm0 176; AVX512VL-NEXT: vzeroupper 177; AVX512VL-NEXT: retq 178; 179; AVX512BW-LABEL: trunc_usat_v4i64_v4i32: 180; AVX512BW: # %bb.0: 181; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 182; AVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295] 183; AVX512BW-NEXT: vpcmpltuq %zmm1, %zmm0, %k1 184; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729] 185; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1} 186; AVX512BW-NEXT: vpmovqd %zmm1, %ymm0 187; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 188; AVX512BW-NEXT: vzeroupper 189; AVX512BW-NEXT: retq 190; 191; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i32: 192; AVX512BWVL: # %bb.0: 193; AVX512BWVL-NEXT: vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1 194; AVX512BWVL-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729] 195; AVX512BWVL-NEXT: vmovdqa64 %ymm0, %ymm1 {%k1} 196; AVX512BWVL-NEXT: vpmovqd %ymm1, %xmm0 197; AVX512BWVL-NEXT: vzeroupper 198; AVX512BWVL-NEXT: retq 199 %1 = icmp ult <4 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 200 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 429496729> 201 %3 = trunc <4 x i64> %2 to <4 x i32> 202 ret <4 x i32> %3 203} 204 205define <8 x i32> @trunc_usat_v8i64_v8i32(<8 x i64> %a0) { 206; SSE2-LABEL: trunc_usat_v8i64_v8i32: 207; SSE2: # %bb.0: 208; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295] 209; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456] 210; SSE2-NEXT: movdqa %xmm3, %xmm7 211; SSE2-NEXT: pxor %xmm5, %xmm7 212; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455] 213; SSE2-NEXT: movdqa %xmm9, %xmm6 214; SSE2-NEXT: pcmpgtd %xmm7, %xmm6 215; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2] 216; SSE2-NEXT: pcmpeqd %xmm9, %xmm7 217; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] 218; SSE2-NEXT: pand %xmm4, %xmm7 219; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3] 220; SSE2-NEXT: por %xmm7, %xmm4 221; SSE2-NEXT: pand %xmm4, %xmm3 222; SSE2-NEXT: pandn %xmm8, %xmm4 223; SSE2-NEXT: por %xmm3, %xmm4 224; SSE2-NEXT: movdqa %xmm2, %xmm3 225; SSE2-NEXT: pxor %xmm5, %xmm3 226; SSE2-NEXT: movdqa %xmm9, %xmm6 227; SSE2-NEXT: pcmpgtd %xmm3, %xmm6 228; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2] 229; SSE2-NEXT: pcmpeqd %xmm9, %xmm3 230; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3] 231; SSE2-NEXT: pand %xmm10, %xmm7 232; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 233; SSE2-NEXT: por %xmm7, %xmm3 234; SSE2-NEXT: pand %xmm3, %xmm2 235; SSE2-NEXT: pandn %xmm8, %xmm3 236; SSE2-NEXT: por %xmm2, %xmm3 237; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm4[0,2] 238; SSE2-NEXT: movdqa %xmm1, %xmm2 239; SSE2-NEXT: pxor %xmm5, %xmm2 240; SSE2-NEXT: movdqa %xmm9, %xmm4 241; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 242; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 243; SSE2-NEXT: pcmpeqd %xmm9, %xmm2 244; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 245; SSE2-NEXT: pand %xmm6, %xmm2 246; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 247; SSE2-NEXT: por %xmm2, %xmm4 248; SSE2-NEXT: pand %xmm4, %xmm1 249; SSE2-NEXT: pandn %xmm8, %xmm4 250; SSE2-NEXT: por %xmm1, %xmm4 251; SSE2-NEXT: pxor %xmm0, %xmm5 252; SSE2-NEXT: movdqa %xmm9, %xmm1 253; SSE2-NEXT: pcmpgtd %xmm5, %xmm1 254; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2] 255; SSE2-NEXT: pcmpeqd %xmm9, %xmm5 256; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 257; SSE2-NEXT: pand %xmm2, %xmm5 258; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 259; SSE2-NEXT: por %xmm5, %xmm1 260; SSE2-NEXT: pand %xmm1, %xmm0 261; SSE2-NEXT: pandn %xmm8, %xmm1 262; SSE2-NEXT: por %xmm1, %xmm0 263; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2] 264; SSE2-NEXT: movaps %xmm3, %xmm1 265; SSE2-NEXT: retq 266; 267; SSSE3-LABEL: trunc_usat_v8i64_v8i32: 268; SSSE3: # %bb.0: 269; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295] 270; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456] 271; SSSE3-NEXT: movdqa %xmm3, %xmm7 272; SSSE3-NEXT: pxor %xmm5, %xmm7 273; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455] 274; SSSE3-NEXT: movdqa %xmm9, %xmm6 275; SSSE3-NEXT: pcmpgtd %xmm7, %xmm6 276; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2] 277; SSSE3-NEXT: pcmpeqd %xmm9, %xmm7 278; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] 279; SSSE3-NEXT: pand %xmm4, %xmm7 280; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3] 281; SSSE3-NEXT: por %xmm7, %xmm4 282; SSSE3-NEXT: pand %xmm4, %xmm3 283; SSSE3-NEXT: pandn %xmm8, %xmm4 284; SSSE3-NEXT: por %xmm3, %xmm4 285; SSSE3-NEXT: movdqa %xmm2, %xmm3 286; SSSE3-NEXT: pxor %xmm5, %xmm3 287; SSSE3-NEXT: movdqa %xmm9, %xmm6 288; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6 289; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2] 290; SSSE3-NEXT: pcmpeqd %xmm9, %xmm3 291; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3] 292; SSSE3-NEXT: pand %xmm10, %xmm7 293; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 294; SSSE3-NEXT: por %xmm7, %xmm3 295; SSSE3-NEXT: pand %xmm3, %xmm2 296; SSSE3-NEXT: pandn %xmm8, %xmm3 297; SSSE3-NEXT: por %xmm2, %xmm3 298; SSSE3-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm4[0,2] 299; SSSE3-NEXT: movdqa %xmm1, %xmm2 300; SSSE3-NEXT: pxor %xmm5, %xmm2 301; SSSE3-NEXT: movdqa %xmm9, %xmm4 302; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 303; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 304; SSSE3-NEXT: pcmpeqd %xmm9, %xmm2 305; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 306; SSSE3-NEXT: pand %xmm6, %xmm2 307; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 308; SSSE3-NEXT: por %xmm2, %xmm4 309; SSSE3-NEXT: pand %xmm4, %xmm1 310; SSSE3-NEXT: pandn %xmm8, %xmm4 311; SSSE3-NEXT: por %xmm1, %xmm4 312; SSSE3-NEXT: pxor %xmm0, %xmm5 313; SSSE3-NEXT: movdqa %xmm9, %xmm1 314; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1 315; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2] 316; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5 317; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 318; SSSE3-NEXT: pand %xmm2, %xmm5 319; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 320; SSSE3-NEXT: por %xmm5, %xmm1 321; SSSE3-NEXT: pand %xmm1, %xmm0 322; SSSE3-NEXT: pandn %xmm8, %xmm1 323; SSSE3-NEXT: por %xmm1, %xmm0 324; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2] 325; SSSE3-NEXT: movaps %xmm3, %xmm1 326; SSSE3-NEXT: retq 327; 328; SSE41-LABEL: trunc_usat_v8i64_v8i32: 329; SSE41: # %bb.0: 330; SSE41-NEXT: movdqa %xmm0, %xmm8 331; SSE41-NEXT: movapd {{.*#+}} xmm6 = [4294967295,4294967295] 332; SSE41-NEXT: movdqa {{.*#+}} xmm7 = [9223372039002259456,9223372039002259456] 333; SSE41-NEXT: movdqa %xmm3, %xmm0 334; SSE41-NEXT: pxor %xmm7, %xmm0 335; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455] 336; SSE41-NEXT: movdqa %xmm9, %xmm4 337; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 338; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 339; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 340; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 341; SSE41-NEXT: pand %xmm5, %xmm0 342; SSE41-NEXT: por %xmm4, %xmm0 343; SSE41-NEXT: movapd %xmm6, %xmm5 344; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm5 345; SSE41-NEXT: movdqa %xmm2, %xmm0 346; SSE41-NEXT: pxor %xmm7, %xmm0 347; SSE41-NEXT: movdqa %xmm9, %xmm3 348; SSE41-NEXT: pcmpgtd %xmm0, %xmm3 349; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 350; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 351; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 352; SSE41-NEXT: pand %xmm4, %xmm0 353; SSE41-NEXT: por %xmm3, %xmm0 354; SSE41-NEXT: movapd %xmm6, %xmm4 355; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4 356; SSE41-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2] 357; SSE41-NEXT: movdqa %xmm1, %xmm0 358; SSE41-NEXT: pxor %xmm7, %xmm0 359; SSE41-NEXT: movdqa %xmm9, %xmm2 360; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 361; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 362; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 363; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 364; SSE41-NEXT: pand %xmm3, %xmm0 365; SSE41-NEXT: por %xmm2, %xmm0 366; SSE41-NEXT: movapd %xmm6, %xmm2 367; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 368; SSE41-NEXT: pxor %xmm8, %xmm7 369; SSE41-NEXT: movdqa %xmm9, %xmm1 370; SSE41-NEXT: pcmpgtd %xmm7, %xmm1 371; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2] 372; SSE41-NEXT: pcmpeqd %xmm9, %xmm7 373; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3] 374; SSE41-NEXT: pand %xmm3, %xmm0 375; SSE41-NEXT: por %xmm1, %xmm0 376; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm6 377; SSE41-NEXT: shufps {{.*#+}} xmm6 = xmm6[0,2],xmm2[0,2] 378; SSE41-NEXT: movaps %xmm6, %xmm0 379; SSE41-NEXT: movaps %xmm4, %xmm1 380; SSE41-NEXT: retq 381; 382; AVX1-LABEL: trunc_usat_v8i64_v8i32: 383; AVX1: # %bb.0: 384; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295] 385; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 386; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808] 387; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 388; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372041149743103,9223372041149743103] 389; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3 390; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm6 391; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm6 392; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm6, %ymm3 393; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 394; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 395; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 396; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3 397; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm4 398; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4 399; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 400; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 401; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 402; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2] 403; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 404; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2] 405; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 406; AVX1-NEXT: retq 407; 408; AVX2-SLOW-LABEL: trunc_usat_v8i64_v8i32: 409; AVX2-SLOW: # %bb.0: 410; AVX2-SLOW-NEXT: vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295] 411; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 412; AVX2-SLOW-NEXT: vpxor %ymm3, %ymm1, %ymm4 413; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103] 414; AVX2-SLOW-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4 415; AVX2-SLOW-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1 416; AVX2-SLOW-NEXT: vpxor %ymm3, %ymm0, %ymm3 417; AVX2-SLOW-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3 418; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 419; AVX2-SLOW-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7] 420; AVX2-SLOW-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,2,3] 421; AVX2-SLOW-NEXT: vpermilps {{.*#+}} ymm1 = ymm1[0,2,2,3,4,6,6,7] 422; AVX2-SLOW-NEXT: vpermpd {{.*#+}} ymm1 = ymm1[0,2,2,3] 423; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 424; AVX2-SLOW-NEXT: retq 425; 426; AVX2-FAST-LABEL: trunc_usat_v8i64_v8i32: 427; AVX2-FAST: # %bb.0: 428; AVX2-FAST-NEXT: vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295] 429; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 430; AVX2-FAST-NEXT: vpxor %ymm3, %ymm1, %ymm4 431; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103] 432; AVX2-FAST-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4 433; AVX2-FAST-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1 434; AVX2-FAST-NEXT: vpxor %ymm3, %ymm0, %ymm3 435; AVX2-FAST-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3 436; AVX2-FAST-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 437; AVX2-FAST-NEXT: vmovapd {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 438; AVX2-FAST-NEXT: vpermps %ymm0, %ymm2, %ymm0 439; AVX2-FAST-NEXT: vpermps %ymm1, %ymm2, %ymm1 440; AVX2-FAST-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 441; AVX2-FAST-NEXT: retq 442; 443; AVX512-LABEL: trunc_usat_v8i64_v8i32: 444; AVX512: # %bb.0: 445; AVX512-NEXT: vpmovusqd %zmm0, %ymm0 446; AVX512-NEXT: retq 447 %1 = icmp ult <8 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 448 %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> 449 %3 = trunc <8 x i64> %2 to <8 x i32> 450 ret <8 x i32> %3 451} 452 453; 454; Unsigned saturation truncation to vXi16 455; 456 457define <8 x i16> @trunc_usat_v8i64_v8i16(<8 x i64> %a0) { 458; SSE2-LABEL: trunc_usat_v8i64_v8i16: 459; SSE2: # %bb.0: 460; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535] 461; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456] 462; SSE2-NEXT: movdqa %xmm2, %xmm5 463; SSE2-NEXT: pxor %xmm6, %xmm5 464; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991] 465; SSE2-NEXT: movdqa %xmm9, %xmm7 466; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 467; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2] 468; SSE2-NEXT: pcmpeqd %xmm9, %xmm5 469; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 470; SSE2-NEXT: pand %xmm10, %xmm4 471; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] 472; SSE2-NEXT: por %xmm4, %xmm5 473; SSE2-NEXT: pand %xmm5, %xmm2 474; SSE2-NEXT: pandn %xmm8, %xmm5 475; SSE2-NEXT: por %xmm2, %xmm5 476; SSE2-NEXT: movdqa %xmm3, %xmm2 477; SSE2-NEXT: pxor %xmm6, %xmm2 478; SSE2-NEXT: movdqa %xmm9, %xmm4 479; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 480; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2] 481; SSE2-NEXT: pcmpeqd %xmm9, %xmm2 482; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 483; SSE2-NEXT: pand %xmm10, %xmm7 484; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 485; SSE2-NEXT: por %xmm7, %xmm2 486; SSE2-NEXT: pand %xmm2, %xmm3 487; SSE2-NEXT: pandn %xmm8, %xmm2 488; SSE2-NEXT: por %xmm3, %xmm2 489; SSE2-NEXT: movdqa %xmm0, %xmm3 490; SSE2-NEXT: pxor %xmm6, %xmm3 491; SSE2-NEXT: movdqa %xmm9, %xmm4 492; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 493; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2] 494; SSE2-NEXT: pcmpeqd %xmm9, %xmm3 495; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 496; SSE2-NEXT: pand %xmm7, %xmm3 497; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 498; SSE2-NEXT: por %xmm3, %xmm4 499; SSE2-NEXT: pand %xmm4, %xmm0 500; SSE2-NEXT: pandn %xmm8, %xmm4 501; SSE2-NEXT: por %xmm0, %xmm4 502; SSE2-NEXT: pxor %xmm1, %xmm6 503; SSE2-NEXT: movdqa %xmm9, %xmm0 504; SSE2-NEXT: pcmpgtd %xmm6, %xmm0 505; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2] 506; SSE2-NEXT: pcmpeqd %xmm9, %xmm6 507; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 508; SSE2-NEXT: pand %xmm3, %xmm6 509; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 510; SSE2-NEXT: por %xmm6, %xmm0 511; SSE2-NEXT: pand %xmm0, %xmm1 512; SSE2-NEXT: pandn %xmm8, %xmm0 513; SSE2-NEXT: por %xmm1, %xmm0 514; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 515; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 516; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3] 517; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 518; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 519; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 520; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[0,1,0,2,4,5,6,7] 521; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3] 522; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 523; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 524; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 525; SSE2-NEXT: retq 526; 527; SSSE3-LABEL: trunc_usat_v8i64_v8i16: 528; SSSE3: # %bb.0: 529; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535] 530; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456] 531; SSSE3-NEXT: movdqa %xmm2, %xmm5 532; SSSE3-NEXT: pxor %xmm6, %xmm5 533; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991] 534; SSSE3-NEXT: movdqa %xmm9, %xmm7 535; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7 536; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2] 537; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5 538; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 539; SSSE3-NEXT: pand %xmm10, %xmm4 540; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] 541; SSSE3-NEXT: por %xmm4, %xmm5 542; SSSE3-NEXT: pand %xmm5, %xmm2 543; SSSE3-NEXT: pandn %xmm8, %xmm5 544; SSSE3-NEXT: por %xmm2, %xmm5 545; SSSE3-NEXT: movdqa %xmm3, %xmm2 546; SSSE3-NEXT: pxor %xmm6, %xmm2 547; SSSE3-NEXT: movdqa %xmm9, %xmm4 548; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 549; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2] 550; SSSE3-NEXT: pcmpeqd %xmm9, %xmm2 551; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 552; SSSE3-NEXT: pand %xmm10, %xmm7 553; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 554; SSSE3-NEXT: por %xmm7, %xmm2 555; SSSE3-NEXT: pand %xmm2, %xmm3 556; SSSE3-NEXT: pandn %xmm8, %xmm2 557; SSSE3-NEXT: por %xmm3, %xmm2 558; SSSE3-NEXT: movdqa %xmm0, %xmm3 559; SSSE3-NEXT: pxor %xmm6, %xmm3 560; SSSE3-NEXT: movdqa %xmm9, %xmm4 561; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4 562; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2] 563; SSSE3-NEXT: pcmpeqd %xmm9, %xmm3 564; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 565; SSSE3-NEXT: pand %xmm7, %xmm3 566; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 567; SSSE3-NEXT: por %xmm3, %xmm4 568; SSSE3-NEXT: pand %xmm4, %xmm0 569; SSSE3-NEXT: pandn %xmm8, %xmm4 570; SSSE3-NEXT: por %xmm0, %xmm4 571; SSSE3-NEXT: pxor %xmm1, %xmm6 572; SSSE3-NEXT: movdqa %xmm9, %xmm0 573; SSSE3-NEXT: pcmpgtd %xmm6, %xmm0 574; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2] 575; SSSE3-NEXT: pcmpeqd %xmm9, %xmm6 576; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 577; SSSE3-NEXT: pand %xmm3, %xmm6 578; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 579; SSSE3-NEXT: por %xmm6, %xmm0 580; SSSE3-NEXT: pand %xmm0, %xmm1 581; SSSE3-NEXT: pandn %xmm8, %xmm0 582; SSSE3-NEXT: por %xmm1, %xmm0 583; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 584; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 585; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3] 586; SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 587; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 588; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 589; SSSE3-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[0,1,0,2,4,5,6,7] 590; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3] 591; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 592; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 593; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 594; SSSE3-NEXT: retq 595; 596; SSE41-LABEL: trunc_usat_v8i64_v8i16: 597; SSE41: # %bb.0: 598; SSE41-NEXT: movdqa %xmm0, %xmm8 599; SSE41-NEXT: movapd {{.*#+}} xmm5 = [65535,65535] 600; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456] 601; SSE41-NEXT: movdqa %xmm1, %xmm0 602; SSE41-NEXT: pxor %xmm6, %xmm0 603; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991] 604; SSE41-NEXT: movdqa %xmm9, %xmm7 605; SSE41-NEXT: pcmpgtd %xmm0, %xmm7 606; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2] 607; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 608; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 609; SSE41-NEXT: pand %xmm4, %xmm0 610; SSE41-NEXT: por %xmm7, %xmm0 611; SSE41-NEXT: movapd %xmm5, %xmm4 612; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4 613; SSE41-NEXT: movdqa %xmm8, %xmm0 614; SSE41-NEXT: pxor %xmm6, %xmm0 615; SSE41-NEXT: movdqa %xmm9, %xmm1 616; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 617; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2] 618; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 619; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 620; SSE41-NEXT: pand %xmm7, %xmm0 621; SSE41-NEXT: por %xmm1, %xmm0 622; SSE41-NEXT: movapd %xmm5, %xmm1 623; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1 624; SSE41-NEXT: packusdw %xmm4, %xmm1 625; SSE41-NEXT: movdqa %xmm3, %xmm0 626; SSE41-NEXT: pxor %xmm6, %xmm0 627; SSE41-NEXT: movdqa %xmm9, %xmm4 628; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 629; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2] 630; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 631; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 632; SSE41-NEXT: pand %xmm7, %xmm0 633; SSE41-NEXT: por %xmm4, %xmm0 634; SSE41-NEXT: movapd %xmm5, %xmm4 635; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm4 636; SSE41-NEXT: pxor %xmm2, %xmm6 637; SSE41-NEXT: movdqa %xmm9, %xmm3 638; SSE41-NEXT: pcmpgtd %xmm6, %xmm3 639; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2] 640; SSE41-NEXT: pcmpeqd %xmm9, %xmm6 641; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 642; SSE41-NEXT: pand %xmm7, %xmm0 643; SSE41-NEXT: por %xmm3, %xmm0 644; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5 645; SSE41-NEXT: packusdw %xmm4, %xmm5 646; SSE41-NEXT: packusdw %xmm5, %xmm1 647; SSE41-NEXT: movdqa %xmm1, %xmm0 648; SSE41-NEXT: retq 649; 650; AVX1-LABEL: trunc_usat_v8i64_v8i16: 651; AVX1: # %bb.0: 652; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [65535,65535,65535,65535] 653; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 654; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808] 655; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 656; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372036854841343,9223372036854841343] 657; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3 658; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm6 659; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm6 660; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm6, %ymm3 661; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 662; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 663; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 664; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3 665; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm4 666; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4 667; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 668; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 669; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 670; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 671; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 672; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 673; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 674; AVX1-NEXT: vzeroupper 675; AVX1-NEXT: retq 676; 677; AVX2-LABEL: trunc_usat_v8i64_v8i16: 678; AVX2: # %bb.0: 679; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535] 680; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 681; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm4 682; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343] 683; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4 684; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1 685; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm3 686; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3 687; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 688; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 689; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 690; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 691; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 692; AVX2-NEXT: vzeroupper 693; AVX2-NEXT: retq 694; 695; AVX512-LABEL: trunc_usat_v8i64_v8i16: 696; AVX512: # %bb.0: 697; AVX512-NEXT: vpmovusqw %zmm0, %xmm0 698; AVX512-NEXT: vzeroupper 699; AVX512-NEXT: retq 700 %1 = icmp ult <8 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535> 701 %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> 702 %3 = trunc <8 x i64> %2 to <8 x i16> 703 ret <8 x i16> %3 704} 705 706define <8 x i16> @trunc_usat_v8i32_v8i16(<8 x i32> %a0) { 707; SSE2-LABEL: trunc_usat_v8i32_v8i16: 708; SSE2: # %bb.0: 709; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 710; SSE2-NEXT: movdqa %xmm0, %xmm3 711; SSE2-NEXT: pxor %xmm2, %xmm3 712; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147549183,2147549183,2147549183,2147549183] 713; SSE2-NEXT: movdqa %xmm4, %xmm5 714; SSE2-NEXT: pcmpgtd %xmm3, %xmm5 715; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 716; SSE2-NEXT: pand %xmm5, %xmm0 717; SSE2-NEXT: pxor %xmm3, %xmm5 718; SSE2-NEXT: por %xmm5, %xmm0 719; SSE2-NEXT: pxor %xmm1, %xmm2 720; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 721; SSE2-NEXT: pxor %xmm4, %xmm3 722; SSE2-NEXT: pand %xmm1, %xmm4 723; SSE2-NEXT: por %xmm3, %xmm4 724; SSE2-NEXT: pslld $16, %xmm4 725; SSE2-NEXT: psrad $16, %xmm4 726; SSE2-NEXT: pslld $16, %xmm0 727; SSE2-NEXT: psrad $16, %xmm0 728; SSE2-NEXT: packssdw %xmm4, %xmm0 729; SSE2-NEXT: retq 730; 731; SSSE3-LABEL: trunc_usat_v8i32_v8i16: 732; SSSE3: # %bb.0: 733; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535] 734; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 735; SSSE3-NEXT: movdqa %xmm0, %xmm4 736; SSSE3-NEXT: pxor %xmm3, %xmm4 737; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183] 738; SSSE3-NEXT: movdqa %xmm5, %xmm6 739; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6 740; SSSE3-NEXT: pand %xmm6, %xmm0 741; SSSE3-NEXT: pandn %xmm2, %xmm6 742; SSSE3-NEXT: por %xmm6, %xmm0 743; SSSE3-NEXT: pxor %xmm1, %xmm3 744; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5 745; SSSE3-NEXT: pand %xmm5, %xmm1 746; SSSE3-NEXT: pandn %xmm2, %xmm5 747; SSSE3-NEXT: por %xmm1, %xmm5 748; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 749; SSSE3-NEXT: pshufb %xmm1, %xmm5 750; SSSE3-NEXT: pshufb %xmm1, %xmm0 751; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0] 752; SSSE3-NEXT: retq 753; 754; SSE41-LABEL: trunc_usat_v8i32_v8i16: 755; SSE41: # %bb.0: 756; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535] 757; SSE41-NEXT: pminud %xmm2, %xmm1 758; SSE41-NEXT: pminud %xmm2, %xmm0 759; SSE41-NEXT: packusdw %xmm1, %xmm0 760; SSE41-NEXT: retq 761; 762; AVX1-LABEL: trunc_usat_v8i32_v8i16: 763; AVX1: # %bb.0: 764; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 765; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [65535,65535,65535,65535] 766; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1 767; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0 768; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 769; AVX1-NEXT: vzeroupper 770; AVX1-NEXT: retq 771; 772; AVX2-LABEL: trunc_usat_v8i32_v8i16: 773; AVX2: # %bb.0: 774; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535] 775; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0 776; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 777; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 778; AVX2-NEXT: vzeroupper 779; AVX2-NEXT: retq 780; 781; AVX512F-LABEL: trunc_usat_v8i32_v8i16: 782; AVX512F: # %bb.0: 783; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535] 784; AVX512F-NEXT: vpminud %ymm1, %ymm0, %ymm0 785; AVX512F-NEXT: vpmovdw %zmm0, %ymm0 786; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 787; AVX512F-NEXT: vzeroupper 788; AVX512F-NEXT: retq 789; 790; AVX512VL-LABEL: trunc_usat_v8i32_v8i16: 791; AVX512VL: # %bb.0: 792; AVX512VL-NEXT: vpmovusdw %ymm0, %xmm0 793; AVX512VL-NEXT: vzeroupper 794; AVX512VL-NEXT: retq 795; 796; AVX512BW-LABEL: trunc_usat_v8i32_v8i16: 797; AVX512BW: # %bb.0: 798; AVX512BW-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535] 799; AVX512BW-NEXT: vpminud %ymm1, %ymm0, %ymm0 800; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0 801; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 802; AVX512BW-NEXT: vzeroupper 803; AVX512BW-NEXT: retq 804; 805; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i16: 806; AVX512BWVL: # %bb.0: 807; AVX512BWVL-NEXT: vpmovusdw %ymm0, %xmm0 808; AVX512BWVL-NEXT: vzeroupper 809; AVX512BWVL-NEXT: retq 810 %1 = icmp ult <8 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 811 %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> 812 %3 = trunc <8 x i32> %2 to <8 x i16> 813 ret <8 x i16> %3 814} 815 816define <16 x i16> @trunc_usat_v16i32_v16i16(<16 x i32> %a0) { 817; SSE2-LABEL: trunc_usat_v16i32_v16i16: 818; SSE2: # %bb.0: 819; SSE2-NEXT: movdqa %xmm1, %xmm8 820; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648] 821; SSE2-NEXT: movdqa %xmm2, %xmm7 822; SSE2-NEXT: pxor %xmm6, %xmm7 823; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183] 824; SSE2-NEXT: movdqa %xmm5, %xmm1 825; SSE2-NEXT: pcmpgtd %xmm7, %xmm1 826; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 827; SSE2-NEXT: pand %xmm1, %xmm2 828; SSE2-NEXT: pxor %xmm7, %xmm1 829; SSE2-NEXT: por %xmm2, %xmm1 830; SSE2-NEXT: movdqa %xmm3, %xmm4 831; SSE2-NEXT: pxor %xmm6, %xmm4 832; SSE2-NEXT: movdqa %xmm5, %xmm2 833; SSE2-NEXT: pcmpgtd %xmm4, %xmm2 834; SSE2-NEXT: pand %xmm2, %xmm3 835; SSE2-NEXT: pxor %xmm7, %xmm2 836; SSE2-NEXT: por %xmm3, %xmm2 837; SSE2-NEXT: movdqa %xmm0, %xmm3 838; SSE2-NEXT: pxor %xmm6, %xmm3 839; SSE2-NEXT: movdqa %xmm5, %xmm4 840; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 841; SSE2-NEXT: pand %xmm4, %xmm0 842; SSE2-NEXT: pxor %xmm7, %xmm4 843; SSE2-NEXT: por %xmm4, %xmm0 844; SSE2-NEXT: pxor %xmm8, %xmm6 845; SSE2-NEXT: pcmpgtd %xmm6, %xmm5 846; SSE2-NEXT: pxor %xmm5, %xmm7 847; SSE2-NEXT: pand %xmm8, %xmm5 848; SSE2-NEXT: por %xmm7, %xmm5 849; SSE2-NEXT: pslld $16, %xmm5 850; SSE2-NEXT: psrad $16, %xmm5 851; SSE2-NEXT: pslld $16, %xmm0 852; SSE2-NEXT: psrad $16, %xmm0 853; SSE2-NEXT: packssdw %xmm5, %xmm0 854; SSE2-NEXT: pslld $16, %xmm2 855; SSE2-NEXT: psrad $16, %xmm2 856; SSE2-NEXT: pslld $16, %xmm1 857; SSE2-NEXT: psrad $16, %xmm1 858; SSE2-NEXT: packssdw %xmm2, %xmm1 859; SSE2-NEXT: retq 860; 861; SSSE3-LABEL: trunc_usat_v16i32_v16i16: 862; SSSE3: # %bb.0: 863; SSSE3-NEXT: movdqa %xmm1, %xmm8 864; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648] 865; SSSE3-NEXT: movdqa %xmm2, %xmm7 866; SSSE3-NEXT: pxor %xmm6, %xmm7 867; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183] 868; SSSE3-NEXT: movdqa %xmm5, %xmm1 869; SSSE3-NEXT: pcmpgtd %xmm7, %xmm1 870; SSSE3-NEXT: pcmpeqd %xmm7, %xmm7 871; SSSE3-NEXT: pand %xmm1, %xmm2 872; SSSE3-NEXT: pxor %xmm7, %xmm1 873; SSSE3-NEXT: por %xmm2, %xmm1 874; SSSE3-NEXT: movdqa %xmm3, %xmm4 875; SSSE3-NEXT: pxor %xmm6, %xmm4 876; SSSE3-NEXT: movdqa %xmm5, %xmm2 877; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2 878; SSSE3-NEXT: pand %xmm2, %xmm3 879; SSSE3-NEXT: pxor %xmm7, %xmm2 880; SSSE3-NEXT: por %xmm3, %xmm2 881; SSSE3-NEXT: movdqa %xmm0, %xmm3 882; SSSE3-NEXT: pxor %xmm6, %xmm3 883; SSSE3-NEXT: movdqa %xmm5, %xmm4 884; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4 885; SSSE3-NEXT: pand %xmm4, %xmm0 886; SSSE3-NEXT: pxor %xmm7, %xmm4 887; SSSE3-NEXT: por %xmm4, %xmm0 888; SSSE3-NEXT: pxor %xmm8, %xmm6 889; SSSE3-NEXT: pcmpgtd %xmm6, %xmm5 890; SSSE3-NEXT: pxor %xmm5, %xmm7 891; SSSE3-NEXT: pand %xmm8, %xmm5 892; SSSE3-NEXT: por %xmm7, %xmm5 893; SSSE3-NEXT: pslld $16, %xmm5 894; SSSE3-NEXT: psrad $16, %xmm5 895; SSSE3-NEXT: pslld $16, %xmm0 896; SSSE3-NEXT: psrad $16, %xmm0 897; SSSE3-NEXT: packssdw %xmm5, %xmm0 898; SSSE3-NEXT: pslld $16, %xmm2 899; SSSE3-NEXT: psrad $16, %xmm2 900; SSSE3-NEXT: pslld $16, %xmm1 901; SSSE3-NEXT: psrad $16, %xmm1 902; SSSE3-NEXT: packssdw %xmm2, %xmm1 903; SSSE3-NEXT: retq 904; 905; SSE41-LABEL: trunc_usat_v16i32_v16i16: 906; SSE41: # %bb.0: 907; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535,65535,65535] 908; SSE41-NEXT: pminud %xmm4, %xmm3 909; SSE41-NEXT: pminud %xmm4, %xmm2 910; SSE41-NEXT: packusdw %xmm3, %xmm2 911; SSE41-NEXT: pminud %xmm4, %xmm1 912; SSE41-NEXT: pminud %xmm4, %xmm0 913; SSE41-NEXT: packusdw %xmm1, %xmm0 914; SSE41-NEXT: movdqa %xmm2, %xmm1 915; SSE41-NEXT: retq 916; 917; AVX1-LABEL: trunc_usat_v16i32_v16i16: 918; AVX1: # %bb.0: 919; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 920; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [65535,65535,65535,65535] 921; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2 922; AVX1-NEXT: vpminud %xmm3, %xmm0, %xmm0 923; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 924; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 925; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2 926; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1 927; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 928; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 929; AVX1-NEXT: retq 930; 931; AVX2-LABEL: trunc_usat_v16i32_v16i16: 932; AVX2: # %bb.0: 933; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535] 934; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1 935; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0 936; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 937; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 938; AVX2-NEXT: retq 939; 940; AVX512-LABEL: trunc_usat_v16i32_v16i16: 941; AVX512: # %bb.0: 942; AVX512-NEXT: vpmovusdw %zmm0, %ymm0 943; AVX512-NEXT: retq 944 %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> 945 %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> 946 %3 = trunc <16 x i32> %2 to <16 x i16> 947 ret <16 x i16> %3 948} 949 950; 951; Unsigned saturation truncation to v16i8 952; 953 954define <8 x i8> @trunc_usat_v8i64_v8i8(<8 x i64> %a0) { 955; SSE2-LABEL: trunc_usat_v8i64_v8i8: 956; SSE2: # %bb.0: 957; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 958; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456] 959; SSE2-NEXT: movdqa %xmm1, %xmm7 960; SSE2-NEXT: pxor %xmm5, %xmm7 961; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711] 962; SSE2-NEXT: movdqa %xmm9, %xmm6 963; SSE2-NEXT: pcmpgtd %xmm7, %xmm6 964; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2] 965; SSE2-NEXT: pcmpeqd %xmm9, %xmm7 966; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] 967; SSE2-NEXT: pand %xmm4, %xmm7 968; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3] 969; SSE2-NEXT: por %xmm7, %xmm4 970; SSE2-NEXT: pand %xmm4, %xmm1 971; SSE2-NEXT: pandn %xmm8, %xmm4 972; SSE2-NEXT: por %xmm1, %xmm4 973; SSE2-NEXT: movdqa %xmm0, %xmm1 974; SSE2-NEXT: pxor %xmm5, %xmm1 975; SSE2-NEXT: movdqa %xmm9, %xmm6 976; SSE2-NEXT: pcmpgtd %xmm1, %xmm6 977; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 978; SSE2-NEXT: pcmpeqd %xmm9, %xmm1 979; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 980; SSE2-NEXT: pand %xmm7, %xmm1 981; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 982; SSE2-NEXT: por %xmm1, %xmm6 983; SSE2-NEXT: pand %xmm6, %xmm0 984; SSE2-NEXT: pandn %xmm8, %xmm6 985; SSE2-NEXT: por %xmm6, %xmm0 986; SSE2-NEXT: packuswb %xmm4, %xmm0 987; SSE2-NEXT: movdqa %xmm3, %xmm1 988; SSE2-NEXT: pxor %xmm5, %xmm1 989; SSE2-NEXT: movdqa %xmm9, %xmm4 990; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 991; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 992; SSE2-NEXT: pcmpeqd %xmm9, %xmm1 993; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 994; SSE2-NEXT: pand %xmm6, %xmm1 995; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 996; SSE2-NEXT: por %xmm1, %xmm4 997; SSE2-NEXT: pand %xmm4, %xmm3 998; SSE2-NEXT: pandn %xmm8, %xmm4 999; SSE2-NEXT: por %xmm3, %xmm4 1000; SSE2-NEXT: pxor %xmm2, %xmm5 1001; SSE2-NEXT: movdqa %xmm9, %xmm1 1002; SSE2-NEXT: pcmpgtd %xmm5, %xmm1 1003; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2] 1004; SSE2-NEXT: pcmpeqd %xmm9, %xmm5 1005; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1006; SSE2-NEXT: pand %xmm3, %xmm5 1007; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1008; SSE2-NEXT: por %xmm5, %xmm1 1009; SSE2-NEXT: pand %xmm1, %xmm2 1010; SSE2-NEXT: pandn %xmm8, %xmm1 1011; SSE2-NEXT: por %xmm2, %xmm1 1012; SSE2-NEXT: packuswb %xmm4, %xmm1 1013; SSE2-NEXT: packuswb %xmm1, %xmm0 1014; SSE2-NEXT: retq 1015; 1016; SSSE3-LABEL: trunc_usat_v8i64_v8i8: 1017; SSSE3: # %bb.0: 1018; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 1019; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456] 1020; SSSE3-NEXT: movdqa %xmm1, %xmm7 1021; SSSE3-NEXT: pxor %xmm5, %xmm7 1022; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711] 1023; SSSE3-NEXT: movdqa %xmm9, %xmm6 1024; SSSE3-NEXT: pcmpgtd %xmm7, %xmm6 1025; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2] 1026; SSSE3-NEXT: pcmpeqd %xmm9, %xmm7 1027; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] 1028; SSSE3-NEXT: pand %xmm4, %xmm7 1029; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3] 1030; SSSE3-NEXT: por %xmm7, %xmm4 1031; SSSE3-NEXT: pand %xmm4, %xmm1 1032; SSSE3-NEXT: pandn %xmm8, %xmm4 1033; SSSE3-NEXT: por %xmm1, %xmm4 1034; SSSE3-NEXT: movdqa %xmm0, %xmm1 1035; SSSE3-NEXT: pxor %xmm5, %xmm1 1036; SSSE3-NEXT: movdqa %xmm9, %xmm6 1037; SSSE3-NEXT: pcmpgtd %xmm1, %xmm6 1038; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 1039; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1 1040; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1041; SSSE3-NEXT: pand %xmm7, %xmm1 1042; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 1043; SSSE3-NEXT: por %xmm1, %xmm6 1044; SSSE3-NEXT: pand %xmm6, %xmm0 1045; SSSE3-NEXT: pandn %xmm8, %xmm6 1046; SSSE3-NEXT: por %xmm6, %xmm0 1047; SSSE3-NEXT: packuswb %xmm4, %xmm0 1048; SSSE3-NEXT: movdqa %xmm3, %xmm1 1049; SSSE3-NEXT: pxor %xmm5, %xmm1 1050; SSSE3-NEXT: movdqa %xmm9, %xmm4 1051; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 1052; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 1053; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1 1054; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1055; SSSE3-NEXT: pand %xmm6, %xmm1 1056; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1057; SSSE3-NEXT: por %xmm1, %xmm4 1058; SSSE3-NEXT: pand %xmm4, %xmm3 1059; SSSE3-NEXT: pandn %xmm8, %xmm4 1060; SSSE3-NEXT: por %xmm3, %xmm4 1061; SSSE3-NEXT: pxor %xmm2, %xmm5 1062; SSSE3-NEXT: movdqa %xmm9, %xmm1 1063; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1 1064; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2] 1065; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5 1066; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1067; SSSE3-NEXT: pand %xmm3, %xmm5 1068; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1069; SSSE3-NEXT: por %xmm5, %xmm1 1070; SSSE3-NEXT: pand %xmm1, %xmm2 1071; SSSE3-NEXT: pandn %xmm8, %xmm1 1072; SSSE3-NEXT: por %xmm2, %xmm1 1073; SSSE3-NEXT: packuswb %xmm4, %xmm1 1074; SSSE3-NEXT: packuswb %xmm1, %xmm0 1075; SSSE3-NEXT: retq 1076; 1077; SSE41-LABEL: trunc_usat_v8i64_v8i8: 1078; SSE41: # %bb.0: 1079; SSE41-NEXT: movdqa %xmm0, %xmm8 1080; SSE41-NEXT: movapd {{.*#+}} xmm5 = [255,255] 1081; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456] 1082; SSE41-NEXT: movdqa %xmm1, %xmm0 1083; SSE41-NEXT: pxor %xmm6, %xmm0 1084; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711] 1085; SSE41-NEXT: movdqa %xmm9, %xmm7 1086; SSE41-NEXT: pcmpgtd %xmm0, %xmm7 1087; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2] 1088; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 1089; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1090; SSE41-NEXT: pand %xmm4, %xmm0 1091; SSE41-NEXT: por %xmm7, %xmm0 1092; SSE41-NEXT: movapd %xmm5, %xmm4 1093; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4 1094; SSE41-NEXT: movdqa %xmm8, %xmm0 1095; SSE41-NEXT: pxor %xmm6, %xmm0 1096; SSE41-NEXT: movdqa %xmm9, %xmm1 1097; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 1098; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2] 1099; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 1100; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1101; SSE41-NEXT: pand %xmm7, %xmm0 1102; SSE41-NEXT: por %xmm1, %xmm0 1103; SSE41-NEXT: movapd %xmm5, %xmm1 1104; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1 1105; SSE41-NEXT: packusdw %xmm4, %xmm1 1106; SSE41-NEXT: movdqa %xmm3, %xmm0 1107; SSE41-NEXT: pxor %xmm6, %xmm0 1108; SSE41-NEXT: movdqa %xmm9, %xmm4 1109; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 1110; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2] 1111; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 1112; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1113; SSE41-NEXT: pand %xmm7, %xmm0 1114; SSE41-NEXT: por %xmm4, %xmm0 1115; SSE41-NEXT: movapd %xmm5, %xmm4 1116; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm4 1117; SSE41-NEXT: pxor %xmm2, %xmm6 1118; SSE41-NEXT: movdqa %xmm9, %xmm3 1119; SSE41-NEXT: pcmpgtd %xmm6, %xmm3 1120; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2] 1121; SSE41-NEXT: pcmpeqd %xmm9, %xmm6 1122; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 1123; SSE41-NEXT: pand %xmm7, %xmm0 1124; SSE41-NEXT: por %xmm3, %xmm0 1125; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5 1126; SSE41-NEXT: packusdw %xmm4, %xmm5 1127; SSE41-NEXT: packusdw %xmm5, %xmm1 1128; SSE41-NEXT: movdqa %xmm1, %xmm0 1129; SSE41-NEXT: retq 1130; 1131; AVX1-LABEL: trunc_usat_v8i64_v8i8: 1132; AVX1: # %bb.0: 1133; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [255,255,255,255] 1134; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1135; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808] 1136; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 1137; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372036854776063,9223372036854776063] 1138; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3 1139; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm6 1140; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm6 1141; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm6, %ymm3 1142; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 1143; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1144; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 1145; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3 1146; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm4 1147; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4 1148; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 1149; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 1150; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1151; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 1152; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1153; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 1154; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1155; AVX1-NEXT: vzeroupper 1156; AVX1-NEXT: retq 1157; 1158; AVX2-LABEL: trunc_usat_v8i64_v8i8: 1159; AVX2: # %bb.0: 1160; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255] 1161; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1162; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm4 1163; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063] 1164; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4 1165; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1 1166; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm3 1167; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3 1168; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 1169; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 1170; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 1171; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1172; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1173; AVX2-NEXT: vzeroupper 1174; AVX2-NEXT: retq 1175; 1176; AVX512-LABEL: trunc_usat_v8i64_v8i8: 1177; AVX512: # %bb.0: 1178; AVX512-NEXT: vpminuq {{.*}}(%rip){1to8}, %zmm0, %zmm0 1179; AVX512-NEXT: vpmovqw %zmm0, %xmm0 1180; AVX512-NEXT: vzeroupper 1181; AVX512-NEXT: retq 1182 %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 1183 %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> 1184 %3 = trunc <8 x i64> %2 to <8 x i8> 1185 ret <8 x i8> %3 1186} 1187 1188define void @trunc_usat_v8i64_v8i8_store(<8 x i64> %a0, <8 x i8> *%p1) { 1189; SSE2-LABEL: trunc_usat_v8i64_v8i8_store: 1190; SSE2: # %bb.0: 1191; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 1192; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456] 1193; SSE2-NEXT: movdqa %xmm0, %xmm5 1194; SSE2-NEXT: pxor %xmm6, %xmm5 1195; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711] 1196; SSE2-NEXT: movdqa %xmm9, %xmm7 1197; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 1198; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2] 1199; SSE2-NEXT: pcmpeqd %xmm9, %xmm5 1200; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 1201; SSE2-NEXT: pand %xmm10, %xmm4 1202; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] 1203; SSE2-NEXT: por %xmm4, %xmm5 1204; SSE2-NEXT: pand %xmm5, %xmm0 1205; SSE2-NEXT: pandn %xmm8, %xmm5 1206; SSE2-NEXT: por %xmm0, %xmm5 1207; SSE2-NEXT: movdqa %xmm1, %xmm0 1208; SSE2-NEXT: pxor %xmm6, %xmm0 1209; SSE2-NEXT: movdqa %xmm9, %xmm4 1210; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 1211; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2] 1212; SSE2-NEXT: pcmpeqd %xmm9, %xmm0 1213; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 1214; SSE2-NEXT: pand %xmm10, %xmm7 1215; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1216; SSE2-NEXT: por %xmm7, %xmm0 1217; SSE2-NEXT: pand %xmm0, %xmm1 1218; SSE2-NEXT: pandn %xmm8, %xmm0 1219; SSE2-NEXT: por %xmm1, %xmm0 1220; SSE2-NEXT: movdqa %xmm2, %xmm1 1221; SSE2-NEXT: pxor %xmm6, %xmm1 1222; SSE2-NEXT: movdqa %xmm9, %xmm4 1223; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 1224; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2] 1225; SSE2-NEXT: pcmpeqd %xmm9, %xmm1 1226; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3] 1227; SSE2-NEXT: pand %xmm10, %xmm7 1228; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3] 1229; SSE2-NEXT: por %xmm7, %xmm1 1230; SSE2-NEXT: pand %xmm1, %xmm2 1231; SSE2-NEXT: pandn %xmm8, %xmm1 1232; SSE2-NEXT: por %xmm2, %xmm1 1233; SSE2-NEXT: pxor %xmm3, %xmm6 1234; SSE2-NEXT: movdqa %xmm9, %xmm2 1235; SSE2-NEXT: pcmpgtd %xmm6, %xmm2 1236; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1237; SSE2-NEXT: pcmpeqd %xmm9, %xmm6 1238; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 1239; SSE2-NEXT: pand %xmm4, %xmm6 1240; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1241; SSE2-NEXT: por %xmm6, %xmm2 1242; SSE2-NEXT: pand %xmm2, %xmm3 1243; SSE2-NEXT: pandn %xmm8, %xmm2 1244; SSE2-NEXT: por %xmm3, %xmm2 1245; SSE2-NEXT: pand %xmm8, %xmm2 1246; SSE2-NEXT: pand %xmm8, %xmm1 1247; SSE2-NEXT: packuswb %xmm2, %xmm1 1248; SSE2-NEXT: pand %xmm8, %xmm0 1249; SSE2-NEXT: pand %xmm8, %xmm5 1250; SSE2-NEXT: packuswb %xmm0, %xmm5 1251; SSE2-NEXT: packuswb %xmm1, %xmm5 1252; SSE2-NEXT: packuswb %xmm5, %xmm5 1253; SSE2-NEXT: movq %xmm5, (%rdi) 1254; SSE2-NEXT: retq 1255; 1256; SSSE3-LABEL: trunc_usat_v8i64_v8i8_store: 1257; SSSE3: # %bb.0: 1258; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 1259; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456] 1260; SSSE3-NEXT: movdqa %xmm0, %xmm5 1261; SSSE3-NEXT: pxor %xmm6, %xmm5 1262; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711] 1263; SSSE3-NEXT: movdqa %xmm9, %xmm7 1264; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7 1265; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2] 1266; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5 1267; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 1268; SSSE3-NEXT: pand %xmm10, %xmm4 1269; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] 1270; SSSE3-NEXT: por %xmm4, %xmm5 1271; SSSE3-NEXT: pand %xmm5, %xmm0 1272; SSSE3-NEXT: pandn %xmm8, %xmm5 1273; SSSE3-NEXT: por %xmm0, %xmm5 1274; SSSE3-NEXT: movdqa %xmm1, %xmm0 1275; SSSE3-NEXT: pxor %xmm6, %xmm0 1276; SSSE3-NEXT: movdqa %xmm9, %xmm4 1277; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4 1278; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2] 1279; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0 1280; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 1281; SSSE3-NEXT: pand %xmm10, %xmm7 1282; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1283; SSSE3-NEXT: por %xmm7, %xmm0 1284; SSSE3-NEXT: pand %xmm0, %xmm1 1285; SSSE3-NEXT: pandn %xmm8, %xmm0 1286; SSSE3-NEXT: por %xmm1, %xmm0 1287; SSSE3-NEXT: movdqa %xmm2, %xmm1 1288; SSSE3-NEXT: pxor %xmm6, %xmm1 1289; SSSE3-NEXT: movdqa %xmm9, %xmm4 1290; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 1291; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2] 1292; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1 1293; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3] 1294; SSSE3-NEXT: pand %xmm10, %xmm7 1295; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3] 1296; SSSE3-NEXT: por %xmm7, %xmm1 1297; SSSE3-NEXT: pand %xmm1, %xmm2 1298; SSSE3-NEXT: pandn %xmm8, %xmm1 1299; SSSE3-NEXT: por %xmm2, %xmm1 1300; SSSE3-NEXT: pxor %xmm3, %xmm6 1301; SSSE3-NEXT: movdqa %xmm9, %xmm2 1302; SSSE3-NEXT: pcmpgtd %xmm6, %xmm2 1303; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1304; SSSE3-NEXT: pcmpeqd %xmm9, %xmm6 1305; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 1306; SSSE3-NEXT: pand %xmm4, %xmm6 1307; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1308; SSSE3-NEXT: por %xmm6, %xmm2 1309; SSSE3-NEXT: pand %xmm2, %xmm3 1310; SSSE3-NEXT: pandn %xmm8, %xmm2 1311; SSSE3-NEXT: por %xmm3, %xmm2 1312; SSSE3-NEXT: pand %xmm8, %xmm2 1313; SSSE3-NEXT: pand %xmm8, %xmm1 1314; SSSE3-NEXT: packuswb %xmm2, %xmm1 1315; SSSE3-NEXT: pand %xmm8, %xmm0 1316; SSSE3-NEXT: pand %xmm8, %xmm5 1317; SSSE3-NEXT: packuswb %xmm0, %xmm5 1318; SSSE3-NEXT: packuswb %xmm1, %xmm5 1319; SSSE3-NEXT: packuswb %xmm5, %xmm5 1320; SSSE3-NEXT: movq %xmm5, (%rdi) 1321; SSSE3-NEXT: retq 1322; 1323; SSE41-LABEL: trunc_usat_v8i64_v8i8_store: 1324; SSE41: # %bb.0: 1325; SSE41-NEXT: movdqa %xmm0, %xmm4 1326; SSE41-NEXT: movapd {{.*#+}} xmm8 = [255,255] 1327; SSE41-NEXT: movdqa {{.*#+}} xmm7 = [9223372039002259456,9223372039002259456] 1328; SSE41-NEXT: pxor %xmm7, %xmm0 1329; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711] 1330; SSE41-NEXT: movdqa %xmm9, %xmm6 1331; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 1332; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm6[0,0,2,2] 1333; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 1334; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1335; SSE41-NEXT: pand %xmm5, %xmm0 1336; SSE41-NEXT: por %xmm6, %xmm0 1337; SSE41-NEXT: movapd %xmm8, %xmm6 1338; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm6 1339; SSE41-NEXT: movdqa %xmm1, %xmm0 1340; SSE41-NEXT: pxor %xmm7, %xmm0 1341; SSE41-NEXT: movdqa %xmm9, %xmm4 1342; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 1343; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1344; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 1345; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1346; SSE41-NEXT: pand %xmm5, %xmm0 1347; SSE41-NEXT: por %xmm4, %xmm0 1348; SSE41-NEXT: movapd %xmm8, %xmm4 1349; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4 1350; SSE41-NEXT: movdqa %xmm2, %xmm0 1351; SSE41-NEXT: pxor %xmm7, %xmm0 1352; SSE41-NEXT: movdqa %xmm9, %xmm1 1353; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 1354; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] 1355; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 1356; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1357; SSE41-NEXT: pand %xmm5, %xmm0 1358; SSE41-NEXT: por %xmm1, %xmm0 1359; SSE41-NEXT: movapd %xmm8, %xmm1 1360; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 1361; SSE41-NEXT: pxor %xmm3, %xmm7 1362; SSE41-NEXT: movdqa %xmm9, %xmm2 1363; SSE41-NEXT: pcmpgtd %xmm7, %xmm2 1364; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2] 1365; SSE41-NEXT: pcmpeqd %xmm9, %xmm7 1366; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3] 1367; SSE41-NEXT: pand %xmm5, %xmm0 1368; SSE41-NEXT: por %xmm2, %xmm0 1369; SSE41-NEXT: movapd %xmm8, %xmm2 1370; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2 1371; SSE41-NEXT: andpd %xmm8, %xmm2 1372; SSE41-NEXT: andpd %xmm8, %xmm1 1373; SSE41-NEXT: packusdw %xmm2, %xmm1 1374; SSE41-NEXT: andpd %xmm8, %xmm4 1375; SSE41-NEXT: andpd %xmm8, %xmm6 1376; SSE41-NEXT: packusdw %xmm4, %xmm6 1377; SSE41-NEXT: packusdw %xmm1, %xmm6 1378; SSE41-NEXT: packuswb %xmm6, %xmm6 1379; SSE41-NEXT: movq %xmm6, (%rdi) 1380; SSE41-NEXT: retq 1381; 1382; AVX1-LABEL: trunc_usat_v8i64_v8i8_store: 1383; AVX1: # %bb.0: 1384; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [255,255,255,255] 1385; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1386; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808] 1387; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 1388; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372036854776063,9223372036854776063] 1389; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3 1390; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm6 1391; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm6 1392; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm6, %ymm3 1393; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 1394; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1395; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 1396; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3 1397; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm4 1398; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4 1399; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 1400; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 1401; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1402; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [1.2598673968951787E-321,1.2598673968951787E-321] 1403; AVX1-NEXT: # xmm3 = mem[0,0] 1404; AVX1-NEXT: vandpd %xmm3, %xmm2, %xmm2 1405; AVX1-NEXT: vandpd %xmm3, %xmm1, %xmm1 1406; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 1407; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1408; AVX1-NEXT: vandpd %xmm3, %xmm2, %xmm2 1409; AVX1-NEXT: vandpd %xmm3, %xmm0, %xmm0 1410; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 1411; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1412; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 1413; AVX1-NEXT: vmovq %xmm0, (%rdi) 1414; AVX1-NEXT: vzeroupper 1415; AVX1-NEXT: retq 1416; 1417; AVX2-LABEL: trunc_usat_v8i64_v8i8_store: 1418; AVX2: # %bb.0: 1419; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255] 1420; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1421; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm4 1422; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063] 1423; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4 1424; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm2, %ymm0 1425; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm3 1426; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3 1427; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 1428; AVX2-NEXT: vextractf128 $1, %ymm1, %xmm2 1429; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 1430; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 1431; AVX2-NEXT: vpshufb %xmm2, %xmm1, %xmm1 1432; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm3 1433; AVX2-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 1434; AVX2-NEXT: vpshufb %xmm2, %xmm0, %xmm0 1435; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1436; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 1437; AVX2-NEXT: vmovq %xmm0, (%rdi) 1438; AVX2-NEXT: vzeroupper 1439; AVX2-NEXT: retq 1440; 1441; AVX512-LABEL: trunc_usat_v8i64_v8i8_store: 1442; AVX512: # %bb.0: 1443; AVX512-NEXT: vpmovusqb %zmm0, (%rdi) 1444; AVX512-NEXT: vzeroupper 1445; AVX512-NEXT: retq 1446 %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 1447 %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> 1448 %3 = trunc <8 x i64> %2 to <8 x i8> 1449 store <8 x i8> %3, <8 x i8> *%p1 1450 ret void 1451} 1452 1453define <16 x i8> @trunc_usat_v16i64_v16i8(<16 x i64> %a0) { 1454; SSE2-LABEL: trunc_usat_v16i64_v16i8: 1455; SSE2: # %bb.0: 1456; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 1457; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456] 1458; SSE2-NEXT: movdqa %xmm1, %xmm11 1459; SSE2-NEXT: pxor %xmm9, %xmm11 1460; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711] 1461; SSE2-NEXT: movdqa %xmm10, %xmm12 1462; SSE2-NEXT: pcmpgtd %xmm11, %xmm12 1463; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2] 1464; SSE2-NEXT: pcmpeqd %xmm10, %xmm11 1465; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3] 1466; SSE2-NEXT: pand %xmm13, %xmm11 1467; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3] 1468; SSE2-NEXT: por %xmm11, %xmm12 1469; SSE2-NEXT: pand %xmm12, %xmm1 1470; SSE2-NEXT: pandn %xmm8, %xmm12 1471; SSE2-NEXT: por %xmm1, %xmm12 1472; SSE2-NEXT: movdqa %xmm0, %xmm1 1473; SSE2-NEXT: pxor %xmm9, %xmm1 1474; SSE2-NEXT: movdqa %xmm10, %xmm11 1475; SSE2-NEXT: pcmpgtd %xmm1, %xmm11 1476; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm11[0,0,2,2] 1477; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 1478; SSE2-NEXT: pshufd {{.*#+}} xmm14 = xmm1[1,1,3,3] 1479; SSE2-NEXT: pand %xmm13, %xmm14 1480; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3] 1481; SSE2-NEXT: por %xmm14, %xmm1 1482; SSE2-NEXT: pand %xmm1, %xmm0 1483; SSE2-NEXT: pandn %xmm8, %xmm1 1484; SSE2-NEXT: por %xmm1, %xmm0 1485; SSE2-NEXT: packuswb %xmm12, %xmm0 1486; SSE2-NEXT: movdqa %xmm3, %xmm1 1487; SSE2-NEXT: pxor %xmm9, %xmm1 1488; SSE2-NEXT: movdqa %xmm10, %xmm11 1489; SSE2-NEXT: pcmpgtd %xmm1, %xmm11 1490; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2] 1491; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 1492; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm1[1,1,3,3] 1493; SSE2-NEXT: pand %xmm12, %xmm13 1494; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3] 1495; SSE2-NEXT: por %xmm13, %xmm1 1496; SSE2-NEXT: pand %xmm1, %xmm3 1497; SSE2-NEXT: pandn %xmm8, %xmm1 1498; SSE2-NEXT: por %xmm3, %xmm1 1499; SSE2-NEXT: movdqa %xmm2, %xmm3 1500; SSE2-NEXT: pxor %xmm9, %xmm3 1501; SSE2-NEXT: movdqa %xmm10, %xmm11 1502; SSE2-NEXT: pcmpgtd %xmm3, %xmm11 1503; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2] 1504; SSE2-NEXT: pcmpeqd %xmm10, %xmm3 1505; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3] 1506; SSE2-NEXT: pand %xmm12, %xmm13 1507; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm11[1,1,3,3] 1508; SSE2-NEXT: por %xmm13, %xmm3 1509; SSE2-NEXT: pand %xmm3, %xmm2 1510; SSE2-NEXT: pandn %xmm8, %xmm3 1511; SSE2-NEXT: por %xmm2, %xmm3 1512; SSE2-NEXT: packuswb %xmm1, %xmm3 1513; SSE2-NEXT: packuswb %xmm3, %xmm0 1514; SSE2-NEXT: movdqa %xmm5, %xmm1 1515; SSE2-NEXT: pxor %xmm9, %xmm1 1516; SSE2-NEXT: movdqa %xmm10, %xmm2 1517; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 1518; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 1519; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 1520; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1521; SSE2-NEXT: pand %xmm3, %xmm1 1522; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1523; SSE2-NEXT: por %xmm1, %xmm2 1524; SSE2-NEXT: pand %xmm2, %xmm5 1525; SSE2-NEXT: pandn %xmm8, %xmm2 1526; SSE2-NEXT: por %xmm5, %xmm2 1527; SSE2-NEXT: movdqa %xmm4, %xmm1 1528; SSE2-NEXT: pxor %xmm9, %xmm1 1529; SSE2-NEXT: movdqa %xmm10, %xmm3 1530; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 1531; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm3[0,0,2,2] 1532; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 1533; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 1534; SSE2-NEXT: pand %xmm11, %xmm5 1535; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3] 1536; SSE2-NEXT: por %xmm5, %xmm1 1537; SSE2-NEXT: pand %xmm1, %xmm4 1538; SSE2-NEXT: pandn %xmm8, %xmm1 1539; SSE2-NEXT: por %xmm4, %xmm1 1540; SSE2-NEXT: packuswb %xmm2, %xmm1 1541; SSE2-NEXT: movdqa %xmm7, %xmm2 1542; SSE2-NEXT: pxor %xmm9, %xmm2 1543; SSE2-NEXT: movdqa %xmm10, %xmm3 1544; SSE2-NEXT: pcmpgtd %xmm2, %xmm3 1545; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 1546; SSE2-NEXT: pcmpeqd %xmm10, %xmm2 1547; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1548; SSE2-NEXT: pand %xmm4, %xmm2 1549; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 1550; SSE2-NEXT: por %xmm2, %xmm3 1551; SSE2-NEXT: pand %xmm3, %xmm7 1552; SSE2-NEXT: pandn %xmm8, %xmm3 1553; SSE2-NEXT: por %xmm7, %xmm3 1554; SSE2-NEXT: pxor %xmm6, %xmm9 1555; SSE2-NEXT: movdqa %xmm10, %xmm2 1556; SSE2-NEXT: pcmpgtd %xmm9, %xmm2 1557; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1558; SSE2-NEXT: pcmpeqd %xmm10, %xmm9 1559; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3] 1560; SSE2-NEXT: pand %xmm4, %xmm5 1561; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1562; SSE2-NEXT: por %xmm5, %xmm2 1563; SSE2-NEXT: pand %xmm2, %xmm6 1564; SSE2-NEXT: pandn %xmm8, %xmm2 1565; SSE2-NEXT: por %xmm6, %xmm2 1566; SSE2-NEXT: packuswb %xmm3, %xmm2 1567; SSE2-NEXT: packuswb %xmm2, %xmm1 1568; SSE2-NEXT: packuswb %xmm1, %xmm0 1569; SSE2-NEXT: retq 1570; 1571; SSSE3-LABEL: trunc_usat_v16i64_v16i8: 1572; SSSE3: # %bb.0: 1573; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 1574; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456] 1575; SSSE3-NEXT: movdqa %xmm1, %xmm11 1576; SSSE3-NEXT: pxor %xmm9, %xmm11 1577; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711] 1578; SSSE3-NEXT: movdqa %xmm10, %xmm12 1579; SSSE3-NEXT: pcmpgtd %xmm11, %xmm12 1580; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2] 1581; SSSE3-NEXT: pcmpeqd %xmm10, %xmm11 1582; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3] 1583; SSSE3-NEXT: pand %xmm13, %xmm11 1584; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3] 1585; SSSE3-NEXT: por %xmm11, %xmm12 1586; SSSE3-NEXT: pand %xmm12, %xmm1 1587; SSSE3-NEXT: pandn %xmm8, %xmm12 1588; SSSE3-NEXT: por %xmm1, %xmm12 1589; SSSE3-NEXT: movdqa %xmm0, %xmm1 1590; SSSE3-NEXT: pxor %xmm9, %xmm1 1591; SSSE3-NEXT: movdqa %xmm10, %xmm11 1592; SSSE3-NEXT: pcmpgtd %xmm1, %xmm11 1593; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm11[0,0,2,2] 1594; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1 1595; SSSE3-NEXT: pshufd {{.*#+}} xmm14 = xmm1[1,1,3,3] 1596; SSSE3-NEXT: pand %xmm13, %xmm14 1597; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3] 1598; SSSE3-NEXT: por %xmm14, %xmm1 1599; SSSE3-NEXT: pand %xmm1, %xmm0 1600; SSSE3-NEXT: pandn %xmm8, %xmm1 1601; SSSE3-NEXT: por %xmm1, %xmm0 1602; SSSE3-NEXT: packuswb %xmm12, %xmm0 1603; SSSE3-NEXT: movdqa %xmm3, %xmm1 1604; SSSE3-NEXT: pxor %xmm9, %xmm1 1605; SSSE3-NEXT: movdqa %xmm10, %xmm11 1606; SSSE3-NEXT: pcmpgtd %xmm1, %xmm11 1607; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2] 1608; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1 1609; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm1[1,1,3,3] 1610; SSSE3-NEXT: pand %xmm12, %xmm13 1611; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3] 1612; SSSE3-NEXT: por %xmm13, %xmm1 1613; SSSE3-NEXT: pand %xmm1, %xmm3 1614; SSSE3-NEXT: pandn %xmm8, %xmm1 1615; SSSE3-NEXT: por %xmm3, %xmm1 1616; SSSE3-NEXT: movdqa %xmm2, %xmm3 1617; SSSE3-NEXT: pxor %xmm9, %xmm3 1618; SSSE3-NEXT: movdqa %xmm10, %xmm11 1619; SSSE3-NEXT: pcmpgtd %xmm3, %xmm11 1620; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2] 1621; SSSE3-NEXT: pcmpeqd %xmm10, %xmm3 1622; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3] 1623; SSSE3-NEXT: pand %xmm12, %xmm13 1624; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm11[1,1,3,3] 1625; SSSE3-NEXT: por %xmm13, %xmm3 1626; SSSE3-NEXT: pand %xmm3, %xmm2 1627; SSSE3-NEXT: pandn %xmm8, %xmm3 1628; SSSE3-NEXT: por %xmm2, %xmm3 1629; SSSE3-NEXT: packuswb %xmm1, %xmm3 1630; SSSE3-NEXT: packuswb %xmm3, %xmm0 1631; SSSE3-NEXT: movdqa %xmm5, %xmm1 1632; SSSE3-NEXT: pxor %xmm9, %xmm1 1633; SSSE3-NEXT: movdqa %xmm10, %xmm2 1634; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 1635; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 1636; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1 1637; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1638; SSSE3-NEXT: pand %xmm3, %xmm1 1639; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1640; SSSE3-NEXT: por %xmm1, %xmm2 1641; SSSE3-NEXT: pand %xmm2, %xmm5 1642; SSSE3-NEXT: pandn %xmm8, %xmm2 1643; SSSE3-NEXT: por %xmm5, %xmm2 1644; SSSE3-NEXT: movdqa %xmm4, %xmm1 1645; SSSE3-NEXT: pxor %xmm9, %xmm1 1646; SSSE3-NEXT: movdqa %xmm10, %xmm3 1647; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3 1648; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm3[0,0,2,2] 1649; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1 1650; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 1651; SSSE3-NEXT: pand %xmm11, %xmm5 1652; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3] 1653; SSSE3-NEXT: por %xmm5, %xmm1 1654; SSSE3-NEXT: pand %xmm1, %xmm4 1655; SSSE3-NEXT: pandn %xmm8, %xmm1 1656; SSSE3-NEXT: por %xmm4, %xmm1 1657; SSSE3-NEXT: packuswb %xmm2, %xmm1 1658; SSSE3-NEXT: movdqa %xmm7, %xmm2 1659; SSSE3-NEXT: pxor %xmm9, %xmm2 1660; SSSE3-NEXT: movdqa %xmm10, %xmm3 1661; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3 1662; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 1663; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2 1664; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1665; SSSE3-NEXT: pand %xmm4, %xmm2 1666; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 1667; SSSE3-NEXT: por %xmm2, %xmm3 1668; SSSE3-NEXT: pand %xmm3, %xmm7 1669; SSSE3-NEXT: pandn %xmm8, %xmm3 1670; SSSE3-NEXT: por %xmm7, %xmm3 1671; SSSE3-NEXT: pxor %xmm6, %xmm9 1672; SSSE3-NEXT: movdqa %xmm10, %xmm2 1673; SSSE3-NEXT: pcmpgtd %xmm9, %xmm2 1674; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1675; SSSE3-NEXT: pcmpeqd %xmm10, %xmm9 1676; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3] 1677; SSSE3-NEXT: pand %xmm4, %xmm5 1678; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1679; SSSE3-NEXT: por %xmm5, %xmm2 1680; SSSE3-NEXT: pand %xmm2, %xmm6 1681; SSSE3-NEXT: pandn %xmm8, %xmm2 1682; SSSE3-NEXT: por %xmm6, %xmm2 1683; SSSE3-NEXT: packuswb %xmm3, %xmm2 1684; SSSE3-NEXT: packuswb %xmm2, %xmm1 1685; SSSE3-NEXT: packuswb %xmm1, %xmm0 1686; SSSE3-NEXT: retq 1687; 1688; SSE41-LABEL: trunc_usat_v16i64_v16i8: 1689; SSE41: # %bb.0: 1690; SSE41-NEXT: movdqa %xmm0, %xmm8 1691; SSE41-NEXT: movapd {{.*#+}} xmm9 = [255,255] 1692; SSE41-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259456,9223372039002259456] 1693; SSE41-NEXT: movdqa %xmm1, %xmm0 1694; SSE41-NEXT: pxor %xmm10, %xmm0 1695; SSE41-NEXT: movdqa {{.*#+}} xmm11 = [9223372039002259711,9223372039002259711] 1696; SSE41-NEXT: movdqa %xmm11, %xmm12 1697; SSE41-NEXT: pcmpgtd %xmm0, %xmm12 1698; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2] 1699; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 1700; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1701; SSE41-NEXT: pand %xmm13, %xmm0 1702; SSE41-NEXT: por %xmm12, %xmm0 1703; SSE41-NEXT: movapd %xmm9, %xmm12 1704; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm12 1705; SSE41-NEXT: movdqa %xmm8, %xmm0 1706; SSE41-NEXT: pxor %xmm10, %xmm0 1707; SSE41-NEXT: movdqa %xmm11, %xmm1 1708; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 1709; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm1[0,0,2,2] 1710; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 1711; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1712; SSE41-NEXT: pand %xmm13, %xmm0 1713; SSE41-NEXT: por %xmm1, %xmm0 1714; SSE41-NEXT: movapd %xmm9, %xmm13 1715; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm13 1716; SSE41-NEXT: packusdw %xmm12, %xmm13 1717; SSE41-NEXT: movdqa %xmm3, %xmm0 1718; SSE41-NEXT: pxor %xmm10, %xmm0 1719; SSE41-NEXT: movdqa %xmm11, %xmm1 1720; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 1721; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm1[0,0,2,2] 1722; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 1723; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1724; SSE41-NEXT: pand %xmm8, %xmm0 1725; SSE41-NEXT: por %xmm1, %xmm0 1726; SSE41-NEXT: movapd %xmm9, %xmm1 1727; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1 1728; SSE41-NEXT: movdqa %xmm2, %xmm0 1729; SSE41-NEXT: pxor %xmm10, %xmm0 1730; SSE41-NEXT: movdqa %xmm11, %xmm3 1731; SSE41-NEXT: pcmpgtd %xmm0, %xmm3 1732; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2] 1733; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 1734; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1735; SSE41-NEXT: pand %xmm8, %xmm0 1736; SSE41-NEXT: por %xmm3, %xmm0 1737; SSE41-NEXT: movapd %xmm9, %xmm3 1738; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3 1739; SSE41-NEXT: packusdw %xmm1, %xmm3 1740; SSE41-NEXT: packusdw %xmm3, %xmm13 1741; SSE41-NEXT: movdqa %xmm5, %xmm0 1742; SSE41-NEXT: pxor %xmm10, %xmm0 1743; SSE41-NEXT: movdqa %xmm11, %xmm1 1744; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 1745; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2] 1746; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 1747; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1748; SSE41-NEXT: pand %xmm2, %xmm0 1749; SSE41-NEXT: por %xmm1, %xmm0 1750; SSE41-NEXT: movapd %xmm9, %xmm1 1751; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1 1752; SSE41-NEXT: movdqa %xmm4, %xmm0 1753; SSE41-NEXT: pxor %xmm10, %xmm0 1754; SSE41-NEXT: movdqa %xmm11, %xmm2 1755; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 1756; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 1757; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 1758; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1759; SSE41-NEXT: pand %xmm3, %xmm0 1760; SSE41-NEXT: por %xmm2, %xmm0 1761; SSE41-NEXT: movapd %xmm9, %xmm2 1762; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2 1763; SSE41-NEXT: packusdw %xmm1, %xmm2 1764; SSE41-NEXT: movdqa %xmm7, %xmm0 1765; SSE41-NEXT: pxor %xmm10, %xmm0 1766; SSE41-NEXT: movdqa %xmm11, %xmm1 1767; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 1768; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2] 1769; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 1770; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1771; SSE41-NEXT: pand %xmm3, %xmm0 1772; SSE41-NEXT: por %xmm1, %xmm0 1773; SSE41-NEXT: movapd %xmm9, %xmm1 1774; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1 1775; SSE41-NEXT: pxor %xmm6, %xmm10 1776; SSE41-NEXT: movdqa %xmm11, %xmm3 1777; SSE41-NEXT: pcmpgtd %xmm10, %xmm3 1778; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 1779; SSE41-NEXT: pcmpeqd %xmm11, %xmm10 1780; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3] 1781; SSE41-NEXT: pand %xmm4, %xmm0 1782; SSE41-NEXT: por %xmm3, %xmm0 1783; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm9 1784; SSE41-NEXT: packusdw %xmm1, %xmm9 1785; SSE41-NEXT: packusdw %xmm9, %xmm2 1786; SSE41-NEXT: packuswb %xmm2, %xmm13 1787; SSE41-NEXT: movdqa %xmm13, %xmm0 1788; SSE41-NEXT: retq 1789; 1790; AVX1-LABEL: trunc_usat_v16i64_v16i8: 1791; AVX1: # %bb.0: 1792; AVX1-NEXT: vmovapd {{.*#+}} ymm8 = [255,255,255,255] 1793; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 1794; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808] 1795; AVX1-NEXT: vpxor %xmm6, %xmm5, %xmm5 1796; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [9223372036854776063,9223372036854776063] 1797; AVX1-NEXT: vpcmpgtq %xmm5, %xmm7, %xmm5 1798; AVX1-NEXT: vpxor %xmm6, %xmm0, %xmm4 1799; AVX1-NEXT: vpcmpgtq %xmm4, %xmm7, %xmm4 1800; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm4, %ymm4 1801; AVX1-NEXT: vblendvpd %ymm4, %ymm0, %ymm8, %ymm0 1802; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 1803; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4 1804; AVX1-NEXT: vpcmpgtq %xmm4, %xmm7, %xmm4 1805; AVX1-NEXT: vpxor %xmm6, %xmm1, %xmm5 1806; AVX1-NEXT: vpcmpgtq %xmm5, %xmm7, %xmm5 1807; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4 1808; AVX1-NEXT: vblendvpd %ymm4, %ymm1, %ymm8, %ymm1 1809; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1810; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4 1811; AVX1-NEXT: vpcmpgtq %xmm4, %xmm7, %xmm4 1812; AVX1-NEXT: vpxor %xmm6, %xmm2, %xmm5 1813; AVX1-NEXT: vpcmpgtq %xmm5, %xmm7, %xmm5 1814; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4 1815; AVX1-NEXT: vblendvpd %ymm4, %ymm2, %ymm8, %ymm2 1816; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 1817; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4 1818; AVX1-NEXT: vpcmpgtq %xmm4, %xmm7, %xmm4 1819; AVX1-NEXT: vpxor %xmm6, %xmm3, %xmm5 1820; AVX1-NEXT: vpcmpgtq %xmm5, %xmm7, %xmm5 1821; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4 1822; AVX1-NEXT: vblendvpd %ymm4, %ymm3, %ymm8, %ymm3 1823; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 1824; AVX1-NEXT: vpackusdw %xmm4, %xmm3, %xmm3 1825; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1826; AVX1-NEXT: vpackusdw %xmm4, %xmm2, %xmm2 1827; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 1828; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1829; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 1830; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1831; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 1832; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1833; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 1834; AVX1-NEXT: vzeroupper 1835; AVX1-NEXT: retq 1836; 1837; AVX2-LABEL: trunc_usat_v16i64_v16i8: 1838; AVX2: # %bb.0: 1839; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255] 1840; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 1841; AVX2-NEXT: vpxor %ymm5, %ymm1, %ymm6 1842; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm7 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063] 1843; AVX2-NEXT: vpcmpgtq %ymm6, %ymm7, %ymm6 1844; AVX2-NEXT: vblendvpd %ymm6, %ymm1, %ymm4, %ymm1 1845; AVX2-NEXT: vpxor %ymm5, %ymm0, %ymm6 1846; AVX2-NEXT: vpcmpgtq %ymm6, %ymm7, %ymm6 1847; AVX2-NEXT: vblendvpd %ymm6, %ymm0, %ymm4, %ymm0 1848; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 1849; AVX2-NEXT: vpxor %ymm5, %ymm3, %ymm1 1850; AVX2-NEXT: vpcmpgtq %ymm1, %ymm7, %ymm1 1851; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm4, %ymm1 1852; AVX2-NEXT: vpxor %ymm5, %ymm2, %ymm3 1853; AVX2-NEXT: vpcmpgtq %ymm3, %ymm7, %ymm3 1854; AVX2-NEXT: vblendvpd %ymm3, %ymm2, %ymm4, %ymm2 1855; AVX2-NEXT: vpackusdw %ymm1, %ymm2, %ymm1 1856; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3] 1857; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 1858; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 1859; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 1860; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1861; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 1862; AVX2-NEXT: vzeroupper 1863; AVX2-NEXT: retq 1864; 1865; AVX512-LABEL: trunc_usat_v16i64_v16i8: 1866; AVX512: # %bb.0: 1867; AVX512-NEXT: vpbroadcastq {{.*#+}} zmm2 = [255,255,255,255,255,255,255,255] 1868; AVX512-NEXT: vpminuq %zmm2, %zmm1, %zmm1 1869; AVX512-NEXT: vpminuq %zmm2, %zmm0, %zmm0 1870; AVX512-NEXT: vpmovqd %zmm0, %ymm0 1871; AVX512-NEXT: vpmovqd %zmm1, %ymm1 1872; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 1873; AVX512-NEXT: vpmovdb %zmm0, %xmm0 1874; AVX512-NEXT: vzeroupper 1875; AVX512-NEXT: retq 1876 %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> 1877 %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> 1878 %3 = trunc <16 x i64> %2 to <16 x i8> 1879 ret <16 x i8> %3 1880} 1881 1882define <8 x i8> @trunc_usat_v8i32_v8i8(<8 x i32> %a0) { 1883; SSE2-LABEL: trunc_usat_v8i32_v8i8: 1884; SSE2: # %bb.0: 1885; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255] 1886; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 1887; SSE2-NEXT: movdqa %xmm1, %xmm4 1888; SSE2-NEXT: pxor %xmm3, %xmm4 1889; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903] 1890; SSE2-NEXT: movdqa %xmm5, %xmm6 1891; SSE2-NEXT: pcmpgtd %xmm4, %xmm6 1892; SSE2-NEXT: pand %xmm6, %xmm1 1893; SSE2-NEXT: pandn %xmm2, %xmm6 1894; SSE2-NEXT: por %xmm1, %xmm6 1895; SSE2-NEXT: pxor %xmm0, %xmm3 1896; SSE2-NEXT: pcmpgtd %xmm3, %xmm5 1897; SSE2-NEXT: pand %xmm5, %xmm0 1898; SSE2-NEXT: pandn %xmm2, %xmm5 1899; SSE2-NEXT: por %xmm5, %xmm0 1900; SSE2-NEXT: packuswb %xmm6, %xmm0 1901; SSE2-NEXT: retq 1902; 1903; SSSE3-LABEL: trunc_usat_v8i32_v8i8: 1904; SSSE3: # %bb.0: 1905; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255] 1906; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 1907; SSSE3-NEXT: movdqa %xmm1, %xmm4 1908; SSSE3-NEXT: pxor %xmm3, %xmm4 1909; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903] 1910; SSSE3-NEXT: movdqa %xmm5, %xmm6 1911; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6 1912; SSSE3-NEXT: pand %xmm6, %xmm1 1913; SSSE3-NEXT: pandn %xmm2, %xmm6 1914; SSSE3-NEXT: por %xmm1, %xmm6 1915; SSSE3-NEXT: pxor %xmm0, %xmm3 1916; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5 1917; SSSE3-NEXT: pand %xmm5, %xmm0 1918; SSSE3-NEXT: pandn %xmm2, %xmm5 1919; SSSE3-NEXT: por %xmm5, %xmm0 1920; SSSE3-NEXT: packuswb %xmm6, %xmm0 1921; SSSE3-NEXT: retq 1922; 1923; SSE41-LABEL: trunc_usat_v8i32_v8i8: 1924; SSE41: # %bb.0: 1925; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255] 1926; SSE41-NEXT: pminud %xmm2, %xmm1 1927; SSE41-NEXT: pminud %xmm2, %xmm0 1928; SSE41-NEXT: packusdw %xmm1, %xmm0 1929; SSE41-NEXT: retq 1930; 1931; AVX1-LABEL: trunc_usat_v8i32_v8i8: 1932; AVX1: # %bb.0: 1933; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1934; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255] 1935; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1 1936; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0 1937; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1938; AVX1-NEXT: vzeroupper 1939; AVX1-NEXT: retq 1940; 1941; AVX2-LABEL: trunc_usat_v8i32_v8i8: 1942; AVX2: # %bb.0: 1943; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255] 1944; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0 1945; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1946; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1947; AVX2-NEXT: vzeroupper 1948; AVX2-NEXT: retq 1949; 1950; AVX512F-LABEL: trunc_usat_v8i32_v8i8: 1951; AVX512F: # %bb.0: 1952; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255] 1953; AVX512F-NEXT: vpminud %ymm1, %ymm0, %ymm0 1954; AVX512F-NEXT: vpmovdw %zmm0, %ymm0 1955; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 1956; AVX512F-NEXT: vzeroupper 1957; AVX512F-NEXT: retq 1958; 1959; AVX512VL-LABEL: trunc_usat_v8i32_v8i8: 1960; AVX512VL: # %bb.0: 1961; AVX512VL-NEXT: vpminud {{.*}}(%rip){1to8}, %ymm0, %ymm0 1962; AVX512VL-NEXT: vpmovdw %ymm0, %xmm0 1963; AVX512VL-NEXT: vzeroupper 1964; AVX512VL-NEXT: retq 1965; 1966; AVX512BW-LABEL: trunc_usat_v8i32_v8i8: 1967; AVX512BW: # %bb.0: 1968; AVX512BW-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255] 1969; AVX512BW-NEXT: vpminud %ymm1, %ymm0, %ymm0 1970; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0 1971; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 1972; AVX512BW-NEXT: vzeroupper 1973; AVX512BW-NEXT: retq 1974; 1975; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8: 1976; AVX512BWVL: # %bb.0: 1977; AVX512BWVL-NEXT: vpminud {{.*}}(%rip){1to8}, %ymm0, %ymm0 1978; AVX512BWVL-NEXT: vpmovdw %ymm0, %xmm0 1979; AVX512BWVL-NEXT: vzeroupper 1980; AVX512BWVL-NEXT: retq 1981 %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 1982 %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> 1983 %3 = trunc <8 x i32> %2 to <8 x i8> 1984 ret <8 x i8> %3 1985} 1986 1987define void @trunc_usat_v8i32_v8i8_store(<8 x i32> %a0, <8 x i8> *%p1) { 1988; SSE2-LABEL: trunc_usat_v8i32_v8i8_store: 1989; SSE2: # %bb.0: 1990; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255] 1991; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 1992; SSE2-NEXT: movdqa %xmm0, %xmm4 1993; SSE2-NEXT: pxor %xmm3, %xmm4 1994; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903] 1995; SSE2-NEXT: movdqa %xmm5, %xmm6 1996; SSE2-NEXT: pcmpgtd %xmm4, %xmm6 1997; SSE2-NEXT: pand %xmm6, %xmm0 1998; SSE2-NEXT: pandn %xmm2, %xmm6 1999; SSE2-NEXT: por %xmm0, %xmm6 2000; SSE2-NEXT: pxor %xmm1, %xmm3 2001; SSE2-NEXT: pcmpgtd %xmm3, %xmm5 2002; SSE2-NEXT: pand %xmm5, %xmm1 2003; SSE2-NEXT: pandn %xmm2, %xmm5 2004; SSE2-NEXT: por %xmm1, %xmm5 2005; SSE2-NEXT: pand %xmm2, %xmm5 2006; SSE2-NEXT: pand %xmm2, %xmm6 2007; SSE2-NEXT: packuswb %xmm5, %xmm6 2008; SSE2-NEXT: packuswb %xmm6, %xmm6 2009; SSE2-NEXT: movq %xmm6, (%rdi) 2010; SSE2-NEXT: retq 2011; 2012; SSSE3-LABEL: trunc_usat_v8i32_v8i8_store: 2013; SSSE3: # %bb.0: 2014; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255] 2015; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] 2016; SSSE3-NEXT: movdqa %xmm0, %xmm4 2017; SSSE3-NEXT: pxor %xmm3, %xmm4 2018; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903] 2019; SSSE3-NEXT: movdqa %xmm5, %xmm6 2020; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6 2021; SSSE3-NEXT: pand %xmm6, %xmm0 2022; SSSE3-NEXT: pandn %xmm2, %xmm6 2023; SSSE3-NEXT: por %xmm0, %xmm6 2024; SSSE3-NEXT: pxor %xmm1, %xmm3 2025; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5 2026; SSSE3-NEXT: pand %xmm5, %xmm1 2027; SSSE3-NEXT: pandn %xmm2, %xmm5 2028; SSSE3-NEXT: por %xmm1, %xmm5 2029; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 2030; SSSE3-NEXT: pshufb %xmm0, %xmm5 2031; SSSE3-NEXT: pshufb %xmm0, %xmm6 2032; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm5[0] 2033; SSSE3-NEXT: pshufb {{.*#+}} xmm6 = xmm6[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 2034; SSSE3-NEXT: movq %xmm6, (%rdi) 2035; SSSE3-NEXT: retq 2036; 2037; SSE41-LABEL: trunc_usat_v8i32_v8i8_store: 2038; SSE41: # %bb.0: 2039; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255] 2040; SSE41-NEXT: pminud %xmm2, %xmm1 2041; SSE41-NEXT: pminud %xmm2, %xmm0 2042; SSE41-NEXT: packusdw %xmm1, %xmm0 2043; SSE41-NEXT: packuswb %xmm0, %xmm0 2044; SSE41-NEXT: movq %xmm0, (%rdi) 2045; SSE41-NEXT: retq 2046; 2047; AVX1-LABEL: trunc_usat_v8i32_v8i8_store: 2048; AVX1: # %bb.0: 2049; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 2050; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255] 2051; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1 2052; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0 2053; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2054; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 2055; AVX1-NEXT: vmovq %xmm0, (%rdi) 2056; AVX1-NEXT: vzeroupper 2057; AVX1-NEXT: retq 2058; 2059; AVX2-LABEL: trunc_usat_v8i32_v8i8_store: 2060; AVX2: # %bb.0: 2061; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255] 2062; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0 2063; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2064; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2065; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 2066; AVX2-NEXT: vmovq %xmm0, (%rdi) 2067; AVX2-NEXT: vzeroupper 2068; AVX2-NEXT: retq 2069; 2070; AVX512F-LABEL: trunc_usat_v8i32_v8i8_store: 2071; AVX512F: # %bb.0: 2072; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255] 2073; AVX512F-NEXT: vpminud %ymm1, %ymm0, %ymm0 2074; AVX512F-NEXT: vpmovdw %zmm0, %ymm0 2075; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 2076; AVX512F-NEXT: vmovq %xmm0, (%rdi) 2077; AVX512F-NEXT: vzeroupper 2078; AVX512F-NEXT: retq 2079; 2080; AVX512VL-LABEL: trunc_usat_v8i32_v8i8_store: 2081; AVX512VL: # %bb.0: 2082; AVX512VL-NEXT: vpmovusdb %ymm0, (%rdi) 2083; AVX512VL-NEXT: vzeroupper 2084; AVX512VL-NEXT: retq 2085; 2086; AVX512BW-LABEL: trunc_usat_v8i32_v8i8_store: 2087; AVX512BW: # %bb.0: 2088; AVX512BW-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255] 2089; AVX512BW-NEXT: vpminud %ymm1, %ymm0, %ymm0 2090; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0 2091; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 2092; AVX512BW-NEXT: vmovq %xmm0, (%rdi) 2093; AVX512BW-NEXT: vzeroupper 2094; AVX512BW-NEXT: retq 2095; 2096; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8_store: 2097; AVX512BWVL: # %bb.0: 2098; AVX512BWVL-NEXT: vpmovusdb %ymm0, (%rdi) 2099; AVX512BWVL-NEXT: vzeroupper 2100; AVX512BWVL-NEXT: retq 2101 %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 2102 %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> 2103 %3 = trunc <8 x i32> %2 to <8 x i8> 2104 store <8 x i8> %3, <8 x i8> *%p1 2105 ret void 2106} 2107 2108define <16 x i8> @trunc_usat_v16i32_v16i8(<16 x i32> %a0) { 2109; SSE2-LABEL: trunc_usat_v16i32_v16i8: 2110; SSE2: # %bb.0: 2111; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255] 2112; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648] 2113; SSE2-NEXT: movdqa %xmm1, %xmm7 2114; SSE2-NEXT: pxor %xmm6, %xmm7 2115; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903] 2116; SSE2-NEXT: movdqa %xmm5, %xmm4 2117; SSE2-NEXT: pcmpgtd %xmm7, %xmm4 2118; SSE2-NEXT: pand %xmm4, %xmm1 2119; SSE2-NEXT: pandn %xmm8, %xmm4 2120; SSE2-NEXT: por %xmm1, %xmm4 2121; SSE2-NEXT: movdqa %xmm0, %xmm1 2122; SSE2-NEXT: pxor %xmm6, %xmm1 2123; SSE2-NEXT: movdqa %xmm5, %xmm7 2124; SSE2-NEXT: pcmpgtd %xmm1, %xmm7 2125; SSE2-NEXT: pand %xmm7, %xmm0 2126; SSE2-NEXT: pandn %xmm8, %xmm7 2127; SSE2-NEXT: por %xmm7, %xmm0 2128; SSE2-NEXT: packuswb %xmm4, %xmm0 2129; SSE2-NEXT: movdqa %xmm3, %xmm1 2130; SSE2-NEXT: pxor %xmm6, %xmm1 2131; SSE2-NEXT: movdqa %xmm5, %xmm4 2132; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 2133; SSE2-NEXT: pand %xmm4, %xmm3 2134; SSE2-NEXT: pandn %xmm8, %xmm4 2135; SSE2-NEXT: por %xmm3, %xmm4 2136; SSE2-NEXT: pxor %xmm2, %xmm6 2137; SSE2-NEXT: pcmpgtd %xmm6, %xmm5 2138; SSE2-NEXT: pand %xmm5, %xmm2 2139; SSE2-NEXT: pandn %xmm8, %xmm5 2140; SSE2-NEXT: por %xmm2, %xmm5 2141; SSE2-NEXT: packuswb %xmm4, %xmm5 2142; SSE2-NEXT: packuswb %xmm5, %xmm0 2143; SSE2-NEXT: retq 2144; 2145; SSSE3-LABEL: trunc_usat_v16i32_v16i8: 2146; SSSE3: # %bb.0: 2147; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255] 2148; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648] 2149; SSSE3-NEXT: movdqa %xmm1, %xmm7 2150; SSSE3-NEXT: pxor %xmm6, %xmm7 2151; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903] 2152; SSSE3-NEXT: movdqa %xmm5, %xmm4 2153; SSSE3-NEXT: pcmpgtd %xmm7, %xmm4 2154; SSSE3-NEXT: pand %xmm4, %xmm1 2155; SSSE3-NEXT: pandn %xmm8, %xmm4 2156; SSSE3-NEXT: por %xmm1, %xmm4 2157; SSSE3-NEXT: movdqa %xmm0, %xmm1 2158; SSSE3-NEXT: pxor %xmm6, %xmm1 2159; SSSE3-NEXT: movdqa %xmm5, %xmm7 2160; SSSE3-NEXT: pcmpgtd %xmm1, %xmm7 2161; SSSE3-NEXT: pand %xmm7, %xmm0 2162; SSSE3-NEXT: pandn %xmm8, %xmm7 2163; SSSE3-NEXT: por %xmm7, %xmm0 2164; SSSE3-NEXT: packuswb %xmm4, %xmm0 2165; SSSE3-NEXT: movdqa %xmm3, %xmm1 2166; SSSE3-NEXT: pxor %xmm6, %xmm1 2167; SSSE3-NEXT: movdqa %xmm5, %xmm4 2168; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 2169; SSSE3-NEXT: pand %xmm4, %xmm3 2170; SSSE3-NEXT: pandn %xmm8, %xmm4 2171; SSSE3-NEXT: por %xmm3, %xmm4 2172; SSSE3-NEXT: pxor %xmm2, %xmm6 2173; SSSE3-NEXT: pcmpgtd %xmm6, %xmm5 2174; SSSE3-NEXT: pand %xmm5, %xmm2 2175; SSSE3-NEXT: pandn %xmm8, %xmm5 2176; SSSE3-NEXT: por %xmm2, %xmm5 2177; SSSE3-NEXT: packuswb %xmm4, %xmm5 2178; SSSE3-NEXT: packuswb %xmm5, %xmm0 2179; SSSE3-NEXT: retq 2180; 2181; SSE41-LABEL: trunc_usat_v16i32_v16i8: 2182; SSE41: # %bb.0: 2183; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255] 2184; SSE41-NEXT: pminud %xmm4, %xmm1 2185; SSE41-NEXT: pminud %xmm4, %xmm0 2186; SSE41-NEXT: packusdw %xmm1, %xmm0 2187; SSE41-NEXT: pminud %xmm4, %xmm3 2188; SSE41-NEXT: pminud %xmm4, %xmm2 2189; SSE41-NEXT: packusdw %xmm3, %xmm2 2190; SSE41-NEXT: packuswb %xmm2, %xmm0 2191; SSE41-NEXT: retq 2192; 2193; AVX1-LABEL: trunc_usat_v16i32_v16i8: 2194; AVX1: # %bb.0: 2195; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2196; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255] 2197; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2 2198; AVX1-NEXT: vpminud %xmm3, %xmm0, %xmm0 2199; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 2200; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2201; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2 2202; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1 2203; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 2204; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2205; AVX1-NEXT: vzeroupper 2206; AVX1-NEXT: retq 2207; 2208; AVX2-LABEL: trunc_usat_v16i32_v16i8: 2209; AVX2: # %bb.0: 2210; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255] 2211; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1 2212; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0 2213; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 2214; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 2215; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2216; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2217; AVX2-NEXT: vzeroupper 2218; AVX2-NEXT: retq 2219; 2220; AVX512-LABEL: trunc_usat_v16i32_v16i8: 2221; AVX512: # %bb.0: 2222; AVX512-NEXT: vpmovusdb %zmm0, %xmm0 2223; AVX512-NEXT: vzeroupper 2224; AVX512-NEXT: retq 2225 %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> 2226 %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> 2227 %3 = trunc <16 x i32> %2 to <16 x i8> 2228 ret <16 x i8> %3 2229} 2230 2231define <16 x i8> @trunc_usat_v16i16_v16i8(<16 x i16> %a0) { 2232; SSE2-LABEL: trunc_usat_v16i16_v16i8: 2233; SSE2: # %bb.0: 2234; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768] 2235; SSE2-NEXT: pxor %xmm2, %xmm1 2236; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023] 2237; SSE2-NEXT: pminsw %xmm3, %xmm1 2238; SSE2-NEXT: pxor %xmm2, %xmm1 2239; SSE2-NEXT: pxor %xmm2, %xmm0 2240; SSE2-NEXT: pminsw %xmm3, %xmm0 2241; SSE2-NEXT: pxor %xmm2, %xmm0 2242; SSE2-NEXT: packuswb %xmm1, %xmm0 2243; SSE2-NEXT: retq 2244; 2245; SSSE3-LABEL: trunc_usat_v16i16_v16i8: 2246; SSSE3: # %bb.0: 2247; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768] 2248; SSSE3-NEXT: pxor %xmm2, %xmm1 2249; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023] 2250; SSSE3-NEXT: pminsw %xmm3, %xmm1 2251; SSSE3-NEXT: pxor %xmm2, %xmm1 2252; SSSE3-NEXT: pxor %xmm2, %xmm0 2253; SSSE3-NEXT: pminsw %xmm3, %xmm0 2254; SSSE3-NEXT: pxor %xmm2, %xmm0 2255; SSSE3-NEXT: packuswb %xmm1, %xmm0 2256; SSSE3-NEXT: retq 2257; 2258; SSE41-LABEL: trunc_usat_v16i16_v16i8: 2259; SSE41: # %bb.0: 2260; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 2261; SSE41-NEXT: pminuw %xmm2, %xmm1 2262; SSE41-NEXT: pminuw %xmm2, %xmm0 2263; SSE41-NEXT: packuswb %xmm1, %xmm0 2264; SSE41-NEXT: retq 2265; 2266; AVX1-LABEL: trunc_usat_v16i16_v16i8: 2267; AVX1: # %bb.0: 2268; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 2269; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255] 2270; AVX1-NEXT: vpminuw %xmm2, %xmm1, %xmm1 2271; AVX1-NEXT: vpminuw %xmm2, %xmm0, %xmm0 2272; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2273; AVX1-NEXT: vzeroupper 2274; AVX1-NEXT: retq 2275; 2276; AVX2-LABEL: trunc_usat_v16i16_v16i8: 2277; AVX2: # %bb.0: 2278; AVX2-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0 2279; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2280; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2281; AVX2-NEXT: vzeroupper 2282; AVX2-NEXT: retq 2283; 2284; AVX512F-LABEL: trunc_usat_v16i16_v16i8: 2285; AVX512F: # %bb.0: 2286; AVX512F-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0 2287; 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 2288; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 2289; AVX512F-NEXT: vzeroupper 2290; AVX512F-NEXT: retq 2291; 2292; AVX512VL-LABEL: trunc_usat_v16i16_v16i8: 2293; AVX512VL: # %bb.0: 2294; AVX512VL-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0 2295; 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 2296; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0 2297; AVX512VL-NEXT: vzeroupper 2298; AVX512VL-NEXT: retq 2299; 2300; AVX512BW-LABEL: trunc_usat_v16i16_v16i8: 2301; AVX512BW: # %bb.0: 2302; AVX512BW-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0 2303; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 2304; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 2305; AVX512BW-NEXT: vzeroupper 2306; AVX512BW-NEXT: retq 2307; 2308; AVX512BWVL-LABEL: trunc_usat_v16i16_v16i8: 2309; AVX512BWVL: # %bb.0: 2310; AVX512BWVL-NEXT: vpmovuswb %ymm0, %xmm0 2311; AVX512BWVL-NEXT: vzeroupper 2312; AVX512BWVL-NEXT: retq 2313 %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> 2314 %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> 2315 %3 = trunc <16 x i16> %2 to <16 x i8> 2316 ret <16 x i8> %3 2317} 2318 2319define <32 x i8> @trunc_usat_v32i16_v32i8(<32 x i16> %a0) { 2320; SSE2-LABEL: trunc_usat_v32i16_v32i8: 2321; SSE2: # %bb.0: 2322; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768] 2323; SSE2-NEXT: pxor %xmm4, %xmm3 2324; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [33023,33023,33023,33023,33023,33023,33023,33023] 2325; SSE2-NEXT: pminsw %xmm5, %xmm3 2326; SSE2-NEXT: pxor %xmm4, %xmm3 2327; SSE2-NEXT: pxor %xmm4, %xmm2 2328; SSE2-NEXT: pminsw %xmm5, %xmm2 2329; SSE2-NEXT: pxor %xmm4, %xmm2 2330; SSE2-NEXT: packuswb %xmm3, %xmm2 2331; SSE2-NEXT: pxor %xmm4, %xmm1 2332; SSE2-NEXT: pminsw %xmm5, %xmm1 2333; SSE2-NEXT: pxor %xmm4, %xmm1 2334; SSE2-NEXT: pxor %xmm4, %xmm0 2335; SSE2-NEXT: pminsw %xmm5, %xmm0 2336; SSE2-NEXT: pxor %xmm4, %xmm0 2337; SSE2-NEXT: packuswb %xmm1, %xmm0 2338; SSE2-NEXT: movdqa %xmm2, %xmm1 2339; SSE2-NEXT: retq 2340; 2341; SSSE3-LABEL: trunc_usat_v32i16_v32i8: 2342; SSSE3: # %bb.0: 2343; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768] 2344; SSSE3-NEXT: pxor %xmm4, %xmm3 2345; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [33023,33023,33023,33023,33023,33023,33023,33023] 2346; SSSE3-NEXT: pminsw %xmm5, %xmm3 2347; SSSE3-NEXT: pxor %xmm4, %xmm3 2348; SSSE3-NEXT: pxor %xmm4, %xmm2 2349; SSSE3-NEXT: pminsw %xmm5, %xmm2 2350; SSSE3-NEXT: pxor %xmm4, %xmm2 2351; SSSE3-NEXT: packuswb %xmm3, %xmm2 2352; SSSE3-NEXT: pxor %xmm4, %xmm1 2353; SSSE3-NEXT: pminsw %xmm5, %xmm1 2354; SSSE3-NEXT: pxor %xmm4, %xmm1 2355; SSSE3-NEXT: pxor %xmm4, %xmm0 2356; SSSE3-NEXT: pminsw %xmm5, %xmm0 2357; SSSE3-NEXT: pxor %xmm4, %xmm0 2358; SSSE3-NEXT: packuswb %xmm1, %xmm0 2359; SSSE3-NEXT: movdqa %xmm2, %xmm1 2360; SSSE3-NEXT: retq 2361; 2362; SSE41-LABEL: trunc_usat_v32i16_v32i8: 2363; SSE41: # %bb.0: 2364; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 2365; SSE41-NEXT: pminuw %xmm4, %xmm3 2366; SSE41-NEXT: pminuw %xmm4, %xmm2 2367; SSE41-NEXT: packuswb %xmm3, %xmm2 2368; SSE41-NEXT: pminuw %xmm4, %xmm1 2369; SSE41-NEXT: pminuw %xmm4, %xmm0 2370; SSE41-NEXT: packuswb %xmm1, %xmm0 2371; SSE41-NEXT: movdqa %xmm2, %xmm1 2372; SSE41-NEXT: retq 2373; 2374; AVX1-LABEL: trunc_usat_v32i16_v32i8: 2375; AVX1: # %bb.0: 2376; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 2377; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] 2378; AVX1-NEXT: vpminuw %xmm3, %xmm2, %xmm2 2379; AVX1-NEXT: vpminuw %xmm3, %xmm0, %xmm0 2380; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 2381; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2382; AVX1-NEXT: vpminuw %xmm3, %xmm2, %xmm2 2383; AVX1-NEXT: vpminuw %xmm3, %xmm1, %xmm1 2384; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1 2385; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 2386; AVX1-NEXT: retq 2387; 2388; AVX2-LABEL: trunc_usat_v32i16_v32i8: 2389; AVX2: # %bb.0: 2390; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2391; AVX2-NEXT: vpminuw %ymm2, %ymm1, %ymm1 2392; AVX2-NEXT: vpminuw %ymm2, %ymm0, %ymm0 2393; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 2394; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 2395; AVX2-NEXT: retq 2396; 2397; AVX512F-LABEL: trunc_usat_v32i16_v32i8: 2398; AVX512F: # %bb.0: 2399; AVX512F-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2400; AVX512F-NEXT: vpminuw %ymm2, %ymm1, %ymm1 2401; AVX512F-NEXT: vpminuw %ymm2, %ymm0, %ymm0 2402; 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 2403; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 2404; 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 2405; AVX512F-NEXT: vpmovdb %zmm1, %xmm1 2406; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 2407; AVX512F-NEXT: retq 2408; 2409; AVX512VL-LABEL: trunc_usat_v32i16_v32i8: 2410; AVX512VL: # %bb.0: 2411; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 2412; AVX512VL-NEXT: vpminuw %ymm2, %ymm1, %ymm1 2413; AVX512VL-NEXT: vpminuw %ymm2, %ymm0, %ymm0 2414; 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 2415; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0 2416; 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 2417; AVX512VL-NEXT: vpmovdb %zmm1, %xmm1 2418; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 2419; AVX512VL-NEXT: retq 2420; 2421; AVX512BW-LABEL: trunc_usat_v32i16_v32i8: 2422; AVX512BW: # %bb.0: 2423; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm0 2424; AVX512BW-NEXT: retq 2425; 2426; AVX512BWVL-LABEL: trunc_usat_v32i16_v32i8: 2427; AVX512BWVL: # %bb.0: 2428; AVX512BWVL-NEXT: vpmovuswb %zmm0, %ymm0 2429; AVX512BWVL-NEXT: retq 2430 %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> 2431 %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> 2432 %3 = trunc <32 x i16> %2 to <32 x i8> 2433 ret <32 x i8> %3 2434} 2435