1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=X64 --check-prefix=SSE --check-prefix=SSE2 3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse3 | FileCheck %s --check-prefix=X64 --check-prefix=SSE --check-prefix=SSE3 4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=X64 --check-prefix=SSE --check-prefix=SSSE3 5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X64 --check-prefix=SSE --check-prefix=SSE41 6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=X64 --check-prefix=NOBW --check-prefix=AVX --check-prefix=AVX1 7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X64 --check-prefix=NOBW --check-prefix=AVX --check-prefix=AVX2 8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl | FileCheck %s --check-prefix=X64 --check-prefix=NOBW --check-prefix=AVX --check-prefix=AVX512VL 9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512bw,+avx512dq | FileCheck %s --check-prefix=X64 --check-prefix=AVX512VLBWDQ 10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512cd,+avx512vl | FileCheck %s --check-prefix=X64 --check-prefix=NOBW --check-prefix=AVX512 --check-prefix=AVX512VLCD 11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512cd | FileCheck %s --check-prefix=X64 --check-prefix=NOBW --check-prefix=AVX512 --check-prefix=AVX512CD 12 ; 13 ; Just one 32-bit run to make sure we do reasonable things for i64 lzcnt. 14 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X32-SSE 15 16 define <2 x i64> @testv2i64(<2 x i64> %in) nounwind { 17 ; SSE2-LABEL: testv2i64: 18 ; SSE2: # %bb.0: 19 ; SSE2-NEXT: movdqa %xmm0, %xmm1 20 ; SSE2-NEXT: psrlq $1, %xmm1 21 ; SSE2-NEXT: por %xmm0, %xmm1 22 ; SSE2-NEXT: movdqa %xmm1, %xmm0 23 ; SSE2-NEXT: psrlq $2, %xmm0 24 ; SSE2-NEXT: por %xmm1, %xmm0 25 ; SSE2-NEXT: movdqa %xmm0, %xmm1 26 ; SSE2-NEXT: psrlq $4, %xmm1 27 ; SSE2-NEXT: por %xmm0, %xmm1 28 ; SSE2-NEXT: movdqa %xmm1, %xmm0 29 ; SSE2-NEXT: psrlq $8, %xmm0 30 ; SSE2-NEXT: por %xmm1, %xmm0 31 ; SSE2-NEXT: movdqa %xmm0, %xmm1 32 ; SSE2-NEXT: psrlq $16, %xmm1 33 ; SSE2-NEXT: por %xmm0, %xmm1 34 ; SSE2-NEXT: movdqa %xmm1, %xmm0 35 ; SSE2-NEXT: psrlq $32, %xmm0 36 ; SSE2-NEXT: por %xmm1, %xmm0 37 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 38 ; SSE2-NEXT: pxor %xmm0, %xmm1 39 ; SSE2-NEXT: movdqa %xmm1, %xmm0 40 ; SSE2-NEXT: psrlq $1, %xmm0 41 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 42 ; SSE2-NEXT: psubq %xmm0, %xmm1 43 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [3689348814741910323,3689348814741910323] 44 ; SSE2-NEXT: movdqa %xmm1, %xmm2 45 ; SSE2-NEXT: pand %xmm0, %xmm2 46 ; SSE2-NEXT: psrlq $2, %xmm1 47 ; SSE2-NEXT: pand %xmm0, %xmm1 48 ; SSE2-NEXT: paddq %xmm2, %xmm1 49 ; SSE2-NEXT: movdqa %xmm1, %xmm2 50 ; SSE2-NEXT: psrlq $4, %xmm2 51 ; SSE2-NEXT: paddq %xmm1, %xmm2 52 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm2 53 ; SSE2-NEXT: pxor %xmm0, %xmm0 54 ; SSE2-NEXT: psadbw %xmm2, %xmm0 55 ; SSE2-NEXT: retq 56 ; 57 ; SSE3-LABEL: testv2i64: 58 ; SSE3: # %bb.0: 59 ; SSE3-NEXT: movdqa %xmm0, %xmm1 60 ; SSE3-NEXT: psrlq $1, %xmm1 61 ; SSE3-NEXT: por %xmm0, %xmm1 62 ; SSE3-NEXT: movdqa %xmm1, %xmm0 63 ; SSE3-NEXT: psrlq $2, %xmm0 64 ; SSE3-NEXT: por %xmm1, %xmm0 65 ; SSE3-NEXT: movdqa %xmm0, %xmm1 66 ; SSE3-NEXT: psrlq $4, %xmm1 67 ; SSE3-NEXT: por %xmm0, %xmm1 68 ; SSE3-NEXT: movdqa %xmm1, %xmm0 69 ; SSE3-NEXT: psrlq $8, %xmm0 70 ; SSE3-NEXT: por %xmm1, %xmm0 71 ; SSE3-NEXT: movdqa %xmm0, %xmm1 72 ; SSE3-NEXT: psrlq $16, %xmm1 73 ; SSE3-NEXT: por %xmm0, %xmm1 74 ; SSE3-NEXT: movdqa %xmm1, %xmm0 75 ; SSE3-NEXT: psrlq $32, %xmm0 76 ; SSE3-NEXT: por %xmm1, %xmm0 77 ; SSE3-NEXT: pcmpeqd %xmm1, %xmm1 78 ; SSE3-NEXT: pxor %xmm0, %xmm1 79 ; SSE3-NEXT: movdqa %xmm1, %xmm0 80 ; SSE3-NEXT: psrlq $1, %xmm0 81 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm0 82 ; SSE3-NEXT: psubq %xmm0, %xmm1 83 ; SSE3-NEXT: movdqa {{.*#+}} xmm0 = [3689348814741910323,3689348814741910323] 84 ; SSE3-NEXT: movdqa %xmm1, %xmm2 85 ; SSE3-NEXT: pand %xmm0, %xmm2 86 ; SSE3-NEXT: psrlq $2, %xmm1 87 ; SSE3-NEXT: pand %xmm0, %xmm1 88 ; SSE3-NEXT: paddq %xmm2, %xmm1 89 ; SSE3-NEXT: movdqa %xmm1, %xmm2 90 ; SSE3-NEXT: psrlq $4, %xmm2 91 ; SSE3-NEXT: paddq %xmm1, %xmm2 92 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm2 93 ; SSE3-NEXT: pxor %xmm0, %xmm0 94 ; SSE3-NEXT: psadbw %xmm2, %xmm0 95 ; SSE3-NEXT: retq 96 ; 97 ; SSSE3-LABEL: testv2i64: 98 ; SSSE3: # %bb.0: 99 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 100 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 101 ; SSSE3-NEXT: pand %xmm2, %xmm1 102 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 103 ; SSSE3-NEXT: movdqa %xmm3, %xmm4 104 ; SSSE3-NEXT: pshufb %xmm1, %xmm4 105 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 106 ; SSSE3-NEXT: psrlw $4, %xmm1 107 ; SSSE3-NEXT: pand %xmm2, %xmm1 108 ; SSSE3-NEXT: pxor %xmm2, %xmm2 109 ; SSSE3-NEXT: pshufb %xmm1, %xmm3 110 ; SSSE3-NEXT: pcmpeqb %xmm2, %xmm1 111 ; SSSE3-NEXT: pand %xmm4, %xmm1 112 ; SSSE3-NEXT: paddb %xmm3, %xmm1 113 ; SSSE3-NEXT: movdqa %xmm0, %xmm3 114 ; SSSE3-NEXT: pcmpeqb %xmm2, %xmm3 115 ; SSSE3-NEXT: psrlw $8, %xmm3 116 ; SSSE3-NEXT: pand %xmm1, %xmm3 117 ; SSSE3-NEXT: psrlw $8, %xmm1 118 ; SSSE3-NEXT: paddw %xmm3, %xmm1 119 ; SSSE3-NEXT: movdqa %xmm0, %xmm3 120 ; SSSE3-NEXT: pcmpeqw %xmm2, %xmm3 121 ; SSSE3-NEXT: psrld $16, %xmm3 122 ; SSSE3-NEXT: pand %xmm1, %xmm3 123 ; SSSE3-NEXT: psrld $16, %xmm1 124 ; SSSE3-NEXT: paddd %xmm3, %xmm1 125 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0 126 ; SSSE3-NEXT: psrlq $32, %xmm0 127 ; SSSE3-NEXT: pand %xmm1, %xmm0 128 ; SSSE3-NEXT: psrlq $32, %xmm1 129 ; SSSE3-NEXT: paddq %xmm0, %xmm1 130 ; SSSE3-NEXT: movdqa %xmm1, %xmm0 131 ; SSSE3-NEXT: retq 132 ; 133 ; SSE41-LABEL: testv2i64: 134 ; SSE41: # %bb.0: 135 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 136 ; SSE41-NEXT: movdqa %xmm0, %xmm1 137 ; SSE41-NEXT: pand %xmm2, %xmm1 138 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 139 ; SSE41-NEXT: movdqa %xmm3, %xmm4 140 ; SSE41-NEXT: pshufb %xmm1, %xmm4 141 ; SSE41-NEXT: movdqa %xmm0, %xmm1 142 ; SSE41-NEXT: psrlw $4, %xmm1 143 ; SSE41-NEXT: pand %xmm2, %xmm1 144 ; SSE41-NEXT: pxor %xmm2, %xmm2 145 ; SSE41-NEXT: pshufb %xmm1, %xmm3 146 ; SSE41-NEXT: pcmpeqb %xmm2, %xmm1 147 ; SSE41-NEXT: pand %xmm4, %xmm1 148 ; SSE41-NEXT: paddb %xmm3, %xmm1 149 ; SSE41-NEXT: movdqa %xmm0, %xmm3 150 ; SSE41-NEXT: pcmpeqb %xmm2, %xmm3 151 ; SSE41-NEXT: psrlw $8, %xmm3 152 ; SSE41-NEXT: pand %xmm1, %xmm3 153 ; SSE41-NEXT: psrlw $8, %xmm1 154 ; SSE41-NEXT: paddw %xmm3, %xmm1 155 ; SSE41-NEXT: movdqa %xmm0, %xmm3 156 ; SSE41-NEXT: pcmpeqw %xmm2, %xmm3 157 ; SSE41-NEXT: psrld $16, %xmm3 158 ; SSE41-NEXT: pand %xmm1, %xmm3 159 ; SSE41-NEXT: psrld $16, %xmm1 160 ; SSE41-NEXT: paddd %xmm3, %xmm1 161 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0 162 ; SSE41-NEXT: psrlq $32, %xmm0 163 ; SSE41-NEXT: pand %xmm1, %xmm0 164 ; SSE41-NEXT: psrlq $32, %xmm1 165 ; SSE41-NEXT: paddq %xmm0, %xmm1 166 ; SSE41-NEXT: movdqa %xmm1, %xmm0 167 ; SSE41-NEXT: retq 168 ; 169 ; AVX-LABEL: testv2i64: 170 ; AVX: # %bb.0: 171 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 172 ; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 173 ; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 174 ; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 175 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm4 176 ; AVX-NEXT: vpand %xmm1, %xmm4, %xmm1 177 ; AVX-NEXT: vpxor %xmm4, %xmm4, %xmm4 178 ; AVX-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm5 179 ; AVX-NEXT: vpand %xmm5, %xmm2, %xmm2 180 ; AVX-NEXT: vpshufb %xmm1, %xmm3, %xmm1 181 ; AVX-NEXT: vpaddb %xmm1, %xmm2, %xmm1 182 ; AVX-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm2 183 ; AVX-NEXT: vpsrlw $8, %xmm2, %xmm2 184 ; AVX-NEXT: vpand %xmm2, %xmm1, %xmm2 185 ; AVX-NEXT: vpsrlw $8, %xmm1, %xmm1 186 ; AVX-NEXT: vpaddw %xmm2, %xmm1, %xmm1 187 ; AVX-NEXT: vpcmpeqw %xmm4, %xmm0, %xmm2 188 ; AVX-NEXT: vpsrld $16, %xmm2, %xmm2 189 ; AVX-NEXT: vpand %xmm2, %xmm1, %xmm2 190 ; AVX-NEXT: vpsrld $16, %xmm1, %xmm1 191 ; AVX-NEXT: vpaddd %xmm2, %xmm1, %xmm1 192 ; AVX-NEXT: vpcmpeqd %xmm4, %xmm0, %xmm0 193 ; AVX-NEXT: vpsrlq $32, %xmm0, %xmm0 194 ; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0 195 ; AVX-NEXT: vpsrlq $32, %xmm1, %xmm1 196 ; AVX-NEXT: vpaddq %xmm0, %xmm1, %xmm0 197 ; AVX-NEXT: retq 198 ; 199 ; AVX512VLBWDQ-LABEL: testv2i64: 200 ; AVX512VLBWDQ: # %bb.0: 201 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 202 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm0, %xmm2 203 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 204 ; AVX512VLBWDQ-NEXT: vpshufb %xmm2, %xmm3, %xmm2 205 ; AVX512VLBWDQ-NEXT: vpsrlw $4, %xmm0, %xmm4 206 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm4, %xmm1 207 ; AVX512VLBWDQ-NEXT: vpxor %xmm4, %xmm4, %xmm4 208 ; AVX512VLBWDQ-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm5 209 ; AVX512VLBWDQ-NEXT: vpand %xmm5, %xmm2, %xmm2 210 ; AVX512VLBWDQ-NEXT: vpshufb %xmm1, %xmm3, %xmm1 211 ; AVX512VLBWDQ-NEXT: vpaddb %xmm1, %xmm2, %xmm1 212 ; AVX512VLBWDQ-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm2 213 ; AVX512VLBWDQ-NEXT: vpsrlw $8, %xmm2, %xmm2 214 ; AVX512VLBWDQ-NEXT: vpand %xmm2, %xmm1, %xmm2 215 ; AVX512VLBWDQ-NEXT: vpsrlw $8, %xmm1, %xmm1 216 ; AVX512VLBWDQ-NEXT: vpaddw %xmm2, %xmm1, %xmm1 217 ; AVX512VLBWDQ-NEXT: vpcmpeqw %xmm4, %xmm0, %xmm2 218 ; AVX512VLBWDQ-NEXT: vpsrld $16, %xmm2, %xmm2 219 ; AVX512VLBWDQ-NEXT: vpand %xmm2, %xmm1, %xmm2 220 ; AVX512VLBWDQ-NEXT: vpsrld $16, %xmm1, %xmm1 221 ; AVX512VLBWDQ-NEXT: vpaddd %xmm2, %xmm1, %xmm1 222 ; AVX512VLBWDQ-NEXT: vpcmpeqd %xmm4, %xmm0, %xmm0 223 ; AVX512VLBWDQ-NEXT: vpsrlq $32, %xmm0, %xmm0 224 ; AVX512VLBWDQ-NEXT: vpand %xmm0, %xmm1, %xmm0 225 ; AVX512VLBWDQ-NEXT: vpsrlq $32, %xmm1, %xmm1 226 ; AVX512VLBWDQ-NEXT: vpaddq %xmm0, %xmm1, %xmm0 227 ; AVX512VLBWDQ-NEXT: retq 228 ; 229 ; AVX512VLCD-LABEL: testv2i64: 230 ; AVX512VLCD: # %bb.0: 231 ; AVX512VLCD-NEXT: vplzcntq %xmm0, %xmm0 232 ; AVX512VLCD-NEXT: retq 233 ; 234 ; AVX512CD-LABEL: testv2i64: 235 ; AVX512CD: # %bb.0: 236 ; AVX512CD-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 237 ; AVX512CD-NEXT: vplzcntq %zmm0, %zmm0 238 ; AVX512CD-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 239 ; AVX512CD-NEXT: vzeroupper 240 ; AVX512CD-NEXT: retq 241 ; 242 ; X32-SSE-LABEL: testv2i64: 243 ; X32-SSE: # %bb.0: 244 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 245 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 246 ; X32-SSE-NEXT: pand %xmm2, %xmm1 247 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 248 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4 249 ; X32-SSE-NEXT: pshufb %xmm1, %xmm4 250 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 251 ; X32-SSE-NEXT: psrlw $4, %xmm1 252 ; X32-SSE-NEXT: pand %xmm2, %xmm1 253 ; X32-SSE-NEXT: pxor %xmm2, %xmm2 254 ; X32-SSE-NEXT: pshufb %xmm1, %xmm3 255 ; X32-SSE-NEXT: pcmpeqb %xmm2, %xmm1 256 ; X32-SSE-NEXT: pand %xmm4, %xmm1 257 ; X32-SSE-NEXT: paddb %xmm3, %xmm1 258 ; X32-SSE-NEXT: movdqa %xmm0, %xmm3 259 ; X32-SSE-NEXT: pcmpeqb %xmm2, %xmm3 260 ; X32-SSE-NEXT: psrlw $8, %xmm3 261 ; X32-SSE-NEXT: pand %xmm1, %xmm3 262 ; X32-SSE-NEXT: psrlw $8, %xmm1 263 ; X32-SSE-NEXT: paddw %xmm3, %xmm1 264 ; X32-SSE-NEXT: movdqa %xmm0, %xmm3 265 ; X32-SSE-NEXT: pcmpeqw %xmm2, %xmm3 266 ; X32-SSE-NEXT: psrld $16, %xmm3 267 ; X32-SSE-NEXT: pand %xmm1, %xmm3 268 ; X32-SSE-NEXT: psrld $16, %xmm1 269 ; X32-SSE-NEXT: paddd %xmm3, %xmm1 270 ; X32-SSE-NEXT: pcmpeqd %xmm2, %xmm0 271 ; X32-SSE-NEXT: psrlq $32, %xmm0 272 ; X32-SSE-NEXT: pand %xmm1, %xmm0 273 ; X32-SSE-NEXT: psrlq $32, %xmm1 274 ; X32-SSE-NEXT: paddq %xmm0, %xmm1 275 ; X32-SSE-NEXT: movdqa %xmm1, %xmm0 276 ; X32-SSE-NEXT: retl 277 278 %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %in, i1 0) 279 ret <2 x i64> %out 280 } 281 282 define <2 x i64> @testv2i64u(<2 x i64> %in) nounwind { 283 ; SSE2-LABEL: testv2i64u: 284 ; SSE2: # %bb.0: 285 ; SSE2-NEXT: movdqa %xmm0, %xmm1 286 ; SSE2-NEXT: psrlq $1, %xmm1 287 ; SSE2-NEXT: por %xmm0, %xmm1 288 ; SSE2-NEXT: movdqa %xmm1, %xmm0 289 ; SSE2-NEXT: psrlq $2, %xmm0 290 ; SSE2-NEXT: por %xmm1, %xmm0 291 ; SSE2-NEXT: movdqa %xmm0, %xmm1 292 ; SSE2-NEXT: psrlq $4, %xmm1 293 ; SSE2-NEXT: por %xmm0, %xmm1 294 ; SSE2-NEXT: movdqa %xmm1, %xmm0 295 ; SSE2-NEXT: psrlq $8, %xmm0 296 ; SSE2-NEXT: por %xmm1, %xmm0 297 ; SSE2-NEXT: movdqa %xmm0, %xmm1 298 ; SSE2-NEXT: psrlq $16, %xmm1 299 ; SSE2-NEXT: por %xmm0, %xmm1 300 ; SSE2-NEXT: movdqa %xmm1, %xmm0 301 ; SSE2-NEXT: psrlq $32, %xmm0 302 ; SSE2-NEXT: por %xmm1, %xmm0 303 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 304 ; SSE2-NEXT: pxor %xmm0, %xmm1 305 ; SSE2-NEXT: movdqa %xmm1, %xmm0 306 ; SSE2-NEXT: psrlq $1, %xmm0 307 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 308 ; SSE2-NEXT: psubq %xmm0, %xmm1 309 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [3689348814741910323,3689348814741910323] 310 ; SSE2-NEXT: movdqa %xmm1, %xmm2 311 ; SSE2-NEXT: pand %xmm0, %xmm2 312 ; SSE2-NEXT: psrlq $2, %xmm1 313 ; SSE2-NEXT: pand %xmm0, %xmm1 314 ; SSE2-NEXT: paddq %xmm2, %xmm1 315 ; SSE2-NEXT: movdqa %xmm1, %xmm2 316 ; SSE2-NEXT: psrlq $4, %xmm2 317 ; SSE2-NEXT: paddq %xmm1, %xmm2 318 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm2 319 ; SSE2-NEXT: pxor %xmm0, %xmm0 320 ; SSE2-NEXT: psadbw %xmm2, %xmm0 321 ; SSE2-NEXT: retq 322 ; 323 ; SSE3-LABEL: testv2i64u: 324 ; SSE3: # %bb.0: 325 ; SSE3-NEXT: movdqa %xmm0, %xmm1 326 ; SSE3-NEXT: psrlq $1, %xmm1 327 ; SSE3-NEXT: por %xmm0, %xmm1 328 ; SSE3-NEXT: movdqa %xmm1, %xmm0 329 ; SSE3-NEXT: psrlq $2, %xmm0 330 ; SSE3-NEXT: por %xmm1, %xmm0 331 ; SSE3-NEXT: movdqa %xmm0, %xmm1 332 ; SSE3-NEXT: psrlq $4, %xmm1 333 ; SSE3-NEXT: por %xmm0, %xmm1 334 ; SSE3-NEXT: movdqa %xmm1, %xmm0 335 ; SSE3-NEXT: psrlq $8, %xmm0 336 ; SSE3-NEXT: por %xmm1, %xmm0 337 ; SSE3-NEXT: movdqa %xmm0, %xmm1 338 ; SSE3-NEXT: psrlq $16, %xmm1 339 ; SSE3-NEXT: por %xmm0, %xmm1 340 ; SSE3-NEXT: movdqa %xmm1, %xmm0 341 ; SSE3-NEXT: psrlq $32, %xmm0 342 ; SSE3-NEXT: por %xmm1, %xmm0 343 ; SSE3-NEXT: pcmpeqd %xmm1, %xmm1 344 ; SSE3-NEXT: pxor %xmm0, %xmm1 345 ; SSE3-NEXT: movdqa %xmm1, %xmm0 346 ; SSE3-NEXT: psrlq $1, %xmm0 347 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm0 348 ; SSE3-NEXT: psubq %xmm0, %xmm1 349 ; SSE3-NEXT: movdqa {{.*#+}} xmm0 = [3689348814741910323,3689348814741910323] 350 ; SSE3-NEXT: movdqa %xmm1, %xmm2 351 ; SSE3-NEXT: pand %xmm0, %xmm2 352 ; SSE3-NEXT: psrlq $2, %xmm1 353 ; SSE3-NEXT: pand %xmm0, %xmm1 354 ; SSE3-NEXT: paddq %xmm2, %xmm1 355 ; SSE3-NEXT: movdqa %xmm1, %xmm2 356 ; SSE3-NEXT: psrlq $4, %xmm2 357 ; SSE3-NEXT: paddq %xmm1, %xmm2 358 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm2 359 ; SSE3-NEXT: pxor %xmm0, %xmm0 360 ; SSE3-NEXT: psadbw %xmm2, %xmm0 361 ; SSE3-NEXT: retq 362 ; 363 ; SSSE3-LABEL: testv2i64u: 364 ; SSSE3: # %bb.0: 365 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 366 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 367 ; SSSE3-NEXT: pand %xmm2, %xmm1 368 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 369 ; SSSE3-NEXT: movdqa %xmm3, %xmm4 370 ; SSSE3-NEXT: pshufb %xmm1, %xmm4 371 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 372 ; SSSE3-NEXT: psrlw $4, %xmm1 373 ; SSSE3-NEXT: pand %xmm2, %xmm1 374 ; SSSE3-NEXT: pxor %xmm2, %xmm2 375 ; SSSE3-NEXT: pshufb %xmm1, %xmm3 376 ; SSSE3-NEXT: pcmpeqb %xmm2, %xmm1 377 ; SSSE3-NEXT: pand %xmm4, %xmm1 378 ; SSSE3-NEXT: paddb %xmm3, %xmm1 379 ; SSSE3-NEXT: movdqa %xmm0, %xmm3 380 ; SSSE3-NEXT: pcmpeqb %xmm2, %xmm3 381 ; SSSE3-NEXT: psrlw $8, %xmm3 382 ; SSSE3-NEXT: pand %xmm1, %xmm3 383 ; SSSE3-NEXT: psrlw $8, %xmm1 384 ; SSSE3-NEXT: paddw %xmm3, %xmm1 385 ; SSSE3-NEXT: movdqa %xmm0, %xmm3 386 ; SSSE3-NEXT: pcmpeqw %xmm2, %xmm3 387 ; SSSE3-NEXT: psrld $16, %xmm3 388 ; SSSE3-NEXT: pand %xmm1, %xmm3 389 ; SSSE3-NEXT: psrld $16, %xmm1 390 ; SSSE3-NEXT: paddd %xmm3, %xmm1 391 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm0 392 ; SSSE3-NEXT: psrlq $32, %xmm0 393 ; SSSE3-NEXT: pand %xmm1, %xmm0 394 ; SSSE3-NEXT: psrlq $32, %xmm1 395 ; SSSE3-NEXT: paddq %xmm0, %xmm1 396 ; SSSE3-NEXT: movdqa %xmm1, %xmm0 397 ; SSSE3-NEXT: retq 398 ; 399 ; SSE41-LABEL: testv2i64u: 400 ; SSE41: # %bb.0: 401 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 402 ; SSE41-NEXT: movdqa %xmm0, %xmm1 403 ; SSE41-NEXT: pand %xmm2, %xmm1 404 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 405 ; SSE41-NEXT: movdqa %xmm3, %xmm4 406 ; SSE41-NEXT: pshufb %xmm1, %xmm4 407 ; SSE41-NEXT: movdqa %xmm0, %xmm1 408 ; SSE41-NEXT: psrlw $4, %xmm1 409 ; SSE41-NEXT: pand %xmm2, %xmm1 410 ; SSE41-NEXT: pxor %xmm2, %xmm2 411 ; SSE41-NEXT: pshufb %xmm1, %xmm3 412 ; SSE41-NEXT: pcmpeqb %xmm2, %xmm1 413 ; SSE41-NEXT: pand %xmm4, %xmm1 414 ; SSE41-NEXT: paddb %xmm3, %xmm1 415 ; SSE41-NEXT: movdqa %xmm0, %xmm3 416 ; SSE41-NEXT: pcmpeqb %xmm2, %xmm3 417 ; SSE41-NEXT: psrlw $8, %xmm3 418 ; SSE41-NEXT: pand %xmm1, %xmm3 419 ; SSE41-NEXT: psrlw $8, %xmm1 420 ; SSE41-NEXT: paddw %xmm3, %xmm1 421 ; SSE41-NEXT: movdqa %xmm0, %xmm3 422 ; SSE41-NEXT: pcmpeqw %xmm2, %xmm3 423 ; SSE41-NEXT: psrld $16, %xmm3 424 ; SSE41-NEXT: pand %xmm1, %xmm3 425 ; SSE41-NEXT: psrld $16, %xmm1 426 ; SSE41-NEXT: paddd %xmm3, %xmm1 427 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0 428 ; SSE41-NEXT: psrlq $32, %xmm0 429 ; SSE41-NEXT: pand %xmm1, %xmm0 430 ; SSE41-NEXT: psrlq $32, %xmm1 431 ; SSE41-NEXT: paddq %xmm0, %xmm1 432 ; SSE41-NEXT: movdqa %xmm1, %xmm0 433 ; SSE41-NEXT: retq 434 ; 435 ; AVX-LABEL: testv2i64u: 436 ; AVX: # %bb.0: 437 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 438 ; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 439 ; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 440 ; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 441 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm4 442 ; AVX-NEXT: vpand %xmm1, %xmm4, %xmm1 443 ; AVX-NEXT: vpxor %xmm4, %xmm4, %xmm4 444 ; AVX-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm5 445 ; AVX-NEXT: vpand %xmm5, %xmm2, %xmm2 446 ; AVX-NEXT: vpshufb %xmm1, %xmm3, %xmm1 447 ; AVX-NEXT: vpaddb %xmm1, %xmm2, %xmm1 448 ; AVX-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm2 449 ; AVX-NEXT: vpsrlw $8, %xmm2, %xmm2 450 ; AVX-NEXT: vpand %xmm2, %xmm1, %xmm2 451 ; AVX-NEXT: vpsrlw $8, %xmm1, %xmm1 452 ; AVX-NEXT: vpaddw %xmm2, %xmm1, %xmm1 453 ; AVX-NEXT: vpcmpeqw %xmm4, %xmm0, %xmm2 454 ; AVX-NEXT: vpsrld $16, %xmm2, %xmm2 455 ; AVX-NEXT: vpand %xmm2, %xmm1, %xmm2 456 ; AVX-NEXT: vpsrld $16, %xmm1, %xmm1 457 ; AVX-NEXT: vpaddd %xmm2, %xmm1, %xmm1 458 ; AVX-NEXT: vpcmpeqd %xmm4, %xmm0, %xmm0 459 ; AVX-NEXT: vpsrlq $32, %xmm0, %xmm0 460 ; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0 461 ; AVX-NEXT: vpsrlq $32, %xmm1, %xmm1 462 ; AVX-NEXT: vpaddq %xmm0, %xmm1, %xmm0 463 ; AVX-NEXT: retq 464 ; 465 ; AVX512VLBWDQ-LABEL: testv2i64u: 466 ; AVX512VLBWDQ: # %bb.0: 467 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 468 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm0, %xmm2 469 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 470 ; AVX512VLBWDQ-NEXT: vpshufb %xmm2, %xmm3, %xmm2 471 ; AVX512VLBWDQ-NEXT: vpsrlw $4, %xmm0, %xmm4 472 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm4, %xmm1 473 ; AVX512VLBWDQ-NEXT: vpxor %xmm4, %xmm4, %xmm4 474 ; AVX512VLBWDQ-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm5 475 ; AVX512VLBWDQ-NEXT: vpand %xmm5, %xmm2, %xmm2 476 ; AVX512VLBWDQ-NEXT: vpshufb %xmm1, %xmm3, %xmm1 477 ; AVX512VLBWDQ-NEXT: vpaddb %xmm1, %xmm2, %xmm1 478 ; AVX512VLBWDQ-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm2 479 ; AVX512VLBWDQ-NEXT: vpsrlw $8, %xmm2, %xmm2 480 ; AVX512VLBWDQ-NEXT: vpand %xmm2, %xmm1, %xmm2 481 ; AVX512VLBWDQ-NEXT: vpsrlw $8, %xmm1, %xmm1 482 ; AVX512VLBWDQ-NEXT: vpaddw %xmm2, %xmm1, %xmm1 483 ; AVX512VLBWDQ-NEXT: vpcmpeqw %xmm4, %xmm0, %xmm2 484 ; AVX512VLBWDQ-NEXT: vpsrld $16, %xmm2, %xmm2 485 ; AVX512VLBWDQ-NEXT: vpand %xmm2, %xmm1, %xmm2 486 ; AVX512VLBWDQ-NEXT: vpsrld $16, %xmm1, %xmm1 487 ; AVX512VLBWDQ-NEXT: vpaddd %xmm2, %xmm1, %xmm1 488 ; AVX512VLBWDQ-NEXT: vpcmpeqd %xmm4, %xmm0, %xmm0 489 ; AVX512VLBWDQ-NEXT: vpsrlq $32, %xmm0, %xmm0 490 ; AVX512VLBWDQ-NEXT: vpand %xmm0, %xmm1, %xmm0 491 ; AVX512VLBWDQ-NEXT: vpsrlq $32, %xmm1, %xmm1 492 ; AVX512VLBWDQ-NEXT: vpaddq %xmm0, %xmm1, %xmm0 493 ; AVX512VLBWDQ-NEXT: retq 494 ; 495 ; AVX512VLCD-LABEL: testv2i64u: 496 ; AVX512VLCD: # %bb.0: 497 ; AVX512VLCD-NEXT: vplzcntq %xmm0, %xmm0 498 ; AVX512VLCD-NEXT: retq 499 ; 500 ; AVX512CD-LABEL: testv2i64u: 501 ; AVX512CD: # %bb.0: 502 ; AVX512CD-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 503 ; AVX512CD-NEXT: vplzcntq %zmm0, %zmm0 504 ; AVX512CD-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 505 ; AVX512CD-NEXT: vzeroupper 506 ; AVX512CD-NEXT: retq 507 ; 508 ; X32-SSE-LABEL: testv2i64u: 509 ; X32-SSE: # %bb.0: 510 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 511 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 512 ; X32-SSE-NEXT: pand %xmm2, %xmm1 513 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 514 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4 515 ; X32-SSE-NEXT: pshufb %xmm1, %xmm4 516 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 517 ; X32-SSE-NEXT: psrlw $4, %xmm1 518 ; X32-SSE-NEXT: pand %xmm2, %xmm1 519 ; X32-SSE-NEXT: pxor %xmm2, %xmm2 520 ; X32-SSE-NEXT: pshufb %xmm1, %xmm3 521 ; X32-SSE-NEXT: pcmpeqb %xmm2, %xmm1 522 ; X32-SSE-NEXT: pand %xmm4, %xmm1 523 ; X32-SSE-NEXT: paddb %xmm3, %xmm1 524 ; X32-SSE-NEXT: movdqa %xmm0, %xmm3 525 ; X32-SSE-NEXT: pcmpeqb %xmm2, %xmm3 526 ; X32-SSE-NEXT: psrlw $8, %xmm3 527 ; X32-SSE-NEXT: pand %xmm1, %xmm3 528 ; X32-SSE-NEXT: psrlw $8, %xmm1 529 ; X32-SSE-NEXT: paddw %xmm3, %xmm1 530 ; X32-SSE-NEXT: movdqa %xmm0, %xmm3 531 ; X32-SSE-NEXT: pcmpeqw %xmm2, %xmm3 532 ; X32-SSE-NEXT: psrld $16, %xmm3 533 ; X32-SSE-NEXT: pand %xmm1, %xmm3 534 ; X32-SSE-NEXT: psrld $16, %xmm1 535 ; X32-SSE-NEXT: paddd %xmm3, %xmm1 536 ; X32-SSE-NEXT: pcmpeqd %xmm2, %xmm0 537 ; X32-SSE-NEXT: psrlq $32, %xmm0 538 ; X32-SSE-NEXT: pand %xmm1, %xmm0 539 ; X32-SSE-NEXT: psrlq $32, %xmm1 540 ; X32-SSE-NEXT: paddq %xmm0, %xmm1 541 ; X32-SSE-NEXT: movdqa %xmm1, %xmm0 542 ; X32-SSE-NEXT: retl 543 544 %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %in, i1 -1) 545 ret <2 x i64> %out 546 } 547 548 define <4 x i32> @testv4i32(<4 x i32> %in) nounwind { 549 ; SSE2-LABEL: testv4i32: 550 ; SSE2: # %bb.0: 551 ; SSE2-NEXT: movdqa %xmm0, %xmm1 552 ; SSE2-NEXT: psrld $1, %xmm1 553 ; SSE2-NEXT: por %xmm0, %xmm1 554 ; SSE2-NEXT: movdqa %xmm1, %xmm0 555 ; SSE2-NEXT: psrld $2, %xmm0 556 ; SSE2-NEXT: por %xmm1, %xmm0 557 ; SSE2-NEXT: movdqa %xmm0, %xmm1 558 ; SSE2-NEXT: psrld $4, %xmm1 559 ; SSE2-NEXT: por %xmm0, %xmm1 560 ; SSE2-NEXT: movdqa %xmm1, %xmm0 561 ; SSE2-NEXT: psrld $8, %xmm0 562 ; SSE2-NEXT: por %xmm1, %xmm0 563 ; SSE2-NEXT: movdqa %xmm0, %xmm1 564 ; SSE2-NEXT: psrld $16, %xmm1 565 ; SSE2-NEXT: por %xmm0, %xmm1 566 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 567 ; SSE2-NEXT: pxor %xmm1, %xmm2 568 ; SSE2-NEXT: movdqa %xmm2, %xmm0 569 ; SSE2-NEXT: psrld $1, %xmm0 570 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 571 ; SSE2-NEXT: psubd %xmm0, %xmm2 572 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [858993459,858993459,858993459,858993459] 573 ; SSE2-NEXT: movdqa %xmm2, %xmm1 574 ; SSE2-NEXT: pand %xmm0, %xmm1 575 ; SSE2-NEXT: psrld $2, %xmm2 576 ; SSE2-NEXT: pand %xmm0, %xmm2 577 ; SSE2-NEXT: paddd %xmm1, %xmm2 578 ; SSE2-NEXT: movdqa %xmm2, %xmm0 579 ; SSE2-NEXT: psrld $4, %xmm0 580 ; SSE2-NEXT: paddd %xmm2, %xmm0 581 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 582 ; SSE2-NEXT: pxor %xmm1, %xmm1 583 ; SSE2-NEXT: movdqa %xmm0, %xmm2 584 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3] 585 ; SSE2-NEXT: psadbw %xmm1, %xmm2 586 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 587 ; SSE2-NEXT: psadbw %xmm1, %xmm0 588 ; SSE2-NEXT: packuswb %xmm2, %xmm0 589 ; SSE2-NEXT: retq 590 ; 591 ; SSE3-LABEL: testv4i32: 592 ; SSE3: # %bb.0: 593 ; SSE3-NEXT: movdqa %xmm0, %xmm1 594 ; SSE3-NEXT: psrld $1, %xmm1 595 ; SSE3-NEXT: por %xmm0, %xmm1 596 ; SSE3-NEXT: movdqa %xmm1, %xmm0 597 ; SSE3-NEXT: psrld $2, %xmm0 598 ; SSE3-NEXT: por %xmm1, %xmm0 599 ; SSE3-NEXT: movdqa %xmm0, %xmm1 600 ; SSE3-NEXT: psrld $4, %xmm1 601 ; SSE3-NEXT: por %xmm0, %xmm1 602 ; SSE3-NEXT: movdqa %xmm1, %xmm0 603 ; SSE3-NEXT: psrld $8, %xmm0 604 ; SSE3-NEXT: por %xmm1, %xmm0 605 ; SSE3-NEXT: movdqa %xmm0, %xmm1 606 ; SSE3-NEXT: psrld $16, %xmm1 607 ; SSE3-NEXT: por %xmm0, %xmm1 608 ; SSE3-NEXT: pcmpeqd %xmm2, %xmm2 609 ; SSE3-NEXT: pxor %xmm1, %xmm2 610 ; SSE3-NEXT: movdqa %xmm2, %xmm0 611 ; SSE3-NEXT: psrld $1, %xmm0 612 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm0 613 ; SSE3-NEXT: psubd %xmm0, %xmm2 614 ; SSE3-NEXT: movdqa {{.*#+}} xmm0 = [858993459,858993459,858993459,858993459] 615 ; SSE3-NEXT: movdqa %xmm2, %xmm1 616 ; SSE3-NEXT: pand %xmm0, %xmm1 617 ; SSE3-NEXT: psrld $2, %xmm2 618 ; SSE3-NEXT: pand %xmm0, %xmm2 619 ; SSE3-NEXT: paddd %xmm1, %xmm2 620 ; SSE3-NEXT: movdqa %xmm2, %xmm0 621 ; SSE3-NEXT: psrld $4, %xmm0 622 ; SSE3-NEXT: paddd %xmm2, %xmm0 623 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm0 624 ; SSE3-NEXT: pxor %xmm1, %xmm1 625 ; SSE3-NEXT: movdqa %xmm0, %xmm2 626 ; SSE3-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3] 627 ; SSE3-NEXT: psadbw %xmm1, %xmm2 628 ; SSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 629 ; SSE3-NEXT: psadbw %xmm1, %xmm0 630 ; SSE3-NEXT: packuswb %xmm2, %xmm0 631 ; SSE3-NEXT: retq 632 ; 633 ; SSSE3-LABEL: testv4i32: 634 ; SSSE3: # %bb.0: 635 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 636 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 637 ; SSSE3-NEXT: pand %xmm2, %xmm1 638 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 639 ; SSSE3-NEXT: movdqa %xmm3, %xmm4 640 ; SSSE3-NEXT: pshufb %xmm1, %xmm4 641 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 642 ; SSSE3-NEXT: psrlw $4, %xmm1 643 ; SSSE3-NEXT: pand %xmm2, %xmm1 644 ; SSSE3-NEXT: pxor %xmm2, %xmm2 645 ; SSSE3-NEXT: pshufb %xmm1, %xmm3 646 ; SSSE3-NEXT: pcmpeqb %xmm2, %xmm1 647 ; SSSE3-NEXT: pand %xmm4, %xmm1 648 ; SSSE3-NEXT: paddb %xmm3, %xmm1 649 ; SSSE3-NEXT: movdqa %xmm0, %xmm3 650 ; SSSE3-NEXT: pcmpeqb %xmm2, %xmm3 651 ; SSSE3-NEXT: psrlw $8, %xmm3 652 ; SSSE3-NEXT: pand %xmm1, %xmm3 653 ; SSSE3-NEXT: psrlw $8, %xmm1 654 ; SSSE3-NEXT: paddw %xmm3, %xmm1 655 ; SSSE3-NEXT: pcmpeqw %xmm2, %xmm0 656 ; SSSE3-NEXT: psrld $16, %xmm0 657 ; SSSE3-NEXT: pand %xmm1, %xmm0 658 ; SSSE3-NEXT: psrld $16, %xmm1 659 ; SSSE3-NEXT: paddd %xmm0, %xmm1 660 ; SSSE3-NEXT: movdqa %xmm1, %xmm0 661 ; SSSE3-NEXT: retq 662 ; 663 ; SSE41-LABEL: testv4i32: 664 ; SSE41: # %bb.0: 665 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 666 ; SSE41-NEXT: movdqa %xmm0, %xmm1 667 ; SSE41-NEXT: pand %xmm2, %xmm1 668 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 669 ; SSE41-NEXT: movdqa %xmm3, %xmm4 670 ; SSE41-NEXT: pshufb %xmm1, %xmm4 671 ; SSE41-NEXT: movdqa %xmm0, %xmm1 672 ; SSE41-NEXT: psrlw $4, %xmm1 673 ; SSE41-NEXT: pand %xmm2, %xmm1 674 ; SSE41-NEXT: pxor %xmm2, %xmm2 675 ; SSE41-NEXT: pshufb %xmm1, %xmm3 676 ; SSE41-NEXT: pcmpeqb %xmm2, %xmm1 677 ; SSE41-NEXT: pand %xmm4, %xmm1 678 ; SSE41-NEXT: paddb %xmm3, %xmm1 679 ; SSE41-NEXT: movdqa %xmm0, %xmm3 680 ; SSE41-NEXT: pcmpeqb %xmm2, %xmm3 681 ; SSE41-NEXT: psrlw $8, %xmm3 682 ; SSE41-NEXT: pand %xmm1, %xmm3 683 ; SSE41-NEXT: psrlw $8, %xmm1 684 ; SSE41-NEXT: paddw %xmm3, %xmm1 685 ; SSE41-NEXT: pcmpeqw %xmm2, %xmm0 686 ; SSE41-NEXT: psrld $16, %xmm0 687 ; SSE41-NEXT: pand %xmm1, %xmm0 688 ; SSE41-NEXT: psrld $16, %xmm1 689 ; SSE41-NEXT: paddd %xmm0, %xmm1 690 ; SSE41-NEXT: movdqa %xmm1, %xmm0 691 ; SSE41-NEXT: retq 692 ; 693 ; AVX-LABEL: testv4i32: 694 ; AVX: # %bb.0: 695 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 696 ; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 697 ; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 698 ; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 699 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm4 700 ; AVX-NEXT: vpand %xmm1, %xmm4, %xmm1 701 ; AVX-NEXT: vpxor %xmm4, %xmm4, %xmm4 702 ; AVX-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm5 703 ; AVX-NEXT: vpand %xmm5, %xmm2, %xmm2 704 ; AVX-NEXT: vpshufb %xmm1, %xmm3, %xmm1 705 ; AVX-NEXT: vpaddb %xmm1, %xmm2, %xmm1 706 ; AVX-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm2 707 ; AVX-NEXT: vpsrlw $8, %xmm2, %xmm2 708 ; AVX-NEXT: vpand %xmm2, %xmm1, %xmm2 709 ; AVX-NEXT: vpsrlw $8, %xmm1, %xmm1 710 ; AVX-NEXT: vpaddw %xmm2, %xmm1, %xmm1 711 ; AVX-NEXT: vpcmpeqw %xmm4, %xmm0, %xmm0 712 ; AVX-NEXT: vpsrld $16, %xmm0, %xmm0 713 ; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0 714 ; AVX-NEXT: vpsrld $16, %xmm1, %xmm1 715 ; AVX-NEXT: vpaddd %xmm0, %xmm1, %xmm0 716 ; AVX-NEXT: retq 717 ; 718 ; AVX512VLBWDQ-LABEL: testv4i32: 719 ; AVX512VLBWDQ: # %bb.0: 720 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 721 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm0, %xmm2 722 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 723 ; AVX512VLBWDQ-NEXT: vpshufb %xmm2, %xmm3, %xmm2 724 ; AVX512VLBWDQ-NEXT: vpsrlw $4, %xmm0, %xmm4 725 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm4, %xmm1 726 ; AVX512VLBWDQ-NEXT: vpxor %xmm4, %xmm4, %xmm4 727 ; AVX512VLBWDQ-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm5 728 ; AVX512VLBWDQ-NEXT: vpand %xmm5, %xmm2, %xmm2 729 ; AVX512VLBWDQ-NEXT: vpshufb %xmm1, %xmm3, %xmm1 730 ; AVX512VLBWDQ-NEXT: vpaddb %xmm1, %xmm2, %xmm1 731 ; AVX512VLBWDQ-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm2 732 ; AVX512VLBWDQ-NEXT: vpsrlw $8, %xmm2, %xmm2 733 ; AVX512VLBWDQ-NEXT: vpand %xmm2, %xmm1, %xmm2 734 ; AVX512VLBWDQ-NEXT: vpsrlw $8, %xmm1, %xmm1 735 ; AVX512VLBWDQ-NEXT: vpaddw %xmm2, %xmm1, %xmm1 736 ; AVX512VLBWDQ-NEXT: vpcmpeqw %xmm4, %xmm0, %xmm0 737 ; AVX512VLBWDQ-NEXT: vpsrld $16, %xmm0, %xmm0 738 ; AVX512VLBWDQ-NEXT: vpand %xmm0, %xmm1, %xmm0 739 ; AVX512VLBWDQ-NEXT: vpsrld $16, %xmm1, %xmm1 740 ; AVX512VLBWDQ-NEXT: vpaddd %xmm0, %xmm1, %xmm0 741 ; AVX512VLBWDQ-NEXT: retq 742 ; 743 ; AVX512VLCD-LABEL: testv4i32: 744 ; AVX512VLCD: # %bb.0: 745 ; AVX512VLCD-NEXT: vplzcntd %xmm0, %xmm0 746 ; AVX512VLCD-NEXT: retq 747 ; 748 ; AVX512CD-LABEL: testv4i32: 749 ; AVX512CD: # %bb.0: 750 ; AVX512CD-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 751 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 752 ; AVX512CD-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 753 ; AVX512CD-NEXT: vzeroupper 754 ; AVX512CD-NEXT: retq 755 ; 756 ; X32-SSE-LABEL: testv4i32: 757 ; X32-SSE: # %bb.0: 758 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 759 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 760 ; X32-SSE-NEXT: pand %xmm2, %xmm1 761 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 762 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4 763 ; X32-SSE-NEXT: pshufb %xmm1, %xmm4 764 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 765 ; X32-SSE-NEXT: psrlw $4, %xmm1 766 ; X32-SSE-NEXT: pand %xmm2, %xmm1 767 ; X32-SSE-NEXT: pxor %xmm2, %xmm2 768 ; X32-SSE-NEXT: pshufb %xmm1, %xmm3 769 ; X32-SSE-NEXT: pcmpeqb %xmm2, %xmm1 770 ; X32-SSE-NEXT: pand %xmm4, %xmm1 771 ; X32-SSE-NEXT: paddb %xmm3, %xmm1 772 ; X32-SSE-NEXT: movdqa %xmm0, %xmm3 773 ; X32-SSE-NEXT: pcmpeqb %xmm2, %xmm3 774 ; X32-SSE-NEXT: psrlw $8, %xmm3 775 ; X32-SSE-NEXT: pand %xmm1, %xmm3 776 ; X32-SSE-NEXT: psrlw $8, %xmm1 777 ; X32-SSE-NEXT: paddw %xmm3, %xmm1 778 ; X32-SSE-NEXT: pcmpeqw %xmm2, %xmm0 779 ; X32-SSE-NEXT: psrld $16, %xmm0 780 ; X32-SSE-NEXT: pand %xmm1, %xmm0 781 ; X32-SSE-NEXT: psrld $16, %xmm1 782 ; X32-SSE-NEXT: paddd %xmm0, %xmm1 783 ; X32-SSE-NEXT: movdqa %xmm1, %xmm0 784 ; X32-SSE-NEXT: retl 785 786 %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %in, i1 0) 787 ret <4 x i32> %out 788 } 789 790 define <4 x i32> @testv4i32u(<4 x i32> %in) nounwind { 791 ; SSE2-LABEL: testv4i32u: 792 ; SSE2: # %bb.0: 793 ; SSE2-NEXT: movdqa %xmm0, %xmm1 794 ; SSE2-NEXT: psrld $1, %xmm1 795 ; SSE2-NEXT: por %xmm0, %xmm1 796 ; SSE2-NEXT: movdqa %xmm1, %xmm0 797 ; SSE2-NEXT: psrld $2, %xmm0 798 ; SSE2-NEXT: por %xmm1, %xmm0 799 ; SSE2-NEXT: movdqa %xmm0, %xmm1 800 ; SSE2-NEXT: psrld $4, %xmm1 801 ; SSE2-NEXT: por %xmm0, %xmm1 802 ; SSE2-NEXT: movdqa %xmm1, %xmm0 803 ; SSE2-NEXT: psrld $8, %xmm0 804 ; SSE2-NEXT: por %xmm1, %xmm0 805 ; SSE2-NEXT: movdqa %xmm0, %xmm1 806 ; SSE2-NEXT: psrld $16, %xmm1 807 ; SSE2-NEXT: por %xmm0, %xmm1 808 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 809 ; SSE2-NEXT: pxor %xmm1, %xmm2 810 ; SSE2-NEXT: movdqa %xmm2, %xmm0 811 ; SSE2-NEXT: psrld $1, %xmm0 812 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 813 ; SSE2-NEXT: psubd %xmm0, %xmm2 814 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [858993459,858993459,858993459,858993459] 815 ; SSE2-NEXT: movdqa %xmm2, %xmm1 816 ; SSE2-NEXT: pand %xmm0, %xmm1 817 ; SSE2-NEXT: psrld $2, %xmm2 818 ; SSE2-NEXT: pand %xmm0, %xmm2 819 ; SSE2-NEXT: paddd %xmm1, %xmm2 820 ; SSE2-NEXT: movdqa %xmm2, %xmm0 821 ; SSE2-NEXT: psrld $4, %xmm0 822 ; SSE2-NEXT: paddd %xmm2, %xmm0 823 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 824 ; SSE2-NEXT: pxor %xmm1, %xmm1 825 ; SSE2-NEXT: movdqa %xmm0, %xmm2 826 ; SSE2-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3] 827 ; SSE2-NEXT: psadbw %xmm1, %xmm2 828 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 829 ; SSE2-NEXT: psadbw %xmm1, %xmm0 830 ; SSE2-NEXT: packuswb %xmm2, %xmm0 831 ; SSE2-NEXT: retq 832 ; 833 ; SSE3-LABEL: testv4i32u: 834 ; SSE3: # %bb.0: 835 ; SSE3-NEXT: movdqa %xmm0, %xmm1 836 ; SSE3-NEXT: psrld $1, %xmm1 837 ; SSE3-NEXT: por %xmm0, %xmm1 838 ; SSE3-NEXT: movdqa %xmm1, %xmm0 839 ; SSE3-NEXT: psrld $2, %xmm0 840 ; SSE3-NEXT: por %xmm1, %xmm0 841 ; SSE3-NEXT: movdqa %xmm0, %xmm1 842 ; SSE3-NEXT: psrld $4, %xmm1 843 ; SSE3-NEXT: por %xmm0, %xmm1 844 ; SSE3-NEXT: movdqa %xmm1, %xmm0 845 ; SSE3-NEXT: psrld $8, %xmm0 846 ; SSE3-NEXT: por %xmm1, %xmm0 847 ; SSE3-NEXT: movdqa %xmm0, %xmm1 848 ; SSE3-NEXT: psrld $16, %xmm1 849 ; SSE3-NEXT: por %xmm0, %xmm1 850 ; SSE3-NEXT: pcmpeqd %xmm2, %xmm2 851 ; SSE3-NEXT: pxor %xmm1, %xmm2 852 ; SSE3-NEXT: movdqa %xmm2, %xmm0 853 ; SSE3-NEXT: psrld $1, %xmm0 854 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm0 855 ; SSE3-NEXT: psubd %xmm0, %xmm2 856 ; SSE3-NEXT: movdqa {{.*#+}} xmm0 = [858993459,858993459,858993459,858993459] 857 ; SSE3-NEXT: movdqa %xmm2, %xmm1 858 ; SSE3-NEXT: pand %xmm0, %xmm1 859 ; SSE3-NEXT: psrld $2, %xmm2 860 ; SSE3-NEXT: pand %xmm0, %xmm2 861 ; SSE3-NEXT: paddd %xmm1, %xmm2 862 ; SSE3-NEXT: movdqa %xmm2, %xmm0 863 ; SSE3-NEXT: psrld $4, %xmm0 864 ; SSE3-NEXT: paddd %xmm2, %xmm0 865 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm0 866 ; SSE3-NEXT: pxor %xmm1, %xmm1 867 ; SSE3-NEXT: movdqa %xmm0, %xmm2 868 ; SSE3-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3] 869 ; SSE3-NEXT: psadbw %xmm1, %xmm2 870 ; SSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 871 ; SSE3-NEXT: psadbw %xmm1, %xmm0 872 ; SSE3-NEXT: packuswb %xmm2, %xmm0 873 ; SSE3-NEXT: retq 874 ; 875 ; SSSE3-LABEL: testv4i32u: 876 ; SSSE3: # %bb.0: 877 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 878 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 879 ; SSSE3-NEXT: pand %xmm2, %xmm1 880 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 881 ; SSSE3-NEXT: movdqa %xmm3, %xmm4 882 ; SSSE3-NEXT: pshufb %xmm1, %xmm4 883 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 884 ; SSSE3-NEXT: psrlw $4, %xmm1 885 ; SSSE3-NEXT: pand %xmm2, %xmm1 886 ; SSSE3-NEXT: pxor %xmm2, %xmm2 887 ; SSSE3-NEXT: pshufb %xmm1, %xmm3 888 ; SSSE3-NEXT: pcmpeqb %xmm2, %xmm1 889 ; SSSE3-NEXT: pand %xmm4, %xmm1 890 ; SSSE3-NEXT: paddb %xmm3, %xmm1 891 ; SSSE3-NEXT: movdqa %xmm0, %xmm3 892 ; SSSE3-NEXT: pcmpeqb %xmm2, %xmm3 893 ; SSSE3-NEXT: psrlw $8, %xmm3 894 ; SSSE3-NEXT: pand %xmm1, %xmm3 895 ; SSSE3-NEXT: psrlw $8, %xmm1 896 ; SSSE3-NEXT: paddw %xmm3, %xmm1 897 ; SSSE3-NEXT: pcmpeqw %xmm2, %xmm0 898 ; SSSE3-NEXT: psrld $16, %xmm0 899 ; SSSE3-NEXT: pand %xmm1, %xmm0 900 ; SSSE3-NEXT: psrld $16, %xmm1 901 ; SSSE3-NEXT: paddd %xmm0, %xmm1 902 ; SSSE3-NEXT: movdqa %xmm1, %xmm0 903 ; SSSE3-NEXT: retq 904 ; 905 ; SSE41-LABEL: testv4i32u: 906 ; SSE41: # %bb.0: 907 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 908 ; SSE41-NEXT: movdqa %xmm0, %xmm1 909 ; SSE41-NEXT: pand %xmm2, %xmm1 910 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 911 ; SSE41-NEXT: movdqa %xmm3, %xmm4 912 ; SSE41-NEXT: pshufb %xmm1, %xmm4 913 ; SSE41-NEXT: movdqa %xmm0, %xmm1 914 ; SSE41-NEXT: psrlw $4, %xmm1 915 ; SSE41-NEXT: pand %xmm2, %xmm1 916 ; SSE41-NEXT: pxor %xmm2, %xmm2 917 ; SSE41-NEXT: pshufb %xmm1, %xmm3 918 ; SSE41-NEXT: pcmpeqb %xmm2, %xmm1 919 ; SSE41-NEXT: pand %xmm4, %xmm1 920 ; SSE41-NEXT: paddb %xmm3, %xmm1 921 ; SSE41-NEXT: movdqa %xmm0, %xmm3 922 ; SSE41-NEXT: pcmpeqb %xmm2, %xmm3 923 ; SSE41-NEXT: psrlw $8, %xmm3 924 ; SSE41-NEXT: pand %xmm1, %xmm3 925 ; SSE41-NEXT: psrlw $8, %xmm1 926 ; SSE41-NEXT: paddw %xmm3, %xmm1 927 ; SSE41-NEXT: pcmpeqw %xmm2, %xmm0 928 ; SSE41-NEXT: psrld $16, %xmm0 929 ; SSE41-NEXT: pand %xmm1, %xmm0 930 ; SSE41-NEXT: psrld $16, %xmm1 931 ; SSE41-NEXT: paddd %xmm0, %xmm1 932 ; SSE41-NEXT: movdqa %xmm1, %xmm0 933 ; SSE41-NEXT: retq 934 ; 935 ; AVX-LABEL: testv4i32u: 936 ; AVX: # %bb.0: 937 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 938 ; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 939 ; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 940 ; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 941 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm4 942 ; AVX-NEXT: vpand %xmm1, %xmm4, %xmm1 943 ; AVX-NEXT: vpxor %xmm4, %xmm4, %xmm4 944 ; AVX-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm5 945 ; AVX-NEXT: vpand %xmm5, %xmm2, %xmm2 946 ; AVX-NEXT: vpshufb %xmm1, %xmm3, %xmm1 947 ; AVX-NEXT: vpaddb %xmm1, %xmm2, %xmm1 948 ; AVX-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm2 949 ; AVX-NEXT: vpsrlw $8, %xmm2, %xmm2 950 ; AVX-NEXT: vpand %xmm2, %xmm1, %xmm2 951 ; AVX-NEXT: vpsrlw $8, %xmm1, %xmm1 952 ; AVX-NEXT: vpaddw %xmm2, %xmm1, %xmm1 953 ; AVX-NEXT: vpcmpeqw %xmm4, %xmm0, %xmm0 954 ; AVX-NEXT: vpsrld $16, %xmm0, %xmm0 955 ; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0 956 ; AVX-NEXT: vpsrld $16, %xmm1, %xmm1 957 ; AVX-NEXT: vpaddd %xmm0, %xmm1, %xmm0 958 ; AVX-NEXT: retq 959 ; 960 ; AVX512VLBWDQ-LABEL: testv4i32u: 961 ; AVX512VLBWDQ: # %bb.0: 962 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 963 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm0, %xmm2 964 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 965 ; AVX512VLBWDQ-NEXT: vpshufb %xmm2, %xmm3, %xmm2 966 ; AVX512VLBWDQ-NEXT: vpsrlw $4, %xmm0, %xmm4 967 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm4, %xmm1 968 ; AVX512VLBWDQ-NEXT: vpxor %xmm4, %xmm4, %xmm4 969 ; AVX512VLBWDQ-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm5 970 ; AVX512VLBWDQ-NEXT: vpand %xmm5, %xmm2, %xmm2 971 ; AVX512VLBWDQ-NEXT: vpshufb %xmm1, %xmm3, %xmm1 972 ; AVX512VLBWDQ-NEXT: vpaddb %xmm1, %xmm2, %xmm1 973 ; AVX512VLBWDQ-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm2 974 ; AVX512VLBWDQ-NEXT: vpsrlw $8, %xmm2, %xmm2 975 ; AVX512VLBWDQ-NEXT: vpand %xmm2, %xmm1, %xmm2 976 ; AVX512VLBWDQ-NEXT: vpsrlw $8, %xmm1, %xmm1 977 ; AVX512VLBWDQ-NEXT: vpaddw %xmm2, %xmm1, %xmm1 978 ; AVX512VLBWDQ-NEXT: vpcmpeqw %xmm4, %xmm0, %xmm0 979 ; AVX512VLBWDQ-NEXT: vpsrld $16, %xmm0, %xmm0 980 ; AVX512VLBWDQ-NEXT: vpand %xmm0, %xmm1, %xmm0 981 ; AVX512VLBWDQ-NEXT: vpsrld $16, %xmm1, %xmm1 982 ; AVX512VLBWDQ-NEXT: vpaddd %xmm0, %xmm1, %xmm0 983 ; AVX512VLBWDQ-NEXT: retq 984 ; 985 ; AVX512VLCD-LABEL: testv4i32u: 986 ; AVX512VLCD: # %bb.0: 987 ; AVX512VLCD-NEXT: vplzcntd %xmm0, %xmm0 988 ; AVX512VLCD-NEXT: retq 989 ; 990 ; AVX512CD-LABEL: testv4i32u: 991 ; AVX512CD: # %bb.0: 992 ; AVX512CD-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 993 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 994 ; AVX512CD-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 995 ; AVX512CD-NEXT: vzeroupper 996 ; AVX512CD-NEXT: retq 997 ; 998 ; X32-SSE-LABEL: testv4i32u: 999 ; X32-SSE: # %bb.0: 1000 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1001 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 1002 ; X32-SSE-NEXT: pand %xmm2, %xmm1 1003 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1004 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4 1005 ; X32-SSE-NEXT: pshufb %xmm1, %xmm4 1006 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 1007 ; X32-SSE-NEXT: psrlw $4, %xmm1 1008 ; X32-SSE-NEXT: pand %xmm2, %xmm1 1009 ; X32-SSE-NEXT: pxor %xmm2, %xmm2 1010 ; X32-SSE-NEXT: pshufb %xmm1, %xmm3 1011 ; X32-SSE-NEXT: pcmpeqb %xmm2, %xmm1 1012 ; X32-SSE-NEXT: pand %xmm4, %xmm1 1013 ; X32-SSE-NEXT: paddb %xmm3, %xmm1 1014 ; X32-SSE-NEXT: movdqa %xmm0, %xmm3 1015 ; X32-SSE-NEXT: pcmpeqb %xmm2, %xmm3 1016 ; X32-SSE-NEXT: psrlw $8, %xmm3 1017 ; X32-SSE-NEXT: pand %xmm1, %xmm3 1018 ; X32-SSE-NEXT: psrlw $8, %xmm1 1019 ; X32-SSE-NEXT: paddw %xmm3, %xmm1 1020 ; X32-SSE-NEXT: pcmpeqw %xmm2, %xmm0 1021 ; X32-SSE-NEXT: psrld $16, %xmm0 1022 ; X32-SSE-NEXT: pand %xmm1, %xmm0 1023 ; X32-SSE-NEXT: psrld $16, %xmm1 1024 ; X32-SSE-NEXT: paddd %xmm0, %xmm1 1025 ; X32-SSE-NEXT: movdqa %xmm1, %xmm0 1026 ; X32-SSE-NEXT: retl 1027 1028 %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %in, i1 -1) 1029 ret <4 x i32> %out 1030 } 1031 1032 define <8 x i16> @testv8i16(<8 x i16> %in) nounwind { 1033 ; SSE2-LABEL: testv8i16: 1034 ; SSE2: # %bb.0: 1035 ; SSE2-NEXT: movdqa %xmm0, %xmm1 1036 ; SSE2-NEXT: psrlw $1, %xmm1 1037 ; SSE2-NEXT: por %xmm0, %xmm1 1038 ; SSE2-NEXT: movdqa %xmm1, %xmm0 1039 ; SSE2-NEXT: psrlw $2, %xmm0 1040 ; SSE2-NEXT: por %xmm1, %xmm0 1041 ; SSE2-NEXT: movdqa %xmm0, %xmm1 1042 ; SSE2-NEXT: psrlw $4, %xmm1 1043 ; SSE2-NEXT: por %xmm0, %xmm1 1044 ; SSE2-NEXT: movdqa %xmm1, %xmm0 1045 ; SSE2-NEXT: psrlw $8, %xmm0 1046 ; SSE2-NEXT: por %xmm1, %xmm0 1047 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 1048 ; SSE2-NEXT: pxor %xmm0, %xmm1 1049 ; SSE2-NEXT: movdqa %xmm1, %xmm0 1050 ; SSE2-NEXT: psrlw $1, %xmm0 1051 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1052 ; SSE2-NEXT: psubw %xmm0, %xmm1 1053 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [13107,13107,13107,13107,13107,13107,13107,13107] 1054 ; SSE2-NEXT: movdqa %xmm1, %xmm2 1055 ; SSE2-NEXT: pand %xmm0, %xmm2 1056 ; SSE2-NEXT: psrlw $2, %xmm1 1057 ; SSE2-NEXT: pand %xmm0, %xmm1 1058 ; SSE2-NEXT: paddw %xmm2, %xmm1 1059 ; SSE2-NEXT: movdqa %xmm1, %xmm2 1060 ; SSE2-NEXT: psrlw $4, %xmm2 1061 ; SSE2-NEXT: paddw %xmm1, %xmm2 1062 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm2 1063 ; SSE2-NEXT: movdqa %xmm2, %xmm0 1064 ; SSE2-NEXT: psllw $8, %xmm0 1065 ; SSE2-NEXT: paddb %xmm2, %xmm0 1066 ; SSE2-NEXT: psrlw $8, %xmm0 1067 ; SSE2-NEXT: retq 1068 ; 1069 ; SSE3-LABEL: testv8i16: 1070 ; SSE3: # %bb.0: 1071 ; SSE3-NEXT: movdqa %xmm0, %xmm1 1072 ; SSE3-NEXT: psrlw $1, %xmm1 1073 ; SSE3-NEXT: por %xmm0, %xmm1 1074 ; SSE3-NEXT: movdqa %xmm1, %xmm0 1075 ; SSE3-NEXT: psrlw $2, %xmm0 1076 ; SSE3-NEXT: por %xmm1, %xmm0 1077 ; SSE3-NEXT: movdqa %xmm0, %xmm1 1078 ; SSE3-NEXT: psrlw $4, %xmm1 1079 ; SSE3-NEXT: por %xmm0, %xmm1 1080 ; SSE3-NEXT: movdqa %xmm1, %xmm0 1081 ; SSE3-NEXT: psrlw $8, %xmm0 1082 ; SSE3-NEXT: por %xmm1, %xmm0 1083 ; SSE3-NEXT: pcmpeqd %xmm1, %xmm1 1084 ; SSE3-NEXT: pxor %xmm0, %xmm1 1085 ; SSE3-NEXT: movdqa %xmm1, %xmm0 1086 ; SSE3-NEXT: psrlw $1, %xmm0 1087 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm0 1088 ; SSE3-NEXT: psubw %xmm0, %xmm1 1089 ; SSE3-NEXT: movdqa {{.*#+}} xmm0 = [13107,13107,13107,13107,13107,13107,13107,13107] 1090 ; SSE3-NEXT: movdqa %xmm1, %xmm2 1091 ; SSE3-NEXT: pand %xmm0, %xmm2 1092 ; SSE3-NEXT: psrlw $2, %xmm1 1093 ; SSE3-NEXT: pand %xmm0, %xmm1 1094 ; SSE3-NEXT: paddw %xmm2, %xmm1 1095 ; SSE3-NEXT: movdqa %xmm1, %xmm2 1096 ; SSE3-NEXT: psrlw $4, %xmm2 1097 ; SSE3-NEXT: paddw %xmm1, %xmm2 1098 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm2 1099 ; SSE3-NEXT: movdqa %xmm2, %xmm0 1100 ; SSE3-NEXT: psllw $8, %xmm0 1101 ; SSE3-NEXT: paddb %xmm2, %xmm0 1102 ; SSE3-NEXT: psrlw $8, %xmm0 1103 ; SSE3-NEXT: retq 1104 ; 1105 ; SSSE3-LABEL: testv8i16: 1106 ; SSSE3: # %bb.0: 1107 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1108 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 1109 ; SSSE3-NEXT: pand %xmm2, %xmm1 1110 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1111 ; SSSE3-NEXT: movdqa %xmm3, %xmm4 1112 ; SSSE3-NEXT: pshufb %xmm1, %xmm4 1113 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 1114 ; SSSE3-NEXT: psrlw $4, %xmm1 1115 ; SSSE3-NEXT: pand %xmm2, %xmm1 1116 ; SSSE3-NEXT: pxor %xmm2, %xmm2 1117 ; SSSE3-NEXT: pshufb %xmm1, %xmm3 1118 ; SSSE3-NEXT: pcmpeqb %xmm2, %xmm1 1119 ; SSSE3-NEXT: pand %xmm4, %xmm1 1120 ; SSSE3-NEXT: paddb %xmm3, %xmm1 1121 ; SSSE3-NEXT: pcmpeqb %xmm2, %xmm0 1122 ; SSSE3-NEXT: psrlw $8, %xmm0 1123 ; SSSE3-NEXT: pand %xmm1, %xmm0 1124 ; SSSE3-NEXT: psrlw $8, %xmm1 1125 ; SSSE3-NEXT: paddw %xmm0, %xmm1 1126 ; SSSE3-NEXT: movdqa %xmm1, %xmm0 1127 ; SSSE3-NEXT: retq 1128 ; 1129 ; SSE41-LABEL: testv8i16: 1130 ; SSE41: # %bb.0: 1131 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1132 ; SSE41-NEXT: movdqa %xmm0, %xmm1 1133 ; SSE41-NEXT: pand %xmm2, %xmm1 1134 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1135 ; SSE41-NEXT: movdqa %xmm3, %xmm4 1136 ; SSE41-NEXT: pshufb %xmm1, %xmm4 1137 ; SSE41-NEXT: movdqa %xmm0, %xmm1 1138 ; SSE41-NEXT: psrlw $4, %xmm1 1139 ; SSE41-NEXT: pand %xmm2, %xmm1 1140 ; SSE41-NEXT: pxor %xmm2, %xmm2 1141 ; SSE41-NEXT: pshufb %xmm1, %xmm3 1142 ; SSE41-NEXT: pcmpeqb %xmm2, %xmm1 1143 ; SSE41-NEXT: pand %xmm4, %xmm1 1144 ; SSE41-NEXT: paddb %xmm3, %xmm1 1145 ; SSE41-NEXT: pcmpeqb %xmm2, %xmm0 1146 ; SSE41-NEXT: psrlw $8, %xmm0 1147 ; SSE41-NEXT: pand %xmm1, %xmm0 1148 ; SSE41-NEXT: psrlw $8, %xmm1 1149 ; SSE41-NEXT: paddw %xmm0, %xmm1 1150 ; SSE41-NEXT: movdqa %xmm1, %xmm0 1151 ; SSE41-NEXT: retq 1152 ; 1153 ; AVX-LABEL: testv8i16: 1154 ; AVX: # %bb.0: 1155 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1156 ; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 1157 ; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1158 ; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1159 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm4 1160 ; AVX-NEXT: vpand %xmm1, %xmm4, %xmm1 1161 ; AVX-NEXT: vpxor %xmm4, %xmm4, %xmm4 1162 ; AVX-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm5 1163 ; AVX-NEXT: vpand %xmm5, %xmm2, %xmm2 1164 ; AVX-NEXT: vpshufb %xmm1, %xmm3, %xmm1 1165 ; AVX-NEXT: vpaddb %xmm1, %xmm2, %xmm1 1166 ; AVX-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm0 1167 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm0 1168 ; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0 1169 ; AVX-NEXT: vpsrlw $8, %xmm1, %xmm1 1170 ; AVX-NEXT: vpaddw %xmm0, %xmm1, %xmm0 1171 ; AVX-NEXT: retq 1172 ; 1173 ; AVX512VLBWDQ-LABEL: testv8i16: 1174 ; AVX512VLBWDQ: # %bb.0: 1175 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1176 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm0, %xmm2 1177 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1178 ; AVX512VLBWDQ-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1179 ; AVX512VLBWDQ-NEXT: vpsrlw $4, %xmm0, %xmm4 1180 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm4, %xmm1 1181 ; AVX512VLBWDQ-NEXT: vpxor %xmm4, %xmm4, %xmm4 1182 ; AVX512VLBWDQ-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm5 1183 ; AVX512VLBWDQ-NEXT: vpand %xmm5, %xmm2, %xmm2 1184 ; AVX512VLBWDQ-NEXT: vpshufb %xmm1, %xmm3, %xmm1 1185 ; AVX512VLBWDQ-NEXT: vpaddb %xmm1, %xmm2, %xmm1 1186 ; AVX512VLBWDQ-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm0 1187 ; AVX512VLBWDQ-NEXT: vpsrlw $8, %xmm0, %xmm0 1188 ; AVX512VLBWDQ-NEXT: vpand %xmm0, %xmm1, %xmm0 1189 ; AVX512VLBWDQ-NEXT: vpsrlw $8, %xmm1, %xmm1 1190 ; AVX512VLBWDQ-NEXT: vpaddw %xmm0, %xmm1, %xmm0 1191 ; AVX512VLBWDQ-NEXT: retq 1192 ; 1193 ; AVX512VLCD-LABEL: testv8i16: 1194 ; AVX512VLCD: # %bb.0: 1195 ; AVX512VLCD-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1196 ; AVX512VLCD-NEXT: vplzcntd %ymm0, %ymm0 1197 ; AVX512VLCD-NEXT: vpmovdw %ymm0, %xmm0 1198 ; AVX512VLCD-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 1199 ; AVX512VLCD-NEXT: vzeroupper 1200 ; AVX512VLCD-NEXT: retq 1201 ; 1202 ; AVX512CD-LABEL: testv8i16: 1203 ; AVX512CD: # %bb.0: 1204 ; AVX512CD-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1205 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 1206 ; AVX512CD-NEXT: vpmovdw %zmm0, %ymm0 1207 ; AVX512CD-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 1208 ; AVX512CD-NEXT: vzeroupper 1209 ; AVX512CD-NEXT: retq 1210 ; 1211 ; X32-SSE-LABEL: testv8i16: 1212 ; X32-SSE: # %bb.0: 1213 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1214 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 1215 ; X32-SSE-NEXT: pand %xmm2, %xmm1 1216 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1217 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4 1218 ; X32-SSE-NEXT: pshufb %xmm1, %xmm4 1219 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 1220 ; X32-SSE-NEXT: psrlw $4, %xmm1 1221 ; X32-SSE-NEXT: pand %xmm2, %xmm1 1222 ; X32-SSE-NEXT: pxor %xmm2, %xmm2 1223 ; X32-SSE-NEXT: pshufb %xmm1, %xmm3 1224 ; X32-SSE-NEXT: pcmpeqb %xmm2, %xmm1 1225 ; X32-SSE-NEXT: pand %xmm4, %xmm1 1226 ; X32-SSE-NEXT: paddb %xmm3, %xmm1 1227 ; X32-SSE-NEXT: pcmpeqb %xmm2, %xmm0 1228 ; X32-SSE-NEXT: psrlw $8, %xmm0 1229 ; X32-SSE-NEXT: pand %xmm1, %xmm0 1230 ; X32-SSE-NEXT: psrlw $8, %xmm1 1231 ; X32-SSE-NEXT: paddw %xmm0, %xmm1 1232 ; X32-SSE-NEXT: movdqa %xmm1, %xmm0 1233 ; X32-SSE-NEXT: retl 1234 %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %in, i1 0) 1235 ret <8 x i16> %out 1236 } 1237 1238 define <8 x i16> @testv8i16u(<8 x i16> %in) nounwind { 1239 ; SSE2-LABEL: testv8i16u: 1240 ; SSE2: # %bb.0: 1241 ; SSE2-NEXT: movdqa %xmm0, %xmm1 1242 ; SSE2-NEXT: psrlw $1, %xmm1 1243 ; SSE2-NEXT: por %xmm0, %xmm1 1244 ; SSE2-NEXT: movdqa %xmm1, %xmm0 1245 ; SSE2-NEXT: psrlw $2, %xmm0 1246 ; SSE2-NEXT: por %xmm1, %xmm0 1247 ; SSE2-NEXT: movdqa %xmm0, %xmm1 1248 ; SSE2-NEXT: psrlw $4, %xmm1 1249 ; SSE2-NEXT: por %xmm0, %xmm1 1250 ; SSE2-NEXT: movdqa %xmm1, %xmm0 1251 ; SSE2-NEXT: psrlw $8, %xmm0 1252 ; SSE2-NEXT: por %xmm1, %xmm0 1253 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 1254 ; SSE2-NEXT: pxor %xmm0, %xmm1 1255 ; SSE2-NEXT: movdqa %xmm1, %xmm0 1256 ; SSE2-NEXT: psrlw $1, %xmm0 1257 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1258 ; SSE2-NEXT: psubw %xmm0, %xmm1 1259 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [13107,13107,13107,13107,13107,13107,13107,13107] 1260 ; SSE2-NEXT: movdqa %xmm1, %xmm2 1261 ; SSE2-NEXT: pand %xmm0, %xmm2 1262 ; SSE2-NEXT: psrlw $2, %xmm1 1263 ; SSE2-NEXT: pand %xmm0, %xmm1 1264 ; SSE2-NEXT: paddw %xmm2, %xmm1 1265 ; SSE2-NEXT: movdqa %xmm1, %xmm2 1266 ; SSE2-NEXT: psrlw $4, %xmm2 1267 ; SSE2-NEXT: paddw %xmm1, %xmm2 1268 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm2 1269 ; SSE2-NEXT: movdqa %xmm2, %xmm0 1270 ; SSE2-NEXT: psllw $8, %xmm0 1271 ; SSE2-NEXT: paddb %xmm2, %xmm0 1272 ; SSE2-NEXT: psrlw $8, %xmm0 1273 ; SSE2-NEXT: retq 1274 ; 1275 ; SSE3-LABEL: testv8i16u: 1276 ; SSE3: # %bb.0: 1277 ; SSE3-NEXT: movdqa %xmm0, %xmm1 1278 ; SSE3-NEXT: psrlw $1, %xmm1 1279 ; SSE3-NEXT: por %xmm0, %xmm1 1280 ; SSE3-NEXT: movdqa %xmm1, %xmm0 1281 ; SSE3-NEXT: psrlw $2, %xmm0 1282 ; SSE3-NEXT: por %xmm1, %xmm0 1283 ; SSE3-NEXT: movdqa %xmm0, %xmm1 1284 ; SSE3-NEXT: psrlw $4, %xmm1 1285 ; SSE3-NEXT: por %xmm0, %xmm1 1286 ; SSE3-NEXT: movdqa %xmm1, %xmm0 1287 ; SSE3-NEXT: psrlw $8, %xmm0 1288 ; SSE3-NEXT: por %xmm1, %xmm0 1289 ; SSE3-NEXT: pcmpeqd %xmm1, %xmm1 1290 ; SSE3-NEXT: pxor %xmm0, %xmm1 1291 ; SSE3-NEXT: movdqa %xmm1, %xmm0 1292 ; SSE3-NEXT: psrlw $1, %xmm0 1293 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm0 1294 ; SSE3-NEXT: psubw %xmm0, %xmm1 1295 ; SSE3-NEXT: movdqa {{.*#+}} xmm0 = [13107,13107,13107,13107,13107,13107,13107,13107] 1296 ; SSE3-NEXT: movdqa %xmm1, %xmm2 1297 ; SSE3-NEXT: pand %xmm0, %xmm2 1298 ; SSE3-NEXT: psrlw $2, %xmm1 1299 ; SSE3-NEXT: pand %xmm0, %xmm1 1300 ; SSE3-NEXT: paddw %xmm2, %xmm1 1301 ; SSE3-NEXT: movdqa %xmm1, %xmm2 1302 ; SSE3-NEXT: psrlw $4, %xmm2 1303 ; SSE3-NEXT: paddw %xmm1, %xmm2 1304 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm2 1305 ; SSE3-NEXT: movdqa %xmm2, %xmm0 1306 ; SSE3-NEXT: psllw $8, %xmm0 1307 ; SSE3-NEXT: paddb %xmm2, %xmm0 1308 ; SSE3-NEXT: psrlw $8, %xmm0 1309 ; SSE3-NEXT: retq 1310 ; 1311 ; SSSE3-LABEL: testv8i16u: 1312 ; SSSE3: # %bb.0: 1313 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1314 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 1315 ; SSSE3-NEXT: pand %xmm2, %xmm1 1316 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1317 ; SSSE3-NEXT: movdqa %xmm3, %xmm4 1318 ; SSSE3-NEXT: pshufb %xmm1, %xmm4 1319 ; SSSE3-NEXT: movdqa %xmm0, %xmm1 1320 ; SSSE3-NEXT: psrlw $4, %xmm1 1321 ; SSSE3-NEXT: pand %xmm2, %xmm1 1322 ; SSSE3-NEXT: pxor %xmm2, %xmm2 1323 ; SSSE3-NEXT: pshufb %xmm1, %xmm3 1324 ; SSSE3-NEXT: pcmpeqb %xmm2, %xmm1 1325 ; SSSE3-NEXT: pand %xmm4, %xmm1 1326 ; SSSE3-NEXT: paddb %xmm3, %xmm1 1327 ; SSSE3-NEXT: pcmpeqb %xmm2, %xmm0 1328 ; SSSE3-NEXT: psrlw $8, %xmm0 1329 ; SSSE3-NEXT: pand %xmm1, %xmm0 1330 ; SSSE3-NEXT: psrlw $8, %xmm1 1331 ; SSSE3-NEXT: paddw %xmm0, %xmm1 1332 ; SSSE3-NEXT: movdqa %xmm1, %xmm0 1333 ; SSSE3-NEXT: retq 1334 ; 1335 ; SSE41-LABEL: testv8i16u: 1336 ; SSE41: # %bb.0: 1337 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1338 ; SSE41-NEXT: movdqa %xmm0, %xmm1 1339 ; SSE41-NEXT: pand %xmm2, %xmm1 1340 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1341 ; SSE41-NEXT: movdqa %xmm3, %xmm4 1342 ; SSE41-NEXT: pshufb %xmm1, %xmm4 1343 ; SSE41-NEXT: movdqa %xmm0, %xmm1 1344 ; SSE41-NEXT: psrlw $4, %xmm1 1345 ; SSE41-NEXT: pand %xmm2, %xmm1 1346 ; SSE41-NEXT: pxor %xmm2, %xmm2 1347 ; SSE41-NEXT: pshufb %xmm1, %xmm3 1348 ; SSE41-NEXT: pcmpeqb %xmm2, %xmm1 1349 ; SSE41-NEXT: pand %xmm4, %xmm1 1350 ; SSE41-NEXT: paddb %xmm3, %xmm1 1351 ; SSE41-NEXT: pcmpeqb %xmm2, %xmm0 1352 ; SSE41-NEXT: psrlw $8, %xmm0 1353 ; SSE41-NEXT: pand %xmm1, %xmm0 1354 ; SSE41-NEXT: psrlw $8, %xmm1 1355 ; SSE41-NEXT: paddw %xmm0, %xmm1 1356 ; SSE41-NEXT: movdqa %xmm1, %xmm0 1357 ; SSE41-NEXT: retq 1358 ; 1359 ; AVX-LABEL: testv8i16u: 1360 ; AVX: # %bb.0: 1361 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1362 ; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 1363 ; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1364 ; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1365 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm4 1366 ; AVX-NEXT: vpand %xmm1, %xmm4, %xmm1 1367 ; AVX-NEXT: vpxor %xmm4, %xmm4, %xmm4 1368 ; AVX-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm5 1369 ; AVX-NEXT: vpand %xmm5, %xmm2, %xmm2 1370 ; AVX-NEXT: vpshufb %xmm1, %xmm3, %xmm1 1371 ; AVX-NEXT: vpaddb %xmm1, %xmm2, %xmm1 1372 ; AVX-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm0 1373 ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm0 1374 ; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0 1375 ; AVX-NEXT: vpsrlw $8, %xmm1, %xmm1 1376 ; AVX-NEXT: vpaddw %xmm0, %xmm1, %xmm0 1377 ; AVX-NEXT: retq 1378 ; 1379 ; AVX512VLBWDQ-LABEL: testv8i16u: 1380 ; AVX512VLBWDQ: # %bb.0: 1381 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1382 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm0, %xmm2 1383 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1384 ; AVX512VLBWDQ-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1385 ; AVX512VLBWDQ-NEXT: vpsrlw $4, %xmm0, %xmm4 1386 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm4, %xmm1 1387 ; AVX512VLBWDQ-NEXT: vpxor %xmm4, %xmm4, %xmm4 1388 ; AVX512VLBWDQ-NEXT: vpcmpeqb %xmm4, %xmm1, %xmm5 1389 ; AVX512VLBWDQ-NEXT: vpand %xmm5, %xmm2, %xmm2 1390 ; AVX512VLBWDQ-NEXT: vpshufb %xmm1, %xmm3, %xmm1 1391 ; AVX512VLBWDQ-NEXT: vpaddb %xmm1, %xmm2, %xmm1 1392 ; AVX512VLBWDQ-NEXT: vpcmpeqb %xmm4, %xmm0, %xmm0 1393 ; AVX512VLBWDQ-NEXT: vpsrlw $8, %xmm0, %xmm0 1394 ; AVX512VLBWDQ-NEXT: vpand %xmm0, %xmm1, %xmm0 1395 ; AVX512VLBWDQ-NEXT: vpsrlw $8, %xmm1, %xmm1 1396 ; AVX512VLBWDQ-NEXT: vpaddw %xmm0, %xmm1, %xmm0 1397 ; AVX512VLBWDQ-NEXT: retq 1398 ; 1399 ; AVX512VLCD-LABEL: testv8i16u: 1400 ; AVX512VLCD: # %bb.0: 1401 ; AVX512VLCD-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1402 ; AVX512VLCD-NEXT: vplzcntd %ymm0, %ymm0 1403 ; AVX512VLCD-NEXT: vpmovdw %ymm0, %xmm0 1404 ; AVX512VLCD-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 1405 ; AVX512VLCD-NEXT: vzeroupper 1406 ; AVX512VLCD-NEXT: retq 1407 ; 1408 ; AVX512CD-LABEL: testv8i16u: 1409 ; AVX512CD: # %bb.0: 1410 ; AVX512CD-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero 1411 ; AVX512CD-NEXT: vplzcntd %zmm0, %zmm0 1412 ; AVX512CD-NEXT: vpmovdw %zmm0, %ymm0 1413 ; AVX512CD-NEXT: vpsubw {{.*}}(%rip), %xmm0, %xmm0 1414 ; AVX512CD-NEXT: vzeroupper 1415 ; AVX512CD-NEXT: retq 1416 ; 1417 ; X32-SSE-LABEL: testv8i16u: 1418 ; X32-SSE: # %bb.0: 1419 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1420 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 1421 ; X32-SSE-NEXT: pand %xmm2, %xmm1 1422 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1423 ; X32-SSE-NEXT: movdqa %xmm3, %xmm4 1424 ; X32-SSE-NEXT: pshufb %xmm1, %xmm4 1425 ; X32-SSE-NEXT: movdqa %xmm0, %xmm1 1426 ; X32-SSE-NEXT: psrlw $4, %xmm1 1427 ; X32-SSE-NEXT: pand %xmm2, %xmm1 1428 ; X32-SSE-NEXT: pxor %xmm2, %xmm2 1429 ; X32-SSE-NEXT: pshufb %xmm1, %xmm3 1430 ; X32-SSE-NEXT: pcmpeqb %xmm2, %xmm1 1431 ; X32-SSE-NEXT: pand %xmm4, %xmm1 1432 ; X32-SSE-NEXT: paddb %xmm3, %xmm1 1433 ; X32-SSE-NEXT: pcmpeqb %xmm2, %xmm0 1434 ; X32-SSE-NEXT: psrlw $8, %xmm0 1435 ; X32-SSE-NEXT: pand %xmm1, %xmm0 1436 ; X32-SSE-NEXT: psrlw $8, %xmm1 1437 ; X32-SSE-NEXT: paddw %xmm0, %xmm1 1438 ; X32-SSE-NEXT: movdqa %xmm1, %xmm0 1439 ; X32-SSE-NEXT: retl 1440 %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %in, i1 -1) 1441 ret <8 x i16> %out 1442 } 1443 1444 define <16 x i8> @testv16i8(<16 x i8> %in) nounwind { 1445 ; SSE2-LABEL: testv16i8: 1446 ; SSE2: # %bb.0: 1447 ; SSE2-NEXT: movdqa %xmm0, %xmm1 1448 ; SSE2-NEXT: psrlw $1, %xmm1 1449 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 1450 ; SSE2-NEXT: por %xmm0, %xmm1 1451 ; SSE2-NEXT: movdqa %xmm1, %xmm0 1452 ; SSE2-NEXT: psrlw $2, %xmm0 1453 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1454 ; SSE2-NEXT: por %xmm1, %xmm0 1455 ; SSE2-NEXT: movdqa %xmm0, %xmm1 1456 ; SSE2-NEXT: psrlw $4, %xmm1 1457 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1458 ; SSE2-NEXT: pand %xmm2, %xmm1 1459 ; SSE2-NEXT: por %xmm0, %xmm1 1460 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 1461 ; SSE2-NEXT: pxor %xmm1, %xmm3 1462 ; SSE2-NEXT: movdqa %xmm3, %xmm0 1463 ; SSE2-NEXT: psrlw $1, %xmm0 1464 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1465 ; SSE2-NEXT: psubb %xmm0, %xmm3 1466 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 1467 ; SSE2-NEXT: movdqa %xmm3, %xmm1 1468 ; SSE2-NEXT: pand %xmm0, %xmm1 1469 ; SSE2-NEXT: psrlw $2, %xmm3 1470 ; SSE2-NEXT: pand %xmm0, %xmm3 1471 ; SSE2-NEXT: paddb %xmm1, %xmm3 1472 ; SSE2-NEXT: movdqa %xmm3, %xmm0 1473 ; SSE2-NEXT: psrlw $4, %xmm0 1474 ; SSE2-NEXT: paddb %xmm3, %xmm0 1475 ; SSE2-NEXT: pand %xmm2, %xmm0 1476 ; SSE2-NEXT: retq 1477 ; 1478 ; SSE3-LABEL: testv16i8: 1479 ; SSE3: # %bb.0: 1480 ; SSE3-NEXT: movdqa %xmm0, %xmm1 1481 ; SSE3-NEXT: psrlw $1, %xmm1 1482 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm1 1483 ; SSE3-NEXT: por %xmm0, %xmm1 1484 ; SSE3-NEXT: movdqa %xmm1, %xmm0 1485 ; SSE3-NEXT: psrlw $2, %xmm0 1486 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm0 1487 ; SSE3-NEXT: por %xmm1, %xmm0 1488 ; SSE3-NEXT: movdqa %xmm0, %xmm1 1489 ; SSE3-NEXT: psrlw $4, %xmm1 1490 ; SSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1491 ; SSE3-NEXT: pand %xmm2, %xmm1 1492 ; SSE3-NEXT: por %xmm0, %xmm1 1493 ; SSE3-NEXT: pcmpeqd %xmm3, %xmm3 1494 ; SSE3-NEXT: pxor %xmm1, %xmm3 1495 ; SSE3-NEXT: movdqa %xmm3, %xmm0 1496 ; SSE3-NEXT: psrlw $1, %xmm0 1497 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm0 1498 ; SSE3-NEXT: psubb %xmm0, %xmm3 1499 ; SSE3-NEXT: movdqa {{.*#+}} xmm0 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 1500 ; SSE3-NEXT: movdqa %xmm3, %xmm1 1501 ; SSE3-NEXT: pand %xmm0, %xmm1 1502 ; SSE3-NEXT: psrlw $2, %xmm3 1503 ; SSE3-NEXT: pand %xmm0, %xmm3 1504 ; SSE3-NEXT: paddb %xmm1, %xmm3 1505 ; SSE3-NEXT: movdqa %xmm3, %xmm0 1506 ; SSE3-NEXT: psrlw $4, %xmm0 1507 ; SSE3-NEXT: paddb %xmm3, %xmm0 1508 ; SSE3-NEXT: pand %xmm2, %xmm0 1509 ; SSE3-NEXT: retq 1510 ; 1511 ; SSSE3-LABEL: testv16i8: 1512 ; SSSE3: # %bb.0: 1513 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1514 ; SSSE3-NEXT: movdqa %xmm0, %xmm3 1515 ; SSSE3-NEXT: pand %xmm2, %xmm3 1516 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1517 ; SSSE3-NEXT: movdqa %xmm1, %xmm4 1518 ; SSSE3-NEXT: pshufb %xmm3, %xmm4 1519 ; SSSE3-NEXT: psrlw $4, %xmm0 1520 ; SSSE3-NEXT: pand %xmm2, %xmm0 1521 ; SSSE3-NEXT: pxor %xmm2, %xmm2 1522 ; SSSE3-NEXT: pcmpeqb %xmm0, %xmm2 1523 ; SSSE3-NEXT: pand %xmm4, %xmm2 1524 ; SSSE3-NEXT: pshufb %xmm0, %xmm1 1525 ; SSSE3-NEXT: paddb %xmm2, %xmm1 1526 ; SSSE3-NEXT: movdqa %xmm1, %xmm0 1527 ; SSSE3-NEXT: retq 1528 ; 1529 ; SSE41-LABEL: testv16i8: 1530 ; SSE41: # %bb.0: 1531 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1532 ; SSE41-NEXT: movdqa %xmm0, %xmm3 1533 ; SSE41-NEXT: pand %xmm2, %xmm3 1534 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1535 ; SSE41-NEXT: movdqa %xmm1, %xmm4 1536 ; SSE41-NEXT: pshufb %xmm3, %xmm4 1537 ; SSE41-NEXT: psrlw $4, %xmm0 1538 ; SSE41-NEXT: pand %xmm2, %xmm0 1539 ; SSE41-NEXT: pxor %xmm2, %xmm2 1540 ; SSE41-NEXT: pcmpeqb %xmm0, %xmm2 1541 ; SSE41-NEXT: pand %xmm4, %xmm2 1542 ; SSE41-NEXT: pshufb %xmm0, %xmm1 1543 ; SSE41-NEXT: paddb %xmm2, %xmm1 1544 ; SSE41-NEXT: movdqa %xmm1, %xmm0 1545 ; SSE41-NEXT: retq 1546 ; 1547 ; AVX-LABEL: testv16i8: 1548 ; AVX: # %bb.0: 1549 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1550 ; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 1551 ; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1552 ; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1553 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 1554 ; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 1555 ; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1 1556 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm1 1557 ; AVX-NEXT: vpand %xmm1, %xmm2, %xmm1 1558 ; AVX-NEXT: vpshufb %xmm0, %xmm3, %xmm0 1559 ; AVX-NEXT: vpaddb %xmm0, %xmm1, %xmm0 1560 ; AVX-NEXT: retq 1561 ; 1562 ; AVX512VLBWDQ-LABEL: testv16i8: 1563 ; AVX512VLBWDQ: # %bb.0: 1564 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1565 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm0, %xmm2 1566 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1567 ; AVX512VLBWDQ-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1568 ; AVX512VLBWDQ-NEXT: vpsrlw $4, %xmm0, %xmm0 1569 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm0, %xmm0 1570 ; AVX512VLBWDQ-NEXT: vpxor %xmm1, %xmm1, %xmm1 1571 ; AVX512VLBWDQ-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm1 1572 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm2, %xmm1 1573 ; AVX512VLBWDQ-NEXT: vpshufb %xmm0, %xmm3, %xmm0 1574 ; AVX512VLBWDQ-NEXT: vpaddb %xmm0, %xmm1, %xmm0 1575 ; AVX512VLBWDQ-NEXT: retq 1576 ; 1577 ; AVX512-LABEL: testv16i8: 1578 ; AVX512: # %bb.0: 1579 ; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero 1580 ; AVX512-NEXT: vplzcntd %zmm0, %zmm0 1581 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0 1582 ; AVX512-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1583 ; AVX512-NEXT: vzeroupper 1584 ; AVX512-NEXT: retq 1585 ; 1586 ; X32-SSE-LABEL: testv16i8: 1587 ; X32-SSE: # %bb.0: 1588 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1589 ; X32-SSE-NEXT: movdqa %xmm0, %xmm3 1590 ; X32-SSE-NEXT: pand %xmm2, %xmm3 1591 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1592 ; X32-SSE-NEXT: movdqa %xmm1, %xmm4 1593 ; X32-SSE-NEXT: pshufb %xmm3, %xmm4 1594 ; X32-SSE-NEXT: psrlw $4, %xmm0 1595 ; X32-SSE-NEXT: pand %xmm2, %xmm0 1596 ; X32-SSE-NEXT: pxor %xmm2, %xmm2 1597 ; X32-SSE-NEXT: pcmpeqb %xmm0, %xmm2 1598 ; X32-SSE-NEXT: pand %xmm4, %xmm2 1599 ; X32-SSE-NEXT: pshufb %xmm0, %xmm1 1600 ; X32-SSE-NEXT: paddb %xmm2, %xmm1 1601 ; X32-SSE-NEXT: movdqa %xmm1, %xmm0 1602 ; X32-SSE-NEXT: retl 1603 %out = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %in, i1 0) 1604 ret <16 x i8> %out 1605 } 1606 1607 define <16 x i8> @testv16i8u(<16 x i8> %in) nounwind { 1608 ; SSE2-LABEL: testv16i8u: 1609 ; SSE2: # %bb.0: 1610 ; SSE2-NEXT: movdqa %xmm0, %xmm1 1611 ; SSE2-NEXT: psrlw $1, %xmm1 1612 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 1613 ; SSE2-NEXT: por %xmm0, %xmm1 1614 ; SSE2-NEXT: movdqa %xmm1, %xmm0 1615 ; SSE2-NEXT: psrlw $2, %xmm0 1616 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1617 ; SSE2-NEXT: por %xmm1, %xmm0 1618 ; SSE2-NEXT: movdqa %xmm0, %xmm1 1619 ; SSE2-NEXT: psrlw $4, %xmm1 1620 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1621 ; SSE2-NEXT: pand %xmm2, %xmm1 1622 ; SSE2-NEXT: por %xmm0, %xmm1 1623 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 1624 ; SSE2-NEXT: pxor %xmm1, %xmm3 1625 ; SSE2-NEXT: movdqa %xmm3, %xmm0 1626 ; SSE2-NEXT: psrlw $1, %xmm0 1627 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1628 ; SSE2-NEXT: psubb %xmm0, %xmm3 1629 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 1630 ; SSE2-NEXT: movdqa %xmm3, %xmm1 1631 ; SSE2-NEXT: pand %xmm0, %xmm1 1632 ; SSE2-NEXT: psrlw $2, %xmm3 1633 ; SSE2-NEXT: pand %xmm0, %xmm3 1634 ; SSE2-NEXT: paddb %xmm1, %xmm3 1635 ; SSE2-NEXT: movdqa %xmm3, %xmm0 1636 ; SSE2-NEXT: psrlw $4, %xmm0 1637 ; SSE2-NEXT: paddb %xmm3, %xmm0 1638 ; SSE2-NEXT: pand %xmm2, %xmm0 1639 ; SSE2-NEXT: retq 1640 ; 1641 ; SSE3-LABEL: testv16i8u: 1642 ; SSE3: # %bb.0: 1643 ; SSE3-NEXT: movdqa %xmm0, %xmm1 1644 ; SSE3-NEXT: psrlw $1, %xmm1 1645 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm1 1646 ; SSE3-NEXT: por %xmm0, %xmm1 1647 ; SSE3-NEXT: movdqa %xmm1, %xmm0 1648 ; SSE3-NEXT: psrlw $2, %xmm0 1649 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm0 1650 ; SSE3-NEXT: por %xmm1, %xmm0 1651 ; SSE3-NEXT: movdqa %xmm0, %xmm1 1652 ; SSE3-NEXT: psrlw $4, %xmm1 1653 ; SSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1654 ; SSE3-NEXT: pand %xmm2, %xmm1 1655 ; SSE3-NEXT: por %xmm0, %xmm1 1656 ; SSE3-NEXT: pcmpeqd %xmm3, %xmm3 1657 ; SSE3-NEXT: pxor %xmm1, %xmm3 1658 ; SSE3-NEXT: movdqa %xmm3, %xmm0 1659 ; SSE3-NEXT: psrlw $1, %xmm0 1660 ; SSE3-NEXT: pand {{.*}}(%rip), %xmm0 1661 ; SSE3-NEXT: psubb %xmm0, %xmm3 1662 ; SSE3-NEXT: movdqa {{.*#+}} xmm0 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51] 1663 ; SSE3-NEXT: movdqa %xmm3, %xmm1 1664 ; SSE3-NEXT: pand %xmm0, %xmm1 1665 ; SSE3-NEXT: psrlw $2, %xmm3 1666 ; SSE3-NEXT: pand %xmm0, %xmm3 1667 ; SSE3-NEXT: paddb %xmm1, %xmm3 1668 ; SSE3-NEXT: movdqa %xmm3, %xmm0 1669 ; SSE3-NEXT: psrlw $4, %xmm0 1670 ; SSE3-NEXT: paddb %xmm3, %xmm0 1671 ; SSE3-NEXT: pand %xmm2, %xmm0 1672 ; SSE3-NEXT: retq 1673 ; 1674 ; SSSE3-LABEL: testv16i8u: 1675 ; SSSE3: # %bb.0: 1676 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1677 ; SSSE3-NEXT: movdqa %xmm0, %xmm3 1678 ; SSSE3-NEXT: pand %xmm2, %xmm3 1679 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1680 ; SSSE3-NEXT: movdqa %xmm1, %xmm4 1681 ; SSSE3-NEXT: pshufb %xmm3, %xmm4 1682 ; SSSE3-NEXT: psrlw $4, %xmm0 1683 ; SSSE3-NEXT: pand %xmm2, %xmm0 1684 ; SSSE3-NEXT: pxor %xmm2, %xmm2 1685 ; SSSE3-NEXT: pcmpeqb %xmm0, %xmm2 1686 ; SSSE3-NEXT: pand %xmm4, %xmm2 1687 ; SSSE3-NEXT: pshufb %xmm0, %xmm1 1688 ; SSSE3-NEXT: paddb %xmm2, %xmm1 1689 ; SSSE3-NEXT: movdqa %xmm1, %xmm0 1690 ; SSSE3-NEXT: retq 1691 ; 1692 ; SSE41-LABEL: testv16i8u: 1693 ; SSE41: # %bb.0: 1694 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1695 ; SSE41-NEXT: movdqa %xmm0, %xmm3 1696 ; SSE41-NEXT: pand %xmm2, %xmm3 1697 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1698 ; SSE41-NEXT: movdqa %xmm1, %xmm4 1699 ; SSE41-NEXT: pshufb %xmm3, %xmm4 1700 ; SSE41-NEXT: psrlw $4, %xmm0 1701 ; SSE41-NEXT: pand %xmm2, %xmm0 1702 ; SSE41-NEXT: pxor %xmm2, %xmm2 1703 ; SSE41-NEXT: pcmpeqb %xmm0, %xmm2 1704 ; SSE41-NEXT: pand %xmm4, %xmm2 1705 ; SSE41-NEXT: pshufb %xmm0, %xmm1 1706 ; SSE41-NEXT: paddb %xmm2, %xmm1 1707 ; SSE41-NEXT: movdqa %xmm1, %xmm0 1708 ; SSE41-NEXT: retq 1709 ; 1710 ; AVX-LABEL: testv16i8u: 1711 ; AVX: # %bb.0: 1712 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1713 ; AVX-NEXT: vpand %xmm1, %xmm0, %xmm2 1714 ; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1715 ; AVX-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1716 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0 1717 ; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 1718 ; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1 1719 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm1 1720 ; AVX-NEXT: vpand %xmm1, %xmm2, %xmm1 1721 ; AVX-NEXT: vpshufb %xmm0, %xmm3, %xmm0 1722 ; AVX-NEXT: vpaddb %xmm0, %xmm1, %xmm0 1723 ; AVX-NEXT: retq 1724 ; 1725 ; AVX512VLBWDQ-LABEL: testv16i8u: 1726 ; AVX512VLBWDQ: # %bb.0: 1727 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1728 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm0, %xmm2 1729 ; AVX512VLBWDQ-NEXT: vmovdqa {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1730 ; AVX512VLBWDQ-NEXT: vpshufb %xmm2, %xmm3, %xmm2 1731 ; AVX512VLBWDQ-NEXT: vpsrlw $4, %xmm0, %xmm0 1732 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm0, %xmm0 1733 ; AVX512VLBWDQ-NEXT: vpxor %xmm1, %xmm1, %xmm1 1734 ; AVX512VLBWDQ-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm1 1735 ; AVX512VLBWDQ-NEXT: vpand %xmm1, %xmm2, %xmm1 1736 ; AVX512VLBWDQ-NEXT: vpshufb %xmm0, %xmm3, %xmm0 1737 ; AVX512VLBWDQ-NEXT: vpaddb %xmm0, %xmm1, %xmm0 1738 ; AVX512VLBWDQ-NEXT: retq 1739 ; 1740 ; AVX512-LABEL: testv16i8u: 1741 ; AVX512: # %bb.0: 1742 ; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero 1743 ; AVX512-NEXT: vplzcntd %zmm0, %zmm0 1744 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0 1745 ; AVX512-NEXT: vpsubb {{.*}}(%rip), %xmm0, %xmm0 1746 ; AVX512-NEXT: vzeroupper 1747 ; AVX512-NEXT: retq 1748 ; 1749 ; X32-SSE-LABEL: testv16i8u: 1750 ; X32-SSE: # %bb.0: 1751 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15] 1752 ; X32-SSE-NEXT: movdqa %xmm0, %xmm3 1753 ; X32-SSE-NEXT: pand %xmm2, %xmm3 1754 ; X32-SSE-NEXT: movdqa {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0] 1755 ; X32-SSE-NEXT: movdqa %xmm1, %xmm4 1756 ; X32-SSE-NEXT: pshufb %xmm3, %xmm4 1757 ; X32-SSE-NEXT: psrlw $4, %xmm0 1758 ; X32-SSE-NEXT: pand %xmm2, %xmm0 1759 ; X32-SSE-NEXT: pxor %xmm2, %xmm2 1760 ; X32-SSE-NEXT: pcmpeqb %xmm0, %xmm2 1761 ; X32-SSE-NEXT: pand %xmm4, %xmm2 1762 ; X32-SSE-NEXT: pshufb %xmm0, %xmm1 1763 ; X32-SSE-NEXT: paddb %xmm2, %xmm1 1764 ; X32-SSE-NEXT: movdqa %xmm1, %xmm0 1765 ; X32-SSE-NEXT: retl 1766 %out = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %in, i1 -1) 1767 ret <16 x i8> %out 1768 } 1769 1770 define <2 x i64> @foldv2i64() nounwind { 1771 ; SSE-LABEL: foldv2i64: 1772 ; SSE: # %bb.0: 1773 ; SSE-NEXT: movl $55, %eax 1774 ; SSE-NEXT: movq %rax, %xmm0 1775 ; SSE-NEXT: retq 1776 ; 1777 ; NOBW-LABEL: foldv2i64: 1778 ; NOBW: # %bb.0: 1779 ; NOBW-NEXT: movl $55, %eax 1780 ; NOBW-NEXT: vmovq %rax, %xmm0 1781 ; NOBW-NEXT: retq 1782 ; 1783 ; AVX512VLBWDQ-LABEL: foldv2i64: 1784 ; AVX512VLBWDQ: # %bb.0: 1785 ; AVX512VLBWDQ-NEXT: movl $55, %eax 1786 ; AVX512VLBWDQ-NEXT: vmovq %rax, %xmm0 1787 ; AVX512VLBWDQ-NEXT: retq 1788 ; 1789 ; X32-SSE-LABEL: foldv2i64: 1790 ; X32-SSE: # %bb.0: 1791 ; X32-SSE-NEXT: movl $55, %eax 1792 ; X32-SSE-NEXT: movd %eax, %xmm0 1793 ; X32-SSE-NEXT: retl 1794 %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> <i64 256, i64 -1>, i1 0) 1795 ret <2 x i64> %out 1796 } 1797 1798 define <2 x i64> @foldv2i64u() nounwind { 1799 ; SSE-LABEL: foldv2i64u: 1800 ; SSE: # %bb.0: 1801 ; SSE-NEXT: movl $55, %eax 1802 ; SSE-NEXT: movq %rax, %xmm0 1803 ; SSE-NEXT: retq 1804 ; 1805 ; NOBW-LABEL: foldv2i64u: 1806 ; NOBW: # %bb.0: 1807 ; NOBW-NEXT: movl $55, %eax 1808 ; NOBW-NEXT: vmovq %rax, %xmm0 1809 ; NOBW-NEXT: retq 1810 ; 1811 ; AVX512VLBWDQ-LABEL: foldv2i64u: 1812 ; AVX512VLBWDQ: # %bb.0: 1813 ; AVX512VLBWDQ-NEXT: movl $55, %eax 1814 ; AVX512VLBWDQ-NEXT: vmovq %rax, %xmm0 1815 ; AVX512VLBWDQ-NEXT: retq 1816 ; 1817 ; X32-SSE-LABEL: foldv2i64u: 1818 ; X32-SSE: # %bb.0: 1819 ; X32-SSE-NEXT: movl $55, %eax 1820 ; X32-SSE-NEXT: movd %eax, %xmm0 1821 ; X32-SSE-NEXT: retl 1822 %out = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> <i64 256, i64 -1>, i1 -1) 1823 ret <2 x i64> %out 1824 } 1825 1826 define <4 x i32> @foldv4i32() nounwind { 1827 ; SSE-LABEL: foldv4i32: 1828 ; SSE: # %bb.0: 1829 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [23,0,32,24] 1830 ; SSE-NEXT: retq 1831 ; 1832 ; NOBW-LABEL: foldv4i32: 1833 ; NOBW: # %bb.0: 1834 ; NOBW-NEXT: vmovaps {{.*#+}} xmm0 = [23,0,32,24] 1835 ; NOBW-NEXT: retq 1836 ; 1837 ; AVX512VLBWDQ-LABEL: foldv4i32: 1838 ; AVX512VLBWDQ: # %bb.0: 1839 ; AVX512VLBWDQ-NEXT: vmovaps {{.*#+}} xmm0 = [23,0,32,24] 1840 ; AVX512VLBWDQ-NEXT: retq 1841 ; 1842 ; X32-SSE-LABEL: foldv4i32: 1843 ; X32-SSE: # %bb.0: 1844 ; X32-SSE-NEXT: movaps {{.*#+}} xmm0 = [23,0,32,24] 1845 ; X32-SSE-NEXT: retl 1846 %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>, i1 0) 1847 ret <4 x i32> %out 1848 } 1849 1850 define <4 x i32> @foldv4i32u() nounwind { 1851 ; SSE-LABEL: foldv4i32u: 1852 ; SSE: # %bb.0: 1853 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [23,0,32,24] 1854 ; SSE-NEXT: retq 1855 ; 1856 ; NOBW-LABEL: foldv4i32u: 1857 ; NOBW: # %bb.0: 1858 ; NOBW-NEXT: vmovaps {{.*#+}} xmm0 = [23,0,32,24] 1859 ; NOBW-NEXT: retq 1860 ; 1861 ; AVX512VLBWDQ-LABEL: foldv4i32u: 1862 ; AVX512VLBWDQ: # %bb.0: 1863 ; AVX512VLBWDQ-NEXT: vmovaps {{.*#+}} xmm0 = [23,0,32,24] 1864 ; AVX512VLBWDQ-NEXT: retq 1865 ; 1866 ; X32-SSE-LABEL: foldv4i32u: 1867 ; X32-SSE: # %bb.0: 1868 ; X32-SSE-NEXT: movaps {{.*#+}} xmm0 = [23,0,32,24] 1869 ; X32-SSE-NEXT: retl 1870 %out = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>, i1 -1) 1871 ret <4 x i32> %out 1872 } 1873 1874 define <8 x i16> @foldv8i16() nounwind { 1875 ; SSE-LABEL: foldv8i16: 1876 ; SSE: # %bb.0: 1877 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 1878 ; SSE-NEXT: retq 1879 ; 1880 ; NOBW-LABEL: foldv8i16: 1881 ; NOBW: # %bb.0: 1882 ; NOBW-NEXT: vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 1883 ; NOBW-NEXT: retq 1884 ; 1885 ; AVX512VLBWDQ-LABEL: foldv8i16: 1886 ; AVX512VLBWDQ: # %bb.0: 1887 ; AVX512VLBWDQ-NEXT: vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 1888 ; AVX512VLBWDQ-NEXT: retq 1889 ; 1890 ; X32-SSE-LABEL: foldv8i16: 1891 ; X32-SSE: # %bb.0: 1892 ; X32-SSE-NEXT: movaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 1893 ; X32-SSE-NEXT: retl 1894 %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88>, i1 0) 1895 ret <8 x i16> %out 1896 } 1897 1898 define <8 x i16> @foldv8i16u() nounwind { 1899 ; SSE-LABEL: foldv8i16u: 1900 ; SSE: # %bb.0: 1901 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 1902 ; SSE-NEXT: retq 1903 ; 1904 ; NOBW-LABEL: foldv8i16u: 1905 ; NOBW: # %bb.0: 1906 ; NOBW-NEXT: vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 1907 ; NOBW-NEXT: retq 1908 ; 1909 ; AVX512VLBWDQ-LABEL: foldv8i16u: 1910 ; AVX512VLBWDQ: # %bb.0: 1911 ; AVX512VLBWDQ-NEXT: vmovaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 1912 ; AVX512VLBWDQ-NEXT: retq 1913 ; 1914 ; X32-SSE-LABEL: foldv8i16u: 1915 ; X32-SSE: # %bb.0: 1916 ; X32-SSE-NEXT: movaps {{.*#+}} xmm0 = [7,0,16,8,16,13,11,9] 1917 ; X32-SSE-NEXT: retl 1918 %out = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88>, i1 -1) 1919 ret <8 x i16> %out 1920 } 1921 1922 define <16 x i8> @foldv16i8() nounwind { 1923 ; SSE-LABEL: foldv16i8: 1924 ; SSE: # %bb.0: 1925 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 1926 ; SSE-NEXT: retq 1927 ; 1928 ; NOBW-LABEL: foldv16i8: 1929 ; NOBW: # %bb.0: 1930 ; NOBW-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 1931 ; NOBW-NEXT: retq 1932 ; 1933 ; AVX512VLBWDQ-LABEL: foldv16i8: 1934 ; AVX512VLBWDQ: # %bb.0: 1935 ; AVX512VLBWDQ-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 1936 ; AVX512VLBWDQ-NEXT: retq 1937 ; 1938 ; X32-SSE-LABEL: foldv16i8: 1939 ; X32-SSE: # %bb.0: 1940 ; X32-SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 1941 ; X32-SSE-NEXT: retl 1942 %out = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> <i8 256, i8 -1, i8 0, i8 255, i8 -65536, i8 7, i8 24, i8 88, i8 -2, i8 254, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32>, i1 0) 1943 ret <16 x i8> %out 1944 } 1945 1946 define <16 x i8> @foldv16i8u() nounwind { 1947 ; SSE-LABEL: foldv16i8u: 1948 ; SSE: # %bb.0: 1949 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 1950 ; SSE-NEXT: retq 1951 ; 1952 ; NOBW-LABEL: foldv16i8u: 1953 ; NOBW: # %bb.0: 1954 ; NOBW-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 1955 ; NOBW-NEXT: retq 1956 ; 1957 ; AVX512VLBWDQ-LABEL: foldv16i8u: 1958 ; AVX512VLBWDQ: # %bb.0: 1959 ; AVX512VLBWDQ-NEXT: vmovaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 1960 ; AVX512VLBWDQ-NEXT: retq 1961 ; 1962 ; X32-SSE-LABEL: foldv16i8u: 1963 ; X32-SSE: # %bb.0: 1964 ; X32-SSE-NEXT: movaps {{.*#+}} xmm0 = [8,0,8,0,8,5,3,1,0,0,7,6,5,4,3,2] 1965 ; X32-SSE-NEXT: retl 1966 %out = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> <i8 256, i8 -1, i8 0, i8 255, i8 -65536, i8 7, i8 24, i8 88, i8 -2, i8 254, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32>, i1 -1) 1967 ret <16 x i8> %out 1968 } 1969 1970 declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>, i1) 1971 declare <4 x i32> @llvm.ctlz.v4i32(<4 x i32>, i1) 1972 declare <8 x i16> @llvm.ctlz.v8i16(<8 x i16>, i1) 1973 declare <16 x i8> @llvm.ctlz.v16i8(<16 x i8>, i1) 1974