[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / vector-tzcnt-512.ll
blob83f0d25ee806fecd7aaa4f2d62b6a871749d870d
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512cd | FileCheck %s --check-prefix=ALL --check-prefix=AVX512CD
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512cd,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512CDBW
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512BW
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512VPOPCNTDQ
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg | FileCheck %s --check-prefix=ALL --check-prefix=BITALG
8 define <8 x i64> @testv8i64(<8 x i64> %in) nounwind {
9 ; AVX512CD-LABEL: testv8i64:
10 ; AVX512CD:       # %bb.0:
11 ; AVX512CD-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
12 ; AVX512CD-NEXT:    vpaddq %zmm1, %zmm0, %zmm1
13 ; AVX512CD-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
14 ; AVX512CD-NEXT:    vplzcntq %zmm0, %zmm0
15 ; AVX512CD-NEXT:    vpbroadcastq {{.*#+}} zmm1 = [64,64,64,64,64,64,64,64]
16 ; AVX512CD-NEXT:    vpsubq %zmm0, %zmm1, %zmm0
17 ; AVX512CD-NEXT:    retq
19 ; AVX512CDBW-LABEL: testv8i64:
20 ; AVX512CDBW:       # %bb.0:
21 ; AVX512CDBW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
22 ; AVX512CDBW-NEXT:    vpaddq %zmm1, %zmm0, %zmm1
23 ; AVX512CDBW-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
24 ; AVX512CDBW-NEXT:    vplzcntq %zmm0, %zmm0
25 ; AVX512CDBW-NEXT:    vpbroadcastq {{.*#+}} zmm1 = [64,64,64,64,64,64,64,64]
26 ; AVX512CDBW-NEXT:    vpsubq %zmm0, %zmm1, %zmm0
27 ; AVX512CDBW-NEXT:    retq
29 ; AVX512BW-LABEL: testv8i64:
30 ; AVX512BW:       # %bb.0:
31 ; AVX512BW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
32 ; AVX512BW-NEXT:    vpaddq %zmm1, %zmm0, %zmm1
33 ; AVX512BW-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
34 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
35 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
36 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
37 ; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
38 ; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
39 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
40 ; AVX512BW-NEXT:    vpshufb %zmm0, %zmm3, %zmm0
41 ; AVX512BW-NEXT:    vpaddb %zmm2, %zmm0, %zmm0
42 ; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
43 ; AVX512BW-NEXT:    vpsadbw %zmm1, %zmm0, %zmm0
44 ; AVX512BW-NEXT:    retq
46 ; AVX512VPOPCNTDQ-LABEL: testv8i64:
47 ; AVX512VPOPCNTDQ:       # %bb.0:
48 ; AVX512VPOPCNTDQ-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
49 ; AVX512VPOPCNTDQ-NEXT:    vpaddq %zmm1, %zmm0, %zmm1
50 ; AVX512VPOPCNTDQ-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
51 ; AVX512VPOPCNTDQ-NEXT:    vpopcntq %zmm0, %zmm0
52 ; AVX512VPOPCNTDQ-NEXT:    retq
54 ; BITALG-LABEL: testv8i64:
55 ; BITALG:       # %bb.0:
56 ; BITALG-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
57 ; BITALG-NEXT:    vpaddq %zmm1, %zmm0, %zmm1
58 ; BITALG-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
59 ; BITALG-NEXT:    vpopcntb %zmm0, %zmm0
60 ; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1
61 ; BITALG-NEXT:    vpsadbw %zmm1, %zmm0, %zmm0
62 ; BITALG-NEXT:    retq
63   %out = call <8 x i64> @llvm.cttz.v8i64(<8 x i64> %in, i1 0)
64   ret <8 x i64> %out
67 define <8 x i64> @testv8i64u(<8 x i64> %in) nounwind {
68 ; AVX512CD-LABEL: testv8i64u:
69 ; AVX512CD:       # %bb.0:
70 ; AVX512CD-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
71 ; AVX512CD-NEXT:    vpaddq %zmm1, %zmm0, %zmm1
72 ; AVX512CD-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
73 ; AVX512CD-NEXT:    vplzcntq %zmm0, %zmm0
74 ; AVX512CD-NEXT:    vpbroadcastq {{.*#+}} zmm1 = [64,64,64,64,64,64,64,64]
75 ; AVX512CD-NEXT:    vpsubq %zmm0, %zmm1, %zmm0
76 ; AVX512CD-NEXT:    retq
78 ; AVX512CDBW-LABEL: testv8i64u:
79 ; AVX512CDBW:       # %bb.0:
80 ; AVX512CDBW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
81 ; AVX512CDBW-NEXT:    vpaddq %zmm1, %zmm0, %zmm1
82 ; AVX512CDBW-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
83 ; AVX512CDBW-NEXT:    vplzcntq %zmm0, %zmm0
84 ; AVX512CDBW-NEXT:    vpbroadcastq {{.*#+}} zmm1 = [64,64,64,64,64,64,64,64]
85 ; AVX512CDBW-NEXT:    vpsubq %zmm0, %zmm1, %zmm0
86 ; AVX512CDBW-NEXT:    retq
88 ; AVX512BW-LABEL: testv8i64u:
89 ; AVX512BW:       # %bb.0:
90 ; AVX512BW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
91 ; AVX512BW-NEXT:    vpaddq %zmm1, %zmm0, %zmm1
92 ; AVX512BW-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
93 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
94 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
95 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
96 ; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
97 ; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
98 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
99 ; AVX512BW-NEXT:    vpshufb %zmm0, %zmm3, %zmm0
100 ; AVX512BW-NEXT:    vpaddb %zmm2, %zmm0, %zmm0
101 ; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
102 ; AVX512BW-NEXT:    vpsadbw %zmm1, %zmm0, %zmm0
103 ; AVX512BW-NEXT:    retq
105 ; AVX512VPOPCNTDQ-LABEL: testv8i64u:
106 ; AVX512VPOPCNTDQ:       # %bb.0:
107 ; AVX512VPOPCNTDQ-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
108 ; AVX512VPOPCNTDQ-NEXT:    vpaddq %zmm1, %zmm0, %zmm1
109 ; AVX512VPOPCNTDQ-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
110 ; AVX512VPOPCNTDQ-NEXT:    vpopcntq %zmm0, %zmm0
111 ; AVX512VPOPCNTDQ-NEXT:    retq
113 ; BITALG-LABEL: testv8i64u:
114 ; BITALG:       # %bb.0:
115 ; BITALG-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
116 ; BITALG-NEXT:    vpaddq %zmm1, %zmm0, %zmm1
117 ; BITALG-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
118 ; BITALG-NEXT:    vpopcntb %zmm0, %zmm0
119 ; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1
120 ; BITALG-NEXT:    vpsadbw %zmm1, %zmm0, %zmm0
121 ; BITALG-NEXT:    retq
122   %out = call <8 x i64> @llvm.cttz.v8i64(<8 x i64> %in, i1 -1)
123   ret <8 x i64> %out
126 define <16 x i32> @testv16i32(<16 x i32> %in) nounwind {
127 ; AVX512CD-LABEL: testv16i32:
128 ; AVX512CD:       # %bb.0:
129 ; AVX512CD-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
130 ; AVX512CD-NEXT:    vpaddd %zmm1, %zmm0, %zmm1
131 ; AVX512CD-NEXT:    vpandnd %zmm1, %zmm0, %zmm0
132 ; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0
133 ; AVX512CD-NEXT:    vpbroadcastd {{.*#+}} zmm1 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
134 ; AVX512CD-NEXT:    vpsubd %zmm0, %zmm1, %zmm0
135 ; AVX512CD-NEXT:    retq
137 ; AVX512CDBW-LABEL: testv16i32:
138 ; AVX512CDBW:       # %bb.0:
139 ; AVX512CDBW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
140 ; AVX512CDBW-NEXT:    vpaddd %zmm1, %zmm0, %zmm1
141 ; AVX512CDBW-NEXT:    vpandnd %zmm1, %zmm0, %zmm0
142 ; AVX512CDBW-NEXT:    vplzcntd %zmm0, %zmm0
143 ; AVX512CDBW-NEXT:    vpbroadcastd {{.*#+}} zmm1 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
144 ; AVX512CDBW-NEXT:    vpsubd %zmm0, %zmm1, %zmm0
145 ; AVX512CDBW-NEXT:    retq
147 ; AVX512BW-LABEL: testv16i32:
148 ; AVX512BW:       # %bb.0:
149 ; AVX512BW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
150 ; AVX512BW-NEXT:    vpaddd %zmm1, %zmm0, %zmm1
151 ; AVX512BW-NEXT:    vpandnd %zmm1, %zmm0, %zmm0
152 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
153 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
154 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
155 ; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
156 ; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
157 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
158 ; AVX512BW-NEXT:    vpshufb %zmm0, %zmm3, %zmm0
159 ; AVX512BW-NEXT:    vpaddb %zmm2, %zmm0, %zmm0
160 ; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
161 ; AVX512BW-NEXT:    vpunpckhdq {{.*#+}} zmm2 = zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[14],zmm1[14],zmm0[15],zmm1[15]
162 ; AVX512BW-NEXT:    vpsadbw %zmm1, %zmm2, %zmm2
163 ; AVX512BW-NEXT:    vpunpckldq {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[12],zmm1[12],zmm0[13],zmm1[13]
164 ; AVX512BW-NEXT:    vpsadbw %zmm1, %zmm0, %zmm0
165 ; AVX512BW-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0
166 ; AVX512BW-NEXT:    retq
168 ; AVX512VPOPCNTDQ-LABEL: testv16i32:
169 ; AVX512VPOPCNTDQ:       # %bb.0:
170 ; AVX512VPOPCNTDQ-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
171 ; AVX512VPOPCNTDQ-NEXT:    vpaddd %zmm1, %zmm0, %zmm1
172 ; AVX512VPOPCNTDQ-NEXT:    vpandnd %zmm1, %zmm0, %zmm0
173 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0
174 ; AVX512VPOPCNTDQ-NEXT:    retq
176 ; BITALG-LABEL: testv16i32:
177 ; BITALG:       # %bb.0:
178 ; BITALG-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
179 ; BITALG-NEXT:    vpaddd %zmm1, %zmm0, %zmm1
180 ; BITALG-NEXT:    vpandnd %zmm1, %zmm0, %zmm0
181 ; BITALG-NEXT:    vpopcntb %zmm0, %zmm0
182 ; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1
183 ; BITALG-NEXT:    vpunpckhdq {{.*#+}} zmm2 = zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[14],zmm1[14],zmm0[15],zmm1[15]
184 ; BITALG-NEXT:    vpsadbw %zmm1, %zmm2, %zmm2
185 ; BITALG-NEXT:    vpunpckldq {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[12],zmm1[12],zmm0[13],zmm1[13]
186 ; BITALG-NEXT:    vpsadbw %zmm1, %zmm0, %zmm0
187 ; BITALG-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0
188 ; BITALG-NEXT:    retq
189   %out = call <16 x i32> @llvm.cttz.v16i32(<16 x i32> %in, i1 0)
190   ret <16 x i32> %out
193 define <16 x i32> @testv16i32u(<16 x i32> %in) nounwind {
194 ; AVX512CD-LABEL: testv16i32u:
195 ; AVX512CD:       # %bb.0:
196 ; AVX512CD-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
197 ; AVX512CD-NEXT:    vpaddd %zmm1, %zmm0, %zmm1
198 ; AVX512CD-NEXT:    vpandnd %zmm1, %zmm0, %zmm0
199 ; AVX512CD-NEXT:    vplzcntd %zmm0, %zmm0
200 ; AVX512CD-NEXT:    vpbroadcastd {{.*#+}} zmm1 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
201 ; AVX512CD-NEXT:    vpsubd %zmm0, %zmm1, %zmm0
202 ; AVX512CD-NEXT:    retq
204 ; AVX512CDBW-LABEL: testv16i32u:
205 ; AVX512CDBW:       # %bb.0:
206 ; AVX512CDBW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
207 ; AVX512CDBW-NEXT:    vpaddd %zmm1, %zmm0, %zmm1
208 ; AVX512CDBW-NEXT:    vpandnd %zmm1, %zmm0, %zmm0
209 ; AVX512CDBW-NEXT:    vplzcntd %zmm0, %zmm0
210 ; AVX512CDBW-NEXT:    vpbroadcastd {{.*#+}} zmm1 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
211 ; AVX512CDBW-NEXT:    vpsubd %zmm0, %zmm1, %zmm0
212 ; AVX512CDBW-NEXT:    retq
214 ; AVX512BW-LABEL: testv16i32u:
215 ; AVX512BW:       # %bb.0:
216 ; AVX512BW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
217 ; AVX512BW-NEXT:    vpaddd %zmm1, %zmm0, %zmm1
218 ; AVX512BW-NEXT:    vpandnd %zmm1, %zmm0, %zmm0
219 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
220 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
221 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
222 ; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
223 ; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
224 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
225 ; AVX512BW-NEXT:    vpshufb %zmm0, %zmm3, %zmm0
226 ; AVX512BW-NEXT:    vpaddb %zmm2, %zmm0, %zmm0
227 ; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
228 ; AVX512BW-NEXT:    vpunpckhdq {{.*#+}} zmm2 = zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[14],zmm1[14],zmm0[15],zmm1[15]
229 ; AVX512BW-NEXT:    vpsadbw %zmm1, %zmm2, %zmm2
230 ; AVX512BW-NEXT:    vpunpckldq {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[12],zmm1[12],zmm0[13],zmm1[13]
231 ; AVX512BW-NEXT:    vpsadbw %zmm1, %zmm0, %zmm0
232 ; AVX512BW-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0
233 ; AVX512BW-NEXT:    retq
235 ; AVX512VPOPCNTDQ-LABEL: testv16i32u:
236 ; AVX512VPOPCNTDQ:       # %bb.0:
237 ; AVX512VPOPCNTDQ-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
238 ; AVX512VPOPCNTDQ-NEXT:    vpaddd %zmm1, %zmm0, %zmm1
239 ; AVX512VPOPCNTDQ-NEXT:    vpandnd %zmm1, %zmm0, %zmm0
240 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0
241 ; AVX512VPOPCNTDQ-NEXT:    retq
243 ; BITALG-LABEL: testv16i32u:
244 ; BITALG:       # %bb.0:
245 ; BITALG-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
246 ; BITALG-NEXT:    vpaddd %zmm1, %zmm0, %zmm1
247 ; BITALG-NEXT:    vpandnd %zmm1, %zmm0, %zmm0
248 ; BITALG-NEXT:    vpopcntb %zmm0, %zmm0
249 ; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1
250 ; BITALG-NEXT:    vpunpckhdq {{.*#+}} zmm2 = zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[14],zmm1[14],zmm0[15],zmm1[15]
251 ; BITALG-NEXT:    vpsadbw %zmm1, %zmm2, %zmm2
252 ; BITALG-NEXT:    vpunpckldq {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[12],zmm1[12],zmm0[13],zmm1[13]
253 ; BITALG-NEXT:    vpsadbw %zmm1, %zmm0, %zmm0
254 ; BITALG-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0
255 ; BITALG-NEXT:    retq
256   %out = call <16 x i32> @llvm.cttz.v16i32(<16 x i32> %in, i1 -1)
257   ret <16 x i32> %out
260 define <32 x i16> @testv32i16(<32 x i16> %in) nounwind {
261 ; AVX512CD-LABEL: testv32i16:
262 ; AVX512CD:       # %bb.0:
263 ; AVX512CD-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
264 ; AVX512CD-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
265 ; AVX512CD-NEXT:    vpaddw %ymm2, %ymm1, %ymm3
266 ; AVX512CD-NEXT:    vpandn %ymm3, %ymm1, %ymm1
267 ; AVX512CD-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
268 ; AVX512CD-NEXT:    vpand %ymm3, %ymm1, %ymm4
269 ; AVX512CD-NEXT:    vmovdqa {{.*#+}} ymm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
270 ; AVX512CD-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
271 ; AVX512CD-NEXT:    vpsrlw $4, %ymm1, %ymm1
272 ; AVX512CD-NEXT:    vpand %ymm3, %ymm1, %ymm1
273 ; AVX512CD-NEXT:    vpshufb %ymm1, %ymm5, %ymm1
274 ; AVX512CD-NEXT:    vpaddb %ymm4, %ymm1, %ymm1
275 ; AVX512CD-NEXT:    vpsllw $8, %ymm1, %ymm4
276 ; AVX512CD-NEXT:    vpaddb %ymm1, %ymm4, %ymm1
277 ; AVX512CD-NEXT:    vpsrlw $8, %ymm1, %ymm1
278 ; AVX512CD-NEXT:    vpaddw %ymm2, %ymm0, %ymm2
279 ; AVX512CD-NEXT:    vpandn %ymm2, %ymm0, %ymm0
280 ; AVX512CD-NEXT:    vpand %ymm3, %ymm0, %ymm2
281 ; AVX512CD-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
282 ; AVX512CD-NEXT:    vpsrlw $4, %ymm0, %ymm0
283 ; AVX512CD-NEXT:    vpand %ymm3, %ymm0, %ymm0
284 ; AVX512CD-NEXT:    vpshufb %ymm0, %ymm5, %ymm0
285 ; AVX512CD-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
286 ; AVX512CD-NEXT:    vpsllw $8, %ymm0, %ymm2
287 ; AVX512CD-NEXT:    vpaddb %ymm0, %ymm2, %ymm0
288 ; AVX512CD-NEXT:    vpsrlw $8, %ymm0, %ymm0
289 ; AVX512CD-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
290 ; AVX512CD-NEXT:    retq
292 ; AVX512CDBW-LABEL: testv32i16:
293 ; AVX512CDBW:       # %bb.0:
294 ; AVX512CDBW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
295 ; AVX512CDBW-NEXT:    vpaddw %zmm1, %zmm0, %zmm1
296 ; AVX512CDBW-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
297 ; AVX512CDBW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
298 ; AVX512CDBW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
299 ; AVX512CDBW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
300 ; AVX512CDBW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
301 ; AVX512CDBW-NEXT:    vpsrlw $4, %zmm0, %zmm0
302 ; AVX512CDBW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
303 ; AVX512CDBW-NEXT:    vpshufb %zmm0, %zmm3, %zmm0
304 ; AVX512CDBW-NEXT:    vpaddb %zmm2, %zmm0, %zmm0
305 ; AVX512CDBW-NEXT:    vpsllw $8, %zmm0, %zmm1
306 ; AVX512CDBW-NEXT:    vpaddb %zmm0, %zmm1, %zmm0
307 ; AVX512CDBW-NEXT:    vpsrlw $8, %zmm0, %zmm0
308 ; AVX512CDBW-NEXT:    retq
310 ; AVX512BW-LABEL: testv32i16:
311 ; AVX512BW:       # %bb.0:
312 ; AVX512BW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
313 ; AVX512BW-NEXT:    vpaddw %zmm1, %zmm0, %zmm1
314 ; AVX512BW-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
315 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
316 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
317 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
318 ; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
319 ; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
320 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
321 ; AVX512BW-NEXT:    vpshufb %zmm0, %zmm3, %zmm0
322 ; AVX512BW-NEXT:    vpaddb %zmm2, %zmm0, %zmm0
323 ; AVX512BW-NEXT:    vpsllw $8, %zmm0, %zmm1
324 ; AVX512BW-NEXT:    vpaddb %zmm0, %zmm1, %zmm0
325 ; AVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0
326 ; AVX512BW-NEXT:    retq
328 ; AVX512VPOPCNTDQ-LABEL: testv32i16:
329 ; AVX512VPOPCNTDQ:       # %bb.0:
330 ; AVX512VPOPCNTDQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
331 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
332 ; AVX512VPOPCNTDQ-NEXT:    vpaddw %ymm2, %ymm1, %ymm3
333 ; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm3, %ymm1, %ymm1
334 ; AVX512VPOPCNTDQ-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
335 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm1, %zmm1
336 ; AVX512VPOPCNTDQ-NEXT:    vpmovdw %zmm1, %ymm1
337 ; AVX512VPOPCNTDQ-NEXT:    vpaddw %ymm2, %ymm0, %ymm2
338 ; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm2, %ymm0, %ymm0
339 ; AVX512VPOPCNTDQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
340 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0
341 ; AVX512VPOPCNTDQ-NEXT:    vpmovdw %zmm0, %ymm0
342 ; AVX512VPOPCNTDQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
343 ; AVX512VPOPCNTDQ-NEXT:    retq
345 ; BITALG-LABEL: testv32i16:
346 ; BITALG:       # %bb.0:
347 ; BITALG-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
348 ; BITALG-NEXT:    vpaddw %zmm1, %zmm0, %zmm1
349 ; BITALG-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
350 ; BITALG-NEXT:    vpopcntw %zmm0, %zmm0
351 ; BITALG-NEXT:    retq
352   %out = call <32 x i16> @llvm.cttz.v32i16(<32 x i16> %in, i1 0)
353   ret <32 x i16> %out
356 define <32 x i16> @testv32i16u(<32 x i16> %in) nounwind {
357 ; AVX512CD-LABEL: testv32i16u:
358 ; AVX512CD:       # %bb.0:
359 ; AVX512CD-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
360 ; AVX512CD-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
361 ; AVX512CD-NEXT:    vpaddw %ymm2, %ymm1, %ymm3
362 ; AVX512CD-NEXT:    vpandn %ymm3, %ymm1, %ymm1
363 ; AVX512CD-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
364 ; AVX512CD-NEXT:    vpand %ymm3, %ymm1, %ymm4
365 ; AVX512CD-NEXT:    vmovdqa {{.*#+}} ymm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
366 ; AVX512CD-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
367 ; AVX512CD-NEXT:    vpsrlw $4, %ymm1, %ymm1
368 ; AVX512CD-NEXT:    vpand %ymm3, %ymm1, %ymm1
369 ; AVX512CD-NEXT:    vpshufb %ymm1, %ymm5, %ymm1
370 ; AVX512CD-NEXT:    vpaddb %ymm4, %ymm1, %ymm1
371 ; AVX512CD-NEXT:    vpsllw $8, %ymm1, %ymm4
372 ; AVX512CD-NEXT:    vpaddb %ymm1, %ymm4, %ymm1
373 ; AVX512CD-NEXT:    vpsrlw $8, %ymm1, %ymm1
374 ; AVX512CD-NEXT:    vpaddw %ymm2, %ymm0, %ymm2
375 ; AVX512CD-NEXT:    vpandn %ymm2, %ymm0, %ymm0
376 ; AVX512CD-NEXT:    vpand %ymm3, %ymm0, %ymm2
377 ; AVX512CD-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
378 ; AVX512CD-NEXT:    vpsrlw $4, %ymm0, %ymm0
379 ; AVX512CD-NEXT:    vpand %ymm3, %ymm0, %ymm0
380 ; AVX512CD-NEXT:    vpshufb %ymm0, %ymm5, %ymm0
381 ; AVX512CD-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
382 ; AVX512CD-NEXT:    vpsllw $8, %ymm0, %ymm2
383 ; AVX512CD-NEXT:    vpaddb %ymm0, %ymm2, %ymm0
384 ; AVX512CD-NEXT:    vpsrlw $8, %ymm0, %ymm0
385 ; AVX512CD-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
386 ; AVX512CD-NEXT:    retq
388 ; AVX512CDBW-LABEL: testv32i16u:
389 ; AVX512CDBW:       # %bb.0:
390 ; AVX512CDBW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
391 ; AVX512CDBW-NEXT:    vpaddw %zmm1, %zmm0, %zmm1
392 ; AVX512CDBW-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
393 ; AVX512CDBW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
394 ; AVX512CDBW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
395 ; AVX512CDBW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
396 ; AVX512CDBW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
397 ; AVX512CDBW-NEXT:    vpsrlw $4, %zmm0, %zmm0
398 ; AVX512CDBW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
399 ; AVX512CDBW-NEXT:    vpshufb %zmm0, %zmm3, %zmm0
400 ; AVX512CDBW-NEXT:    vpaddb %zmm2, %zmm0, %zmm0
401 ; AVX512CDBW-NEXT:    vpsllw $8, %zmm0, %zmm1
402 ; AVX512CDBW-NEXT:    vpaddb %zmm0, %zmm1, %zmm0
403 ; AVX512CDBW-NEXT:    vpsrlw $8, %zmm0, %zmm0
404 ; AVX512CDBW-NEXT:    retq
406 ; AVX512BW-LABEL: testv32i16u:
407 ; AVX512BW:       # %bb.0:
408 ; AVX512BW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
409 ; AVX512BW-NEXT:    vpaddw %zmm1, %zmm0, %zmm1
410 ; AVX512BW-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
411 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
412 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
413 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
414 ; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
415 ; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
416 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
417 ; AVX512BW-NEXT:    vpshufb %zmm0, %zmm3, %zmm0
418 ; AVX512BW-NEXT:    vpaddb %zmm2, %zmm0, %zmm0
419 ; AVX512BW-NEXT:    vpsllw $8, %zmm0, %zmm1
420 ; AVX512BW-NEXT:    vpaddb %zmm0, %zmm1, %zmm0
421 ; AVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0
422 ; AVX512BW-NEXT:    retq
424 ; AVX512VPOPCNTDQ-LABEL: testv32i16u:
425 ; AVX512VPOPCNTDQ:       # %bb.0:
426 ; AVX512VPOPCNTDQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
427 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
428 ; AVX512VPOPCNTDQ-NEXT:    vpaddw %ymm2, %ymm1, %ymm3
429 ; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm3, %ymm1, %ymm1
430 ; AVX512VPOPCNTDQ-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
431 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm1, %zmm1
432 ; AVX512VPOPCNTDQ-NEXT:    vpmovdw %zmm1, %ymm1
433 ; AVX512VPOPCNTDQ-NEXT:    vpaddw %ymm2, %ymm0, %ymm2
434 ; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm2, %ymm0, %ymm0
435 ; AVX512VPOPCNTDQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
436 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0
437 ; AVX512VPOPCNTDQ-NEXT:    vpmovdw %zmm0, %ymm0
438 ; AVX512VPOPCNTDQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
439 ; AVX512VPOPCNTDQ-NEXT:    retq
441 ; BITALG-LABEL: testv32i16u:
442 ; BITALG:       # %bb.0:
443 ; BITALG-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
444 ; BITALG-NEXT:    vpaddw %zmm1, %zmm0, %zmm1
445 ; BITALG-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
446 ; BITALG-NEXT:    vpopcntw %zmm0, %zmm0
447 ; BITALG-NEXT:    retq
448   %out = call <32 x i16> @llvm.cttz.v32i16(<32 x i16> %in, i1 -1)
449   ret <32 x i16> %out
452 define <64 x i8> @testv64i8(<64 x i8> %in) nounwind {
453 ; AVX512CD-LABEL: testv64i8:
454 ; AVX512CD:       # %bb.0:
455 ; AVX512CD-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
456 ; AVX512CD-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
457 ; AVX512CD-NEXT:    vpaddb %ymm2, %ymm1, %ymm3
458 ; AVX512CD-NEXT:    vpandn %ymm3, %ymm1, %ymm1
459 ; AVX512CD-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
460 ; AVX512CD-NEXT:    vpand %ymm3, %ymm1, %ymm4
461 ; AVX512CD-NEXT:    vmovdqa {{.*#+}} ymm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
462 ; AVX512CD-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
463 ; AVX512CD-NEXT:    vpsrlw $4, %ymm1, %ymm1
464 ; AVX512CD-NEXT:    vpand %ymm3, %ymm1, %ymm1
465 ; AVX512CD-NEXT:    vpshufb %ymm1, %ymm5, %ymm1
466 ; AVX512CD-NEXT:    vpaddb %ymm4, %ymm1, %ymm1
467 ; AVX512CD-NEXT:    vpaddb %ymm2, %ymm0, %ymm2
468 ; AVX512CD-NEXT:    vpandn %ymm2, %ymm0, %ymm0
469 ; AVX512CD-NEXT:    vpand %ymm3, %ymm0, %ymm2
470 ; AVX512CD-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
471 ; AVX512CD-NEXT:    vpsrlw $4, %ymm0, %ymm0
472 ; AVX512CD-NEXT:    vpand %ymm3, %ymm0, %ymm0
473 ; AVX512CD-NEXT:    vpshufb %ymm0, %ymm5, %ymm0
474 ; AVX512CD-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
475 ; AVX512CD-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
476 ; AVX512CD-NEXT:    retq
478 ; AVX512CDBW-LABEL: testv64i8:
479 ; AVX512CDBW:       # %bb.0:
480 ; AVX512CDBW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
481 ; AVX512CDBW-NEXT:    vpaddb %zmm1, %zmm0, %zmm1
482 ; AVX512CDBW-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
483 ; AVX512CDBW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
484 ; AVX512CDBW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
485 ; AVX512CDBW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
486 ; AVX512CDBW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
487 ; AVX512CDBW-NEXT:    vpsrlw $4, %zmm0, %zmm0
488 ; AVX512CDBW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
489 ; AVX512CDBW-NEXT:    vpshufb %zmm0, %zmm3, %zmm0
490 ; AVX512CDBW-NEXT:    vpaddb %zmm2, %zmm0, %zmm0
491 ; AVX512CDBW-NEXT:    retq
493 ; AVX512BW-LABEL: testv64i8:
494 ; AVX512BW:       # %bb.0:
495 ; AVX512BW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
496 ; AVX512BW-NEXT:    vpaddb %zmm1, %zmm0, %zmm1
497 ; AVX512BW-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
498 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
499 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
500 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
501 ; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
502 ; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
503 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
504 ; AVX512BW-NEXT:    vpshufb %zmm0, %zmm3, %zmm0
505 ; AVX512BW-NEXT:    vpaddb %zmm2, %zmm0, %zmm0
506 ; AVX512BW-NEXT:    retq
508 ; AVX512VPOPCNTDQ-LABEL: testv64i8:
509 ; AVX512VPOPCNTDQ:       # %bb.0:
510 ; AVX512VPOPCNTDQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
511 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
512 ; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm2, %ymm1, %ymm3
513 ; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm3, %ymm1, %ymm1
514 ; AVX512VPOPCNTDQ-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
515 ; AVX512VPOPCNTDQ-NEXT:    vpand %ymm3, %ymm1, %ymm4
516 ; AVX512VPOPCNTDQ-NEXT:    vmovdqa {{.*#+}} ymm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
517 ; AVX512VPOPCNTDQ-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
518 ; AVX512VPOPCNTDQ-NEXT:    vpsrlw $4, %ymm1, %ymm1
519 ; AVX512VPOPCNTDQ-NEXT:    vpand %ymm3, %ymm1, %ymm1
520 ; AVX512VPOPCNTDQ-NEXT:    vpshufb %ymm1, %ymm5, %ymm1
521 ; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm4, %ymm1, %ymm1
522 ; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm2, %ymm0, %ymm2
523 ; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm2, %ymm0, %ymm0
524 ; AVX512VPOPCNTDQ-NEXT:    vpand %ymm3, %ymm0, %ymm2
525 ; AVX512VPOPCNTDQ-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
526 ; AVX512VPOPCNTDQ-NEXT:    vpsrlw $4, %ymm0, %ymm0
527 ; AVX512VPOPCNTDQ-NEXT:    vpand %ymm3, %ymm0, %ymm0
528 ; AVX512VPOPCNTDQ-NEXT:    vpshufb %ymm0, %ymm5, %ymm0
529 ; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
530 ; AVX512VPOPCNTDQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
531 ; AVX512VPOPCNTDQ-NEXT:    retq
533 ; BITALG-LABEL: testv64i8:
534 ; BITALG:       # %bb.0:
535 ; BITALG-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
536 ; BITALG-NEXT:    vpaddb %zmm1, %zmm0, %zmm1
537 ; BITALG-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
538 ; BITALG-NEXT:    vpopcntb %zmm0, %zmm0
539 ; BITALG-NEXT:    retq
540   %out = call <64 x i8> @llvm.cttz.v64i8(<64 x i8> %in, i1 0)
541   ret <64 x i8> %out
544 define <64 x i8> @testv64i8u(<64 x i8> %in) nounwind {
545 ; AVX512CD-LABEL: testv64i8u:
546 ; AVX512CD:       # %bb.0:
547 ; AVX512CD-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
548 ; AVX512CD-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
549 ; AVX512CD-NEXT:    vpaddb %ymm2, %ymm1, %ymm3
550 ; AVX512CD-NEXT:    vpandn %ymm3, %ymm1, %ymm1
551 ; AVX512CD-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
552 ; AVX512CD-NEXT:    vpand %ymm3, %ymm1, %ymm4
553 ; AVX512CD-NEXT:    vmovdqa {{.*#+}} ymm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
554 ; AVX512CD-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
555 ; AVX512CD-NEXT:    vpsrlw $4, %ymm1, %ymm1
556 ; AVX512CD-NEXT:    vpand %ymm3, %ymm1, %ymm1
557 ; AVX512CD-NEXT:    vpshufb %ymm1, %ymm5, %ymm1
558 ; AVX512CD-NEXT:    vpaddb %ymm4, %ymm1, %ymm1
559 ; AVX512CD-NEXT:    vpaddb %ymm2, %ymm0, %ymm2
560 ; AVX512CD-NEXT:    vpandn %ymm2, %ymm0, %ymm0
561 ; AVX512CD-NEXT:    vpand %ymm3, %ymm0, %ymm2
562 ; AVX512CD-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
563 ; AVX512CD-NEXT:    vpsrlw $4, %ymm0, %ymm0
564 ; AVX512CD-NEXT:    vpand %ymm3, %ymm0, %ymm0
565 ; AVX512CD-NEXT:    vpshufb %ymm0, %ymm5, %ymm0
566 ; AVX512CD-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
567 ; AVX512CD-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
568 ; AVX512CD-NEXT:    retq
570 ; AVX512CDBW-LABEL: testv64i8u:
571 ; AVX512CDBW:       # %bb.0:
572 ; AVX512CDBW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
573 ; AVX512CDBW-NEXT:    vpaddb %zmm1, %zmm0, %zmm1
574 ; AVX512CDBW-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
575 ; AVX512CDBW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
576 ; AVX512CDBW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
577 ; AVX512CDBW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
578 ; AVX512CDBW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
579 ; AVX512CDBW-NEXT:    vpsrlw $4, %zmm0, %zmm0
580 ; AVX512CDBW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
581 ; AVX512CDBW-NEXT:    vpshufb %zmm0, %zmm3, %zmm0
582 ; AVX512CDBW-NEXT:    vpaddb %zmm2, %zmm0, %zmm0
583 ; AVX512CDBW-NEXT:    retq
585 ; AVX512BW-LABEL: testv64i8u:
586 ; AVX512BW:       # %bb.0:
587 ; AVX512BW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
588 ; AVX512BW-NEXT:    vpaddb %zmm1, %zmm0, %zmm1
589 ; AVX512BW-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
590 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
591 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm2
592 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
593 ; AVX512BW-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
594 ; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm0
595 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
596 ; AVX512BW-NEXT:    vpshufb %zmm0, %zmm3, %zmm0
597 ; AVX512BW-NEXT:    vpaddb %zmm2, %zmm0, %zmm0
598 ; AVX512BW-NEXT:    retq
600 ; AVX512VPOPCNTDQ-LABEL: testv64i8u:
601 ; AVX512VPOPCNTDQ:       # %bb.0:
602 ; AVX512VPOPCNTDQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
603 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
604 ; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm2, %ymm1, %ymm3
605 ; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm3, %ymm1, %ymm1
606 ; AVX512VPOPCNTDQ-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
607 ; AVX512VPOPCNTDQ-NEXT:    vpand %ymm3, %ymm1, %ymm4
608 ; AVX512VPOPCNTDQ-NEXT:    vmovdqa {{.*#+}} ymm5 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
609 ; AVX512VPOPCNTDQ-NEXT:    vpshufb %ymm4, %ymm5, %ymm4
610 ; AVX512VPOPCNTDQ-NEXT:    vpsrlw $4, %ymm1, %ymm1
611 ; AVX512VPOPCNTDQ-NEXT:    vpand %ymm3, %ymm1, %ymm1
612 ; AVX512VPOPCNTDQ-NEXT:    vpshufb %ymm1, %ymm5, %ymm1
613 ; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm4, %ymm1, %ymm1
614 ; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm2, %ymm0, %ymm2
615 ; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm2, %ymm0, %ymm0
616 ; AVX512VPOPCNTDQ-NEXT:    vpand %ymm3, %ymm0, %ymm2
617 ; AVX512VPOPCNTDQ-NEXT:    vpshufb %ymm2, %ymm5, %ymm2
618 ; AVX512VPOPCNTDQ-NEXT:    vpsrlw $4, %ymm0, %ymm0
619 ; AVX512VPOPCNTDQ-NEXT:    vpand %ymm3, %ymm0, %ymm0
620 ; AVX512VPOPCNTDQ-NEXT:    vpshufb %ymm0, %ymm5, %ymm0
621 ; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
622 ; AVX512VPOPCNTDQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
623 ; AVX512VPOPCNTDQ-NEXT:    retq
625 ; BITALG-LABEL: testv64i8u:
626 ; BITALG:       # %bb.0:
627 ; BITALG-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
628 ; BITALG-NEXT:    vpaddb %zmm1, %zmm0, %zmm1
629 ; BITALG-NEXT:    vpandnq %zmm1, %zmm0, %zmm0
630 ; BITALG-NEXT:    vpopcntb %zmm0, %zmm0
631 ; BITALG-NEXT:    retq
632   %out = call <64 x i8> @llvm.cttz.v64i8(<64 x i8> %in, i1 -1)
633   ret <64 x i8> %out
636 declare <8 x i64> @llvm.cttz.v8i64(<8 x i64>, i1)
637 declare <16 x i32> @llvm.cttz.v16i32(<16 x i32>, i1)
638 declare <32 x i16> @llvm.cttz.v32i16(<32 x i16>, i1)
639 declare <64 x i8> @llvm.cttz.v64i8(<64 x i8>, i1)