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