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 ; PACKUS saturation truncation to vXi32 15 ; 16 17 define <4 x i32> @trunc_packus_v4i64_v4i32(<4 x i64> %a0) { 18 ; SSE2-LABEL: trunc_packus_v4i64_v4i32: 19 ; SSE2: # %bb.0: 20 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295] 21 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 22 ; SSE2-NEXT: movdqa %xmm0, %xmm3 23 ; SSE2-NEXT: pxor %xmm2, %xmm3 24 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483647,2147483647] 25 ; SSE2-NEXT: movdqa %xmm5, %xmm6 26 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6 27 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 28 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm3 29 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 30 ; SSE2-NEXT: pand %xmm7, %xmm4 31 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 32 ; SSE2-NEXT: por %xmm4, %xmm3 33 ; SSE2-NEXT: pand %xmm3, %xmm0 34 ; SSE2-NEXT: pandn %xmm8, %xmm3 35 ; SSE2-NEXT: por %xmm0, %xmm3 36 ; SSE2-NEXT: movdqa %xmm1, %xmm0 37 ; SSE2-NEXT: pxor %xmm2, %xmm0 38 ; SSE2-NEXT: movdqa %xmm5, %xmm4 39 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 40 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 41 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm0 42 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 43 ; SSE2-NEXT: pand %xmm6, %xmm0 44 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 45 ; SSE2-NEXT: por %xmm0, %xmm4 46 ; SSE2-NEXT: pand %xmm4, %xmm1 47 ; SSE2-NEXT: pandn %xmm8, %xmm4 48 ; SSE2-NEXT: por %xmm1, %xmm4 49 ; SSE2-NEXT: movdqa %xmm4, %xmm0 50 ; SSE2-NEXT: pxor %xmm2, %xmm0 51 ; SSE2-NEXT: movdqa %xmm0, %xmm1 52 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 53 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] 54 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 55 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 56 ; SSE2-NEXT: pand %xmm5, %xmm0 57 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 58 ; SSE2-NEXT: por %xmm0, %xmm1 59 ; SSE2-NEXT: pand %xmm4, %xmm1 60 ; SSE2-NEXT: movdqa %xmm3, %xmm0 61 ; SSE2-NEXT: pxor %xmm2, %xmm0 62 ; SSE2-NEXT: movdqa %xmm0, %xmm4 63 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 64 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 65 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 66 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] 67 ; SSE2-NEXT: pand %xmm5, %xmm2 68 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 69 ; SSE2-NEXT: por %xmm2, %xmm0 70 ; SSE2-NEXT: pand %xmm3, %xmm0 71 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 72 ; SSE2-NEXT: retq 73 ; 74 ; SSSE3-LABEL: trunc_packus_v4i64_v4i32: 75 ; SSSE3: # %bb.0: 76 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295] 77 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 78 ; SSSE3-NEXT: movdqa %xmm0, %xmm3 79 ; SSSE3-NEXT: pxor %xmm2, %xmm3 80 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483647,2147483647] 81 ; SSSE3-NEXT: movdqa %xmm5, %xmm6 82 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6 83 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 84 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3 85 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3] 86 ; SSSE3-NEXT: pand %xmm7, %xmm4 87 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 88 ; SSSE3-NEXT: por %xmm4, %xmm3 89 ; SSSE3-NEXT: pand %xmm3, %xmm0 90 ; SSSE3-NEXT: pandn %xmm8, %xmm3 91 ; SSSE3-NEXT: por %xmm0, %xmm3 92 ; SSSE3-NEXT: movdqa %xmm1, %xmm0 93 ; SSSE3-NEXT: pxor %xmm2, %xmm0 94 ; SSSE3-NEXT: movdqa %xmm5, %xmm4 95 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4 96 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 97 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm0 98 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 99 ; SSSE3-NEXT: pand %xmm6, %xmm0 100 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 101 ; SSSE3-NEXT: por %xmm0, %xmm4 102 ; SSSE3-NEXT: pand %xmm4, %xmm1 103 ; SSSE3-NEXT: pandn %xmm8, %xmm4 104 ; SSSE3-NEXT: por %xmm1, %xmm4 105 ; SSSE3-NEXT: movdqa %xmm4, %xmm0 106 ; SSSE3-NEXT: pxor %xmm2, %xmm0 107 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 108 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 109 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] 110 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0 111 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 112 ; SSSE3-NEXT: pand %xmm5, %xmm0 113 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 114 ; SSSE3-NEXT: por %xmm0, %xmm1 115 ; SSSE3-NEXT: pand %xmm4, %xmm1 116 ; SSSE3-NEXT: movdqa %xmm3, %xmm0 117 ; SSSE3-NEXT: pxor %xmm2, %xmm0 118 ; SSSE3-NEXT: movdqa %xmm0, %xmm4 119 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 120 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 121 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0 122 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] 123 ; SSSE3-NEXT: pand %xmm5, %xmm2 124 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 125 ; SSSE3-NEXT: por %xmm2, %xmm0 126 ; SSSE3-NEXT: pand %xmm3, %xmm0 127 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 128 ; SSSE3-NEXT: retq 129 ; 130 ; SSE41-LABEL: trunc_packus_v4i64_v4i32: 131 ; SSE41: # %bb.0: 132 ; SSE41-NEXT: movdqa %xmm0, %xmm2 133 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [4294967295,4294967295] 134 ; SSE41-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,0,2147483648,0] 135 ; SSE41-NEXT: pxor %xmm8, %xmm0 136 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147483647,2147483647] 137 ; SSE41-NEXT: movdqa %xmm6, %xmm5 138 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5 139 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2] 140 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm0 141 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 142 ; SSE41-NEXT: pand %xmm7, %xmm3 143 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3] 144 ; SSE41-NEXT: por %xmm3, %xmm0 145 ; SSE41-NEXT: movapd %xmm4, %xmm5 146 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5 147 ; SSE41-NEXT: movdqa %xmm1, %xmm0 148 ; SSE41-NEXT: pxor %xmm8, %xmm0 149 ; SSE41-NEXT: movdqa %xmm6, %xmm2 150 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 151 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 152 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm0 153 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 154 ; SSE41-NEXT: pand %xmm3, %xmm6 155 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 156 ; SSE41-NEXT: por %xmm6, %xmm0 157 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4 158 ; SSE41-NEXT: xorpd %xmm1, %xmm1 159 ; SSE41-NEXT: movapd %xmm4, %xmm0 160 ; SSE41-NEXT: xorpd %xmm8, %xmm0 161 ; SSE41-NEXT: movapd %xmm0, %xmm2 162 ; SSE41-NEXT: pcmpgtd %xmm8, %xmm2 163 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 164 ; SSE41-NEXT: pcmpeqd %xmm8, %xmm0 165 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 166 ; SSE41-NEXT: pand %xmm3, %xmm6 167 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 168 ; SSE41-NEXT: por %xmm6, %xmm0 169 ; SSE41-NEXT: pxor %xmm2, %xmm2 170 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2 171 ; SSE41-NEXT: movapd %xmm5, %xmm0 172 ; SSE41-NEXT: xorpd %xmm8, %xmm0 173 ; SSE41-NEXT: movapd %xmm0, %xmm3 174 ; SSE41-NEXT: pcmpgtd %xmm8, %xmm3 175 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 176 ; SSE41-NEXT: pcmpeqd %xmm8, %xmm0 177 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 178 ; SSE41-NEXT: pand %xmm4, %xmm6 179 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 180 ; SSE41-NEXT: por %xmm6, %xmm0 181 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1 182 ; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2] 183 ; SSE41-NEXT: movaps %xmm1, %xmm0 184 ; SSE41-NEXT: retq 185 ; 186 ; AVX1-LABEL: trunc_packus_v4i64_v4i32: 187 ; AVX1: # %bb.0: 188 ; AVX1-NEXT: vmovapd {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295] 189 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 190 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [4294967295,4294967295] 191 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2 192 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm3 193 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2 194 ; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 195 ; AVX1-NEXT: vxorpd %xmm1, %xmm1, %xmm1 196 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2 197 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 198 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1 199 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1 200 ; AVX1-NEXT: vpand %xmm0, %xmm2, %xmm0 201 ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 202 ; AVX1-NEXT: vzeroupper 203 ; AVX1-NEXT: retq 204 ; 205 ; AVX2-SLOW-LABEL: trunc_packus_v4i64_v4i32: 206 ; AVX2-SLOW: # %bb.0: 207 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295] 208 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2 209 ; AVX2-SLOW-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 210 ; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm1, %xmm1 211 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1 212 ; AVX2-SLOW-NEXT: vpand %ymm0, %ymm1, %ymm0 213 ; AVX2-SLOW-NEXT: vpshufd {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7] 214 ; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 215 ; AVX2-SLOW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 216 ; AVX2-SLOW-NEXT: vzeroupper 217 ; AVX2-SLOW-NEXT: retq 218 ; 219 ; AVX2-FAST-LABEL: trunc_packus_v4i64_v4i32: 220 ; AVX2-FAST: # %bb.0: 221 ; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295] 222 ; AVX2-FAST-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2 223 ; AVX2-FAST-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 224 ; AVX2-FAST-NEXT: vpxor %xmm1, %xmm1, %xmm1 225 ; AVX2-FAST-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1 226 ; AVX2-FAST-NEXT: vpand %ymm0, %ymm1, %ymm0 227 ; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7] 228 ; AVX2-FAST-NEXT: vpermd %ymm0, %ymm1, %ymm0 229 ; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 230 ; AVX2-FAST-NEXT: vzeroupper 231 ; AVX2-FAST-NEXT: retq 232 ; 233 ; AVX512F-LABEL: trunc_packus_v4i64_v4i32: 234 ; AVX512F: # %bb.0: 235 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 236 ; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295] 237 ; AVX512F-NEXT: vpminsq %zmm1, %zmm0, %zmm0 238 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 239 ; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 240 ; AVX512F-NEXT: vpmovqd %zmm0, %ymm0 241 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 242 ; AVX512F-NEXT: vzeroupper 243 ; AVX512F-NEXT: retq 244 ; 245 ; AVX512VL-LABEL: trunc_packus_v4i64_v4i32: 246 ; AVX512VL: # %bb.0: 247 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 248 ; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 249 ; AVX512VL-NEXT: vpmovusqd %ymm0, %xmm0 250 ; AVX512VL-NEXT: vzeroupper 251 ; AVX512VL-NEXT: retq 252 ; 253 ; AVX512BW-LABEL: trunc_packus_v4i64_v4i32: 254 ; AVX512BW: # %bb.0: 255 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 256 ; AVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295] 257 ; AVX512BW-NEXT: vpminsq %zmm1, %zmm0, %zmm0 258 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 259 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 260 ; AVX512BW-NEXT: vpmovqd %zmm0, %ymm0 261 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 262 ; AVX512BW-NEXT: vzeroupper 263 ; AVX512BW-NEXT: retq 264 ; 265 ; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i32: 266 ; AVX512BWVL: # %bb.0: 267 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 268 ; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0 269 ; AVX512BWVL-NEXT: vpmovusqd %ymm0, %xmm0 270 ; AVX512BWVL-NEXT: vzeroupper 271 ; AVX512BWVL-NEXT: retq 272 %1 = icmp slt <4 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 273 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 274 %3 = icmp sgt <4 x i64> %2, zeroinitializer 275 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer 276 %5 = trunc <4 x i64> %4 to <4 x i32> 277 ret <4 x i32> %5 278 } 279 280 281 define <8 x i32> @trunc_packus_v8i64_v8i32(<8 x i64> %a0) { 282 ; SSE2-LABEL: trunc_packus_v8i64_v8i32: 283 ; SSE2: # %bb.0: 284 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295] 285 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0] 286 ; SSE2-NEXT: movdqa %xmm0, %xmm5 287 ; SSE2-NEXT: pxor %xmm10, %xmm5 288 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483647,2147483647] 289 ; SSE2-NEXT: movdqa %xmm9, %xmm6 290 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm6 291 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 292 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm5 293 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 294 ; SSE2-NEXT: pand %xmm7, %xmm4 295 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 296 ; SSE2-NEXT: por %xmm4, %xmm5 297 ; SSE2-NEXT: pand %xmm5, %xmm0 298 ; SSE2-NEXT: pandn %xmm8, %xmm5 299 ; SSE2-NEXT: por %xmm0, %xmm5 300 ; SSE2-NEXT: movdqa %xmm1, %xmm0 301 ; SSE2-NEXT: pxor %xmm10, %xmm0 302 ; SSE2-NEXT: movdqa %xmm9, %xmm4 303 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 304 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 305 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0 306 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 307 ; SSE2-NEXT: pand %xmm6, %xmm7 308 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 309 ; SSE2-NEXT: por %xmm7, %xmm0 310 ; SSE2-NEXT: pand %xmm0, %xmm1 311 ; SSE2-NEXT: pandn %xmm8, %xmm0 312 ; SSE2-NEXT: por %xmm1, %xmm0 313 ; SSE2-NEXT: movdqa %xmm2, %xmm1 314 ; SSE2-NEXT: pxor %xmm10, %xmm1 315 ; SSE2-NEXT: movdqa %xmm9, %xmm4 316 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 317 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 318 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1 319 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 320 ; SSE2-NEXT: pand %xmm6, %xmm1 321 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3] 322 ; SSE2-NEXT: por %xmm1, %xmm6 323 ; SSE2-NEXT: pand %xmm6, %xmm2 324 ; SSE2-NEXT: pandn %xmm8, %xmm6 325 ; SSE2-NEXT: por %xmm2, %xmm6 326 ; SSE2-NEXT: movdqa %xmm3, %xmm1 327 ; SSE2-NEXT: pxor %xmm10, %xmm1 328 ; SSE2-NEXT: movdqa %xmm9, %xmm2 329 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 330 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 331 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1 332 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 333 ; SSE2-NEXT: pand %xmm4, %xmm1 334 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 335 ; SSE2-NEXT: por %xmm1, %xmm2 336 ; SSE2-NEXT: pand %xmm2, %xmm3 337 ; SSE2-NEXT: pandn %xmm8, %xmm2 338 ; SSE2-NEXT: por %xmm3, %xmm2 339 ; SSE2-NEXT: movdqa %xmm2, %xmm1 340 ; SSE2-NEXT: pxor %xmm10, %xmm1 341 ; SSE2-NEXT: movdqa %xmm1, %xmm3 342 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm3 343 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 344 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 345 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 346 ; SSE2-NEXT: pand %xmm4, %xmm1 347 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 348 ; SSE2-NEXT: por %xmm1, %xmm3 349 ; SSE2-NEXT: pand %xmm2, %xmm3 350 ; SSE2-NEXT: movdqa %xmm6, %xmm1 351 ; SSE2-NEXT: pxor %xmm10, %xmm1 352 ; SSE2-NEXT: movdqa %xmm1, %xmm2 353 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm2 354 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 355 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 356 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3] 357 ; SSE2-NEXT: pand %xmm4, %xmm7 358 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 359 ; SSE2-NEXT: por %xmm7, %xmm1 360 ; SSE2-NEXT: pand %xmm6, %xmm1 361 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2] 362 ; SSE2-NEXT: movdqa %xmm0, %xmm2 363 ; SSE2-NEXT: pxor %xmm10, %xmm2 364 ; SSE2-NEXT: movdqa %xmm2, %xmm3 365 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm3 366 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 367 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm2 368 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 369 ; SSE2-NEXT: pand %xmm4, %xmm2 370 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 371 ; SSE2-NEXT: por %xmm2, %xmm3 372 ; SSE2-NEXT: pand %xmm0, %xmm3 373 ; SSE2-NEXT: movdqa %xmm5, %xmm0 374 ; SSE2-NEXT: pxor %xmm10, %xmm0 375 ; SSE2-NEXT: movdqa %xmm0, %xmm2 376 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm2 377 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 378 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 379 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 380 ; SSE2-NEXT: pand %xmm4, %xmm6 381 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 382 ; SSE2-NEXT: por %xmm6, %xmm0 383 ; SSE2-NEXT: pand %xmm5, %xmm0 384 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2] 385 ; SSE2-NEXT: retq 386 ; 387 ; SSSE3-LABEL: trunc_packus_v8i64_v8i32: 388 ; SSSE3: # %bb.0: 389 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295] 390 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0] 391 ; SSSE3-NEXT: movdqa %xmm0, %xmm5 392 ; SSSE3-NEXT: pxor %xmm10, %xmm5 393 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [2147483647,2147483647] 394 ; SSSE3-NEXT: movdqa %xmm9, %xmm6 395 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm6 396 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 397 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5 398 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 399 ; SSSE3-NEXT: pand %xmm7, %xmm4 400 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 401 ; SSSE3-NEXT: por %xmm4, %xmm5 402 ; SSSE3-NEXT: pand %xmm5, %xmm0 403 ; SSSE3-NEXT: pandn %xmm8, %xmm5 404 ; SSSE3-NEXT: por %xmm0, %xmm5 405 ; SSSE3-NEXT: movdqa %xmm1, %xmm0 406 ; SSSE3-NEXT: pxor %xmm10, %xmm0 407 ; SSSE3-NEXT: movdqa %xmm9, %xmm4 408 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4 409 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 410 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0 411 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 412 ; SSSE3-NEXT: pand %xmm6, %xmm7 413 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 414 ; SSSE3-NEXT: por %xmm7, %xmm0 415 ; SSSE3-NEXT: pand %xmm0, %xmm1 416 ; SSSE3-NEXT: pandn %xmm8, %xmm0 417 ; SSSE3-NEXT: por %xmm1, %xmm0 418 ; SSSE3-NEXT: movdqa %xmm2, %xmm1 419 ; SSSE3-NEXT: pxor %xmm10, %xmm1 420 ; SSSE3-NEXT: movdqa %xmm9, %xmm4 421 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 422 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 423 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1 424 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 425 ; SSSE3-NEXT: pand %xmm6, %xmm1 426 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3] 427 ; SSSE3-NEXT: por %xmm1, %xmm6 428 ; SSSE3-NEXT: pand %xmm6, %xmm2 429 ; SSSE3-NEXT: pandn %xmm8, %xmm6 430 ; SSSE3-NEXT: por %xmm2, %xmm6 431 ; SSSE3-NEXT: movdqa %xmm3, %xmm1 432 ; SSSE3-NEXT: pxor %xmm10, %xmm1 433 ; SSSE3-NEXT: movdqa %xmm9, %xmm2 434 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 435 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 436 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1 437 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 438 ; SSSE3-NEXT: pand %xmm4, %xmm1 439 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 440 ; SSSE3-NEXT: por %xmm1, %xmm2 441 ; SSSE3-NEXT: pand %xmm2, %xmm3 442 ; SSSE3-NEXT: pandn %xmm8, %xmm2 443 ; SSSE3-NEXT: por %xmm3, %xmm2 444 ; SSSE3-NEXT: movdqa %xmm2, %xmm1 445 ; SSSE3-NEXT: pxor %xmm10, %xmm1 446 ; SSSE3-NEXT: movdqa %xmm1, %xmm3 447 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm3 448 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 449 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1 450 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 451 ; SSSE3-NEXT: pand %xmm4, %xmm1 452 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 453 ; SSSE3-NEXT: por %xmm1, %xmm3 454 ; SSSE3-NEXT: pand %xmm2, %xmm3 455 ; SSSE3-NEXT: movdqa %xmm6, %xmm1 456 ; SSSE3-NEXT: pxor %xmm10, %xmm1 457 ; SSSE3-NEXT: movdqa %xmm1, %xmm2 458 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm2 459 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 460 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1 461 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3] 462 ; SSSE3-NEXT: pand %xmm4, %xmm7 463 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 464 ; SSSE3-NEXT: por %xmm7, %xmm1 465 ; SSSE3-NEXT: pand %xmm6, %xmm1 466 ; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2] 467 ; SSSE3-NEXT: movdqa %xmm0, %xmm2 468 ; SSSE3-NEXT: pxor %xmm10, %xmm2 469 ; SSSE3-NEXT: movdqa %xmm2, %xmm3 470 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm3 471 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 472 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2 473 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 474 ; SSSE3-NEXT: pand %xmm4, %xmm2 475 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 476 ; SSSE3-NEXT: por %xmm2, %xmm3 477 ; SSSE3-NEXT: pand %xmm0, %xmm3 478 ; SSSE3-NEXT: movdqa %xmm5, %xmm0 479 ; SSSE3-NEXT: pxor %xmm10, %xmm0 480 ; SSSE3-NEXT: movdqa %xmm0, %xmm2 481 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm2 482 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 483 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0 484 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 485 ; SSSE3-NEXT: pand %xmm4, %xmm6 486 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 487 ; SSSE3-NEXT: por %xmm6, %xmm0 488 ; SSSE3-NEXT: pand %xmm5, %xmm0 489 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2] 490 ; SSSE3-NEXT: retq 491 ; 492 ; SSE41-LABEL: trunc_packus_v8i64_v8i32: 493 ; SSE41: # %bb.0: 494 ; SSE41-NEXT: movdqa %xmm0, %xmm4 495 ; SSE41-NEXT: movapd {{.*#+}} xmm7 = [4294967295,4294967295] 496 ; SSE41-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0] 497 ; SSE41-NEXT: pxor %xmm10, %xmm0 498 ; SSE41-NEXT: movdqa {{.*#+}} xmm11 = [2147483647,2147483647] 499 ; SSE41-NEXT: movdqa %xmm11, %xmm6 500 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 501 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2] 502 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 503 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 504 ; SSE41-NEXT: pand %xmm8, %xmm5 505 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 506 ; SSE41-NEXT: por %xmm5, %xmm0 507 ; SSE41-NEXT: movapd %xmm7, %xmm8 508 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm8 509 ; SSE41-NEXT: movdqa %xmm1, %xmm0 510 ; SSE41-NEXT: pxor %xmm10, %xmm0 511 ; SSE41-NEXT: movdqa %xmm11, %xmm4 512 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 513 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 514 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 515 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 516 ; SSE41-NEXT: pand %xmm5, %xmm6 517 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 518 ; SSE41-NEXT: por %xmm6, %xmm0 519 ; SSE41-NEXT: movapd %xmm7, %xmm9 520 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm9 521 ; SSE41-NEXT: movdqa %xmm2, %xmm0 522 ; SSE41-NEXT: pxor %xmm10, %xmm0 523 ; SSE41-NEXT: movdqa %xmm11, %xmm1 524 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 525 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2] 526 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 527 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 528 ; SSE41-NEXT: pand %xmm4, %xmm5 529 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 530 ; SSE41-NEXT: por %xmm5, %xmm0 531 ; SSE41-NEXT: movapd %xmm7, %xmm4 532 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4 533 ; SSE41-NEXT: movdqa %xmm3, %xmm0 534 ; SSE41-NEXT: pxor %xmm10, %xmm0 535 ; SSE41-NEXT: movdqa %xmm11, %xmm1 536 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 537 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2] 538 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 539 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 540 ; SSE41-NEXT: pand %xmm2, %xmm5 541 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 542 ; SSE41-NEXT: por %xmm5, %xmm0 543 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm7 544 ; SSE41-NEXT: pxor %xmm2, %xmm2 545 ; SSE41-NEXT: movapd %xmm7, %xmm0 546 ; SSE41-NEXT: xorpd %xmm10, %xmm0 547 ; SSE41-NEXT: movapd %xmm0, %xmm1 548 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm1 549 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2] 550 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 551 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 552 ; SSE41-NEXT: pand %xmm3, %xmm5 553 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 554 ; SSE41-NEXT: por %xmm5, %xmm0 555 ; SSE41-NEXT: pxor %xmm3, %xmm3 556 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm3 557 ; SSE41-NEXT: movapd %xmm4, %xmm0 558 ; SSE41-NEXT: xorpd %xmm10, %xmm0 559 ; SSE41-NEXT: movapd %xmm0, %xmm1 560 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm1 561 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] 562 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 563 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 564 ; SSE41-NEXT: pand %xmm5, %xmm6 565 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 566 ; SSE41-NEXT: por %xmm6, %xmm0 567 ; SSE41-NEXT: pxor %xmm1, %xmm1 568 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm1 569 ; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2] 570 ; SSE41-NEXT: movapd %xmm9, %xmm0 571 ; SSE41-NEXT: xorpd %xmm10, %xmm0 572 ; SSE41-NEXT: movapd %xmm0, %xmm3 573 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm3 574 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 575 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 576 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 577 ; SSE41-NEXT: pand %xmm4, %xmm5 578 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 579 ; SSE41-NEXT: por %xmm5, %xmm0 580 ; SSE41-NEXT: pxor %xmm3, %xmm3 581 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm3 582 ; SSE41-NEXT: movapd %xmm8, %xmm0 583 ; SSE41-NEXT: xorpd %xmm10, %xmm0 584 ; SSE41-NEXT: movapd %xmm0, %xmm4 585 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm4 586 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 587 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 588 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 589 ; SSE41-NEXT: pand %xmm5, %xmm6 590 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 591 ; SSE41-NEXT: por %xmm6, %xmm0 592 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm2 593 ; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2] 594 ; SSE41-NEXT: movaps %xmm2, %xmm0 595 ; SSE41-NEXT: retq 596 ; 597 ; AVX1-LABEL: trunc_packus_v8i64_v8i32: 598 ; AVX1: # %bb.0: 599 ; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295] 600 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 601 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [4294967295,4294967295] 602 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 603 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm5 604 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm5, %ymm3 605 ; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 606 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 607 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 608 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm4 609 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 610 ; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 611 ; AVX1-NEXT: vxorpd %xmm2, %xmm2, %xmm2 612 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm3 613 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 614 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm5 615 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm6 616 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 617 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm7, %xmm2 618 ; AVX1-NEXT: vpand %xmm7, %xmm2, %xmm2 619 ; AVX1-NEXT: vpand %xmm1, %xmm6, %xmm1 620 ; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2] 621 ; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm2 622 ; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm0 623 ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2] 624 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 625 ; AVX1-NEXT: retq 626 ; 627 ; AVX2-SLOW-LABEL: trunc_packus_v8i64_v8i32: 628 ; AVX2-SLOW: # %bb.0: 629 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295] 630 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3 631 ; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 632 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3 633 ; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 634 ; AVX2-SLOW-NEXT: vpxor %xmm2, %xmm2, %xmm2 635 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3 636 ; AVX2-SLOW-NEXT: vpand %ymm1, %ymm3, %ymm1 637 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2 638 ; AVX2-SLOW-NEXT: vpand %ymm0, %ymm2, %ymm0 639 ; AVX2-SLOW-NEXT: vpshufd {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7] 640 ; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 641 ; AVX2-SLOW-NEXT: vpshufd {{.*#+}} ymm1 = ymm1[0,2,2,3,4,6,6,7] 642 ; AVX2-SLOW-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] 643 ; AVX2-SLOW-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 644 ; AVX2-SLOW-NEXT: retq 645 ; 646 ; AVX2-FAST-LABEL: trunc_packus_v8i64_v8i32: 647 ; AVX2-FAST: # %bb.0: 648 ; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295] 649 ; AVX2-FAST-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3 650 ; AVX2-FAST-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 651 ; AVX2-FAST-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3 652 ; AVX2-FAST-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 653 ; AVX2-FAST-NEXT: vpxor %xmm2, %xmm2, %xmm2 654 ; AVX2-FAST-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3 655 ; AVX2-FAST-NEXT: vpand %ymm1, %ymm3, %ymm1 656 ; AVX2-FAST-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2 657 ; AVX2-FAST-NEXT: vpand %ymm0, %ymm2, %ymm0 658 ; AVX2-FAST-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7] 659 ; AVX2-FAST-NEXT: vpermd %ymm0, %ymm2, %ymm0 660 ; AVX2-FAST-NEXT: vpermd %ymm1, %ymm2, %ymm1 661 ; AVX2-FAST-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 662 ; AVX2-FAST-NEXT: retq 663 ; 664 ; AVX512-LABEL: trunc_packus_v8i64_v8i32: 665 ; AVX512: # %bb.0: 666 ; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 667 ; AVX512-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 668 ; AVX512-NEXT: vpmovusqd %zmm0, %ymm0 669 ; AVX512-NEXT: retq 670 %1 = icmp slt <8 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 671 %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> 672 %3 = icmp sgt <8 x i64> %2, zeroinitializer 673 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer 674 %5 = trunc <8 x i64> %4 to <8 x i32> 675 ret <8 x i32> %5 676 } 677 678 ; 679 ; PACKUS saturation truncation to vXi16 680 ; 681 682 define <8 x i16> @trunc_packus_v8i64_v8i16(<8 x i64> %a0) { 683 ; SSE2-LABEL: trunc_packus_v8i64_v8i16: 684 ; SSE2: # %bb.0: 685 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535] 686 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0] 687 ; SSE2-NEXT: movdqa %xmm1, %xmm5 688 ; SSE2-NEXT: pxor %xmm10, %xmm5 689 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147549183,2147549183] 690 ; SSE2-NEXT: movdqa %xmm9, %xmm6 691 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm6 692 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 693 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm5 694 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 695 ; SSE2-NEXT: pand %xmm7, %xmm4 696 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 697 ; SSE2-NEXT: por %xmm4, %xmm5 698 ; SSE2-NEXT: pand %xmm5, %xmm1 699 ; SSE2-NEXT: pandn %xmm8, %xmm5 700 ; SSE2-NEXT: por %xmm1, %xmm5 701 ; SSE2-NEXT: movdqa %xmm0, %xmm1 702 ; SSE2-NEXT: pxor %xmm10, %xmm1 703 ; SSE2-NEXT: movdqa %xmm9, %xmm4 704 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 705 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 706 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1 707 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3] 708 ; SSE2-NEXT: pand %xmm6, %xmm7 709 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3] 710 ; SSE2-NEXT: por %xmm7, %xmm1 711 ; SSE2-NEXT: pand %xmm1, %xmm0 712 ; SSE2-NEXT: pandn %xmm8, %xmm1 713 ; SSE2-NEXT: por %xmm0, %xmm1 714 ; SSE2-NEXT: movdqa %xmm3, %xmm0 715 ; SSE2-NEXT: pxor %xmm10, %xmm0 716 ; SSE2-NEXT: movdqa %xmm9, %xmm4 717 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 718 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 719 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0 720 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 721 ; SSE2-NEXT: pand %xmm6, %xmm0 722 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3] 723 ; SSE2-NEXT: por %xmm0, %xmm6 724 ; SSE2-NEXT: pand %xmm6, %xmm3 725 ; SSE2-NEXT: pandn %xmm8, %xmm6 726 ; SSE2-NEXT: por %xmm3, %xmm6 727 ; SSE2-NEXT: movdqa %xmm2, %xmm0 728 ; SSE2-NEXT: pxor %xmm10, %xmm0 729 ; SSE2-NEXT: movdqa %xmm9, %xmm3 730 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 731 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 732 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0 733 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 734 ; SSE2-NEXT: pand %xmm4, %xmm0 735 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 736 ; SSE2-NEXT: por %xmm0, %xmm3 737 ; SSE2-NEXT: pand %xmm3, %xmm2 738 ; SSE2-NEXT: pandn %xmm8, %xmm3 739 ; SSE2-NEXT: por %xmm2, %xmm3 740 ; SSE2-NEXT: movdqa %xmm3, %xmm0 741 ; SSE2-NEXT: pxor %xmm10, %xmm0 742 ; SSE2-NEXT: movdqa %xmm0, %xmm2 743 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm2 744 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 745 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 746 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 747 ; SSE2-NEXT: pand %xmm4, %xmm7 748 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 749 ; SSE2-NEXT: por %xmm7, %xmm0 750 ; SSE2-NEXT: pand %xmm3, %xmm0 751 ; SSE2-NEXT: movdqa %xmm6, %xmm2 752 ; SSE2-NEXT: pxor %xmm10, %xmm2 753 ; SSE2-NEXT: movdqa %xmm2, %xmm3 754 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm3 755 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 756 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm2 757 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 758 ; SSE2-NEXT: pand %xmm4, %xmm7 759 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3] 760 ; SSE2-NEXT: por %xmm7, %xmm2 761 ; SSE2-NEXT: pand %xmm6, %xmm2 762 ; SSE2-NEXT: movdqa %xmm1, %xmm3 763 ; SSE2-NEXT: pxor %xmm10, %xmm3 764 ; SSE2-NEXT: movdqa %xmm3, %xmm4 765 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm4 766 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 767 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm3 768 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 769 ; SSE2-NEXT: pand %xmm6, %xmm3 770 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 771 ; SSE2-NEXT: por %xmm3, %xmm4 772 ; SSE2-NEXT: pand %xmm1, %xmm4 773 ; SSE2-NEXT: movdqa %xmm5, %xmm1 774 ; SSE2-NEXT: pxor %xmm10, %xmm1 775 ; SSE2-NEXT: movdqa %xmm1, %xmm3 776 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm3 777 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 778 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 779 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 780 ; SSE2-NEXT: pand %xmm6, %xmm1 781 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 782 ; SSE2-NEXT: por %xmm1, %xmm3 783 ; SSE2-NEXT: pand %xmm5, %xmm3 784 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3] 785 ; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 786 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[0,2,2,3] 787 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,2,2,3,4,5,6,7] 788 ; SSE2-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1] 789 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3] 790 ; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,0,2,4,5,6,7] 791 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 792 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 793 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 794 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm3[0],xmm0[1] 795 ; SSE2-NEXT: retq 796 ; 797 ; SSSE3-LABEL: trunc_packus_v8i64_v8i16: 798 ; SSSE3: # %bb.0: 799 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535] 800 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0] 801 ; SSSE3-NEXT: movdqa %xmm1, %xmm5 802 ; SSSE3-NEXT: pxor %xmm10, %xmm5 803 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [2147549183,2147549183] 804 ; SSSE3-NEXT: movdqa %xmm9, %xmm6 805 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm6 806 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 807 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5 808 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 809 ; SSSE3-NEXT: pand %xmm7, %xmm4 810 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 811 ; SSSE3-NEXT: por %xmm4, %xmm5 812 ; SSSE3-NEXT: pand %xmm5, %xmm1 813 ; SSSE3-NEXT: pandn %xmm8, %xmm5 814 ; SSSE3-NEXT: por %xmm1, %xmm5 815 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 816 ; SSSE3-NEXT: pxor %xmm10, %xmm1 817 ; SSSE3-NEXT: movdqa %xmm9, %xmm4 818 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 819 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 820 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1 821 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3] 822 ; SSSE3-NEXT: pand %xmm6, %xmm7 823 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3] 824 ; SSSE3-NEXT: por %xmm7, %xmm1 825 ; SSSE3-NEXT: pand %xmm1, %xmm0 826 ; SSSE3-NEXT: pandn %xmm8, %xmm1 827 ; SSSE3-NEXT: por %xmm0, %xmm1 828 ; SSSE3-NEXT: movdqa %xmm3, %xmm0 829 ; SSSE3-NEXT: pxor %xmm10, %xmm0 830 ; SSSE3-NEXT: movdqa %xmm9, %xmm4 831 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4 832 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 833 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0 834 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 835 ; SSSE3-NEXT: pand %xmm6, %xmm0 836 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3] 837 ; SSSE3-NEXT: por %xmm0, %xmm6 838 ; SSSE3-NEXT: pand %xmm6, %xmm3 839 ; SSSE3-NEXT: pandn %xmm8, %xmm6 840 ; SSSE3-NEXT: por %xmm3, %xmm6 841 ; SSSE3-NEXT: movdqa %xmm2, %xmm0 842 ; SSSE3-NEXT: pxor %xmm10, %xmm0 843 ; SSSE3-NEXT: movdqa %xmm9, %xmm3 844 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm3 845 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 846 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0 847 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 848 ; SSSE3-NEXT: pand %xmm4, %xmm0 849 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 850 ; SSSE3-NEXT: por %xmm0, %xmm3 851 ; SSSE3-NEXT: pand %xmm3, %xmm2 852 ; SSSE3-NEXT: pandn %xmm8, %xmm3 853 ; SSSE3-NEXT: por %xmm2, %xmm3 854 ; SSSE3-NEXT: movdqa %xmm3, %xmm0 855 ; SSSE3-NEXT: pxor %xmm10, %xmm0 856 ; SSSE3-NEXT: movdqa %xmm0, %xmm2 857 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm2 858 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 859 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0 860 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 861 ; SSSE3-NEXT: pand %xmm4, %xmm7 862 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 863 ; SSSE3-NEXT: por %xmm7, %xmm0 864 ; SSSE3-NEXT: pand %xmm3, %xmm0 865 ; SSSE3-NEXT: movdqa %xmm6, %xmm2 866 ; SSSE3-NEXT: pxor %xmm10, %xmm2 867 ; SSSE3-NEXT: movdqa %xmm2, %xmm3 868 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm3 869 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 870 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2 871 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 872 ; SSSE3-NEXT: pand %xmm4, %xmm7 873 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3] 874 ; SSSE3-NEXT: por %xmm7, %xmm2 875 ; SSSE3-NEXT: pand %xmm6, %xmm2 876 ; SSSE3-NEXT: movdqa %xmm1, %xmm3 877 ; SSSE3-NEXT: pxor %xmm10, %xmm3 878 ; SSSE3-NEXT: movdqa %xmm3, %xmm4 879 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm4 880 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 881 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm3 882 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 883 ; SSSE3-NEXT: pand %xmm6, %xmm3 884 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 885 ; SSSE3-NEXT: por %xmm3, %xmm4 886 ; SSSE3-NEXT: pand %xmm1, %xmm4 887 ; SSSE3-NEXT: movdqa %xmm5, %xmm1 888 ; SSSE3-NEXT: pxor %xmm10, %xmm1 889 ; SSSE3-NEXT: movdqa %xmm1, %xmm3 890 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm3 891 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 892 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1 893 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 894 ; SSSE3-NEXT: pand %xmm6, %xmm1 895 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 896 ; SSSE3-NEXT: por %xmm1, %xmm3 897 ; SSSE3-NEXT: pand %xmm5, %xmm3 898 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3] 899 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 900 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[0,2,2,3] 901 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,2,2,3,4,5,6,7] 902 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1] 903 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3] 904 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,0,2,4,5,6,7] 905 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 906 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 907 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 908 ; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm3[0],xmm0[1] 909 ; SSSE3-NEXT: retq 910 ; 911 ; SSE41-LABEL: trunc_packus_v8i64_v8i16: 912 ; SSE41: # %bb.0: 913 ; SSE41-NEXT: movdqa %xmm0, %xmm9 914 ; SSE41-NEXT: movapd {{.*#+}} xmm7 = [65535,65535] 915 ; SSE41-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0] 916 ; SSE41-NEXT: movdqa %xmm2, %xmm0 917 ; SSE41-NEXT: pxor %xmm10, %xmm0 918 ; SSE41-NEXT: movdqa {{.*#+}} xmm11 = [2147549183,2147549183] 919 ; SSE41-NEXT: movdqa %xmm11, %xmm4 920 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 921 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 922 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 923 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 924 ; SSE41-NEXT: pand %xmm5, %xmm6 925 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 926 ; SSE41-NEXT: por %xmm6, %xmm0 927 ; SSE41-NEXT: movapd %xmm7, %xmm8 928 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm8 929 ; SSE41-NEXT: movdqa %xmm3, %xmm0 930 ; SSE41-NEXT: pxor %xmm10, %xmm0 931 ; SSE41-NEXT: movdqa %xmm11, %xmm2 932 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 933 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 934 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 935 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 936 ; SSE41-NEXT: pand %xmm4, %xmm5 937 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 938 ; SSE41-NEXT: por %xmm5, %xmm0 939 ; SSE41-NEXT: movapd %xmm7, %xmm2 940 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2 941 ; SSE41-NEXT: movdqa %xmm9, %xmm0 942 ; SSE41-NEXT: pxor %xmm10, %xmm0 943 ; SSE41-NEXT: movdqa %xmm11, %xmm3 944 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3 945 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 946 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 947 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 948 ; SSE41-NEXT: pand %xmm4, %xmm5 949 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 950 ; SSE41-NEXT: por %xmm5, %xmm0 951 ; SSE41-NEXT: movapd %xmm7, %xmm4 952 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm4 953 ; SSE41-NEXT: movdqa %xmm1, %xmm0 954 ; SSE41-NEXT: pxor %xmm10, %xmm0 955 ; SSE41-NEXT: movdqa %xmm11, %xmm3 956 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3 957 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2] 958 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 959 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 960 ; SSE41-NEXT: pand %xmm5, %xmm6 961 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 962 ; SSE41-NEXT: por %xmm6, %xmm0 963 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm7 964 ; SSE41-NEXT: pxor %xmm3, %xmm3 965 ; SSE41-NEXT: movapd %xmm7, %xmm0 966 ; SSE41-NEXT: xorpd %xmm10, %xmm0 967 ; SSE41-NEXT: movapd %xmm0, %xmm1 968 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm1 969 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] 970 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 971 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 972 ; SSE41-NEXT: pand %xmm5, %xmm6 973 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 974 ; SSE41-NEXT: por %xmm6, %xmm0 975 ; SSE41-NEXT: pxor %xmm5, %xmm5 976 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm5 977 ; SSE41-NEXT: movapd %xmm4, %xmm0 978 ; SSE41-NEXT: xorpd %xmm10, %xmm0 979 ; SSE41-NEXT: movapd %xmm0, %xmm1 980 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm1 981 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2] 982 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 983 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 984 ; SSE41-NEXT: pand %xmm6, %xmm7 985 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 986 ; SSE41-NEXT: por %xmm7, %xmm0 987 ; SSE41-NEXT: pxor %xmm1, %xmm1 988 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm1 989 ; SSE41-NEXT: packusdw %xmm5, %xmm1 990 ; SSE41-NEXT: movapd %xmm2, %xmm0 991 ; SSE41-NEXT: xorpd %xmm10, %xmm0 992 ; SSE41-NEXT: movapd %xmm0, %xmm4 993 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm4 994 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 995 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 996 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 997 ; SSE41-NEXT: pand %xmm5, %xmm6 998 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 999 ; SSE41-NEXT: por %xmm6, %xmm0 1000 ; SSE41-NEXT: pxor %xmm4, %xmm4 1001 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4 1002 ; SSE41-NEXT: movapd %xmm8, %xmm0 1003 ; SSE41-NEXT: xorpd %xmm10, %xmm0 1004 ; SSE41-NEXT: movapd %xmm0, %xmm2 1005 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm2 1006 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2] 1007 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 1008 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 1009 ; SSE41-NEXT: pand %xmm5, %xmm6 1010 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 1011 ; SSE41-NEXT: por %xmm6, %xmm0 1012 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm3 1013 ; SSE41-NEXT: packusdw %xmm4, %xmm3 1014 ; SSE41-NEXT: packusdw %xmm3, %xmm1 1015 ; SSE41-NEXT: movdqa %xmm1, %xmm0 1016 ; SSE41-NEXT: retq 1017 ; 1018 ; AVX1-LABEL: trunc_packus_v8i64_v8i16: 1019 ; AVX1: # %bb.0: 1020 ; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [65535,65535,65535,65535] 1021 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1022 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [65535,65535] 1023 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 1024 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm5 1025 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm5, %ymm3 1026 ; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 1027 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1028 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 1029 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm4 1030 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 1031 ; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 1032 ; AVX1-NEXT: vxorpd %xmm2, %xmm2, %xmm2 1033 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm3 1034 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 1035 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm5 1036 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm6 1037 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 1038 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm7, %xmm2 1039 ; AVX1-NEXT: vpand %xmm7, %xmm2, %xmm2 1040 ; AVX1-NEXT: vpand %xmm1, %xmm6, %xmm1 1041 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 1042 ; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm2 1043 ; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm0 1044 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 1045 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1046 ; AVX1-NEXT: vzeroupper 1047 ; AVX1-NEXT: retq 1048 ; 1049 ; AVX2-LABEL: trunc_packus_v8i64_v8i16: 1050 ; AVX2: # %bb.0: 1051 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [65535,65535,65535,65535] 1052 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3 1053 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 1054 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3 1055 ; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 1056 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1057 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3 1058 ; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm1 1059 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2 1060 ; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm0 1061 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 1062 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 1063 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1064 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1065 ; AVX2-NEXT: vzeroupper 1066 ; AVX2-NEXT: retq 1067 ; 1068 ; AVX512-LABEL: trunc_packus_v8i64_v8i16: 1069 ; AVX512: # %bb.0: 1070 ; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 1071 ; AVX512-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 1072 ; AVX512-NEXT: vpmovusqw %zmm0, %xmm0 1073 ; AVX512-NEXT: vzeroupper 1074 ; AVX512-NEXT: retq 1075 %1 = icmp slt <8 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535> 1076 %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> 1077 %3 = icmp sgt <8 x i64> %2, zeroinitializer 1078 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer 1079 %5 = trunc <8 x i64> %4 to <8 x i16> 1080 ret <8 x i16> %5 1081 } 1082 1083 define <8 x i16> @trunc_packus_v8i32_v8i16(<8 x i32> %a0) { 1084 ; SSE2-LABEL: trunc_packus_v8i32_v8i16: 1085 ; SSE2: # %bb.0: 1086 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535] 1087 ; SSE2-NEXT: movdqa %xmm2, %xmm3 1088 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 1089 ; SSE2-NEXT: pand %xmm3, %xmm1 1090 ; SSE2-NEXT: pandn %xmm2, %xmm3 1091 ; SSE2-NEXT: por %xmm1, %xmm3 1092 ; SSE2-NEXT: movdqa %xmm2, %xmm1 1093 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 1094 ; SSE2-NEXT: pand %xmm1, %xmm0 1095 ; SSE2-NEXT: pandn %xmm2, %xmm1 1096 ; SSE2-NEXT: por %xmm0, %xmm1 1097 ; SSE2-NEXT: pxor %xmm2, %xmm2 1098 ; SSE2-NEXT: movdqa %xmm1, %xmm0 1099 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm0 1100 ; SSE2-NEXT: pand %xmm1, %xmm0 1101 ; SSE2-NEXT: movdqa %xmm3, %xmm1 1102 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 1103 ; SSE2-NEXT: pand %xmm3, %xmm1 1104 ; SSE2-NEXT: pslld $16, %xmm1 1105 ; SSE2-NEXT: psrad $16, %xmm1 1106 ; SSE2-NEXT: pslld $16, %xmm0 1107 ; SSE2-NEXT: psrad $16, %xmm0 1108 ; SSE2-NEXT: packssdw %xmm1, %xmm0 1109 ; SSE2-NEXT: retq 1110 ; 1111 ; SSSE3-LABEL: trunc_packus_v8i32_v8i16: 1112 ; SSSE3: # %bb.0: 1113 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535] 1114 ; SSSE3-NEXT: movdqa %xmm2, %xmm3 1115 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3 1116 ; SSSE3-NEXT: pand %xmm3, %xmm1 1117 ; SSSE3-NEXT: pandn %xmm2, %xmm3 1118 ; SSSE3-NEXT: por %xmm1, %xmm3 1119 ; SSSE3-NEXT: movdqa %xmm2, %xmm1 1120 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm1 1121 ; SSSE3-NEXT: pand %xmm1, %xmm0 1122 ; SSSE3-NEXT: pandn %xmm2, %xmm1 1123 ; SSSE3-NEXT: por %xmm0, %xmm1 1124 ; SSSE3-NEXT: pxor %xmm2, %xmm2 1125 ; SSSE3-NEXT: movdqa %xmm1, %xmm0 1126 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0 1127 ; SSSE3-NEXT: pand %xmm1, %xmm0 1128 ; SSSE3-NEXT: movdqa %xmm3, %xmm1 1129 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 1130 ; SSSE3-NEXT: pand %xmm3, %xmm1 1131 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 1132 ; SSSE3-NEXT: pshufb %xmm2, %xmm1 1133 ; SSSE3-NEXT: pshufb %xmm2, %xmm0 1134 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1135 ; SSSE3-NEXT: retq 1136 ; 1137 ; SSE41-LABEL: trunc_packus_v8i32_v8i16: 1138 ; SSE41: # %bb.0: 1139 ; SSE41-NEXT: packusdw %xmm1, %xmm0 1140 ; SSE41-NEXT: retq 1141 ; 1142 ; AVX1-LABEL: trunc_packus_v8i32_v8i16: 1143 ; AVX1: # %bb.0: 1144 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1145 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1146 ; AVX1-NEXT: vzeroupper 1147 ; AVX1-NEXT: retq 1148 ; 1149 ; AVX2-LABEL: trunc_packus_v8i32_v8i16: 1150 ; AVX2: # %bb.0: 1151 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1152 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1153 ; AVX2-NEXT: vzeroupper 1154 ; AVX2-NEXT: retq 1155 ; 1156 ; AVX512F-LABEL: trunc_packus_v8i32_v8i16: 1157 ; AVX512F: # %bb.0: 1158 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535] 1159 ; AVX512F-NEXT: vpminsd %ymm1, %ymm0, %ymm0 1160 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 1161 ; AVX512F-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 1162 ; AVX512F-NEXT: vpmovdw %zmm0, %ymm0 1163 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 1164 ; AVX512F-NEXT: vzeroupper 1165 ; AVX512F-NEXT: retq 1166 ; 1167 ; AVX512VL-LABEL: trunc_packus_v8i32_v8i16: 1168 ; AVX512VL: # %bb.0: 1169 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1170 ; AVX512VL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 1171 ; AVX512VL-NEXT: vpmovusdw %ymm0, %xmm0 1172 ; AVX512VL-NEXT: vzeroupper 1173 ; AVX512VL-NEXT: retq 1174 ; 1175 ; AVX512BW-LABEL: trunc_packus_v8i32_v8i16: 1176 ; AVX512BW: # %bb.0: 1177 ; AVX512BW-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535] 1178 ; AVX512BW-NEXT: vpminsd %ymm1, %ymm0, %ymm0 1179 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 1180 ; AVX512BW-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 1181 ; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0 1182 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 1183 ; AVX512BW-NEXT: vzeroupper 1184 ; AVX512BW-NEXT: retq 1185 ; 1186 ; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i16: 1187 ; AVX512BWVL: # %bb.0: 1188 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1189 ; AVX512BWVL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 1190 ; AVX512BWVL-NEXT: vpmovusdw %ymm0, %xmm0 1191 ; AVX512BWVL-NEXT: vzeroupper 1192 ; AVX512BWVL-NEXT: retq 1193 %1 = icmp slt <8 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 1194 %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> 1195 %3 = icmp sgt <8 x i32> %2, zeroinitializer 1196 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer 1197 %5 = trunc <8 x i32> %4 to <8 x i16> 1198 ret <8 x i16> %5 1199 } 1200 1201 define <16 x i16> @trunc_packus_v16i32_v16i16(<16 x i32> %a0) { 1202 ; SSE2-LABEL: trunc_packus_v16i32_v16i16: 1203 ; SSE2: # %bb.0: 1204 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [65535,65535,65535,65535] 1205 ; SSE2-NEXT: movdqa %xmm6, %xmm4 1206 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 1207 ; SSE2-NEXT: pand %xmm4, %xmm1 1208 ; SSE2-NEXT: pandn %xmm6, %xmm4 1209 ; SSE2-NEXT: por %xmm1, %xmm4 1210 ; SSE2-NEXT: movdqa %xmm6, %xmm5 1211 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm5 1212 ; SSE2-NEXT: pand %xmm5, %xmm0 1213 ; SSE2-NEXT: pandn %xmm6, %xmm5 1214 ; SSE2-NEXT: por %xmm0, %xmm5 1215 ; SSE2-NEXT: movdqa %xmm6, %xmm0 1216 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm0 1217 ; SSE2-NEXT: pand %xmm0, %xmm3 1218 ; SSE2-NEXT: pandn %xmm6, %xmm0 1219 ; SSE2-NEXT: por %xmm3, %xmm0 1220 ; SSE2-NEXT: movdqa %xmm6, %xmm3 1221 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3 1222 ; SSE2-NEXT: pand %xmm3, %xmm2 1223 ; SSE2-NEXT: pandn %xmm6, %xmm3 1224 ; SSE2-NEXT: por %xmm2, %xmm3 1225 ; SSE2-NEXT: pxor %xmm2, %xmm2 1226 ; SSE2-NEXT: movdqa %xmm3, %xmm1 1227 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 1228 ; SSE2-NEXT: pand %xmm3, %xmm1 1229 ; SSE2-NEXT: movdqa %xmm0, %xmm3 1230 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3 1231 ; SSE2-NEXT: pand %xmm0, %xmm3 1232 ; SSE2-NEXT: movdqa %xmm5, %xmm0 1233 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm0 1234 ; SSE2-NEXT: pand %xmm5, %xmm0 1235 ; SSE2-NEXT: movdqa %xmm4, %xmm5 1236 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm5 1237 ; SSE2-NEXT: pand %xmm4, %xmm5 1238 ; SSE2-NEXT: pslld $16, %xmm5 1239 ; SSE2-NEXT: psrad $16, %xmm5 1240 ; SSE2-NEXT: pslld $16, %xmm0 1241 ; SSE2-NEXT: psrad $16, %xmm0 1242 ; SSE2-NEXT: packssdw %xmm5, %xmm0 1243 ; SSE2-NEXT: pslld $16, %xmm3 1244 ; SSE2-NEXT: psrad $16, %xmm3 1245 ; SSE2-NEXT: pslld $16, %xmm1 1246 ; SSE2-NEXT: psrad $16, %xmm1 1247 ; SSE2-NEXT: packssdw %xmm3, %xmm1 1248 ; SSE2-NEXT: retq 1249 ; 1250 ; SSSE3-LABEL: trunc_packus_v16i32_v16i16: 1251 ; SSSE3: # %bb.0: 1252 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [65535,65535,65535,65535] 1253 ; SSSE3-NEXT: movdqa %xmm6, %xmm4 1254 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 1255 ; SSSE3-NEXT: pand %xmm4, %xmm1 1256 ; SSSE3-NEXT: pandn %xmm6, %xmm4 1257 ; SSSE3-NEXT: por %xmm1, %xmm4 1258 ; SSSE3-NEXT: movdqa %xmm6, %xmm5 1259 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm5 1260 ; SSSE3-NEXT: pand %xmm5, %xmm0 1261 ; SSSE3-NEXT: pandn %xmm6, %xmm5 1262 ; SSSE3-NEXT: por %xmm0, %xmm5 1263 ; SSSE3-NEXT: movdqa %xmm6, %xmm0 1264 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0 1265 ; SSSE3-NEXT: pand %xmm0, %xmm3 1266 ; SSSE3-NEXT: pandn %xmm6, %xmm0 1267 ; SSSE3-NEXT: por %xmm3, %xmm0 1268 ; SSSE3-NEXT: movdqa %xmm6, %xmm3 1269 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3 1270 ; SSSE3-NEXT: pand %xmm3, %xmm2 1271 ; SSSE3-NEXT: pandn %xmm6, %xmm3 1272 ; SSSE3-NEXT: por %xmm2, %xmm3 1273 ; SSSE3-NEXT: pxor %xmm2, %xmm2 1274 ; SSSE3-NEXT: movdqa %xmm3, %xmm1 1275 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 1276 ; SSSE3-NEXT: pand %xmm3, %xmm1 1277 ; SSSE3-NEXT: movdqa %xmm0, %xmm3 1278 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3 1279 ; SSSE3-NEXT: pand %xmm0, %xmm3 1280 ; SSSE3-NEXT: movdqa %xmm5, %xmm0 1281 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0 1282 ; SSSE3-NEXT: pand %xmm5, %xmm0 1283 ; SSSE3-NEXT: movdqa %xmm4, %xmm5 1284 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5 1285 ; SSSE3-NEXT: pand %xmm4, %xmm5 1286 ; SSSE3-NEXT: pslld $16, %xmm5 1287 ; SSSE3-NEXT: psrad $16, %xmm5 1288 ; SSSE3-NEXT: pslld $16, %xmm0 1289 ; SSSE3-NEXT: psrad $16, %xmm0 1290 ; SSSE3-NEXT: packssdw %xmm5, %xmm0 1291 ; SSSE3-NEXT: pslld $16, %xmm3 1292 ; SSSE3-NEXT: psrad $16, %xmm3 1293 ; SSSE3-NEXT: pslld $16, %xmm1 1294 ; SSSE3-NEXT: psrad $16, %xmm1 1295 ; SSSE3-NEXT: packssdw %xmm3, %xmm1 1296 ; SSSE3-NEXT: retq 1297 ; 1298 ; SSE41-LABEL: trunc_packus_v16i32_v16i16: 1299 ; SSE41: # %bb.0: 1300 ; SSE41-NEXT: packusdw %xmm1, %xmm0 1301 ; SSE41-NEXT: packusdw %xmm3, %xmm2 1302 ; SSE41-NEXT: movdqa %xmm2, %xmm1 1303 ; SSE41-NEXT: retq 1304 ; 1305 ; AVX1-LABEL: trunc_packus_v16i32_v16i16: 1306 ; AVX1: # %bb.0: 1307 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1308 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 1309 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1310 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 1311 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1312 ; AVX1-NEXT: retq 1313 ; 1314 ; AVX2-LABEL: trunc_packus_v16i32_v16i16: 1315 ; AVX2: # %bb.0: 1316 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 1317 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 1318 ; AVX2-NEXT: retq 1319 ; 1320 ; AVX512-LABEL: trunc_packus_v16i32_v16i16: 1321 ; AVX512: # %bb.0: 1322 ; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 1323 ; AVX512-NEXT: vpmaxsd %zmm1, %zmm0, %zmm0 1324 ; AVX512-NEXT: vpmovusdw %zmm0, %ymm0 1325 ; AVX512-NEXT: retq 1326 %1 = icmp slt <16 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 1327 %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> 1328 %3 = icmp sgt <16 x i32> %2, zeroinitializer 1329 %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> zeroinitializer 1330 %5 = trunc <16 x i32> %4 to <16 x i16> 1331 ret <16 x i16> %5 1332 } 1333 1334 ; 1335 ; PACKUS saturation truncation to v16i8 1336 ; 1337 1338 define <8 x i8> @trunc_packus_v8i64_v8i8(<8 x i64> %a0) { 1339 ; SSE2-LABEL: trunc_packus_v8i64_v8i8: 1340 ; SSE2: # %bb.0: 1341 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 1342 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0] 1343 ; SSE2-NEXT: movdqa %xmm2, %xmm5 1344 ; SSE2-NEXT: pxor %xmm10, %xmm5 1345 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483903,2147483903] 1346 ; SSE2-NEXT: movdqa %xmm9, %xmm7 1347 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 1348 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2] 1349 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm5 1350 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 1351 ; SSE2-NEXT: pand %xmm6, %xmm4 1352 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] 1353 ; SSE2-NEXT: por %xmm4, %xmm5 1354 ; SSE2-NEXT: pand %xmm5, %xmm2 1355 ; SSE2-NEXT: pandn %xmm8, %xmm5 1356 ; SSE2-NEXT: por %xmm2, %xmm5 1357 ; SSE2-NEXT: movdqa %xmm3, %xmm2 1358 ; SSE2-NEXT: pxor %xmm10, %xmm2 1359 ; SSE2-NEXT: movdqa %xmm9, %xmm4 1360 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 1361 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 1362 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm2 1363 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 1364 ; SSE2-NEXT: pand %xmm6, %xmm7 1365 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 1366 ; SSE2-NEXT: por %xmm7, %xmm2 1367 ; SSE2-NEXT: pand %xmm2, %xmm3 1368 ; SSE2-NEXT: pandn %xmm8, %xmm2 1369 ; SSE2-NEXT: por %xmm3, %xmm2 1370 ; SSE2-NEXT: movdqa %xmm0, %xmm3 1371 ; SSE2-NEXT: pxor %xmm10, %xmm3 1372 ; SSE2-NEXT: movdqa %xmm9, %xmm4 1373 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 1374 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 1375 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm3 1376 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3] 1377 ; SSE2-NEXT: pand %xmm6, %xmm7 1378 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1379 ; SSE2-NEXT: por %xmm7, %xmm3 1380 ; SSE2-NEXT: pand %xmm3, %xmm0 1381 ; SSE2-NEXT: pandn %xmm8, %xmm3 1382 ; SSE2-NEXT: por %xmm0, %xmm3 1383 ; SSE2-NEXT: movdqa %xmm1, %xmm0 1384 ; SSE2-NEXT: pxor %xmm10, %xmm0 1385 ; SSE2-NEXT: movdqa %xmm9, %xmm4 1386 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 1387 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 1388 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0 1389 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1390 ; SSE2-NEXT: pand %xmm6, %xmm0 1391 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1392 ; SSE2-NEXT: por %xmm0, %xmm4 1393 ; SSE2-NEXT: pand %xmm4, %xmm1 1394 ; SSE2-NEXT: pandn %xmm8, %xmm4 1395 ; SSE2-NEXT: por %xmm1, %xmm4 1396 ; SSE2-NEXT: movdqa %xmm4, %xmm0 1397 ; SSE2-NEXT: pxor %xmm10, %xmm0 1398 ; SSE2-NEXT: movdqa %xmm0, %xmm1 1399 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm1 1400 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2] 1401 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 1402 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1403 ; SSE2-NEXT: pand %xmm6, %xmm0 1404 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1405 ; SSE2-NEXT: por %xmm0, %xmm1 1406 ; SSE2-NEXT: pand %xmm4, %xmm1 1407 ; SSE2-NEXT: movdqa %xmm3, %xmm0 1408 ; SSE2-NEXT: pxor %xmm10, %xmm0 1409 ; SSE2-NEXT: movdqa %xmm0, %xmm4 1410 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm4 1411 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 1412 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 1413 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 1414 ; SSE2-NEXT: pand %xmm6, %xmm7 1415 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1416 ; SSE2-NEXT: por %xmm7, %xmm0 1417 ; SSE2-NEXT: pand %xmm3, %xmm0 1418 ; SSE2-NEXT: packuswb %xmm1, %xmm0 1419 ; SSE2-NEXT: movdqa %xmm2, %xmm1 1420 ; SSE2-NEXT: pxor %xmm10, %xmm1 1421 ; SSE2-NEXT: movdqa %xmm1, %xmm3 1422 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm3 1423 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 1424 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 1425 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1426 ; SSE2-NEXT: pand %xmm4, %xmm1 1427 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 1428 ; SSE2-NEXT: por %xmm1, %xmm3 1429 ; SSE2-NEXT: pand %xmm2, %xmm3 1430 ; SSE2-NEXT: movdqa %xmm5, %xmm1 1431 ; SSE2-NEXT: pxor %xmm10, %xmm1 1432 ; SSE2-NEXT: movdqa %xmm1, %xmm2 1433 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm2 1434 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1435 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 1436 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1437 ; SSE2-NEXT: pand %xmm4, %xmm1 1438 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1439 ; SSE2-NEXT: por %xmm1, %xmm2 1440 ; SSE2-NEXT: pand %xmm5, %xmm2 1441 ; SSE2-NEXT: packuswb %xmm3, %xmm2 1442 ; SSE2-NEXT: packuswb %xmm2, %xmm0 1443 ; SSE2-NEXT: retq 1444 ; 1445 ; SSSE3-LABEL: trunc_packus_v8i64_v8i8: 1446 ; SSSE3: # %bb.0: 1447 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 1448 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0] 1449 ; SSSE3-NEXT: movdqa %xmm2, %xmm5 1450 ; SSSE3-NEXT: pxor %xmm10, %xmm5 1451 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [2147483903,2147483903] 1452 ; SSSE3-NEXT: movdqa %xmm9, %xmm7 1453 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7 1454 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2] 1455 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5 1456 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 1457 ; SSSE3-NEXT: pand %xmm6, %xmm4 1458 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] 1459 ; SSSE3-NEXT: por %xmm4, %xmm5 1460 ; SSSE3-NEXT: pand %xmm5, %xmm2 1461 ; SSSE3-NEXT: pandn %xmm8, %xmm5 1462 ; SSSE3-NEXT: por %xmm2, %xmm5 1463 ; SSSE3-NEXT: movdqa %xmm3, %xmm2 1464 ; SSSE3-NEXT: pxor %xmm10, %xmm2 1465 ; SSSE3-NEXT: movdqa %xmm9, %xmm4 1466 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 1467 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 1468 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm2 1469 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 1470 ; SSSE3-NEXT: pand %xmm6, %xmm7 1471 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 1472 ; SSSE3-NEXT: por %xmm7, %xmm2 1473 ; SSSE3-NEXT: pand %xmm2, %xmm3 1474 ; SSSE3-NEXT: pandn %xmm8, %xmm2 1475 ; SSSE3-NEXT: por %xmm3, %xmm2 1476 ; SSSE3-NEXT: movdqa %xmm0, %xmm3 1477 ; SSSE3-NEXT: pxor %xmm10, %xmm3 1478 ; SSSE3-NEXT: movdqa %xmm9, %xmm4 1479 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4 1480 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 1481 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm3 1482 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3] 1483 ; SSSE3-NEXT: pand %xmm6, %xmm7 1484 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1485 ; SSSE3-NEXT: por %xmm7, %xmm3 1486 ; SSSE3-NEXT: pand %xmm3, %xmm0 1487 ; SSSE3-NEXT: pandn %xmm8, %xmm3 1488 ; SSSE3-NEXT: por %xmm0, %xmm3 1489 ; SSSE3-NEXT: movdqa %xmm1, %xmm0 1490 ; SSSE3-NEXT: pxor %xmm10, %xmm0 1491 ; SSSE3-NEXT: movdqa %xmm9, %xmm4 1492 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4 1493 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 1494 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0 1495 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1496 ; SSSE3-NEXT: pand %xmm6, %xmm0 1497 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1498 ; SSSE3-NEXT: por %xmm0, %xmm4 1499 ; SSSE3-NEXT: pand %xmm4, %xmm1 1500 ; SSSE3-NEXT: pandn %xmm8, %xmm4 1501 ; SSSE3-NEXT: por %xmm1, %xmm4 1502 ; SSSE3-NEXT: movdqa %xmm4, %xmm0 1503 ; SSSE3-NEXT: pxor %xmm10, %xmm0 1504 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 1505 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm1 1506 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2] 1507 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0 1508 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1509 ; SSSE3-NEXT: pand %xmm6, %xmm0 1510 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1511 ; SSSE3-NEXT: por %xmm0, %xmm1 1512 ; SSSE3-NEXT: pand %xmm4, %xmm1 1513 ; SSSE3-NEXT: movdqa %xmm3, %xmm0 1514 ; SSSE3-NEXT: pxor %xmm10, %xmm0 1515 ; SSSE3-NEXT: movdqa %xmm0, %xmm4 1516 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm4 1517 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 1518 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0 1519 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 1520 ; SSSE3-NEXT: pand %xmm6, %xmm7 1521 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1522 ; SSSE3-NEXT: por %xmm7, %xmm0 1523 ; SSSE3-NEXT: pand %xmm3, %xmm0 1524 ; SSSE3-NEXT: packuswb %xmm1, %xmm0 1525 ; SSSE3-NEXT: movdqa %xmm2, %xmm1 1526 ; SSSE3-NEXT: pxor %xmm10, %xmm1 1527 ; SSSE3-NEXT: movdqa %xmm1, %xmm3 1528 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm3 1529 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 1530 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1 1531 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1532 ; SSSE3-NEXT: pand %xmm4, %xmm1 1533 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 1534 ; SSSE3-NEXT: por %xmm1, %xmm3 1535 ; SSSE3-NEXT: pand %xmm2, %xmm3 1536 ; SSSE3-NEXT: movdqa %xmm5, %xmm1 1537 ; SSSE3-NEXT: pxor %xmm10, %xmm1 1538 ; SSSE3-NEXT: movdqa %xmm1, %xmm2 1539 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm2 1540 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1541 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1 1542 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1543 ; SSSE3-NEXT: pand %xmm4, %xmm1 1544 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1545 ; SSSE3-NEXT: por %xmm1, %xmm2 1546 ; SSSE3-NEXT: pand %xmm5, %xmm2 1547 ; SSSE3-NEXT: packuswb %xmm3, %xmm2 1548 ; SSSE3-NEXT: packuswb %xmm2, %xmm0 1549 ; SSSE3-NEXT: retq 1550 ; 1551 ; SSE41-LABEL: trunc_packus_v8i64_v8i8: 1552 ; SSE41: # %bb.0: 1553 ; SSE41-NEXT: movdqa %xmm0, %xmm9 1554 ; SSE41-NEXT: movapd {{.*#+}} xmm7 = [255,255] 1555 ; SSE41-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0] 1556 ; SSE41-NEXT: movdqa %xmm2, %xmm0 1557 ; SSE41-NEXT: pxor %xmm10, %xmm0 1558 ; SSE41-NEXT: movdqa {{.*#+}} xmm11 = [2147483903,2147483903] 1559 ; SSE41-NEXT: movdqa %xmm11, %xmm4 1560 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 1561 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1562 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 1563 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 1564 ; SSE41-NEXT: pand %xmm5, %xmm6 1565 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1566 ; SSE41-NEXT: por %xmm6, %xmm0 1567 ; SSE41-NEXT: movapd %xmm7, %xmm8 1568 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm8 1569 ; SSE41-NEXT: movdqa %xmm3, %xmm0 1570 ; SSE41-NEXT: pxor %xmm10, %xmm0 1571 ; SSE41-NEXT: movdqa %xmm11, %xmm2 1572 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 1573 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1574 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 1575 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 1576 ; SSE41-NEXT: pand %xmm4, %xmm5 1577 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 1578 ; SSE41-NEXT: por %xmm5, %xmm0 1579 ; SSE41-NEXT: movapd %xmm7, %xmm2 1580 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2 1581 ; SSE41-NEXT: movdqa %xmm9, %xmm0 1582 ; SSE41-NEXT: pxor %xmm10, %xmm0 1583 ; SSE41-NEXT: movdqa %xmm11, %xmm3 1584 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3 1585 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 1586 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 1587 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 1588 ; SSE41-NEXT: pand %xmm4, %xmm5 1589 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 1590 ; SSE41-NEXT: por %xmm5, %xmm0 1591 ; SSE41-NEXT: movapd %xmm7, %xmm4 1592 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm4 1593 ; SSE41-NEXT: movdqa %xmm1, %xmm0 1594 ; SSE41-NEXT: pxor %xmm10, %xmm0 1595 ; SSE41-NEXT: movdqa %xmm11, %xmm3 1596 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3 1597 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2] 1598 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0 1599 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 1600 ; SSE41-NEXT: pand %xmm5, %xmm6 1601 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 1602 ; SSE41-NEXT: por %xmm6, %xmm0 1603 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm7 1604 ; SSE41-NEXT: pxor %xmm3, %xmm3 1605 ; SSE41-NEXT: movapd %xmm7, %xmm0 1606 ; SSE41-NEXT: xorpd %xmm10, %xmm0 1607 ; SSE41-NEXT: movapd %xmm0, %xmm1 1608 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm1 1609 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] 1610 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 1611 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 1612 ; SSE41-NEXT: pand %xmm5, %xmm6 1613 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 1614 ; SSE41-NEXT: por %xmm6, %xmm0 1615 ; SSE41-NEXT: pxor %xmm5, %xmm5 1616 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm5 1617 ; SSE41-NEXT: movapd %xmm4, %xmm0 1618 ; SSE41-NEXT: xorpd %xmm10, %xmm0 1619 ; SSE41-NEXT: movapd %xmm0, %xmm1 1620 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm1 1621 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2] 1622 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 1623 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 1624 ; SSE41-NEXT: pand %xmm6, %xmm7 1625 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 1626 ; SSE41-NEXT: por %xmm7, %xmm0 1627 ; SSE41-NEXT: pxor %xmm1, %xmm1 1628 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm1 1629 ; SSE41-NEXT: packusdw %xmm5, %xmm1 1630 ; SSE41-NEXT: movapd %xmm2, %xmm0 1631 ; SSE41-NEXT: xorpd %xmm10, %xmm0 1632 ; SSE41-NEXT: movapd %xmm0, %xmm4 1633 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm4 1634 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1635 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 1636 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 1637 ; SSE41-NEXT: pand %xmm5, %xmm6 1638 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1639 ; SSE41-NEXT: por %xmm6, %xmm0 1640 ; SSE41-NEXT: pxor %xmm4, %xmm4 1641 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4 1642 ; SSE41-NEXT: movapd %xmm8, %xmm0 1643 ; SSE41-NEXT: xorpd %xmm10, %xmm0 1644 ; SSE41-NEXT: movapd %xmm0, %xmm2 1645 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm2 1646 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2] 1647 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 1648 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 1649 ; SSE41-NEXT: pand %xmm5, %xmm6 1650 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 1651 ; SSE41-NEXT: por %xmm6, %xmm0 1652 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm3 1653 ; SSE41-NEXT: packusdw %xmm4, %xmm3 1654 ; SSE41-NEXT: packusdw %xmm3, %xmm1 1655 ; SSE41-NEXT: movdqa %xmm1, %xmm0 1656 ; SSE41-NEXT: retq 1657 ; 1658 ; AVX1-LABEL: trunc_packus_v8i64_v8i8: 1659 ; AVX1: # %bb.0: 1660 ; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [255,255,255,255] 1661 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1662 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255] 1663 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 1664 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm5 1665 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm5, %ymm3 1666 ; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 1667 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1668 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 1669 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm4 1670 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 1671 ; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 1672 ; AVX1-NEXT: vxorpd %xmm2, %xmm2, %xmm2 1673 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm3 1674 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 1675 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm5 1676 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm6 1677 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 1678 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm7, %xmm2 1679 ; AVX1-NEXT: vpand %xmm7, %xmm2, %xmm2 1680 ; AVX1-NEXT: vpand %xmm1, %xmm6, %xmm1 1681 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 1682 ; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm2 1683 ; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm0 1684 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 1685 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1686 ; AVX1-NEXT: vzeroupper 1687 ; AVX1-NEXT: retq 1688 ; 1689 ; AVX2-LABEL: trunc_packus_v8i64_v8i8: 1690 ; AVX2: # %bb.0: 1691 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [255,255,255,255] 1692 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3 1693 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 1694 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3 1695 ; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 1696 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1697 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3 1698 ; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm1 1699 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2 1700 ; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm0 1701 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 1702 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 1703 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1704 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 1705 ; AVX2-NEXT: vzeroupper 1706 ; AVX2-NEXT: retq 1707 ; 1708 ; AVX512-LABEL: trunc_packus_v8i64_v8i8: 1709 ; AVX512: # %bb.0: 1710 ; AVX512-NEXT: vpminsq {{.*}}(%rip){1to8}, %zmm0, %zmm0 1711 ; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 1712 ; AVX512-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 1713 ; AVX512-NEXT: vpmovqw %zmm0, %xmm0 1714 ; AVX512-NEXT: vzeroupper 1715 ; AVX512-NEXT: retq 1716 %1 = icmp slt <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 1717 %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> 1718 %3 = icmp sgt <8 x i64> %2, zeroinitializer 1719 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer 1720 %5 = trunc <8 x i64> %4 to <8 x i8> 1721 ret <8 x i8> %5 1722 } 1723 1724 define void @trunc_packus_v8i64_v8i8_store(<8 x i64> %a0, <8 x i8> *%p1) { 1725 ; SSE2-LABEL: trunc_packus_v8i64_v8i8_store: 1726 ; SSE2: # %bb.0: 1727 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 1728 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0] 1729 ; SSE2-NEXT: movdqa %xmm3, %xmm4 1730 ; SSE2-NEXT: pxor %xmm10, %xmm4 1731 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483903,2147483903] 1732 ; SSE2-NEXT: movdqa %xmm9, %xmm6 1733 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6 1734 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 1735 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm4 1736 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1737 ; SSE2-NEXT: pand %xmm7, %xmm4 1738 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm6[1,1,3,3] 1739 ; SSE2-NEXT: por %xmm4, %xmm11 1740 ; SSE2-NEXT: pand %xmm11, %xmm3 1741 ; SSE2-NEXT: pandn %xmm8, %xmm11 1742 ; SSE2-NEXT: por %xmm3, %xmm11 1743 ; SSE2-NEXT: movdqa %xmm2, %xmm3 1744 ; SSE2-NEXT: pxor %xmm10, %xmm3 1745 ; SSE2-NEXT: movdqa %xmm9, %xmm4 1746 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 1747 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2] 1748 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm3 1749 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3] 1750 ; SSE2-NEXT: pand %xmm7, %xmm5 1751 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1752 ; SSE2-NEXT: por %xmm5, %xmm3 1753 ; SSE2-NEXT: pand %xmm3, %xmm2 1754 ; SSE2-NEXT: pandn %xmm8, %xmm3 1755 ; SSE2-NEXT: por %xmm2, %xmm3 1756 ; SSE2-NEXT: movdqa %xmm1, %xmm2 1757 ; SSE2-NEXT: pxor %xmm10, %xmm2 1758 ; SSE2-NEXT: movdqa %xmm9, %xmm4 1759 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 1760 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1761 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm2 1762 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 1763 ; SSE2-NEXT: pand %xmm5, %xmm7 1764 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 1765 ; SSE2-NEXT: por %xmm7, %xmm2 1766 ; SSE2-NEXT: pand %xmm2, %xmm1 1767 ; SSE2-NEXT: pandn %xmm8, %xmm2 1768 ; SSE2-NEXT: por %xmm1, %xmm2 1769 ; SSE2-NEXT: movdqa %xmm0, %xmm1 1770 ; SSE2-NEXT: pxor %xmm10, %xmm1 1771 ; SSE2-NEXT: movdqa %xmm9, %xmm4 1772 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 1773 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1774 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1 1775 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3] 1776 ; SSE2-NEXT: pand %xmm5, %xmm7 1777 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3] 1778 ; SSE2-NEXT: por %xmm7, %xmm1 1779 ; SSE2-NEXT: pand %xmm1, %xmm0 1780 ; SSE2-NEXT: pandn %xmm8, %xmm1 1781 ; SSE2-NEXT: por %xmm0, %xmm1 1782 ; SSE2-NEXT: movdqa %xmm1, %xmm0 1783 ; SSE2-NEXT: pxor %xmm10, %xmm0 1784 ; SSE2-NEXT: movdqa %xmm0, %xmm4 1785 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm4 1786 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1787 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 1788 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 1789 ; SSE2-NEXT: pand %xmm5, %xmm7 1790 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1791 ; SSE2-NEXT: por %xmm7, %xmm0 1792 ; SSE2-NEXT: movdqa %xmm2, %xmm4 1793 ; SSE2-NEXT: pxor %xmm10, %xmm4 1794 ; SSE2-NEXT: movdqa %xmm4, %xmm5 1795 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm5 1796 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2] 1797 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm4 1798 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1799 ; SSE2-NEXT: pand %xmm7, %xmm4 1800 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3] 1801 ; SSE2-NEXT: por %xmm4, %xmm7 1802 ; SSE2-NEXT: movdqa %xmm3, %xmm4 1803 ; SSE2-NEXT: pxor %xmm10, %xmm4 1804 ; SSE2-NEXT: movdqa %xmm4, %xmm5 1805 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm5 1806 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2] 1807 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm4 1808 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3] 1809 ; SSE2-NEXT: pand %xmm9, %xmm6 1810 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 1811 ; SSE2-NEXT: por %xmm6, %xmm4 1812 ; SSE2-NEXT: movdqa %xmm11, %xmm5 1813 ; SSE2-NEXT: pxor %xmm10, %xmm5 1814 ; SSE2-NEXT: movdqa %xmm5, %xmm6 1815 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm6 1816 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm6[0,0,2,2] 1817 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm5 1818 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1819 ; SSE2-NEXT: pand %xmm9, %xmm5 1820 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 1821 ; SSE2-NEXT: por %xmm5, %xmm6 1822 ; SSE2-NEXT: pand %xmm8, %xmm6 1823 ; SSE2-NEXT: pand %xmm11, %xmm6 1824 ; SSE2-NEXT: pand %xmm8, %xmm4 1825 ; SSE2-NEXT: pand %xmm3, %xmm4 1826 ; SSE2-NEXT: packuswb %xmm6, %xmm4 1827 ; SSE2-NEXT: pand %xmm8, %xmm7 1828 ; SSE2-NEXT: pand %xmm2, %xmm7 1829 ; SSE2-NEXT: pand %xmm8, %xmm0 1830 ; SSE2-NEXT: pand %xmm1, %xmm0 1831 ; SSE2-NEXT: packuswb %xmm7, %xmm0 1832 ; SSE2-NEXT: packuswb %xmm4, %xmm0 1833 ; SSE2-NEXT: packuswb %xmm0, %xmm0 1834 ; SSE2-NEXT: movq %xmm0, (%rdi) 1835 ; SSE2-NEXT: retq 1836 ; 1837 ; SSSE3-LABEL: trunc_packus_v8i64_v8i8_store: 1838 ; SSSE3: # %bb.0: 1839 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255] 1840 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0] 1841 ; SSSE3-NEXT: movdqa %xmm3, %xmm4 1842 ; SSSE3-NEXT: pxor %xmm10, %xmm4 1843 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [2147483903,2147483903] 1844 ; SSSE3-NEXT: movdqa %xmm9, %xmm6 1845 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6 1846 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 1847 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm4 1848 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1849 ; SSSE3-NEXT: pand %xmm7, %xmm4 1850 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm6[1,1,3,3] 1851 ; SSSE3-NEXT: por %xmm4, %xmm11 1852 ; SSSE3-NEXT: pand %xmm11, %xmm3 1853 ; SSSE3-NEXT: pandn %xmm8, %xmm11 1854 ; SSSE3-NEXT: por %xmm3, %xmm11 1855 ; SSSE3-NEXT: movdqa %xmm2, %xmm3 1856 ; SSSE3-NEXT: pxor %xmm10, %xmm3 1857 ; SSSE3-NEXT: movdqa %xmm9, %xmm4 1858 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4 1859 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2] 1860 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm3 1861 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3] 1862 ; SSSE3-NEXT: pand %xmm7, %xmm5 1863 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1864 ; SSSE3-NEXT: por %xmm5, %xmm3 1865 ; SSSE3-NEXT: pand %xmm3, %xmm2 1866 ; SSSE3-NEXT: pandn %xmm8, %xmm3 1867 ; SSSE3-NEXT: por %xmm2, %xmm3 1868 ; SSSE3-NEXT: movdqa %xmm1, %xmm2 1869 ; SSSE3-NEXT: pxor %xmm10, %xmm2 1870 ; SSSE3-NEXT: movdqa %xmm9, %xmm4 1871 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 1872 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1873 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm2 1874 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 1875 ; SSSE3-NEXT: pand %xmm5, %xmm7 1876 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 1877 ; SSSE3-NEXT: por %xmm7, %xmm2 1878 ; SSSE3-NEXT: pand %xmm2, %xmm1 1879 ; SSSE3-NEXT: pandn %xmm8, %xmm2 1880 ; SSSE3-NEXT: por %xmm1, %xmm2 1881 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 1882 ; SSSE3-NEXT: pxor %xmm10, %xmm1 1883 ; SSSE3-NEXT: movdqa %xmm9, %xmm4 1884 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4 1885 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1886 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1 1887 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3] 1888 ; SSSE3-NEXT: pand %xmm5, %xmm7 1889 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3] 1890 ; SSSE3-NEXT: por %xmm7, %xmm1 1891 ; SSSE3-NEXT: pand %xmm1, %xmm0 1892 ; SSSE3-NEXT: pandn %xmm8, %xmm1 1893 ; SSSE3-NEXT: por %xmm0, %xmm1 1894 ; SSSE3-NEXT: movdqa %xmm1, %xmm0 1895 ; SSSE3-NEXT: pxor %xmm10, %xmm0 1896 ; SSSE3-NEXT: movdqa %xmm0, %xmm4 1897 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm4 1898 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1899 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0 1900 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 1901 ; SSSE3-NEXT: pand %xmm5, %xmm7 1902 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1903 ; SSSE3-NEXT: por %xmm7, %xmm0 1904 ; SSSE3-NEXT: movdqa %xmm2, %xmm4 1905 ; SSSE3-NEXT: pxor %xmm10, %xmm4 1906 ; SSSE3-NEXT: movdqa %xmm4, %xmm5 1907 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm5 1908 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2] 1909 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm4 1910 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1911 ; SSSE3-NEXT: pand %xmm7, %xmm4 1912 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3] 1913 ; SSSE3-NEXT: por %xmm4, %xmm7 1914 ; SSSE3-NEXT: movdqa %xmm3, %xmm4 1915 ; SSSE3-NEXT: pxor %xmm10, %xmm4 1916 ; SSSE3-NEXT: movdqa %xmm4, %xmm5 1917 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm5 1918 ; SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2] 1919 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm4 1920 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3] 1921 ; SSSE3-NEXT: pand %xmm9, %xmm6 1922 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 1923 ; SSSE3-NEXT: por %xmm6, %xmm4 1924 ; SSSE3-NEXT: movdqa %xmm11, %xmm5 1925 ; SSSE3-NEXT: pxor %xmm10, %xmm5 1926 ; SSSE3-NEXT: movdqa %xmm5, %xmm6 1927 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm6 1928 ; SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm6[0,0,2,2] 1929 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm5 1930 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 1931 ; SSSE3-NEXT: pand %xmm9, %xmm5 1932 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 1933 ; SSSE3-NEXT: por %xmm5, %xmm6 1934 ; SSSE3-NEXT: pand %xmm8, %xmm6 1935 ; SSSE3-NEXT: pand %xmm11, %xmm6 1936 ; SSSE3-NEXT: pand %xmm8, %xmm4 1937 ; SSSE3-NEXT: pand %xmm3, %xmm4 1938 ; SSSE3-NEXT: packuswb %xmm6, %xmm4 1939 ; SSSE3-NEXT: pand %xmm8, %xmm7 1940 ; SSSE3-NEXT: pand %xmm2, %xmm7 1941 ; SSSE3-NEXT: pand %xmm8, %xmm0 1942 ; SSSE3-NEXT: pand %xmm1, %xmm0 1943 ; SSSE3-NEXT: packuswb %xmm7, %xmm0 1944 ; SSSE3-NEXT: packuswb %xmm4, %xmm0 1945 ; SSSE3-NEXT: packuswb %xmm0, %xmm0 1946 ; SSSE3-NEXT: movq %xmm0, (%rdi) 1947 ; SSSE3-NEXT: retq 1948 ; 1949 ; SSE41-LABEL: trunc_packus_v8i64_v8i8_store: 1950 ; SSE41: # %bb.0: 1951 ; SSE41-NEXT: movdqa %xmm0, %xmm9 1952 ; SSE41-NEXT: movapd {{.*#+}} xmm8 = [255,255] 1953 ; SSE41-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,0,2147483648,0] 1954 ; SSE41-NEXT: movdqa %xmm3, %xmm0 1955 ; SSE41-NEXT: pxor %xmm10, %xmm0 1956 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903] 1957 ; SSE41-NEXT: movdqa %xmm5, %xmm4 1958 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 1959 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2] 1960 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm0 1961 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 1962 ; SSE41-NEXT: pand %xmm7, %xmm6 1963 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 1964 ; SSE41-NEXT: por %xmm6, %xmm0 1965 ; SSE41-NEXT: movapd %xmm8, %xmm11 1966 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm11 1967 ; SSE41-NEXT: movdqa %xmm2, %xmm0 1968 ; SSE41-NEXT: pxor %xmm10, %xmm0 1969 ; SSE41-NEXT: movdqa %xmm5, %xmm3 1970 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3 1971 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 1972 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm0 1973 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 1974 ; SSE41-NEXT: pand %xmm4, %xmm6 1975 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 1976 ; SSE41-NEXT: por %xmm6, %xmm0 1977 ; SSE41-NEXT: movapd %xmm8, %xmm3 1978 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3 1979 ; SSE41-NEXT: movdqa %xmm1, %xmm0 1980 ; SSE41-NEXT: pxor %xmm10, %xmm0 1981 ; SSE41-NEXT: movdqa %xmm5, %xmm2 1982 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 1983 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 1984 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm0 1985 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 1986 ; SSE41-NEXT: pand %xmm4, %xmm6 1987 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 1988 ; SSE41-NEXT: por %xmm6, %xmm0 1989 ; SSE41-NEXT: movapd %xmm8, %xmm4 1990 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4 1991 ; SSE41-NEXT: movdqa %xmm9, %xmm0 1992 ; SSE41-NEXT: pxor %xmm10, %xmm0 1993 ; SSE41-NEXT: movdqa %xmm5, %xmm1 1994 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 1995 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2] 1996 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm0 1997 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 1998 ; SSE41-NEXT: pand %xmm2, %xmm5 1999 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 2000 ; SSE41-NEXT: por %xmm5, %xmm0 2001 ; SSE41-NEXT: movapd %xmm8, %xmm5 2002 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm5 2003 ; SSE41-NEXT: movapd %xmm5, %xmm0 2004 ; SSE41-NEXT: xorpd %xmm10, %xmm0 2005 ; SSE41-NEXT: movapd %xmm0, %xmm1 2006 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm1 2007 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2] 2008 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 2009 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 2010 ; SSE41-NEXT: pand %xmm2, %xmm6 2011 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 2012 ; SSE41-NEXT: por %xmm6, %xmm0 2013 ; SSE41-NEXT: pxor %xmm2, %xmm2 2014 ; SSE41-NEXT: pxor %xmm1, %xmm1 2015 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1 2016 ; SSE41-NEXT: movapd %xmm4, %xmm0 2017 ; SSE41-NEXT: xorpd %xmm10, %xmm0 2018 ; SSE41-NEXT: movapd %xmm0, %xmm5 2019 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm5 2020 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 2021 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 2022 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 2023 ; SSE41-NEXT: pand %xmm6, %xmm7 2024 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3] 2025 ; SSE41-NEXT: por %xmm7, %xmm0 2026 ; SSE41-NEXT: pxor %xmm5, %xmm5 2027 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm5 2028 ; SSE41-NEXT: movapd %xmm3, %xmm0 2029 ; SSE41-NEXT: xorpd %xmm10, %xmm0 2030 ; SSE41-NEXT: movapd %xmm0, %xmm4 2031 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm4 2032 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 2033 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 2034 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 2035 ; SSE41-NEXT: pand %xmm6, %xmm7 2036 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 2037 ; SSE41-NEXT: por %xmm7, %xmm0 2038 ; SSE41-NEXT: pxor %xmm4, %xmm4 2039 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm4 2040 ; SSE41-NEXT: movapd %xmm11, %xmm0 2041 ; SSE41-NEXT: xorpd %xmm10, %xmm0 2042 ; SSE41-NEXT: movapd %xmm0, %xmm3 2043 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm3 2044 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 2045 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 2046 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 2047 ; SSE41-NEXT: pand %xmm6, %xmm7 2048 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 2049 ; SSE41-NEXT: por %xmm7, %xmm0 2050 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm2 2051 ; SSE41-NEXT: andpd %xmm8, %xmm2 2052 ; SSE41-NEXT: andpd %xmm8, %xmm4 2053 ; SSE41-NEXT: packusdw %xmm2, %xmm4 2054 ; SSE41-NEXT: andpd %xmm8, %xmm5 2055 ; SSE41-NEXT: andpd %xmm8, %xmm1 2056 ; SSE41-NEXT: packusdw %xmm5, %xmm1 2057 ; SSE41-NEXT: packusdw %xmm4, %xmm1 2058 ; SSE41-NEXT: packuswb %xmm1, %xmm1 2059 ; SSE41-NEXT: movq %xmm1, (%rdi) 2060 ; SSE41-NEXT: retq 2061 ; 2062 ; AVX1-LABEL: trunc_packus_v8i64_v8i8_store: 2063 ; AVX1: # %bb.0: 2064 ; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [255,255,255,255] 2065 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 2066 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255] 2067 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 2068 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm5 2069 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm5, %ymm3 2070 ; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 2071 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 2072 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 2073 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5 2074 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm5, %ymm3 2075 ; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 2076 ; AVX1-NEXT: vxorpd %xmm2, %xmm2, %xmm2 2077 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm8 2078 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 2079 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm5, %xmm6 2080 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm7 2081 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 2082 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2 2083 ; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3 2084 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2 2085 ; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 2086 ; AVX1-NEXT: vpand %xmm1, %xmm7, %xmm1 2087 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 2088 ; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm2 2089 ; AVX1-NEXT: vpand %xmm2, %xmm6, %xmm2 2090 ; AVX1-NEXT: vpand %xmm4, %xmm0, %xmm0 2091 ; AVX1-NEXT: vpand %xmm0, %xmm8, %xmm0 2092 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 2093 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2094 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 2095 ; AVX1-NEXT: vmovq %xmm0, (%rdi) 2096 ; AVX1-NEXT: vzeroupper 2097 ; AVX1-NEXT: retq 2098 ; 2099 ; AVX2-LABEL: trunc_packus_v8i64_v8i8_store: 2100 ; AVX2: # %bb.0: 2101 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [255,255,255,255] 2102 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3 2103 ; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1 2104 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3 2105 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 2106 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 2107 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm3 2108 ; AVX2-NEXT: vpand %ymm0, %ymm3, %ymm0 2109 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm2 2110 ; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm1 2111 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 2112 ; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm1 2113 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 2114 ; AVX2-NEXT: vpshufb %xmm2, %xmm1, %xmm1 2115 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 2116 ; AVX2-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 2117 ; AVX2-NEXT: vpshufb %xmm2, %xmm0, %xmm0 2118 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2119 ; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 2120 ; AVX2-NEXT: vmovq %xmm0, (%rdi) 2121 ; AVX2-NEXT: vzeroupper 2122 ; AVX2-NEXT: retq 2123 ; 2124 ; AVX512-LABEL: trunc_packus_v8i64_v8i8_store: 2125 ; AVX512: # %bb.0: 2126 ; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 2127 ; AVX512-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 2128 ; AVX512-NEXT: vpmovusqb %zmm0, (%rdi) 2129 ; AVX512-NEXT: vzeroupper 2130 ; AVX512-NEXT: retq 2131 %1 = icmp slt <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 2132 %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> 2133 %3 = icmp sgt <8 x i64> %2, zeroinitializer 2134 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer 2135 %5 = trunc <8 x i64> %4 to <8 x i8> 2136 store <8 x i8> %5, <8 x i8> *%p1 2137 ret void 2138 } 2139 2140 define <16 x i8> @trunc_packus_v16i64_v16i8(<16 x i64> %a0) { 2141 ; SSE2-LABEL: trunc_packus_v16i64_v16i8: 2142 ; SSE2: # %bb.0: 2143 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [255,255] 2144 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,0,2147483648,0] 2145 ; SSE2-NEXT: movdqa %xmm6, %xmm9 2146 ; SSE2-NEXT: pxor %xmm8, %xmm9 2147 ; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [2147483903,2147483903] 2148 ; SSE2-NEXT: movdqa %xmm11, %xmm12 2149 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm12 2150 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2] 2151 ; SSE2-NEXT: pcmpeqd %xmm11, %xmm9 2152 ; SSE2-NEXT: pshufd {{.*#+}} xmm14 = xmm9[1,1,3,3] 2153 ; SSE2-NEXT: pand %xmm13, %xmm14 2154 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm12[1,1,3,3] 2155 ; SSE2-NEXT: por %xmm14, %xmm9 2156 ; SSE2-NEXT: pand %xmm9, %xmm6 2157 ; SSE2-NEXT: pandn %xmm10, %xmm9 2158 ; SSE2-NEXT: por %xmm6, %xmm9 2159 ; SSE2-NEXT: movdqa %xmm7, %xmm6 2160 ; SSE2-NEXT: pxor %xmm8, %xmm6 2161 ; SSE2-NEXT: movdqa %xmm11, %xmm12 2162 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm12 2163 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2] 2164 ; SSE2-NEXT: pcmpeqd %xmm11, %xmm6 2165 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 2166 ; SSE2-NEXT: pand %xmm13, %xmm6 2167 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3] 2168 ; SSE2-NEXT: por %xmm6, %xmm12 2169 ; SSE2-NEXT: pand %xmm12, %xmm7 2170 ; SSE2-NEXT: pandn %xmm10, %xmm12 2171 ; SSE2-NEXT: por %xmm7, %xmm12 2172 ; SSE2-NEXT: movdqa %xmm4, %xmm6 2173 ; SSE2-NEXT: pxor %xmm8, %xmm6 2174 ; SSE2-NEXT: movdqa %xmm11, %xmm7 2175 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 2176 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm7[0,0,2,2] 2177 ; SSE2-NEXT: pcmpeqd %xmm11, %xmm6 2178 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 2179 ; SSE2-NEXT: pand %xmm13, %xmm6 2180 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3] 2181 ; SSE2-NEXT: por %xmm6, %xmm13 2182 ; SSE2-NEXT: pand %xmm13, %xmm4 2183 ; SSE2-NEXT: pandn %xmm10, %xmm13 2184 ; SSE2-NEXT: por %xmm4, %xmm13 2185 ; SSE2-NEXT: movdqa %xmm5, %xmm4 2186 ; SSE2-NEXT: pxor %xmm8, %xmm4 2187 ; SSE2-NEXT: movdqa %xmm11, %xmm6 2188 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6 2189 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 2190 ; SSE2-NEXT: pcmpeqd %xmm11, %xmm4 2191 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2192 ; SSE2-NEXT: pand %xmm7, %xmm4 2193 ; SSE2-NEXT: pshufd {{.*#+}} xmm14 = xmm6[1,1,3,3] 2194 ; SSE2-NEXT: por %xmm4, %xmm14 2195 ; SSE2-NEXT: pand %xmm14, %xmm5 2196 ; SSE2-NEXT: pandn %xmm10, %xmm14 2197 ; SSE2-NEXT: por %xmm5, %xmm14 2198 ; SSE2-NEXT: movdqa %xmm2, %xmm4 2199 ; SSE2-NEXT: pxor %xmm8, %xmm4 2200 ; SSE2-NEXT: movdqa %xmm11, %xmm5 2201 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm5 2202 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2] 2203 ; SSE2-NEXT: pcmpeqd %xmm11, %xmm4 2204 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2205 ; SSE2-NEXT: pand %xmm7, %xmm4 2206 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 2207 ; SSE2-NEXT: por %xmm4, %xmm5 2208 ; SSE2-NEXT: pand %xmm5, %xmm2 2209 ; SSE2-NEXT: pandn %xmm10, %xmm5 2210 ; SSE2-NEXT: por %xmm2, %xmm5 2211 ; SSE2-NEXT: movdqa %xmm3, %xmm2 2212 ; SSE2-NEXT: pxor %xmm8, %xmm2 2213 ; SSE2-NEXT: movdqa %xmm11, %xmm4 2214 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 2215 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2] 2216 ; SSE2-NEXT: pcmpeqd %xmm11, %xmm2 2217 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3] 2218 ; SSE2-NEXT: pand %xmm7, %xmm6 2219 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 2220 ; SSE2-NEXT: por %xmm6, %xmm2 2221 ; SSE2-NEXT: pand %xmm2, %xmm3 2222 ; SSE2-NEXT: pandn %xmm10, %xmm2 2223 ; SSE2-NEXT: por %xmm3, %xmm2 2224 ; SSE2-NEXT: movdqa %xmm0, %xmm3 2225 ; SSE2-NEXT: pxor %xmm8, %xmm3 2226 ; SSE2-NEXT: movdqa %xmm11, %xmm4 2227 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 2228 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 2229 ; SSE2-NEXT: pcmpeqd %xmm11, %xmm3 2230 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3] 2231 ; SSE2-NEXT: pand %xmm6, %xmm7 2232 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 2233 ; SSE2-NEXT: por %xmm7, %xmm3 2234 ; SSE2-NEXT: pand %xmm3, %xmm0 2235 ; SSE2-NEXT: pandn %xmm10, %xmm3 2236 ; SSE2-NEXT: por %xmm0, %xmm3 2237 ; SSE2-NEXT: movdqa %xmm1, %xmm0 2238 ; SSE2-NEXT: pxor %xmm8, %xmm0 2239 ; SSE2-NEXT: movdqa %xmm11, %xmm4 2240 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 2241 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 2242 ; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 2243 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 2244 ; SSE2-NEXT: pand %xmm6, %xmm0 2245 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2246 ; SSE2-NEXT: por %xmm0, %xmm4 2247 ; SSE2-NEXT: pand %xmm4, %xmm1 2248 ; SSE2-NEXT: pandn %xmm10, %xmm4 2249 ; SSE2-NEXT: por %xmm1, %xmm4 2250 ; SSE2-NEXT: movdqa %xmm4, %xmm0 2251 ; SSE2-NEXT: pxor %xmm8, %xmm0 2252 ; SSE2-NEXT: movdqa %xmm0, %xmm1 2253 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm1 2254 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2] 2255 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm0 2256 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 2257 ; SSE2-NEXT: pand %xmm6, %xmm0 2258 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 2259 ; SSE2-NEXT: por %xmm0, %xmm1 2260 ; SSE2-NEXT: pand %xmm4, %xmm1 2261 ; SSE2-NEXT: movdqa %xmm3, %xmm0 2262 ; SSE2-NEXT: pxor %xmm8, %xmm0 2263 ; SSE2-NEXT: movdqa %xmm0, %xmm4 2264 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm4 2265 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 2266 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm0 2267 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 2268 ; SSE2-NEXT: pand %xmm6, %xmm7 2269 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 2270 ; SSE2-NEXT: por %xmm7, %xmm0 2271 ; SSE2-NEXT: pand %xmm3, %xmm0 2272 ; SSE2-NEXT: packuswb %xmm1, %xmm0 2273 ; SSE2-NEXT: movdqa %xmm2, %xmm1 2274 ; SSE2-NEXT: pxor %xmm8, %xmm1 2275 ; SSE2-NEXT: movdqa %xmm1, %xmm3 2276 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm3 2277 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 2278 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm1 2279 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 2280 ; SSE2-NEXT: pand %xmm4, %xmm1 2281 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2282 ; SSE2-NEXT: por %xmm1, %xmm3 2283 ; SSE2-NEXT: pand %xmm2, %xmm3 2284 ; SSE2-NEXT: movdqa %xmm5, %xmm1 2285 ; SSE2-NEXT: pxor %xmm8, %xmm1 2286 ; SSE2-NEXT: movdqa %xmm1, %xmm2 2287 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm2 2288 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 2289 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm1 2290 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 2291 ; SSE2-NEXT: pand %xmm4, %xmm1 2292 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 2293 ; SSE2-NEXT: por %xmm1, %xmm2 2294 ; SSE2-NEXT: pand %xmm5, %xmm2 2295 ; SSE2-NEXT: packuswb %xmm3, %xmm2 2296 ; SSE2-NEXT: packuswb %xmm2, %xmm0 2297 ; SSE2-NEXT: movdqa %xmm14, %xmm1 2298 ; SSE2-NEXT: pxor %xmm8, %xmm1 2299 ; SSE2-NEXT: movdqa %xmm1, %xmm2 2300 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm2 2301 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 2302 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm1 2303 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 2304 ; SSE2-NEXT: pand %xmm3, %xmm1 2305 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 2306 ; SSE2-NEXT: por %xmm1, %xmm2 2307 ; SSE2-NEXT: pand %xmm14, %xmm2 2308 ; SSE2-NEXT: movdqa %xmm13, %xmm1 2309 ; SSE2-NEXT: pxor %xmm8, %xmm1 2310 ; SSE2-NEXT: movdqa %xmm1, %xmm3 2311 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm3 2312 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 2313 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm1 2314 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 2315 ; SSE2-NEXT: pand %xmm4, %xmm5 2316 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3] 2317 ; SSE2-NEXT: por %xmm5, %xmm1 2318 ; SSE2-NEXT: pand %xmm13, %xmm1 2319 ; SSE2-NEXT: packuswb %xmm2, %xmm1 2320 ; SSE2-NEXT: movdqa %xmm12, %xmm2 2321 ; SSE2-NEXT: pxor %xmm8, %xmm2 2322 ; SSE2-NEXT: movdqa %xmm2, %xmm3 2323 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm3 2324 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 2325 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm2 2326 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 2327 ; SSE2-NEXT: pand %xmm4, %xmm2 2328 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2329 ; SSE2-NEXT: por %xmm2, %xmm3 2330 ; SSE2-NEXT: pand %xmm12, %xmm3 2331 ; SSE2-NEXT: movdqa %xmm9, %xmm2 2332 ; SSE2-NEXT: pxor %xmm8, %xmm2 2333 ; SSE2-NEXT: movdqa %xmm2, %xmm4 2334 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm4 2335 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 2336 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm2 2337 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 2338 ; SSE2-NEXT: pand %xmm5, %xmm2 2339 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2340 ; SSE2-NEXT: por %xmm2, %xmm4 2341 ; SSE2-NEXT: pand %xmm9, %xmm4 2342 ; SSE2-NEXT: packuswb %xmm3, %xmm4 2343 ; SSE2-NEXT: packuswb %xmm4, %xmm1 2344 ; SSE2-NEXT: packuswb %xmm1, %xmm0 2345 ; SSE2-NEXT: retq 2346 ; 2347 ; SSSE3-LABEL: trunc_packus_v16i64_v16i8: 2348 ; SSSE3: # %bb.0: 2349 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [255,255] 2350 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,0,2147483648,0] 2351 ; SSSE3-NEXT: movdqa %xmm6, %xmm9 2352 ; SSSE3-NEXT: pxor %xmm8, %xmm9 2353 ; SSSE3-NEXT: movdqa {{.*#+}} xmm11 = [2147483903,2147483903] 2354 ; SSSE3-NEXT: movdqa %xmm11, %xmm12 2355 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm12 2356 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2] 2357 ; SSSE3-NEXT: pcmpeqd %xmm11, %xmm9 2358 ; SSSE3-NEXT: pshufd {{.*#+}} xmm14 = xmm9[1,1,3,3] 2359 ; SSSE3-NEXT: pand %xmm13, %xmm14 2360 ; SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm12[1,1,3,3] 2361 ; SSSE3-NEXT: por %xmm14, %xmm9 2362 ; SSSE3-NEXT: pand %xmm9, %xmm6 2363 ; SSSE3-NEXT: pandn %xmm10, %xmm9 2364 ; SSSE3-NEXT: por %xmm6, %xmm9 2365 ; SSSE3-NEXT: movdqa %xmm7, %xmm6 2366 ; SSSE3-NEXT: pxor %xmm8, %xmm6 2367 ; SSSE3-NEXT: movdqa %xmm11, %xmm12 2368 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm12 2369 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2] 2370 ; SSSE3-NEXT: pcmpeqd %xmm11, %xmm6 2371 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 2372 ; SSSE3-NEXT: pand %xmm13, %xmm6 2373 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3] 2374 ; SSSE3-NEXT: por %xmm6, %xmm12 2375 ; SSSE3-NEXT: pand %xmm12, %xmm7 2376 ; SSSE3-NEXT: pandn %xmm10, %xmm12 2377 ; SSSE3-NEXT: por %xmm7, %xmm12 2378 ; SSSE3-NEXT: movdqa %xmm4, %xmm6 2379 ; SSSE3-NEXT: pxor %xmm8, %xmm6 2380 ; SSSE3-NEXT: movdqa %xmm11, %xmm7 2381 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm7 2382 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm7[0,0,2,2] 2383 ; SSSE3-NEXT: pcmpeqd %xmm11, %xmm6 2384 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 2385 ; SSSE3-NEXT: pand %xmm13, %xmm6 2386 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3] 2387 ; SSSE3-NEXT: por %xmm6, %xmm13 2388 ; SSSE3-NEXT: pand %xmm13, %xmm4 2389 ; SSSE3-NEXT: pandn %xmm10, %xmm13 2390 ; SSSE3-NEXT: por %xmm4, %xmm13 2391 ; SSSE3-NEXT: movdqa %xmm5, %xmm4 2392 ; SSSE3-NEXT: pxor %xmm8, %xmm4 2393 ; SSSE3-NEXT: movdqa %xmm11, %xmm6 2394 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6 2395 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 2396 ; SSSE3-NEXT: pcmpeqd %xmm11, %xmm4 2397 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2398 ; SSSE3-NEXT: pand %xmm7, %xmm4 2399 ; SSSE3-NEXT: pshufd {{.*#+}} xmm14 = xmm6[1,1,3,3] 2400 ; SSSE3-NEXT: por %xmm4, %xmm14 2401 ; SSSE3-NEXT: pand %xmm14, %xmm5 2402 ; SSSE3-NEXT: pandn %xmm10, %xmm14 2403 ; SSSE3-NEXT: por %xmm5, %xmm14 2404 ; SSSE3-NEXT: movdqa %xmm2, %xmm4 2405 ; SSSE3-NEXT: pxor %xmm8, %xmm4 2406 ; SSSE3-NEXT: movdqa %xmm11, %xmm5 2407 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm5 2408 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2] 2409 ; SSSE3-NEXT: pcmpeqd %xmm11, %xmm4 2410 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2411 ; SSSE3-NEXT: pand %xmm7, %xmm4 2412 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 2413 ; SSSE3-NEXT: por %xmm4, %xmm5 2414 ; SSSE3-NEXT: pand %xmm5, %xmm2 2415 ; SSSE3-NEXT: pandn %xmm10, %xmm5 2416 ; SSSE3-NEXT: por %xmm2, %xmm5 2417 ; SSSE3-NEXT: movdqa %xmm3, %xmm2 2418 ; SSSE3-NEXT: pxor %xmm8, %xmm2 2419 ; SSSE3-NEXT: movdqa %xmm11, %xmm4 2420 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 2421 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2] 2422 ; SSSE3-NEXT: pcmpeqd %xmm11, %xmm2 2423 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3] 2424 ; SSSE3-NEXT: pand %xmm7, %xmm6 2425 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 2426 ; SSSE3-NEXT: por %xmm6, %xmm2 2427 ; SSSE3-NEXT: pand %xmm2, %xmm3 2428 ; SSSE3-NEXT: pandn %xmm10, %xmm2 2429 ; SSSE3-NEXT: por %xmm3, %xmm2 2430 ; SSSE3-NEXT: movdqa %xmm0, %xmm3 2431 ; SSSE3-NEXT: pxor %xmm8, %xmm3 2432 ; SSSE3-NEXT: movdqa %xmm11, %xmm4 2433 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4 2434 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 2435 ; SSSE3-NEXT: pcmpeqd %xmm11, %xmm3 2436 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3] 2437 ; SSSE3-NEXT: pand %xmm6, %xmm7 2438 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 2439 ; SSSE3-NEXT: por %xmm7, %xmm3 2440 ; SSSE3-NEXT: pand %xmm3, %xmm0 2441 ; SSSE3-NEXT: pandn %xmm10, %xmm3 2442 ; SSSE3-NEXT: por %xmm0, %xmm3 2443 ; SSSE3-NEXT: movdqa %xmm1, %xmm0 2444 ; SSSE3-NEXT: pxor %xmm8, %xmm0 2445 ; SSSE3-NEXT: movdqa %xmm11, %xmm4 2446 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4 2447 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 2448 ; SSSE3-NEXT: pcmpeqd %xmm11, %xmm0 2449 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 2450 ; SSSE3-NEXT: pand %xmm6, %xmm0 2451 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2452 ; SSSE3-NEXT: por %xmm0, %xmm4 2453 ; SSSE3-NEXT: pand %xmm4, %xmm1 2454 ; SSSE3-NEXT: pandn %xmm10, %xmm4 2455 ; SSSE3-NEXT: por %xmm1, %xmm4 2456 ; SSSE3-NEXT: movdqa %xmm4, %xmm0 2457 ; SSSE3-NEXT: pxor %xmm8, %xmm0 2458 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 2459 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm1 2460 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2] 2461 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm0 2462 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 2463 ; SSSE3-NEXT: pand %xmm6, %xmm0 2464 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 2465 ; SSSE3-NEXT: por %xmm0, %xmm1 2466 ; SSSE3-NEXT: pand %xmm4, %xmm1 2467 ; SSSE3-NEXT: movdqa %xmm3, %xmm0 2468 ; SSSE3-NEXT: pxor %xmm8, %xmm0 2469 ; SSSE3-NEXT: movdqa %xmm0, %xmm4 2470 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm4 2471 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 2472 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm0 2473 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 2474 ; SSSE3-NEXT: pand %xmm6, %xmm7 2475 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 2476 ; SSSE3-NEXT: por %xmm7, %xmm0 2477 ; SSSE3-NEXT: pand %xmm3, %xmm0 2478 ; SSSE3-NEXT: packuswb %xmm1, %xmm0 2479 ; SSSE3-NEXT: movdqa %xmm2, %xmm1 2480 ; SSSE3-NEXT: pxor %xmm8, %xmm1 2481 ; SSSE3-NEXT: movdqa %xmm1, %xmm3 2482 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm3 2483 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 2484 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm1 2485 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 2486 ; SSSE3-NEXT: pand %xmm4, %xmm1 2487 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2488 ; SSSE3-NEXT: por %xmm1, %xmm3 2489 ; SSSE3-NEXT: pand %xmm2, %xmm3 2490 ; SSSE3-NEXT: movdqa %xmm5, %xmm1 2491 ; SSSE3-NEXT: pxor %xmm8, %xmm1 2492 ; SSSE3-NEXT: movdqa %xmm1, %xmm2 2493 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm2 2494 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 2495 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm1 2496 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 2497 ; SSSE3-NEXT: pand %xmm4, %xmm1 2498 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 2499 ; SSSE3-NEXT: por %xmm1, %xmm2 2500 ; SSSE3-NEXT: pand %xmm5, %xmm2 2501 ; SSSE3-NEXT: packuswb %xmm3, %xmm2 2502 ; SSSE3-NEXT: packuswb %xmm2, %xmm0 2503 ; SSSE3-NEXT: movdqa %xmm14, %xmm1 2504 ; SSSE3-NEXT: pxor %xmm8, %xmm1 2505 ; SSSE3-NEXT: movdqa %xmm1, %xmm2 2506 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm2 2507 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 2508 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm1 2509 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 2510 ; SSSE3-NEXT: pand %xmm3, %xmm1 2511 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 2512 ; SSSE3-NEXT: por %xmm1, %xmm2 2513 ; SSSE3-NEXT: pand %xmm14, %xmm2 2514 ; SSSE3-NEXT: movdqa %xmm13, %xmm1 2515 ; SSSE3-NEXT: pxor %xmm8, %xmm1 2516 ; SSSE3-NEXT: movdqa %xmm1, %xmm3 2517 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm3 2518 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 2519 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm1 2520 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 2521 ; SSSE3-NEXT: pand %xmm4, %xmm5 2522 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3] 2523 ; SSSE3-NEXT: por %xmm5, %xmm1 2524 ; SSSE3-NEXT: pand %xmm13, %xmm1 2525 ; SSSE3-NEXT: packuswb %xmm2, %xmm1 2526 ; SSSE3-NEXT: movdqa %xmm12, %xmm2 2527 ; SSSE3-NEXT: pxor %xmm8, %xmm2 2528 ; SSSE3-NEXT: movdqa %xmm2, %xmm3 2529 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm3 2530 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 2531 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm2 2532 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 2533 ; SSSE3-NEXT: pand %xmm4, %xmm2 2534 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2535 ; SSSE3-NEXT: por %xmm2, %xmm3 2536 ; SSSE3-NEXT: pand %xmm12, %xmm3 2537 ; SSSE3-NEXT: movdqa %xmm9, %xmm2 2538 ; SSSE3-NEXT: pxor %xmm8, %xmm2 2539 ; SSSE3-NEXT: movdqa %xmm2, %xmm4 2540 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm4 2541 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 2542 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm2 2543 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 2544 ; SSSE3-NEXT: pand %xmm5, %xmm2 2545 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2546 ; SSSE3-NEXT: por %xmm2, %xmm4 2547 ; SSSE3-NEXT: pand %xmm9, %xmm4 2548 ; SSSE3-NEXT: packuswb %xmm3, %xmm4 2549 ; SSSE3-NEXT: packuswb %xmm4, %xmm1 2550 ; SSSE3-NEXT: packuswb %xmm1, %xmm0 2551 ; SSSE3-NEXT: retq 2552 ; 2553 ; SSE41-LABEL: trunc_packus_v16i64_v16i8: 2554 ; SSE41: # %bb.0: 2555 ; SSE41-NEXT: movdqa %xmm0, %xmm8 2556 ; SSE41-NEXT: movapd {{.*#+}} xmm11 = [255,255] 2557 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,0,2147483648,0] 2558 ; SSE41-NEXT: movdqa %xmm6, %xmm0 2559 ; SSE41-NEXT: pxor %xmm9, %xmm0 2560 ; SSE41-NEXT: movdqa {{.*#+}} xmm12 = [2147483903,2147483903] 2561 ; SSE41-NEXT: movdqa %xmm12, %xmm10 2562 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm10 2563 ; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm10[0,0,2,2] 2564 ; SSE41-NEXT: pcmpeqd %xmm12, %xmm0 2565 ; SSE41-NEXT: pshufd {{.*#+}} xmm14 = xmm0[1,1,3,3] 2566 ; SSE41-NEXT: pand %xmm13, %xmm14 2567 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3] 2568 ; SSE41-NEXT: por %xmm14, %xmm0 2569 ; SSE41-NEXT: movapd %xmm11, %xmm10 2570 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm10 2571 ; SSE41-NEXT: movdqa %xmm7, %xmm0 2572 ; SSE41-NEXT: pxor %xmm9, %xmm0 2573 ; SSE41-NEXT: movdqa %xmm12, %xmm6 2574 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 2575 ; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2] 2576 ; SSE41-NEXT: pcmpeqd %xmm12, %xmm0 2577 ; SSE41-NEXT: pshufd {{.*#+}} xmm14 = xmm0[1,1,3,3] 2578 ; SSE41-NEXT: pand %xmm13, %xmm14 2579 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 2580 ; SSE41-NEXT: por %xmm14, %xmm0 2581 ; SSE41-NEXT: movapd %xmm11, %xmm13 2582 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm13 2583 ; SSE41-NEXT: movdqa %xmm4, %xmm0 2584 ; SSE41-NEXT: pxor %xmm9, %xmm0 2585 ; SSE41-NEXT: movdqa %xmm12, %xmm6 2586 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6 2587 ; SSE41-NEXT: pshufd {{.*#+}} xmm14 = xmm6[0,0,2,2] 2588 ; SSE41-NEXT: pcmpeqd %xmm12, %xmm0 2589 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 2590 ; SSE41-NEXT: pand %xmm14, %xmm7 2591 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 2592 ; SSE41-NEXT: por %xmm7, %xmm0 2593 ; SSE41-NEXT: movapd %xmm11, %xmm14 2594 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm14 2595 ; SSE41-NEXT: movdqa %xmm5, %xmm0 2596 ; SSE41-NEXT: pxor %xmm9, %xmm0 2597 ; SSE41-NEXT: movdqa %xmm12, %xmm4 2598 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 2599 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 2600 ; SSE41-NEXT: pcmpeqd %xmm12, %xmm0 2601 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 2602 ; SSE41-NEXT: pand %xmm6, %xmm7 2603 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 2604 ; SSE41-NEXT: por %xmm7, %xmm0 2605 ; SSE41-NEXT: movapd %xmm11, %xmm15 2606 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm15 2607 ; SSE41-NEXT: movdqa %xmm2, %xmm0 2608 ; SSE41-NEXT: pxor %xmm9, %xmm0 2609 ; SSE41-NEXT: movdqa %xmm12, %xmm5 2610 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5 2611 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 2612 ; SSE41-NEXT: pcmpeqd %xmm12, %xmm0 2613 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 2614 ; SSE41-NEXT: pand %xmm6, %xmm7 2615 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3] 2616 ; SSE41-NEXT: por %xmm7, %xmm0 2617 ; SSE41-NEXT: movapd %xmm11, %xmm5 2618 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5 2619 ; SSE41-NEXT: movdqa %xmm3, %xmm0 2620 ; SSE41-NEXT: pxor %xmm9, %xmm0 2621 ; SSE41-NEXT: movdqa %xmm12, %xmm2 2622 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 2623 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2] 2624 ; SSE41-NEXT: pcmpeqd %xmm12, %xmm0 2625 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 2626 ; SSE41-NEXT: pand %xmm6, %xmm7 2627 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 2628 ; SSE41-NEXT: por %xmm7, %xmm0 2629 ; SSE41-NEXT: movapd %xmm11, %xmm6 2630 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm6 2631 ; SSE41-NEXT: movdqa %xmm8, %xmm0 2632 ; SSE41-NEXT: pxor %xmm9, %xmm0 2633 ; SSE41-NEXT: movdqa %xmm12, %xmm2 2634 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 2635 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 2636 ; SSE41-NEXT: pcmpeqd %xmm12, %xmm0 2637 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 2638 ; SSE41-NEXT: pand %xmm3, %xmm7 2639 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 2640 ; SSE41-NEXT: por %xmm7, %xmm0 2641 ; SSE41-NEXT: movapd %xmm11, %xmm3 2642 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm3 2643 ; SSE41-NEXT: movdqa %xmm1, %xmm0 2644 ; SSE41-NEXT: pxor %xmm9, %xmm0 2645 ; SSE41-NEXT: movdqa %xmm12, %xmm2 2646 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 2647 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm2[0,0,2,2] 2648 ; SSE41-NEXT: pcmpeqd %xmm12, %xmm0 2649 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3] 2650 ; SSE41-NEXT: pand %xmm7, %xmm4 2651 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 2652 ; SSE41-NEXT: por %xmm4, %xmm0 2653 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm11 2654 ; SSE41-NEXT: xorpd %xmm8, %xmm8 2655 ; SSE41-NEXT: movapd %xmm11, %xmm0 2656 ; SSE41-NEXT: xorpd %xmm9, %xmm0 2657 ; SSE41-NEXT: movapd %xmm0, %xmm1 2658 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm1 2659 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2] 2660 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 2661 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 2662 ; SSE41-NEXT: pand %xmm4, %xmm7 2663 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 2664 ; SSE41-NEXT: por %xmm7, %xmm0 2665 ; SSE41-NEXT: pxor %xmm4, %xmm4 2666 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm4 2667 ; SSE41-NEXT: movapd %xmm3, %xmm0 2668 ; SSE41-NEXT: xorpd %xmm9, %xmm0 2669 ; SSE41-NEXT: movapd %xmm0, %xmm1 2670 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm1 2671 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2] 2672 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 2673 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] 2674 ; SSE41-NEXT: pand %xmm7, %xmm2 2675 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 2676 ; SSE41-NEXT: por %xmm2, %xmm0 2677 ; SSE41-NEXT: pxor %xmm1, %xmm1 2678 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1 2679 ; SSE41-NEXT: packusdw %xmm4, %xmm1 2680 ; SSE41-NEXT: movapd %xmm6, %xmm0 2681 ; SSE41-NEXT: xorpd %xmm9, %xmm0 2682 ; SSE41-NEXT: movapd %xmm0, %xmm2 2683 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm2 2684 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 2685 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 2686 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3] 2687 ; SSE41-NEXT: pand %xmm3, %xmm4 2688 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 2689 ; SSE41-NEXT: por %xmm4, %xmm0 2690 ; SSE41-NEXT: pxor %xmm2, %xmm2 2691 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm2 2692 ; SSE41-NEXT: movapd %xmm5, %xmm0 2693 ; SSE41-NEXT: xorpd %xmm9, %xmm0 2694 ; SSE41-NEXT: movapd %xmm0, %xmm3 2695 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm3 2696 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 2697 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 2698 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 2699 ; SSE41-NEXT: pand %xmm4, %xmm6 2700 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 2701 ; SSE41-NEXT: por %xmm6, %xmm0 2702 ; SSE41-NEXT: pxor %xmm3, %xmm3 2703 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm3 2704 ; SSE41-NEXT: packusdw %xmm2, %xmm3 2705 ; SSE41-NEXT: packusdw %xmm3, %xmm1 2706 ; SSE41-NEXT: movapd %xmm15, %xmm0 2707 ; SSE41-NEXT: xorpd %xmm9, %xmm0 2708 ; SSE41-NEXT: movapd %xmm0, %xmm2 2709 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm2 2710 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 2711 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 2712 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3] 2713 ; SSE41-NEXT: pand %xmm3, %xmm4 2714 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 2715 ; SSE41-NEXT: por %xmm4, %xmm0 2716 ; SSE41-NEXT: pxor %xmm2, %xmm2 2717 ; SSE41-NEXT: blendvpd %xmm0, %xmm15, %xmm2 2718 ; SSE41-NEXT: movapd %xmm14, %xmm0 2719 ; SSE41-NEXT: xorpd %xmm9, %xmm0 2720 ; SSE41-NEXT: movapd %xmm0, %xmm3 2721 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm3 2722 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 2723 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 2724 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 2725 ; SSE41-NEXT: pand %xmm4, %xmm5 2726 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 2727 ; SSE41-NEXT: por %xmm5, %xmm0 2728 ; SSE41-NEXT: pxor %xmm3, %xmm3 2729 ; SSE41-NEXT: blendvpd %xmm0, %xmm14, %xmm3 2730 ; SSE41-NEXT: packusdw %xmm2, %xmm3 2731 ; SSE41-NEXT: movapd %xmm13, %xmm0 2732 ; SSE41-NEXT: xorpd %xmm9, %xmm0 2733 ; SSE41-NEXT: movapd %xmm0, %xmm2 2734 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm2 2735 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 2736 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 2737 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 2738 ; SSE41-NEXT: pand %xmm4, %xmm5 2739 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 2740 ; SSE41-NEXT: por %xmm5, %xmm0 2741 ; SSE41-NEXT: pxor %xmm2, %xmm2 2742 ; SSE41-NEXT: blendvpd %xmm0, %xmm13, %xmm2 2743 ; SSE41-NEXT: movapd %xmm10, %xmm0 2744 ; SSE41-NEXT: xorpd %xmm9, %xmm0 2745 ; SSE41-NEXT: movapd %xmm0, %xmm4 2746 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm4 2747 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 2748 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0 2749 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 2750 ; SSE41-NEXT: pand %xmm5, %xmm6 2751 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 2752 ; SSE41-NEXT: por %xmm6, %xmm0 2753 ; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm8 2754 ; SSE41-NEXT: packusdw %xmm2, %xmm8 2755 ; SSE41-NEXT: packusdw %xmm8, %xmm3 2756 ; SSE41-NEXT: packuswb %xmm3, %xmm1 2757 ; SSE41-NEXT: movdqa %xmm1, %xmm0 2758 ; SSE41-NEXT: retq 2759 ; 2760 ; AVX1-LABEL: trunc_packus_v16i64_v16i8: 2761 ; AVX1: # %bb.0: 2762 ; AVX1-NEXT: vmovapd {{.*#+}} ymm4 = [255,255,255,255] 2763 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5 2764 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [255,255] 2765 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5 2766 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm6, %xmm7 2767 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm7, %ymm5 2768 ; AVX1-NEXT: vblendvpd %ymm5, %ymm3, %ymm4, %ymm15 2769 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 2770 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5 2771 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm6, %xmm7 2772 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm7, %ymm5 2773 ; AVX1-NEXT: vblendvpd %ymm5, %ymm2, %ymm4, %ymm2 2774 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 2775 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5 2776 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm6, %xmm7 2777 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm7, %ymm5 2778 ; AVX1-NEXT: vblendvpd %ymm5, %ymm1, %ymm4, %ymm1 2779 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 2780 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5 2781 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm6, %xmm6 2782 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm6, %ymm5 2783 ; AVX1-NEXT: vblendvpd %ymm5, %ymm0, %ymm4, %ymm0 2784 ; AVX1-NEXT: vxorpd %xmm4, %xmm4, %xmm4 2785 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm8 2786 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm14 2787 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm14, %xmm9 2788 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm10 2789 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 2790 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm7, %xmm11 2791 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm12 2792 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 2793 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm13 2794 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm15, %xmm6 2795 ; AVX1-NEXT: vextractf128 $1, %ymm15, %xmm3 2796 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm4 2797 ; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm3 2798 ; AVX1-NEXT: vpand %xmm15, %xmm6, %xmm4 2799 ; AVX1-NEXT: vpackusdw %xmm3, %xmm4, %xmm3 2800 ; AVX1-NEXT: vpand %xmm5, %xmm13, %xmm4 2801 ; AVX1-NEXT: vpand %xmm2, %xmm12, %xmm2 2802 ; AVX1-NEXT: vpackusdw %xmm4, %xmm2, %xmm2 2803 ; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2 2804 ; AVX1-NEXT: vpand %xmm7, %xmm11, %xmm3 2805 ; AVX1-NEXT: vpand %xmm1, %xmm10, %xmm1 2806 ; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 2807 ; AVX1-NEXT: vpand %xmm14, %xmm9, %xmm3 2808 ; AVX1-NEXT: vpand %xmm0, %xmm8, %xmm0 2809 ; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 2810 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2811 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 2812 ; AVX1-NEXT: vzeroupper 2813 ; AVX1-NEXT: retq 2814 ; 2815 ; AVX2-LABEL: trunc_packus_v16i64_v16i8: 2816 ; AVX2: # %bb.0: 2817 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [255,255,255,255] 2818 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm4, %ymm5 2819 ; AVX2-NEXT: vblendvpd %ymm5, %ymm2, %ymm4, %ymm2 2820 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm5 2821 ; AVX2-NEXT: vblendvpd %ymm5, %ymm3, %ymm4, %ymm3 2822 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm4, %ymm5 2823 ; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm4, %ymm0 2824 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm4, %ymm5 2825 ; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm4, %ymm1 2826 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 2827 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm1, %ymm5 2828 ; AVX2-NEXT: vpand %ymm1, %ymm5, %ymm1 2829 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm0, %ymm5 2830 ; AVX2-NEXT: vpand %ymm0, %ymm5, %ymm0 2831 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 2832 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm3, %ymm1 2833 ; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1 2834 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm2, %ymm3 2835 ; AVX2-NEXT: vpand %ymm2, %ymm3, %ymm2 2836 ; AVX2-NEXT: vpackusdw %ymm1, %ymm2, %ymm1 2837 ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3] 2838 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 2839 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 2840 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 2841 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2842 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2843 ; AVX2-NEXT: vzeroupper 2844 ; AVX2-NEXT: retq 2845 ; 2846 ; AVX512-LABEL: trunc_packus_v16i64_v16i8: 2847 ; AVX512: # %bb.0: 2848 ; AVX512-NEXT: vpbroadcastq {{.*#+}} zmm2 = [255,255,255,255,255,255,255,255] 2849 ; AVX512-NEXT: vpminsq %zmm2, %zmm0, %zmm0 2850 ; AVX512-NEXT: vpminsq %zmm2, %zmm1, %zmm1 2851 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2 2852 ; AVX512-NEXT: vpmaxsq %zmm2, %zmm1, %zmm1 2853 ; AVX512-NEXT: vpmaxsq %zmm2, %zmm0, %zmm0 2854 ; AVX512-NEXT: vpmovqd %zmm0, %ymm0 2855 ; AVX512-NEXT: vpmovqd %zmm1, %ymm1 2856 ; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 2857 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0 2858 ; AVX512-NEXT: vzeroupper 2859 ; AVX512-NEXT: retq 2860 %1 = icmp slt <16 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 2861 %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> 2862 %3 = icmp sgt <16 x i64> %2, zeroinitializer 2863 %4 = select <16 x i1> %3, <16 x i64> %2, <16 x i64> zeroinitializer 2864 %5 = trunc <16 x i64> %4 to <16 x i8> 2865 ret <16 x i8> %5 2866 } 2867 2868 define <8 x i8> @trunc_packus_v8i32_v8i8(<8 x i32> %a0) { 2869 ; SSE2-LABEL: trunc_packus_v8i32_v8i8: 2870 ; SSE2: # %bb.0: 2871 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255] 2872 ; SSE2-NEXT: movdqa %xmm2, %xmm3 2873 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 2874 ; SSE2-NEXT: pand %xmm3, %xmm0 2875 ; SSE2-NEXT: pandn %xmm2, %xmm3 2876 ; SSE2-NEXT: por %xmm0, %xmm3 2877 ; SSE2-NEXT: movdqa %xmm2, %xmm0 2878 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 2879 ; SSE2-NEXT: pand %xmm0, %xmm1 2880 ; SSE2-NEXT: pandn %xmm2, %xmm0 2881 ; SSE2-NEXT: por %xmm1, %xmm0 2882 ; SSE2-NEXT: pxor %xmm1, %xmm1 2883 ; SSE2-NEXT: movdqa %xmm0, %xmm2 2884 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 2885 ; SSE2-NEXT: pand %xmm0, %xmm2 2886 ; SSE2-NEXT: movdqa %xmm3, %xmm0 2887 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 2888 ; SSE2-NEXT: pand %xmm3, %xmm0 2889 ; SSE2-NEXT: packuswb %xmm2, %xmm0 2890 ; SSE2-NEXT: retq 2891 ; 2892 ; SSSE3-LABEL: trunc_packus_v8i32_v8i8: 2893 ; SSSE3: # %bb.0: 2894 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255] 2895 ; SSSE3-NEXT: movdqa %xmm2, %xmm3 2896 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm3 2897 ; SSSE3-NEXT: pand %xmm3, %xmm0 2898 ; SSSE3-NEXT: pandn %xmm2, %xmm3 2899 ; SSSE3-NEXT: por %xmm0, %xmm3 2900 ; SSSE3-NEXT: movdqa %xmm2, %xmm0 2901 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0 2902 ; SSSE3-NEXT: pand %xmm0, %xmm1 2903 ; SSSE3-NEXT: pandn %xmm2, %xmm0 2904 ; SSSE3-NEXT: por %xmm1, %xmm0 2905 ; SSSE3-NEXT: pxor %xmm1, %xmm1 2906 ; SSSE3-NEXT: movdqa %xmm0, %xmm2 2907 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 2908 ; SSSE3-NEXT: pand %xmm0, %xmm2 2909 ; SSSE3-NEXT: movdqa %xmm3, %xmm0 2910 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0 2911 ; SSSE3-NEXT: pand %xmm3, %xmm0 2912 ; SSSE3-NEXT: packuswb %xmm2, %xmm0 2913 ; SSSE3-NEXT: retq 2914 ; 2915 ; SSE41-LABEL: trunc_packus_v8i32_v8i8: 2916 ; SSE41: # %bb.0: 2917 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255] 2918 ; SSE41-NEXT: pminsd %xmm2, %xmm0 2919 ; SSE41-NEXT: pminsd %xmm2, %xmm1 2920 ; SSE41-NEXT: pxor %xmm2, %xmm2 2921 ; SSE41-NEXT: pmaxsd %xmm2, %xmm1 2922 ; SSE41-NEXT: pmaxsd %xmm2, %xmm0 2923 ; SSE41-NEXT: packusdw %xmm1, %xmm0 2924 ; SSE41-NEXT: retq 2925 ; 2926 ; AVX1-LABEL: trunc_packus_v8i32_v8i8: 2927 ; AVX1: # %bb.0: 2928 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255,255,255] 2929 ; AVX1-NEXT: vpminsd %xmm1, %xmm0, %xmm2 2930 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2931 ; AVX1-NEXT: vpminsd %xmm1, %xmm0, %xmm0 2932 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 2933 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 2934 ; AVX1-NEXT: vpmaxsd %xmm1, %xmm2, %xmm1 2935 ; AVX1-NEXT: vpackusdw %xmm0, %xmm1, %xmm0 2936 ; AVX1-NEXT: vzeroupper 2937 ; AVX1-NEXT: retq 2938 ; 2939 ; AVX2-LABEL: trunc_packus_v8i32_v8i8: 2940 ; AVX2: # %bb.0: 2941 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255] 2942 ; AVX2-NEXT: vpminsd %ymm1, %ymm0, %ymm0 2943 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 2944 ; AVX2-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 2945 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2946 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 2947 ; AVX2-NEXT: vzeroupper 2948 ; AVX2-NEXT: retq 2949 ; 2950 ; AVX512F-LABEL: trunc_packus_v8i32_v8i8: 2951 ; AVX512F: # %bb.0: 2952 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255] 2953 ; AVX512F-NEXT: vpminsd %ymm1, %ymm0, %ymm0 2954 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 2955 ; AVX512F-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 2956 ; AVX512F-NEXT: vpmovdw %zmm0, %ymm0 2957 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 2958 ; AVX512F-NEXT: vzeroupper 2959 ; AVX512F-NEXT: retq 2960 ; 2961 ; AVX512VL-LABEL: trunc_packus_v8i32_v8i8: 2962 ; AVX512VL: # %bb.0: 2963 ; AVX512VL-NEXT: vpminsd {{.*}}(%rip){1to8}, %ymm0, %ymm0 2964 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2965 ; AVX512VL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 2966 ; AVX512VL-NEXT: vpmovdw %ymm0, %xmm0 2967 ; AVX512VL-NEXT: vzeroupper 2968 ; AVX512VL-NEXT: retq 2969 ; 2970 ; AVX512BW-LABEL: trunc_packus_v8i32_v8i8: 2971 ; AVX512BW: # %bb.0: 2972 ; AVX512BW-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255] 2973 ; AVX512BW-NEXT: vpminsd %ymm1, %ymm0, %ymm0 2974 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 2975 ; AVX512BW-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 2976 ; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0 2977 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 2978 ; AVX512BW-NEXT: vzeroupper 2979 ; AVX512BW-NEXT: retq 2980 ; 2981 ; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i8: 2982 ; AVX512BWVL: # %bb.0: 2983 ; AVX512BWVL-NEXT: vpminsd {{.*}}(%rip){1to8}, %ymm0, %ymm0 2984 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 2985 ; AVX512BWVL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 2986 ; AVX512BWVL-NEXT: vpmovdw %ymm0, %xmm0 2987 ; AVX512BWVL-NEXT: vzeroupper 2988 ; AVX512BWVL-NEXT: retq 2989 %1 = icmp slt <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 2990 %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> 2991 %3 = icmp sgt <8 x i32> %2, zeroinitializer 2992 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer 2993 %5 = trunc <8 x i32> %4 to <8 x i8> 2994 ret <8 x i8> %5 2995 } 2996 2997 define void @trunc_packus_v8i32_v8i8_store(<8 x i32> %a0, <8 x i8> *%p1) { 2998 ; SSE-LABEL: trunc_packus_v8i32_v8i8_store: 2999 ; SSE: # %bb.0: 3000 ; SSE-NEXT: packssdw %xmm1, %xmm0 3001 ; SSE-NEXT: packuswb %xmm0, %xmm0 3002 ; SSE-NEXT: movq %xmm0, (%rdi) 3003 ; SSE-NEXT: retq 3004 ; 3005 ; AVX1-LABEL: trunc_packus_v8i32_v8i8_store: 3006 ; AVX1: # %bb.0: 3007 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 3008 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 3009 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 3010 ; AVX1-NEXT: vmovq %xmm0, (%rdi) 3011 ; AVX1-NEXT: vzeroupper 3012 ; AVX1-NEXT: retq 3013 ; 3014 ; AVX2-LABEL: trunc_packus_v8i32_v8i8_store: 3015 ; AVX2: # %bb.0: 3016 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 3017 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 3018 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 3019 ; AVX2-NEXT: vmovq %xmm0, (%rdi) 3020 ; AVX2-NEXT: vzeroupper 3021 ; AVX2-NEXT: retq 3022 ; 3023 ; AVX512F-LABEL: trunc_packus_v8i32_v8i8_store: 3024 ; AVX512F: # %bb.0: 3025 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255] 3026 ; AVX512F-NEXT: vpminsd %ymm1, %ymm0, %ymm0 3027 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 3028 ; AVX512F-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 3029 ; AVX512F-NEXT: vpmovdw %zmm0, %ymm0 3030 ; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 3031 ; AVX512F-NEXT: vmovq %xmm0, (%rdi) 3032 ; AVX512F-NEXT: vzeroupper 3033 ; AVX512F-NEXT: retq 3034 ; 3035 ; AVX512VL-LABEL: trunc_packus_v8i32_v8i8_store: 3036 ; AVX512VL: # %bb.0: 3037 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 3038 ; AVX512VL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 3039 ; AVX512VL-NEXT: vpmovusdb %ymm0, (%rdi) 3040 ; AVX512VL-NEXT: vzeroupper 3041 ; AVX512VL-NEXT: retq 3042 ; 3043 ; AVX512BW-LABEL: trunc_packus_v8i32_v8i8_store: 3044 ; AVX512BW: # %bb.0: 3045 ; AVX512BW-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255] 3046 ; AVX512BW-NEXT: vpminsd %ymm1, %ymm0, %ymm0 3047 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 3048 ; AVX512BW-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 3049 ; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0 3050 ; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 3051 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi) 3052 ; AVX512BW-NEXT: vzeroupper 3053 ; AVX512BW-NEXT: retq 3054 ; 3055 ; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i8_store: 3056 ; AVX512BWVL: # %bb.0: 3057 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 3058 ; AVX512BWVL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 3059 ; AVX512BWVL-NEXT: vpmovusdb %ymm0, (%rdi) 3060 ; AVX512BWVL-NEXT: vzeroupper 3061 ; AVX512BWVL-NEXT: retq 3062 %1 = icmp slt <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 3063 %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> 3064 %3 = icmp sgt <8 x i32> %2, zeroinitializer 3065 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer 3066 %5 = trunc <8 x i32> %4 to <8 x i8> 3067 store <8 x i8> %5, <8 x i8> *%p1 3068 ret void 3069 } 3070 3071 define <16 x i8> @trunc_packus_v16i32_v16i8(<16 x i32> %a0) { 3072 ; SSE-LABEL: trunc_packus_v16i32_v16i8: 3073 ; SSE: # %bb.0: 3074 ; SSE-NEXT: packssdw %xmm3, %xmm2 3075 ; SSE-NEXT: packssdw %xmm1, %xmm0 3076 ; SSE-NEXT: packuswb %xmm2, %xmm0 3077 ; SSE-NEXT: retq 3078 ; 3079 ; AVX1-LABEL: trunc_packus_v16i32_v16i8: 3080 ; AVX1: # %bb.0: 3081 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 3082 ; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1 3083 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 3084 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 3085 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3086 ; AVX1-NEXT: vzeroupper 3087 ; AVX1-NEXT: retq 3088 ; 3089 ; AVX2-LABEL: trunc_packus_v16i32_v16i8: 3090 ; AVX2: # %bb.0: 3091 ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 3092 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 3093 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 3094 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3095 ; AVX2-NEXT: vzeroupper 3096 ; AVX2-NEXT: retq 3097 ; 3098 ; AVX512-LABEL: trunc_packus_v16i32_v16i8: 3099 ; AVX512: # %bb.0: 3100 ; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 3101 ; AVX512-NEXT: vpmaxsd %zmm1, %zmm0, %zmm0 3102 ; AVX512-NEXT: vpmovusdb %zmm0, %xmm0 3103 ; AVX512-NEXT: vzeroupper 3104 ; AVX512-NEXT: retq 3105 %1 = icmp slt <16 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 3106 %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> 3107 %3 = icmp sgt <16 x i32> %2, zeroinitializer 3108 %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> zeroinitializer 3109 %5 = trunc <16 x i32> %4 to <16 x i8> 3110 ret <16 x i8> %5 3111 } 3112 3113 define <16 x i8> @trunc_packus_v16i16_v16i8(<16 x i16> %a0) { 3114 ; SSE-LABEL: trunc_packus_v16i16_v16i8: 3115 ; SSE: # %bb.0: 3116 ; SSE-NEXT: packuswb %xmm1, %xmm0 3117 ; SSE-NEXT: retq 3118 ; 3119 ; AVX1-LABEL: trunc_packus_v16i16_v16i8: 3120 ; AVX1: # %bb.0: 3121 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 3122 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3123 ; AVX1-NEXT: vzeroupper 3124 ; AVX1-NEXT: retq 3125 ; 3126 ; AVX2-LABEL: trunc_packus_v16i16_v16i8: 3127 ; AVX2: # %bb.0: 3128 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 3129 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3130 ; AVX2-NEXT: vzeroupper 3131 ; AVX2-NEXT: retq 3132 ; 3133 ; AVX512F-LABEL: trunc_packus_v16i16_v16i8: 3134 ; AVX512F: # %bb.0: 3135 ; AVX512F-NEXT: vpminsw {{.*}}(%rip), %ymm0, %ymm0 3136 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 3137 ; AVX512F-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 3138 ; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 3139 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 3140 ; AVX512F-NEXT: vzeroupper 3141 ; AVX512F-NEXT: retq 3142 ; 3143 ; AVX512VL-LABEL: trunc_packus_v16i16_v16i8: 3144 ; AVX512VL: # %bb.0: 3145 ; AVX512VL-NEXT: vpminsw {{.*}}(%rip), %ymm0, %ymm0 3146 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 3147 ; AVX512VL-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 3148 ; AVX512VL-NEXT: vpmovsxwd %ymm0, %zmm0 3149 ; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0 3150 ; AVX512VL-NEXT: vzeroupper 3151 ; AVX512VL-NEXT: retq 3152 ; 3153 ; AVX512BW-LABEL: trunc_packus_v16i16_v16i8: 3154 ; AVX512BW: # %bb.0: 3155 ; AVX512BW-NEXT: vpminsw {{.*}}(%rip), %ymm0, %ymm0 3156 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 3157 ; AVX512BW-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 3158 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 3159 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 3160 ; AVX512BW-NEXT: vzeroupper 3161 ; AVX512BW-NEXT: retq 3162 ; 3163 ; AVX512BWVL-LABEL: trunc_packus_v16i16_v16i8: 3164 ; AVX512BWVL: # %bb.0: 3165 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 3166 ; AVX512BWVL-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 3167 ; AVX512BWVL-NEXT: vpmovuswb %ymm0, %xmm0 3168 ; AVX512BWVL-NEXT: vzeroupper 3169 ; AVX512BWVL-NEXT: retq 3170 %1 = icmp slt <16 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 3171 %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> 3172 %3 = icmp sgt <16 x i16> %2, zeroinitializer 3173 %4 = select <16 x i1> %3, <16 x i16> %2, <16 x i16> zeroinitializer 3174 %5 = trunc <16 x i16> %4 to <16 x i8> 3175 ret <16 x i8> %5 3176 } 3177 3178 define <32 x i8> @trunc_packus_v32i16_v32i8(<32 x i16> %a0) { 3179 ; SSE-LABEL: trunc_packus_v32i16_v32i8: 3180 ; SSE: # %bb.0: 3181 ; SSE-NEXT: packuswb %xmm1, %xmm0 3182 ; SSE-NEXT: packuswb %xmm3, %xmm2 3183 ; SSE-NEXT: movdqa %xmm2, %xmm1 3184 ; SSE-NEXT: retq 3185 ; 3186 ; AVX1-LABEL: trunc_packus_v32i16_v32i8: 3187 ; AVX1: # %bb.0: 3188 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 3189 ; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1 3190 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 3191 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 3192 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 3193 ; AVX1-NEXT: retq 3194 ; 3195 ; AVX2-LABEL: trunc_packus_v32i16_v32i8: 3196 ; AVX2: # %bb.0: 3197 ; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 3198 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 3199 ; AVX2-NEXT: retq 3200 ; 3201 ; AVX512F-LABEL: trunc_packus_v32i16_v32i8: 3202 ; AVX512F: # %bb.0: 3203 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 3204 ; AVX512F-NEXT: vpminsw %ymm2, %ymm0, %ymm0 3205 ; AVX512F-NEXT: vpminsw %ymm2, %ymm1, %ymm1 3206 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 3207 ; AVX512F-NEXT: vpmaxsw %ymm2, %ymm1, %ymm1 3208 ; AVX512F-NEXT: vpmaxsw %ymm2, %ymm0, %ymm0 3209 ; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 3210 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 3211 ; AVX512F-NEXT: vpmovsxwd %ymm1, %zmm1 3212 ; AVX512F-NEXT: vpmovdb %zmm1, %xmm1 3213 ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 3214 ; AVX512F-NEXT: retq 3215 ; 3216 ; AVX512VL-LABEL: trunc_packus_v32i16_v32i8: 3217 ; AVX512VL: # %bb.0: 3218 ; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 3219 ; AVX512VL-NEXT: vpminsw %ymm2, %ymm0, %ymm0 3220 ; AVX512VL-NEXT: vpminsw %ymm2, %ymm1, %ymm1 3221 ; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm2 3222 ; AVX512VL-NEXT: vpmaxsw %ymm2, %ymm1, %ymm1 3223 ; AVX512VL-NEXT: vpmaxsw %ymm2, %ymm0, %ymm0 3224 ; AVX512VL-NEXT: vpmovsxwd %ymm0, %zmm0 3225 ; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0 3226 ; AVX512VL-NEXT: vpmovsxwd %ymm1, %zmm1 3227 ; AVX512VL-NEXT: vpmovdb %zmm1, %xmm1 3228 ; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 3229 ; AVX512VL-NEXT: retq 3230 ; 3231 ; AVX512BW-LABEL: trunc_packus_v32i16_v32i8: 3232 ; AVX512BW: # %bb.0: 3233 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 3234 ; AVX512BW-NEXT: vpmaxsw %zmm1, %zmm0, %zmm0 3235 ; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm0 3236 ; AVX512BW-NEXT: retq 3237 ; 3238 ; AVX512BWVL-LABEL: trunc_packus_v32i16_v32i8: 3239 ; AVX512BWVL: # %bb.0: 3240 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1 3241 ; AVX512BWVL-NEXT: vpmaxsw %zmm1, %zmm0, %zmm0 3242 ; AVX512BWVL-NEXT: vpmovuswb %zmm0, %ymm0 3243 ; AVX512BWVL-NEXT: retq 3244 %1 = icmp slt <32 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 3245 %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> 3246 %3 = icmp sgt <32 x i16> %2, zeroinitializer 3247 %4 = select <32 x i1> %3, <32 x i16> %2, <32 x i16> zeroinitializer 3248 %5 = trunc <32 x i16> %4 to <32 x i8> 3249 ret <32 x i8> %5 3250 } 3251