1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2,+gfni | FileCheck %s --check-prefixes=GFNISSE
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+gfni | FileCheck %s --check-prefixes=GFNIAVX,GFNIAVX1OR2,GFNIAVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+gfni | FileCheck %s --check-prefixes=GFNIAVX,GFNIAVX1OR2,GFNIAVX2
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+gfni | FileCheck %s --check-prefixes=GFNIAVX,GFNIAVX512,GFNIAVX512VL
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+gfni | FileCheck %s --check-prefixes=GFNIAVX,GFNIAVX512,GFNIAVX512BW
8 define <16 x i8> @testv16i8(<16 x i8> %in) nounwind {
9 ; GFNISSE-LABEL: testv16i8:
11 ; GFNISSE-NEXT: movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
12 ; GFNISSE-NEXT: movdqa %xmm1, %xmm2
13 ; GFNISSE-NEXT: pshufb %xmm0, %xmm2
14 ; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
15 ; GFNISSE-NEXT: pxor %xmm3, %xmm3
16 ; GFNISSE-NEXT: pcmpeqb %xmm0, %xmm3
17 ; GFNISSE-NEXT: pand %xmm2, %xmm3
18 ; GFNISSE-NEXT: pshufb %xmm0, %xmm1
19 ; GFNISSE-NEXT: paddb %xmm3, %xmm1
20 ; GFNISSE-NEXT: movdqa %xmm1, %xmm0
23 ; GFNIAVX1OR2-LABEL: testv16i8:
24 ; GFNIAVX1OR2: # %bb.0:
25 ; GFNIAVX1OR2-NEXT: vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
26 ; GFNIAVX1OR2-NEXT: vpshufb %xmm0, %xmm1, %xmm2
27 ; GFNIAVX1OR2-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
28 ; GFNIAVX1OR2-NEXT: vpxor %xmm3, %xmm3, %xmm3
29 ; GFNIAVX1OR2-NEXT: vpcmpeqb %xmm3, %xmm0, %xmm3
30 ; GFNIAVX1OR2-NEXT: vpand %xmm3, %xmm2, %xmm2
31 ; GFNIAVX1OR2-NEXT: vpshufb %xmm0, %xmm1, %xmm0
32 ; GFNIAVX1OR2-NEXT: vpaddb %xmm0, %xmm2, %xmm0
33 ; GFNIAVX1OR2-NEXT: retq
35 ; GFNIAVX512-LABEL: testv16i8:
36 ; GFNIAVX512: # %bb.0:
37 ; GFNIAVX512-NEXT: vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
38 ; GFNIAVX512-NEXT: vpshufb %xmm0, %xmm1, %xmm2
39 ; GFNIAVX512-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
40 ; GFNIAVX512-NEXT: vpxor %xmm3, %xmm3, %xmm3
41 ; GFNIAVX512-NEXT: vpcmpeqb %xmm3, %xmm0, %xmm3
42 ; GFNIAVX512-NEXT: vpand %xmm3, %xmm2, %xmm2
43 ; GFNIAVX512-NEXT: vpshufb %xmm0, %xmm1, %xmm0
44 ; GFNIAVX512-NEXT: vpaddb %xmm0, %xmm2, %xmm0
45 ; GFNIAVX512-NEXT: retq
46 %out = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %in, i1 0)
50 define <16 x i8> @testv16i8u(<16 x i8> %in) nounwind {
51 ; GFNISSE-LABEL: testv16i8u:
53 ; GFNISSE-NEXT: movq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
54 ; GFNISSE-NEXT: movdqa %xmm1, %xmm2
55 ; GFNISSE-NEXT: pshufb %xmm0, %xmm2
56 ; GFNISSE-NEXT: gf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
57 ; GFNISSE-NEXT: pxor %xmm3, %xmm3
58 ; GFNISSE-NEXT: pcmpeqb %xmm0, %xmm3
59 ; GFNISSE-NEXT: pand %xmm2, %xmm3
60 ; GFNISSE-NEXT: pshufb %xmm0, %xmm1
61 ; GFNISSE-NEXT: paddb %xmm3, %xmm1
62 ; GFNISSE-NEXT: movdqa %xmm1, %xmm0
65 ; GFNIAVX1OR2-LABEL: testv16i8u:
66 ; GFNIAVX1OR2: # %bb.0:
67 ; GFNIAVX1OR2-NEXT: vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
68 ; GFNIAVX1OR2-NEXT: vpshufb %xmm0, %xmm1, %xmm2
69 ; GFNIAVX1OR2-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
70 ; GFNIAVX1OR2-NEXT: vpxor %xmm3, %xmm3, %xmm3
71 ; GFNIAVX1OR2-NEXT: vpcmpeqb %xmm3, %xmm0, %xmm3
72 ; GFNIAVX1OR2-NEXT: vpand %xmm3, %xmm2, %xmm2
73 ; GFNIAVX1OR2-NEXT: vpshufb %xmm0, %xmm1, %xmm0
74 ; GFNIAVX1OR2-NEXT: vpaddb %xmm0, %xmm2, %xmm0
75 ; GFNIAVX1OR2-NEXT: retq
77 ; GFNIAVX512-LABEL: testv16i8u:
78 ; GFNIAVX512: # %bb.0:
79 ; GFNIAVX512-NEXT: vmovq {{.*#+}} xmm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
80 ; GFNIAVX512-NEXT: vpshufb %xmm0, %xmm1, %xmm2
81 ; GFNIAVX512-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0
82 ; GFNIAVX512-NEXT: vpxor %xmm3, %xmm3, %xmm3
83 ; GFNIAVX512-NEXT: vpcmpeqb %xmm3, %xmm0, %xmm3
84 ; GFNIAVX512-NEXT: vpand %xmm3, %xmm2, %xmm2
85 ; GFNIAVX512-NEXT: vpshufb %xmm0, %xmm1, %xmm0
86 ; GFNIAVX512-NEXT: vpaddb %xmm0, %xmm2, %xmm0
87 ; GFNIAVX512-NEXT: retq
88 %out = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %in, i1 -1)
92 define <32 x i8> @testv32i8(<32 x i8> %in) nounwind {
93 ; GFNISSE-LABEL: testv32i8:
95 ; GFNISSE-NEXT: movq {{.*#+}} xmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
96 ; GFNISSE-NEXT: movdqa %xmm2, %xmm3
97 ; GFNISSE-NEXT: pshufb %xmm0, %xmm3
98 ; GFNISSE-NEXT: movdqa {{.*#+}} xmm4 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
99 ; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm0
100 ; GFNISSE-NEXT: pxor %xmm5, %xmm5
101 ; GFNISSE-NEXT: movdqa %xmm2, %xmm6
102 ; GFNISSE-NEXT: pshufb %xmm0, %xmm6
103 ; GFNISSE-NEXT: pcmpeqb %xmm5, %xmm0
104 ; GFNISSE-NEXT: pand %xmm3, %xmm0
105 ; GFNISSE-NEXT: paddb %xmm6, %xmm0
106 ; GFNISSE-NEXT: movdqa %xmm2, %xmm3
107 ; GFNISSE-NEXT: pshufb %xmm1, %xmm3
108 ; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm1
109 ; GFNISSE-NEXT: pcmpeqb %xmm1, %xmm5
110 ; GFNISSE-NEXT: pand %xmm3, %xmm5
111 ; GFNISSE-NEXT: pshufb %xmm1, %xmm2
112 ; GFNISSE-NEXT: paddb %xmm5, %xmm2
113 ; GFNISSE-NEXT: movdqa %xmm2, %xmm1
116 ; GFNIAVX1-LABEL: testv32i8:
118 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
119 ; GFNIAVX1-NEXT: vmovq {{.*#+}} xmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
120 ; GFNIAVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm3
121 ; GFNIAVX1-NEXT: vmovddup {{.*#+}} xmm4 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
122 ; GFNIAVX1-NEXT: # xmm4 = mem[0,0]
123 ; GFNIAVX1-NEXT: vgf2p8affineqb $0, %xmm4, %xmm1, %xmm1
124 ; GFNIAVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5
125 ; GFNIAVX1-NEXT: vpcmpeqb %xmm5, %xmm1, %xmm6
126 ; GFNIAVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
127 ; GFNIAVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1
128 ; GFNIAVX1-NEXT: vpaddb %xmm1, %xmm3, %xmm1
129 ; GFNIAVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm3
130 ; GFNIAVX1-NEXT: vgf2p8affineqb $0, %xmm4, %xmm0, %xmm0
131 ; GFNIAVX1-NEXT: vpcmpeqb %xmm5, %xmm0, %xmm4
132 ; GFNIAVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
133 ; GFNIAVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0
134 ; GFNIAVX1-NEXT: vpaddb %xmm0, %xmm3, %xmm0
135 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
136 ; GFNIAVX1-NEXT: retq
138 ; GFNIAVX2-LABEL: testv32i8:
140 ; GFNIAVX2-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
141 ; GFNIAVX2-NEXT: # ymm1 = mem[0,1,0,1]
142 ; GFNIAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm2
143 ; GFNIAVX2-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
144 ; GFNIAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
145 ; GFNIAVX2-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm3
146 ; GFNIAVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
147 ; GFNIAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0
148 ; GFNIAVX2-NEXT: vpaddb %ymm0, %ymm2, %ymm0
149 ; GFNIAVX2-NEXT: retq
151 ; GFNIAVX512-LABEL: testv32i8:
152 ; GFNIAVX512: # %bb.0:
153 ; GFNIAVX512-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
154 ; GFNIAVX512-NEXT: # ymm1 = mem[0,1,0,1]
155 ; GFNIAVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm2
156 ; GFNIAVX512-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
157 ; GFNIAVX512-NEXT: vpxor %xmm3, %xmm3, %xmm3
158 ; GFNIAVX512-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm3
159 ; GFNIAVX512-NEXT: vpand %ymm3, %ymm2, %ymm2
160 ; GFNIAVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm0
161 ; GFNIAVX512-NEXT: vpaddb %ymm0, %ymm2, %ymm0
162 ; GFNIAVX512-NEXT: retq
163 %out = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %in, i1 0)
167 define <32 x i8> @testv32i8u(<32 x i8> %in) nounwind {
168 ; GFNISSE-LABEL: testv32i8u:
170 ; GFNISSE-NEXT: movq {{.*#+}} xmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
171 ; GFNISSE-NEXT: movdqa %xmm2, %xmm3
172 ; GFNISSE-NEXT: pshufb %xmm0, %xmm3
173 ; GFNISSE-NEXT: movdqa {{.*#+}} xmm4 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
174 ; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm0
175 ; GFNISSE-NEXT: pxor %xmm5, %xmm5
176 ; GFNISSE-NEXT: movdqa %xmm2, %xmm6
177 ; GFNISSE-NEXT: pshufb %xmm0, %xmm6
178 ; GFNISSE-NEXT: pcmpeqb %xmm5, %xmm0
179 ; GFNISSE-NEXT: pand %xmm3, %xmm0
180 ; GFNISSE-NEXT: paddb %xmm6, %xmm0
181 ; GFNISSE-NEXT: movdqa %xmm2, %xmm3
182 ; GFNISSE-NEXT: pshufb %xmm1, %xmm3
183 ; GFNISSE-NEXT: gf2p8affineqb $0, %xmm4, %xmm1
184 ; GFNISSE-NEXT: pcmpeqb %xmm1, %xmm5
185 ; GFNISSE-NEXT: pand %xmm3, %xmm5
186 ; GFNISSE-NEXT: pshufb %xmm1, %xmm2
187 ; GFNISSE-NEXT: paddb %xmm5, %xmm2
188 ; GFNISSE-NEXT: movdqa %xmm2, %xmm1
191 ; GFNIAVX1-LABEL: testv32i8u:
193 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
194 ; GFNIAVX1-NEXT: vmovq {{.*#+}} xmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
195 ; GFNIAVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm3
196 ; GFNIAVX1-NEXT: vmovddup {{.*#+}} xmm4 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
197 ; GFNIAVX1-NEXT: # xmm4 = mem[0,0]
198 ; GFNIAVX1-NEXT: vgf2p8affineqb $0, %xmm4, %xmm1, %xmm1
199 ; GFNIAVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5
200 ; GFNIAVX1-NEXT: vpcmpeqb %xmm5, %xmm1, %xmm6
201 ; GFNIAVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
202 ; GFNIAVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1
203 ; GFNIAVX1-NEXT: vpaddb %xmm1, %xmm3, %xmm1
204 ; GFNIAVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm3
205 ; GFNIAVX1-NEXT: vgf2p8affineqb $0, %xmm4, %xmm0, %xmm0
206 ; GFNIAVX1-NEXT: vpcmpeqb %xmm5, %xmm0, %xmm4
207 ; GFNIAVX1-NEXT: vpand %xmm4, %xmm3, %xmm3
208 ; GFNIAVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0
209 ; GFNIAVX1-NEXT: vpaddb %xmm0, %xmm3, %xmm0
210 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
211 ; GFNIAVX1-NEXT: retq
213 ; GFNIAVX2-LABEL: testv32i8u:
215 ; GFNIAVX2-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
216 ; GFNIAVX2-NEXT: # ymm1 = mem[0,1,0,1]
217 ; GFNIAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm2
218 ; GFNIAVX2-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
219 ; GFNIAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
220 ; GFNIAVX2-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm3
221 ; GFNIAVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
222 ; GFNIAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0
223 ; GFNIAVX2-NEXT: vpaddb %ymm0, %ymm2, %ymm0
224 ; GFNIAVX2-NEXT: retq
226 ; GFNIAVX512-LABEL: testv32i8u:
227 ; GFNIAVX512: # %bb.0:
228 ; GFNIAVX512-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
229 ; GFNIAVX512-NEXT: # ymm1 = mem[0,1,0,1]
230 ; GFNIAVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm2
231 ; GFNIAVX512-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
232 ; GFNIAVX512-NEXT: vpxor %xmm3, %xmm3, %xmm3
233 ; GFNIAVX512-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm3
234 ; GFNIAVX512-NEXT: vpand %ymm3, %ymm2, %ymm2
235 ; GFNIAVX512-NEXT: vpshufb %ymm0, %ymm1, %ymm0
236 ; GFNIAVX512-NEXT: vpaddb %ymm0, %ymm2, %ymm0
237 ; GFNIAVX512-NEXT: retq
238 %out = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %in, i1 -1)
242 define <64 x i8> @testv64i8(<64 x i8> %in) nounwind {
243 ; GFNISSE-LABEL: testv64i8:
245 ; GFNISSE-NEXT: movdqa %xmm3, %xmm4
246 ; GFNISSE-NEXT: movq {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
247 ; GFNISSE-NEXT: movdqa %xmm3, %xmm7
248 ; GFNISSE-NEXT: pshufb %xmm0, %xmm7
249 ; GFNISSE-NEXT: movdqa {{.*#+}} xmm6 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
250 ; GFNISSE-NEXT: gf2p8affineqb $0, %xmm6, %xmm0
251 ; GFNISSE-NEXT: pxor %xmm5, %xmm5
252 ; GFNISSE-NEXT: movdqa %xmm3, %xmm8
253 ; GFNISSE-NEXT: pshufb %xmm0, %xmm8
254 ; GFNISSE-NEXT: pcmpeqb %xmm5, %xmm0
255 ; GFNISSE-NEXT: pand %xmm7, %xmm0
256 ; GFNISSE-NEXT: paddb %xmm8, %xmm0
257 ; GFNISSE-NEXT: movdqa %xmm3, %xmm7
258 ; GFNISSE-NEXT: pshufb %xmm1, %xmm7
259 ; GFNISSE-NEXT: gf2p8affineqb $0, %xmm6, %xmm1
260 ; GFNISSE-NEXT: movdqa %xmm3, %xmm8
261 ; GFNISSE-NEXT: pshufb %xmm1, %xmm8
262 ; GFNISSE-NEXT: pcmpeqb %xmm5, %xmm1
263 ; GFNISSE-NEXT: pand %xmm7, %xmm1
264 ; GFNISSE-NEXT: paddb %xmm8, %xmm1
265 ; GFNISSE-NEXT: movdqa %xmm3, %xmm7
266 ; GFNISSE-NEXT: pshufb %xmm2, %xmm7
267 ; GFNISSE-NEXT: gf2p8affineqb $0, %xmm6, %xmm2
268 ; GFNISSE-NEXT: movdqa %xmm3, %xmm8
269 ; GFNISSE-NEXT: pshufb %xmm2, %xmm8
270 ; GFNISSE-NEXT: pcmpeqb %xmm5, %xmm2
271 ; GFNISSE-NEXT: pand %xmm7, %xmm2
272 ; GFNISSE-NEXT: paddb %xmm8, %xmm2
273 ; GFNISSE-NEXT: movdqa %xmm3, %xmm7
274 ; GFNISSE-NEXT: pshufb %xmm4, %xmm7
275 ; GFNISSE-NEXT: gf2p8affineqb $0, %xmm6, %xmm4
276 ; GFNISSE-NEXT: pcmpeqb %xmm4, %xmm5
277 ; GFNISSE-NEXT: pand %xmm7, %xmm5
278 ; GFNISSE-NEXT: pshufb %xmm4, %xmm3
279 ; GFNISSE-NEXT: paddb %xmm5, %xmm3
282 ; GFNIAVX1-LABEL: testv64i8:
284 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
285 ; GFNIAVX1-NEXT: vmovq {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
286 ; GFNIAVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm4
287 ; GFNIAVX1-NEXT: vmovddup {{.*#+}} xmm5 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
288 ; GFNIAVX1-NEXT: # xmm5 = mem[0,0]
289 ; GFNIAVX1-NEXT: vgf2p8affineqb $0, %xmm5, %xmm2, %xmm2
290 ; GFNIAVX1-NEXT: vpxor %xmm6, %xmm6, %xmm6
291 ; GFNIAVX1-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm7
292 ; GFNIAVX1-NEXT: vpand %xmm7, %xmm4, %xmm4
293 ; GFNIAVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
294 ; GFNIAVX1-NEXT: vpaddb %xmm2, %xmm4, %xmm2
295 ; GFNIAVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm4
296 ; GFNIAVX1-NEXT: vgf2p8affineqb $0, %xmm5, %xmm0, %xmm0
297 ; GFNIAVX1-NEXT: vpcmpeqb %xmm6, %xmm0, %xmm7
298 ; GFNIAVX1-NEXT: vpand %xmm7, %xmm4, %xmm4
299 ; GFNIAVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0
300 ; GFNIAVX1-NEXT: vpaddb %xmm0, %xmm4, %xmm0
301 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
302 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
303 ; GFNIAVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm4
304 ; GFNIAVX1-NEXT: vgf2p8affineqb $0, %xmm5, %xmm2, %xmm2
305 ; GFNIAVX1-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm7
306 ; GFNIAVX1-NEXT: vpand %xmm7, %xmm4, %xmm4
307 ; GFNIAVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
308 ; GFNIAVX1-NEXT: vpaddb %xmm2, %xmm4, %xmm2
309 ; GFNIAVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm4
310 ; GFNIAVX1-NEXT: vgf2p8affineqb $0, %xmm5, %xmm1, %xmm1
311 ; GFNIAVX1-NEXT: vpcmpeqb %xmm6, %xmm1, %xmm5
312 ; GFNIAVX1-NEXT: vpand %xmm5, %xmm4, %xmm4
313 ; GFNIAVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm1
314 ; GFNIAVX1-NEXT: vpaddb %xmm1, %xmm4, %xmm1
315 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
316 ; GFNIAVX1-NEXT: retq
318 ; GFNIAVX2-LABEL: testv64i8:
320 ; GFNIAVX2-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
321 ; GFNIAVX2-NEXT: # ymm2 = mem[0,1,0,1]
322 ; GFNIAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm3
323 ; GFNIAVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
324 ; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm4, %ymm0, %ymm0
325 ; GFNIAVX2-NEXT: vpxor %xmm5, %xmm5, %xmm5
326 ; GFNIAVX2-NEXT: vpcmpeqb %ymm5, %ymm0, %ymm6
327 ; GFNIAVX2-NEXT: vpand %ymm6, %ymm3, %ymm3
328 ; GFNIAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0
329 ; GFNIAVX2-NEXT: vpaddb %ymm0, %ymm3, %ymm0
330 ; GFNIAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm3
331 ; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm4, %ymm1, %ymm1
332 ; GFNIAVX2-NEXT: vpcmpeqb %ymm5, %ymm1, %ymm4
333 ; GFNIAVX2-NEXT: vpand %ymm4, %ymm3, %ymm3
334 ; GFNIAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
335 ; GFNIAVX2-NEXT: vpaddb %ymm1, %ymm3, %ymm1
336 ; GFNIAVX2-NEXT: retq
338 ; GFNIAVX512VL-LABEL: testv64i8:
339 ; GFNIAVX512VL: # %bb.0:
340 ; GFNIAVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm1
341 ; GFNIAVX512VL-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
342 ; GFNIAVX512VL-NEXT: # ymm2 = mem[0,1,0,1]
343 ; GFNIAVX512VL-NEXT: vpshufb %ymm1, %ymm2, %ymm3
344 ; GFNIAVX512VL-NEXT: vpbroadcastq {{.*#+}} ymm4 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
345 ; GFNIAVX512VL-NEXT: vgf2p8affineqb $0, %ymm4, %ymm1, %ymm1
346 ; GFNIAVX512VL-NEXT: vpxor %xmm5, %xmm5, %xmm5
347 ; GFNIAVX512VL-NEXT: vpcmpeqb %ymm5, %ymm1, %ymm6
348 ; GFNIAVX512VL-NEXT: vpand %ymm6, %ymm3, %ymm3
349 ; GFNIAVX512VL-NEXT: vpshufb %ymm1, %ymm2, %ymm1
350 ; GFNIAVX512VL-NEXT: vpaddb %ymm1, %ymm3, %ymm1
351 ; GFNIAVX512VL-NEXT: vpshufb %ymm0, %ymm2, %ymm3
352 ; GFNIAVX512VL-NEXT: vgf2p8affineqb $0, %ymm4, %ymm0, %ymm0
353 ; GFNIAVX512VL-NEXT: vpcmpeqb %ymm5, %ymm0, %ymm4
354 ; GFNIAVX512VL-NEXT: vpand %ymm4, %ymm3, %ymm3
355 ; GFNIAVX512VL-NEXT: vpshufb %ymm0, %ymm2, %ymm0
356 ; GFNIAVX512VL-NEXT: vpaddb %ymm0, %ymm3, %ymm0
357 ; GFNIAVX512VL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
358 ; GFNIAVX512VL-NEXT: retq
360 ; GFNIAVX512BW-LABEL: testv64i8:
361 ; GFNIAVX512BW: # %bb.0:
362 ; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm1
363 ; GFNIAVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
364 ; GFNIAVX512BW-NEXT: # zmm2 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
365 ; GFNIAVX512BW-NEXT: vpshufb %zmm1, %zmm2, %zmm3
366 ; GFNIAVX512BW-NEXT: vpshufb %zmm0, %zmm2, %zmm0
367 ; GFNIAVX512BW-NEXT: vptestnmb %zmm1, %zmm1, %k0
368 ; GFNIAVX512BW-NEXT: vpmovm2b %k0, %zmm1
369 ; GFNIAVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm0
370 ; GFNIAVX512BW-NEXT: vpaddb %zmm3, %zmm0, %zmm0
371 ; GFNIAVX512BW-NEXT: retq
372 %out = call <64 x i8> @llvm.ctlz.v64i8(<64 x i8> %in, i1 0)
376 define <64 x i8> @testv64i8u(<64 x i8> %in) nounwind {
377 ; GFNISSE-LABEL: testv64i8u:
379 ; GFNISSE-NEXT: movdqa %xmm3, %xmm4
380 ; GFNISSE-NEXT: movq {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
381 ; GFNISSE-NEXT: movdqa %xmm3, %xmm7
382 ; GFNISSE-NEXT: pshufb %xmm0, %xmm7
383 ; GFNISSE-NEXT: movdqa {{.*#+}} xmm6 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
384 ; GFNISSE-NEXT: gf2p8affineqb $0, %xmm6, %xmm0
385 ; GFNISSE-NEXT: pxor %xmm5, %xmm5
386 ; GFNISSE-NEXT: movdqa %xmm3, %xmm8
387 ; GFNISSE-NEXT: pshufb %xmm0, %xmm8
388 ; GFNISSE-NEXT: pcmpeqb %xmm5, %xmm0
389 ; GFNISSE-NEXT: pand %xmm7, %xmm0
390 ; GFNISSE-NEXT: paddb %xmm8, %xmm0
391 ; GFNISSE-NEXT: movdqa %xmm3, %xmm7
392 ; GFNISSE-NEXT: pshufb %xmm1, %xmm7
393 ; GFNISSE-NEXT: gf2p8affineqb $0, %xmm6, %xmm1
394 ; GFNISSE-NEXT: movdqa %xmm3, %xmm8
395 ; GFNISSE-NEXT: pshufb %xmm1, %xmm8
396 ; GFNISSE-NEXT: pcmpeqb %xmm5, %xmm1
397 ; GFNISSE-NEXT: pand %xmm7, %xmm1
398 ; GFNISSE-NEXT: paddb %xmm8, %xmm1
399 ; GFNISSE-NEXT: movdqa %xmm3, %xmm7
400 ; GFNISSE-NEXT: pshufb %xmm2, %xmm7
401 ; GFNISSE-NEXT: gf2p8affineqb $0, %xmm6, %xmm2
402 ; GFNISSE-NEXT: movdqa %xmm3, %xmm8
403 ; GFNISSE-NEXT: pshufb %xmm2, %xmm8
404 ; GFNISSE-NEXT: pcmpeqb %xmm5, %xmm2
405 ; GFNISSE-NEXT: pand %xmm7, %xmm2
406 ; GFNISSE-NEXT: paddb %xmm8, %xmm2
407 ; GFNISSE-NEXT: movdqa %xmm3, %xmm7
408 ; GFNISSE-NEXT: pshufb %xmm4, %xmm7
409 ; GFNISSE-NEXT: gf2p8affineqb $0, %xmm6, %xmm4
410 ; GFNISSE-NEXT: pcmpeqb %xmm4, %xmm5
411 ; GFNISSE-NEXT: pand %xmm7, %xmm5
412 ; GFNISSE-NEXT: pshufb %xmm4, %xmm3
413 ; GFNISSE-NEXT: paddb %xmm5, %xmm3
416 ; GFNIAVX1-LABEL: testv64i8u:
418 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
419 ; GFNIAVX1-NEXT: vmovq {{.*#+}} xmm3 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
420 ; GFNIAVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm4
421 ; GFNIAVX1-NEXT: vmovddup {{.*#+}} xmm5 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
422 ; GFNIAVX1-NEXT: # xmm5 = mem[0,0]
423 ; GFNIAVX1-NEXT: vgf2p8affineqb $0, %xmm5, %xmm2, %xmm2
424 ; GFNIAVX1-NEXT: vpxor %xmm6, %xmm6, %xmm6
425 ; GFNIAVX1-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm7
426 ; GFNIAVX1-NEXT: vpand %xmm7, %xmm4, %xmm4
427 ; GFNIAVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
428 ; GFNIAVX1-NEXT: vpaddb %xmm2, %xmm4, %xmm2
429 ; GFNIAVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm4
430 ; GFNIAVX1-NEXT: vgf2p8affineqb $0, %xmm5, %xmm0, %xmm0
431 ; GFNIAVX1-NEXT: vpcmpeqb %xmm6, %xmm0, %xmm7
432 ; GFNIAVX1-NEXT: vpand %xmm7, %xmm4, %xmm4
433 ; GFNIAVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0
434 ; GFNIAVX1-NEXT: vpaddb %xmm0, %xmm4, %xmm0
435 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
436 ; GFNIAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
437 ; GFNIAVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm4
438 ; GFNIAVX1-NEXT: vgf2p8affineqb $0, %xmm5, %xmm2, %xmm2
439 ; GFNIAVX1-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm7
440 ; GFNIAVX1-NEXT: vpand %xmm7, %xmm4, %xmm4
441 ; GFNIAVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
442 ; GFNIAVX1-NEXT: vpaddb %xmm2, %xmm4, %xmm2
443 ; GFNIAVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm4
444 ; GFNIAVX1-NEXT: vgf2p8affineqb $0, %xmm5, %xmm1, %xmm1
445 ; GFNIAVX1-NEXT: vpcmpeqb %xmm6, %xmm1, %xmm5
446 ; GFNIAVX1-NEXT: vpand %xmm5, %xmm4, %xmm4
447 ; GFNIAVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm1
448 ; GFNIAVX1-NEXT: vpaddb %xmm1, %xmm4, %xmm1
449 ; GFNIAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
450 ; GFNIAVX1-NEXT: retq
452 ; GFNIAVX2-LABEL: testv64i8u:
454 ; GFNIAVX2-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
455 ; GFNIAVX2-NEXT: # ymm2 = mem[0,1,0,1]
456 ; GFNIAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm3
457 ; GFNIAVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
458 ; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm4, %ymm0, %ymm0
459 ; GFNIAVX2-NEXT: vpxor %xmm5, %xmm5, %xmm5
460 ; GFNIAVX2-NEXT: vpcmpeqb %ymm5, %ymm0, %ymm6
461 ; GFNIAVX2-NEXT: vpand %ymm6, %ymm3, %ymm3
462 ; GFNIAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0
463 ; GFNIAVX2-NEXT: vpaddb %ymm0, %ymm3, %ymm0
464 ; GFNIAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm3
465 ; GFNIAVX2-NEXT: vgf2p8affineqb $0, %ymm4, %ymm1, %ymm1
466 ; GFNIAVX2-NEXT: vpcmpeqb %ymm5, %ymm1, %ymm4
467 ; GFNIAVX2-NEXT: vpand %ymm4, %ymm3, %ymm3
468 ; GFNIAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
469 ; GFNIAVX2-NEXT: vpaddb %ymm1, %ymm3, %ymm1
470 ; GFNIAVX2-NEXT: retq
472 ; GFNIAVX512VL-LABEL: testv64i8u:
473 ; GFNIAVX512VL: # %bb.0:
474 ; GFNIAVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm1
475 ; GFNIAVX512VL-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
476 ; GFNIAVX512VL-NEXT: # ymm2 = mem[0,1,0,1]
477 ; GFNIAVX512VL-NEXT: vpshufb %ymm1, %ymm2, %ymm3
478 ; GFNIAVX512VL-NEXT: vpbroadcastq {{.*#+}} ymm4 = [0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16,0,0,0,0,128,64,32,16]
479 ; GFNIAVX512VL-NEXT: vgf2p8affineqb $0, %ymm4, %ymm1, %ymm1
480 ; GFNIAVX512VL-NEXT: vpxor %xmm5, %xmm5, %xmm5
481 ; GFNIAVX512VL-NEXT: vpcmpeqb %ymm5, %ymm1, %ymm6
482 ; GFNIAVX512VL-NEXT: vpand %ymm6, %ymm3, %ymm3
483 ; GFNIAVX512VL-NEXT: vpshufb %ymm1, %ymm2, %ymm1
484 ; GFNIAVX512VL-NEXT: vpaddb %ymm1, %ymm3, %ymm1
485 ; GFNIAVX512VL-NEXT: vpshufb %ymm0, %ymm2, %ymm3
486 ; GFNIAVX512VL-NEXT: vgf2p8affineqb $0, %ymm4, %ymm0, %ymm0
487 ; GFNIAVX512VL-NEXT: vpcmpeqb %ymm5, %ymm0, %ymm4
488 ; GFNIAVX512VL-NEXT: vpand %ymm4, %ymm3, %ymm3
489 ; GFNIAVX512VL-NEXT: vpshufb %ymm0, %ymm2, %ymm0
490 ; GFNIAVX512VL-NEXT: vpaddb %ymm0, %ymm3, %ymm0
491 ; GFNIAVX512VL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
492 ; GFNIAVX512VL-NEXT: retq
494 ; GFNIAVX512BW-LABEL: testv64i8u:
495 ; GFNIAVX512BW: # %bb.0:
496 ; GFNIAVX512BW-NEXT: vgf2p8affineqb $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm1
497 ; GFNIAVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm2 = [4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0,4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0]
498 ; GFNIAVX512BW-NEXT: # zmm2 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
499 ; GFNIAVX512BW-NEXT: vpshufb %zmm1, %zmm2, %zmm3
500 ; GFNIAVX512BW-NEXT: vpshufb %zmm0, %zmm2, %zmm0
501 ; GFNIAVX512BW-NEXT: vptestnmb %zmm1, %zmm1, %k0
502 ; GFNIAVX512BW-NEXT: vpmovm2b %k0, %zmm1
503 ; GFNIAVX512BW-NEXT: vpandq %zmm1, %zmm0, %zmm0
504 ; GFNIAVX512BW-NEXT: vpaddb %zmm3, %zmm0, %zmm0
505 ; GFNIAVX512BW-NEXT: retq
506 %out = call <64 x i8> @llvm.ctlz.v64i8(<64 x i8> %in, i1 -1)
509 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: