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