1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse2 | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=AVXANY --check-prefix=AVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=AVXANY --check-prefix=AVX256 --check-prefix=AVX2
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f | FileCheck %s --check-prefix=ANY --check-prefix=AVXANY --check-prefix=AVX256 --check-prefix=AVX512 --check-prefix=AVX512F
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw | FileCheck %s --check-prefix=ANY --check-prefix=AVXANY --check-prefix=AVX256 --check-prefix=AVX512 --check-prefix=AVX512BW
8 ; Equality checks of 128/256-bit values can use PMOVMSK or PTEST to avoid scalarization.
10 define i32 @ne_i128(<2 x i64> %x, <2 x i64> %y) {
11 ; SSE2-LABEL: ne_i128:
13 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
14 ; SSE2-NEXT: pmovmskb %xmm0, %ecx
15 ; SSE2-NEXT: xorl %eax, %eax
16 ; SSE2-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
17 ; SSE2-NEXT: setne %al
20 ; AVXANY-LABEL: ne_i128:
22 ; AVXANY-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
23 ; AVXANY-NEXT: vpmovmskb %xmm0, %ecx
24 ; AVXANY-NEXT: xorl %eax, %eax
25 ; AVXANY-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
26 ; AVXANY-NEXT: setne %al
28 %bcx = bitcast <2 x i64> %x to i128
29 %bcy = bitcast <2 x i64> %y to i128
30 %cmp = icmp ne i128 %bcx, %bcy
31 %zext = zext i1 %cmp to i32
35 define i32 @eq_i128(<2 x i64> %x, <2 x i64> %y) {
36 ; SSE2-LABEL: eq_i128:
38 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
39 ; SSE2-NEXT: pmovmskb %xmm0, %ecx
40 ; SSE2-NEXT: xorl %eax, %eax
41 ; SSE2-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
45 ; AVXANY-LABEL: eq_i128:
47 ; AVXANY-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
48 ; AVXANY-NEXT: vpmovmskb %xmm0, %ecx
49 ; AVXANY-NEXT: xorl %eax, %eax
50 ; AVXANY-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
51 ; AVXANY-NEXT: sete %al
53 %bcx = bitcast <2 x i64> %x to i128
54 %bcy = bitcast <2 x i64> %y to i128
55 %cmp = icmp eq i128 %bcx, %bcy
56 %zext = zext i1 %cmp to i32
60 define i32 @ne_i256(<4 x i64> %x, <4 x i64> %y) {
61 ; SSE2-LABEL: ne_i256:
63 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
64 ; SSE2-NEXT: movq %xmm4, %rax
65 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
66 ; SSE2-NEXT: movq %xmm4, %rcx
67 ; SSE2-NEXT: movq %xmm0, %rdx
68 ; SSE2-NEXT: movq %xmm1, %r8
69 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
70 ; SSE2-NEXT: movq %xmm0, %rdi
71 ; SSE2-NEXT: xorq %rax, %rdi
72 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[2,3,0,1]
73 ; SSE2-NEXT: movq %xmm0, %rsi
74 ; SSE2-NEXT: xorq %rcx, %rsi
75 ; SSE2-NEXT: orq %rdi, %rsi
76 ; SSE2-NEXT: movq %xmm2, %rax
77 ; SSE2-NEXT: xorq %rdx, %rax
78 ; SSE2-NEXT: movq %xmm3, %rcx
79 ; SSE2-NEXT: xorq %r8, %rcx
80 ; SSE2-NEXT: orq %rax, %rcx
81 ; SSE2-NEXT: xorl %eax, %eax
82 ; SSE2-NEXT: orq %rsi, %rcx
83 ; SSE2-NEXT: setne %al
86 ; AVX1-LABEL: ne_i256:
88 ; AVX1-NEXT: vmovq %xmm0, %rax
89 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
90 ; AVX1-NEXT: vmovq %xmm2, %rcx
91 ; AVX1-NEXT: vpextrq $1, %xmm0, %rdx
92 ; AVX1-NEXT: vpextrq $1, %xmm2, %r8
93 ; AVX1-NEXT: vmovq %xmm1, %rdi
94 ; AVX1-NEXT: xorq %rax, %rdi
95 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0
96 ; AVX1-NEXT: vmovq %xmm0, %rsi
97 ; AVX1-NEXT: xorq %rcx, %rsi
98 ; AVX1-NEXT: orq %rdi, %rsi
99 ; AVX1-NEXT: vpextrq $1, %xmm1, %rax
100 ; AVX1-NEXT: xorq %rdx, %rax
101 ; AVX1-NEXT: vpextrq $1, %xmm0, %rcx
102 ; AVX1-NEXT: xorq %r8, %rcx
103 ; AVX1-NEXT: orq %rax, %rcx
104 ; AVX1-NEXT: xorl %eax, %eax
105 ; AVX1-NEXT: orq %rsi, %rcx
106 ; AVX1-NEXT: setne %al
107 ; AVX1-NEXT: vzeroupper
110 ; AVX256-LABEL: ne_i256:
112 ; AVX256-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
113 ; AVX256-NEXT: vpmovmskb %ymm0, %ecx
114 ; AVX256-NEXT: xorl %eax, %eax
115 ; AVX256-NEXT: cmpl $-1, %ecx
116 ; AVX256-NEXT: setne %al
117 ; AVX256-NEXT: vzeroupper
119 %bcx = bitcast <4 x i64> %x to i256
120 %bcy = bitcast <4 x i64> %y to i256
121 %cmp = icmp ne i256 %bcx, %bcy
122 %zext = zext i1 %cmp to i32
126 define i32 @eq_i256(<4 x i64> %x, <4 x i64> %y) {
127 ; SSE2-LABEL: eq_i256:
129 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
130 ; SSE2-NEXT: movq %xmm4, %rax
131 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
132 ; SSE2-NEXT: movq %xmm4, %rcx
133 ; SSE2-NEXT: movq %xmm0, %rdx
134 ; SSE2-NEXT: movq %xmm1, %r8
135 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
136 ; SSE2-NEXT: movq %xmm0, %rdi
137 ; SSE2-NEXT: xorq %rax, %rdi
138 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[2,3,0,1]
139 ; SSE2-NEXT: movq %xmm0, %rsi
140 ; SSE2-NEXT: xorq %rcx, %rsi
141 ; SSE2-NEXT: orq %rdi, %rsi
142 ; SSE2-NEXT: movq %xmm2, %rax
143 ; SSE2-NEXT: xorq %rdx, %rax
144 ; SSE2-NEXT: movq %xmm3, %rcx
145 ; SSE2-NEXT: xorq %r8, %rcx
146 ; SSE2-NEXT: orq %rax, %rcx
147 ; SSE2-NEXT: xorl %eax, %eax
148 ; SSE2-NEXT: orq %rsi, %rcx
149 ; SSE2-NEXT: sete %al
152 ; AVX1-LABEL: eq_i256:
154 ; AVX1-NEXT: vmovq %xmm0, %rax
155 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
156 ; AVX1-NEXT: vmovq %xmm2, %rcx
157 ; AVX1-NEXT: vpextrq $1, %xmm0, %rdx
158 ; AVX1-NEXT: vpextrq $1, %xmm2, %r8
159 ; AVX1-NEXT: vmovq %xmm1, %rdi
160 ; AVX1-NEXT: xorq %rax, %rdi
161 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0
162 ; AVX1-NEXT: vmovq %xmm0, %rsi
163 ; AVX1-NEXT: xorq %rcx, %rsi
164 ; AVX1-NEXT: orq %rdi, %rsi
165 ; AVX1-NEXT: vpextrq $1, %xmm1, %rax
166 ; AVX1-NEXT: xorq %rdx, %rax
167 ; AVX1-NEXT: vpextrq $1, %xmm0, %rcx
168 ; AVX1-NEXT: xorq %r8, %rcx
169 ; AVX1-NEXT: orq %rax, %rcx
170 ; AVX1-NEXT: xorl %eax, %eax
171 ; AVX1-NEXT: orq %rsi, %rcx
172 ; AVX1-NEXT: sete %al
173 ; AVX1-NEXT: vzeroupper
176 ; AVX256-LABEL: eq_i256:
178 ; AVX256-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0
179 ; AVX256-NEXT: vpmovmskb %ymm0, %ecx
180 ; AVX256-NEXT: xorl %eax, %eax
181 ; AVX256-NEXT: cmpl $-1, %ecx
182 ; AVX256-NEXT: sete %al
183 ; AVX256-NEXT: vzeroupper
185 %bcx = bitcast <4 x i64> %x to i256
186 %bcy = bitcast <4 x i64> %y to i256
187 %cmp = icmp eq i256 %bcx, %bcy
188 %zext = zext i1 %cmp to i32
192 define i32 @ne_i512(<8 x i64> %x, <8 x i64> %y) {
193 ; SSE2-LABEL: ne_i512:
195 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm0[2,3,0,1]
196 ; SSE2-NEXT: movq %xmm8, %rax
197 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm2[2,3,0,1]
198 ; SSE2-NEXT: movq %xmm8, %rcx
199 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm1[2,3,0,1]
200 ; SSE2-NEXT: movq %xmm8, %rdx
201 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm3[2,3,0,1]
202 ; SSE2-NEXT: movq %xmm8, %rsi
203 ; SSE2-NEXT: movq %xmm0, %r11
204 ; SSE2-NEXT: movq %xmm2, %r8
205 ; SSE2-NEXT: movq %xmm1, %r9
206 ; SSE2-NEXT: movq %xmm3, %r10
207 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
208 ; SSE2-NEXT: movq %xmm0, %rdi
209 ; SSE2-NEXT: xorq %rax, %rdi
210 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[2,3,0,1]
211 ; SSE2-NEXT: movq %xmm0, %rax
212 ; SSE2-NEXT: xorq %rcx, %rax
213 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[2,3,0,1]
214 ; SSE2-NEXT: movq %xmm0, %rcx
215 ; SSE2-NEXT: xorq %rdx, %rcx
216 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[2,3,0,1]
217 ; SSE2-NEXT: movq %xmm0, %rdx
218 ; SSE2-NEXT: xorq %rsi, %rdx
219 ; SSE2-NEXT: orq %rcx, %rdx
220 ; SSE2-NEXT: orq %rax, %rdx
221 ; SSE2-NEXT: orq %rdi, %rdx
222 ; SSE2-NEXT: movq %xmm4, %rax
223 ; SSE2-NEXT: xorq %r11, %rax
224 ; SSE2-NEXT: movq %xmm6, %rcx
225 ; SSE2-NEXT: xorq %r8, %rcx
226 ; SSE2-NEXT: movq %xmm5, %rsi
227 ; SSE2-NEXT: xorq %r9, %rsi
228 ; SSE2-NEXT: movq %xmm7, %rdi
229 ; SSE2-NEXT: xorq %r10, %rdi
230 ; SSE2-NEXT: orq %rsi, %rdi
231 ; SSE2-NEXT: orq %rcx, %rdi
232 ; SSE2-NEXT: orq %rax, %rdi
233 ; SSE2-NEXT: xorl %eax, %eax
234 ; SSE2-NEXT: orq %rdx, %rdi
235 ; SSE2-NEXT: setne %al
238 ; AVX1-LABEL: ne_i512:
240 ; AVX1-NEXT: vmovq %xmm0, %rax
241 ; AVX1-NEXT: vmovq %xmm1, %rcx
242 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
243 ; AVX1-NEXT: vmovq %xmm4, %rdx
244 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
245 ; AVX1-NEXT: vmovq %xmm5, %rsi
246 ; AVX1-NEXT: vpextrq $1, %xmm0, %r11
247 ; AVX1-NEXT: vpextrq $1, %xmm1, %r8
248 ; AVX1-NEXT: vpextrq $1, %xmm4, %r9
249 ; AVX1-NEXT: vpextrq $1, %xmm5, %r10
250 ; AVX1-NEXT: vmovq %xmm2, %rdi
251 ; AVX1-NEXT: xorq %rax, %rdi
252 ; AVX1-NEXT: vmovq %xmm3, %rax
253 ; AVX1-NEXT: xorq %rcx, %rax
254 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm0
255 ; AVX1-NEXT: vmovq %xmm0, %rcx
256 ; AVX1-NEXT: xorq %rdx, %rcx
257 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1
258 ; AVX1-NEXT: vmovq %xmm1, %rdx
259 ; AVX1-NEXT: xorq %rsi, %rdx
260 ; AVX1-NEXT: orq %rcx, %rdx
261 ; AVX1-NEXT: orq %rax, %rdx
262 ; AVX1-NEXT: orq %rdi, %rdx
263 ; AVX1-NEXT: vpextrq $1, %xmm2, %rax
264 ; AVX1-NEXT: xorq %r11, %rax
265 ; AVX1-NEXT: vpextrq $1, %xmm3, %rcx
266 ; AVX1-NEXT: xorq %r8, %rcx
267 ; AVX1-NEXT: vpextrq $1, %xmm0, %rsi
268 ; AVX1-NEXT: xorq %r9, %rsi
269 ; AVX1-NEXT: vpextrq $1, %xmm1, %rdi
270 ; AVX1-NEXT: xorq %r10, %rdi
271 ; AVX1-NEXT: orq %rsi, %rdi
272 ; AVX1-NEXT: orq %rcx, %rdi
273 ; AVX1-NEXT: orq %rax, %rdi
274 ; AVX1-NEXT: xorl %eax, %eax
275 ; AVX1-NEXT: orq %rdx, %rdi
276 ; AVX1-NEXT: setne %al
277 ; AVX1-NEXT: vzeroupper
280 ; AVX2-LABEL: ne_i512:
282 ; AVX2-NEXT: vmovq %xmm0, %rax
283 ; AVX2-NEXT: vmovq %xmm1, %rcx
284 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
285 ; AVX2-NEXT: vmovq %xmm4, %rdx
286 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5
287 ; AVX2-NEXT: vmovq %xmm5, %rsi
288 ; AVX2-NEXT: vpextrq $1, %xmm0, %r11
289 ; AVX2-NEXT: vpextrq $1, %xmm1, %r8
290 ; AVX2-NEXT: vpextrq $1, %xmm4, %r9
291 ; AVX2-NEXT: vpextrq $1, %xmm5, %r10
292 ; AVX2-NEXT: vmovq %xmm2, %rdi
293 ; AVX2-NEXT: xorq %rax, %rdi
294 ; AVX2-NEXT: vmovq %xmm3, %rax
295 ; AVX2-NEXT: xorq %rcx, %rax
296 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm0
297 ; AVX2-NEXT: vmovq %xmm0, %rcx
298 ; AVX2-NEXT: xorq %rdx, %rcx
299 ; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm1
300 ; AVX2-NEXT: vmovq %xmm1, %rdx
301 ; AVX2-NEXT: xorq %rsi, %rdx
302 ; AVX2-NEXT: orq %rcx, %rdx
303 ; AVX2-NEXT: orq %rax, %rdx
304 ; AVX2-NEXT: orq %rdi, %rdx
305 ; AVX2-NEXT: vpextrq $1, %xmm2, %rax
306 ; AVX2-NEXT: xorq %r11, %rax
307 ; AVX2-NEXT: vpextrq $1, %xmm3, %rcx
308 ; AVX2-NEXT: xorq %r8, %rcx
309 ; AVX2-NEXT: vpextrq $1, %xmm0, %rsi
310 ; AVX2-NEXT: xorq %r9, %rsi
311 ; AVX2-NEXT: vpextrq $1, %xmm1, %rdi
312 ; AVX2-NEXT: xorq %r10, %rdi
313 ; AVX2-NEXT: orq %rsi, %rdi
314 ; AVX2-NEXT: orq %rcx, %rdi
315 ; AVX2-NEXT: orq %rax, %rdi
316 ; AVX2-NEXT: xorl %eax, %eax
317 ; AVX2-NEXT: orq %rdx, %rdi
318 ; AVX2-NEXT: setne %al
319 ; AVX2-NEXT: vzeroupper
322 ; AVX512-LABEL: ne_i512:
324 ; AVX512-NEXT: vpcmpeqd %zmm1, %zmm0, %k0
325 ; AVX512-NEXT: xorl %eax, %eax
326 ; AVX512-NEXT: kortestw %k0, %k0
327 ; AVX512-NEXT: setae %al
328 ; AVX512-NEXT: vzeroupper
330 %bcx = bitcast <8 x i64> %x to i512
331 %bcy = bitcast <8 x i64> %y to i512
332 %cmp = icmp ne i512 %bcx, %bcy
333 %zext = zext i1 %cmp to i32
337 define i32 @eq_i512(<8 x i64> %x, <8 x i64> %y) {
338 ; SSE2-LABEL: eq_i512:
340 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm0[2,3,0,1]
341 ; SSE2-NEXT: movq %xmm8, %rax
342 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm2[2,3,0,1]
343 ; SSE2-NEXT: movq %xmm8, %rcx
344 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm1[2,3,0,1]
345 ; SSE2-NEXT: movq %xmm8, %rdx
346 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm3[2,3,0,1]
347 ; SSE2-NEXT: movq %xmm8, %rsi
348 ; SSE2-NEXT: movq %xmm0, %r11
349 ; SSE2-NEXT: movq %xmm2, %r8
350 ; SSE2-NEXT: movq %xmm1, %r9
351 ; SSE2-NEXT: movq %xmm3, %r10
352 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
353 ; SSE2-NEXT: movq %xmm0, %rdi
354 ; SSE2-NEXT: xorq %rax, %rdi
355 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[2,3,0,1]
356 ; SSE2-NEXT: movq %xmm0, %rax
357 ; SSE2-NEXT: xorq %rcx, %rax
358 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[2,3,0,1]
359 ; SSE2-NEXT: movq %xmm0, %rcx
360 ; SSE2-NEXT: xorq %rdx, %rcx
361 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[2,3,0,1]
362 ; SSE2-NEXT: movq %xmm0, %rdx
363 ; SSE2-NEXT: xorq %rsi, %rdx
364 ; SSE2-NEXT: orq %rcx, %rdx
365 ; SSE2-NEXT: orq %rax, %rdx
366 ; SSE2-NEXT: orq %rdi, %rdx
367 ; SSE2-NEXT: movq %xmm4, %rax
368 ; SSE2-NEXT: xorq %r11, %rax
369 ; SSE2-NEXT: movq %xmm6, %rcx
370 ; SSE2-NEXT: xorq %r8, %rcx
371 ; SSE2-NEXT: movq %xmm5, %rsi
372 ; SSE2-NEXT: xorq %r9, %rsi
373 ; SSE2-NEXT: movq %xmm7, %rdi
374 ; SSE2-NEXT: xorq %r10, %rdi
375 ; SSE2-NEXT: orq %rsi, %rdi
376 ; SSE2-NEXT: orq %rcx, %rdi
377 ; SSE2-NEXT: orq %rax, %rdi
378 ; SSE2-NEXT: xorl %eax, %eax
379 ; SSE2-NEXT: orq %rdx, %rdi
380 ; SSE2-NEXT: sete %al
383 ; AVX1-LABEL: eq_i512:
385 ; AVX1-NEXT: vmovq %xmm0, %rax
386 ; AVX1-NEXT: vmovq %xmm1, %rcx
387 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
388 ; AVX1-NEXT: vmovq %xmm4, %rdx
389 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
390 ; AVX1-NEXT: vmovq %xmm5, %rsi
391 ; AVX1-NEXT: vpextrq $1, %xmm0, %r11
392 ; AVX1-NEXT: vpextrq $1, %xmm1, %r8
393 ; AVX1-NEXT: vpextrq $1, %xmm4, %r9
394 ; AVX1-NEXT: vpextrq $1, %xmm5, %r10
395 ; AVX1-NEXT: vmovq %xmm2, %rdi
396 ; AVX1-NEXT: xorq %rax, %rdi
397 ; AVX1-NEXT: vmovq %xmm3, %rax
398 ; AVX1-NEXT: xorq %rcx, %rax
399 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm0
400 ; AVX1-NEXT: vmovq %xmm0, %rcx
401 ; AVX1-NEXT: xorq %rdx, %rcx
402 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1
403 ; AVX1-NEXT: vmovq %xmm1, %rdx
404 ; AVX1-NEXT: xorq %rsi, %rdx
405 ; AVX1-NEXT: orq %rcx, %rdx
406 ; AVX1-NEXT: orq %rax, %rdx
407 ; AVX1-NEXT: orq %rdi, %rdx
408 ; AVX1-NEXT: vpextrq $1, %xmm2, %rax
409 ; AVX1-NEXT: xorq %r11, %rax
410 ; AVX1-NEXT: vpextrq $1, %xmm3, %rcx
411 ; AVX1-NEXT: xorq %r8, %rcx
412 ; AVX1-NEXT: vpextrq $1, %xmm0, %rsi
413 ; AVX1-NEXT: xorq %r9, %rsi
414 ; AVX1-NEXT: vpextrq $1, %xmm1, %rdi
415 ; AVX1-NEXT: xorq %r10, %rdi
416 ; AVX1-NEXT: orq %rsi, %rdi
417 ; AVX1-NEXT: orq %rcx, %rdi
418 ; AVX1-NEXT: orq %rax, %rdi
419 ; AVX1-NEXT: xorl %eax, %eax
420 ; AVX1-NEXT: orq %rdx, %rdi
421 ; AVX1-NEXT: sete %al
422 ; AVX1-NEXT: vzeroupper
425 ; AVX2-LABEL: eq_i512:
427 ; AVX2-NEXT: vmovq %xmm0, %rax
428 ; AVX2-NEXT: vmovq %xmm1, %rcx
429 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
430 ; AVX2-NEXT: vmovq %xmm4, %rdx
431 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5
432 ; AVX2-NEXT: vmovq %xmm5, %rsi
433 ; AVX2-NEXT: vpextrq $1, %xmm0, %r11
434 ; AVX2-NEXT: vpextrq $1, %xmm1, %r8
435 ; AVX2-NEXT: vpextrq $1, %xmm4, %r9
436 ; AVX2-NEXT: vpextrq $1, %xmm5, %r10
437 ; AVX2-NEXT: vmovq %xmm2, %rdi
438 ; AVX2-NEXT: xorq %rax, %rdi
439 ; AVX2-NEXT: vmovq %xmm3, %rax
440 ; AVX2-NEXT: xorq %rcx, %rax
441 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm0
442 ; AVX2-NEXT: vmovq %xmm0, %rcx
443 ; AVX2-NEXT: xorq %rdx, %rcx
444 ; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm1
445 ; AVX2-NEXT: vmovq %xmm1, %rdx
446 ; AVX2-NEXT: xorq %rsi, %rdx
447 ; AVX2-NEXT: orq %rcx, %rdx
448 ; AVX2-NEXT: orq %rax, %rdx
449 ; AVX2-NEXT: orq %rdi, %rdx
450 ; AVX2-NEXT: vpextrq $1, %xmm2, %rax
451 ; AVX2-NEXT: xorq %r11, %rax
452 ; AVX2-NEXT: vpextrq $1, %xmm3, %rcx
453 ; AVX2-NEXT: xorq %r8, %rcx
454 ; AVX2-NEXT: vpextrq $1, %xmm0, %rsi
455 ; AVX2-NEXT: xorq %r9, %rsi
456 ; AVX2-NEXT: vpextrq $1, %xmm1, %rdi
457 ; AVX2-NEXT: xorq %r10, %rdi
458 ; AVX2-NEXT: orq %rsi, %rdi
459 ; AVX2-NEXT: orq %rcx, %rdi
460 ; AVX2-NEXT: orq %rax, %rdi
461 ; AVX2-NEXT: xorl %eax, %eax
462 ; AVX2-NEXT: orq %rdx, %rdi
463 ; AVX2-NEXT: sete %al
464 ; AVX2-NEXT: vzeroupper
467 ; AVX512-LABEL: eq_i512:
469 ; AVX512-NEXT: vpcmpeqd %zmm1, %zmm0, %k0
470 ; AVX512-NEXT: xorl %eax, %eax
471 ; AVX512-NEXT: kortestw %k0, %k0
472 ; AVX512-NEXT: setb %al
473 ; AVX512-NEXT: vzeroupper
475 %bcx = bitcast <8 x i64> %x to i512
476 %bcy = bitcast <8 x i64> %y to i512
477 %cmp = icmp eq i512 %bcx, %bcy
478 %zext = zext i1 %cmp to i32
482 ; This test models the expansion of 'memcmp(a, b, 32) != 0'
483 ; if we allowed 2 pairs of 16-byte loads per block.
485 define i32 @ne_i128_pair(i128* %a, i128* %b) {
486 ; SSE2-LABEL: ne_i128_pair:
488 ; SSE2-NEXT: movdqu (%rdi), %xmm0
489 ; SSE2-NEXT: movdqu 16(%rdi), %xmm1
490 ; SSE2-NEXT: movdqu (%rsi), %xmm2
491 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm2
492 ; SSE2-NEXT: movdqu 16(%rsi), %xmm0
493 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
494 ; SSE2-NEXT: pand %xmm2, %xmm0
495 ; SSE2-NEXT: pmovmskb %xmm0, %ecx
496 ; SSE2-NEXT: xorl %eax, %eax
497 ; SSE2-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
498 ; SSE2-NEXT: setne %al
501 ; AVXANY-LABEL: ne_i128_pair:
503 ; AVXANY-NEXT: vmovdqu (%rdi), %xmm0
504 ; AVXANY-NEXT: vmovdqu 16(%rdi), %xmm1
505 ; AVXANY-NEXT: vpcmpeqb 16(%rsi), %xmm1, %xmm1
506 ; AVXANY-NEXT: vpcmpeqb (%rsi), %xmm0, %xmm0
507 ; AVXANY-NEXT: vpand %xmm1, %xmm0, %xmm0
508 ; AVXANY-NEXT: vpmovmskb %xmm0, %ecx
509 ; AVXANY-NEXT: xorl %eax, %eax
510 ; AVXANY-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
511 ; AVXANY-NEXT: setne %al
513 %a0 = load i128, i128* %a
514 %b0 = load i128, i128* %b
515 %xor1 = xor i128 %a0, %b0
516 %ap1 = getelementptr i128, i128* %a, i128 1
517 %bp1 = getelementptr i128, i128* %b, i128 1
518 %a1 = load i128, i128* %ap1
519 %b1 = load i128, i128* %bp1
520 %xor2 = xor i128 %a1, %b1
521 %or = or i128 %xor1, %xor2
522 %cmp = icmp ne i128 %or, 0
523 %z = zext i1 %cmp to i32
527 ; This test models the expansion of 'memcmp(a, b, 32) == 0'
528 ; if we allowed 2 pairs of 16-byte loads per block.
530 define i32 @eq_i128_pair(i128* %a, i128* %b) {
531 ; SSE2-LABEL: eq_i128_pair:
533 ; SSE2-NEXT: movdqu (%rdi), %xmm0
534 ; SSE2-NEXT: movdqu 16(%rdi), %xmm1
535 ; SSE2-NEXT: movdqu (%rsi), %xmm2
536 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm2
537 ; SSE2-NEXT: movdqu 16(%rsi), %xmm0
538 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
539 ; SSE2-NEXT: pand %xmm2, %xmm0
540 ; SSE2-NEXT: pmovmskb %xmm0, %ecx
541 ; SSE2-NEXT: xorl %eax, %eax
542 ; SSE2-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
543 ; SSE2-NEXT: sete %al
546 ; AVXANY-LABEL: eq_i128_pair:
548 ; AVXANY-NEXT: vmovdqu (%rdi), %xmm0
549 ; AVXANY-NEXT: vmovdqu 16(%rdi), %xmm1
550 ; AVXANY-NEXT: vpcmpeqb 16(%rsi), %xmm1, %xmm1
551 ; AVXANY-NEXT: vpcmpeqb (%rsi), %xmm0, %xmm0
552 ; AVXANY-NEXT: vpand %xmm1, %xmm0, %xmm0
553 ; AVXANY-NEXT: vpmovmskb %xmm0, %ecx
554 ; AVXANY-NEXT: xorl %eax, %eax
555 ; AVXANY-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
556 ; AVXANY-NEXT: sete %al
558 %a0 = load i128, i128* %a
559 %b0 = load i128, i128* %b
560 %xor1 = xor i128 %a0, %b0
561 %ap1 = getelementptr i128, i128* %a, i128 1
562 %bp1 = getelementptr i128, i128* %b, i128 1
563 %a1 = load i128, i128* %ap1
564 %b1 = load i128, i128* %bp1
565 %xor2 = xor i128 %a1, %b1
566 %or = or i128 %xor1, %xor2
567 %cmp = icmp eq i128 %or, 0
568 %z = zext i1 %cmp to i32
572 ; This test models the expansion of 'memcmp(a, b, 64) != 0'
573 ; if we allowed 2 pairs of 32-byte loads per block.
575 define i32 @ne_i256_pair(i256* %a, i256* %b) {
576 ; SSE2-LABEL: ne_i256_pair:
578 ; SSE2-NEXT: movq 16(%rdi), %r9
579 ; SSE2-NEXT: movq 24(%rdi), %r11
580 ; SSE2-NEXT: movq (%rdi), %r8
581 ; SSE2-NEXT: movq 8(%rdi), %r10
582 ; SSE2-NEXT: xorq 8(%rsi), %r10
583 ; SSE2-NEXT: xorq 24(%rsi), %r11
584 ; SSE2-NEXT: xorq (%rsi), %r8
585 ; SSE2-NEXT: xorq 16(%rsi), %r9
586 ; SSE2-NEXT: movq 48(%rdi), %rdx
587 ; SSE2-NEXT: movq 32(%rdi), %rax
588 ; SSE2-NEXT: movq 56(%rdi), %rcx
589 ; SSE2-NEXT: movq 40(%rdi), %rdi
590 ; SSE2-NEXT: xorq 40(%rsi), %rdi
591 ; SSE2-NEXT: xorq 56(%rsi), %rcx
592 ; SSE2-NEXT: orq %r11, %rcx
593 ; SSE2-NEXT: orq %rdi, %rcx
594 ; SSE2-NEXT: orq %r10, %rcx
595 ; SSE2-NEXT: xorq 32(%rsi), %rax
596 ; SSE2-NEXT: xorq 48(%rsi), %rdx
597 ; SSE2-NEXT: orq %r9, %rdx
598 ; SSE2-NEXT: orq %rax, %rdx
599 ; SSE2-NEXT: orq %r8, %rdx
600 ; SSE2-NEXT: xorl %eax, %eax
601 ; SSE2-NEXT: orq %rcx, %rdx
602 ; SSE2-NEXT: setne %al
605 ; AVX1-LABEL: ne_i256_pair:
607 ; AVX1-NEXT: movq 16(%rdi), %r9
608 ; AVX1-NEXT: movq 24(%rdi), %r11
609 ; AVX1-NEXT: movq (%rdi), %r8
610 ; AVX1-NEXT: movq 8(%rdi), %r10
611 ; AVX1-NEXT: xorq 8(%rsi), %r10
612 ; AVX1-NEXT: xorq 24(%rsi), %r11
613 ; AVX1-NEXT: xorq (%rsi), %r8
614 ; AVX1-NEXT: xorq 16(%rsi), %r9
615 ; AVX1-NEXT: movq 48(%rdi), %rdx
616 ; AVX1-NEXT: movq 32(%rdi), %rax
617 ; AVX1-NEXT: movq 56(%rdi), %rcx
618 ; AVX1-NEXT: movq 40(%rdi), %rdi
619 ; AVX1-NEXT: xorq 40(%rsi), %rdi
620 ; AVX1-NEXT: xorq 56(%rsi), %rcx
621 ; AVX1-NEXT: orq %r11, %rcx
622 ; AVX1-NEXT: orq %rdi, %rcx
623 ; AVX1-NEXT: orq %r10, %rcx
624 ; AVX1-NEXT: xorq 32(%rsi), %rax
625 ; AVX1-NEXT: xorq 48(%rsi), %rdx
626 ; AVX1-NEXT: orq %r9, %rdx
627 ; AVX1-NEXT: orq %rax, %rdx
628 ; AVX1-NEXT: orq %r8, %rdx
629 ; AVX1-NEXT: xorl %eax, %eax
630 ; AVX1-NEXT: orq %rcx, %rdx
631 ; AVX1-NEXT: setne %al
634 ; AVX256-LABEL: ne_i256_pair:
636 ; AVX256-NEXT: vmovdqu (%rdi), %ymm0
637 ; AVX256-NEXT: vmovdqu 32(%rdi), %ymm1
638 ; AVX256-NEXT: vpcmpeqb 32(%rsi), %ymm1, %ymm1
639 ; AVX256-NEXT: vpcmpeqb (%rsi), %ymm0, %ymm0
640 ; AVX256-NEXT: vpand %ymm1, %ymm0, %ymm0
641 ; AVX256-NEXT: vpmovmskb %ymm0, %ecx
642 ; AVX256-NEXT: xorl %eax, %eax
643 ; AVX256-NEXT: cmpl $-1, %ecx
644 ; AVX256-NEXT: setne %al
645 ; AVX256-NEXT: vzeroupper
647 %a0 = load i256, i256* %a
648 %b0 = load i256, i256* %b
649 %xor1 = xor i256 %a0, %b0
650 %ap1 = getelementptr i256, i256* %a, i256 1
651 %bp1 = getelementptr i256, i256* %b, i256 1
652 %a1 = load i256, i256* %ap1
653 %b1 = load i256, i256* %bp1
654 %xor2 = xor i256 %a1, %b1
655 %or = or i256 %xor1, %xor2
656 %cmp = icmp ne i256 %or, 0
657 %z = zext i1 %cmp to i32
661 ; This test models the expansion of 'memcmp(a, b, 64) == 0'
662 ; if we allowed 2 pairs of 32-byte loads per block.
664 define i32 @eq_i256_pair(i256* %a, i256* %b) {
665 ; SSE2-LABEL: eq_i256_pair:
667 ; SSE2-NEXT: movq 16(%rdi), %r9
668 ; SSE2-NEXT: movq 24(%rdi), %r11
669 ; SSE2-NEXT: movq (%rdi), %r8
670 ; SSE2-NEXT: movq 8(%rdi), %r10
671 ; SSE2-NEXT: xorq 8(%rsi), %r10
672 ; SSE2-NEXT: xorq 24(%rsi), %r11
673 ; SSE2-NEXT: xorq (%rsi), %r8
674 ; SSE2-NEXT: xorq 16(%rsi), %r9
675 ; SSE2-NEXT: movq 48(%rdi), %rdx
676 ; SSE2-NEXT: movq 32(%rdi), %rax
677 ; SSE2-NEXT: movq 56(%rdi), %rcx
678 ; SSE2-NEXT: movq 40(%rdi), %rdi
679 ; SSE2-NEXT: xorq 40(%rsi), %rdi
680 ; SSE2-NEXT: xorq 56(%rsi), %rcx
681 ; SSE2-NEXT: orq %r11, %rcx
682 ; SSE2-NEXT: orq %rdi, %rcx
683 ; SSE2-NEXT: orq %r10, %rcx
684 ; SSE2-NEXT: xorq 32(%rsi), %rax
685 ; SSE2-NEXT: xorq 48(%rsi), %rdx
686 ; SSE2-NEXT: orq %r9, %rdx
687 ; SSE2-NEXT: orq %rax, %rdx
688 ; SSE2-NEXT: orq %r8, %rdx
689 ; SSE2-NEXT: xorl %eax, %eax
690 ; SSE2-NEXT: orq %rcx, %rdx
691 ; SSE2-NEXT: sete %al
694 ; AVX1-LABEL: eq_i256_pair:
696 ; AVX1-NEXT: movq 16(%rdi), %r9
697 ; AVX1-NEXT: movq 24(%rdi), %r11
698 ; AVX1-NEXT: movq (%rdi), %r8
699 ; AVX1-NEXT: movq 8(%rdi), %r10
700 ; AVX1-NEXT: xorq 8(%rsi), %r10
701 ; AVX1-NEXT: xorq 24(%rsi), %r11
702 ; AVX1-NEXT: xorq (%rsi), %r8
703 ; AVX1-NEXT: xorq 16(%rsi), %r9
704 ; AVX1-NEXT: movq 48(%rdi), %rdx
705 ; AVX1-NEXT: movq 32(%rdi), %rax
706 ; AVX1-NEXT: movq 56(%rdi), %rcx
707 ; AVX1-NEXT: movq 40(%rdi), %rdi
708 ; AVX1-NEXT: xorq 40(%rsi), %rdi
709 ; AVX1-NEXT: xorq 56(%rsi), %rcx
710 ; AVX1-NEXT: orq %r11, %rcx
711 ; AVX1-NEXT: orq %rdi, %rcx
712 ; AVX1-NEXT: orq %r10, %rcx
713 ; AVX1-NEXT: xorq 32(%rsi), %rax
714 ; AVX1-NEXT: xorq 48(%rsi), %rdx
715 ; AVX1-NEXT: orq %r9, %rdx
716 ; AVX1-NEXT: orq %rax, %rdx
717 ; AVX1-NEXT: orq %r8, %rdx
718 ; AVX1-NEXT: xorl %eax, %eax
719 ; AVX1-NEXT: orq %rcx, %rdx
720 ; AVX1-NEXT: sete %al
723 ; AVX256-LABEL: eq_i256_pair:
725 ; AVX256-NEXT: vmovdqu (%rdi), %ymm0
726 ; AVX256-NEXT: vmovdqu 32(%rdi), %ymm1
727 ; AVX256-NEXT: vpcmpeqb 32(%rsi), %ymm1, %ymm1
728 ; AVX256-NEXT: vpcmpeqb (%rsi), %ymm0, %ymm0
729 ; AVX256-NEXT: vpand %ymm1, %ymm0, %ymm0
730 ; AVX256-NEXT: vpmovmskb %ymm0, %ecx
731 ; AVX256-NEXT: xorl %eax, %eax
732 ; AVX256-NEXT: cmpl $-1, %ecx
733 ; AVX256-NEXT: sete %al
734 ; AVX256-NEXT: vzeroupper
736 %a0 = load i256, i256* %a
737 %b0 = load i256, i256* %b
738 %xor1 = xor i256 %a0, %b0
739 %ap1 = getelementptr i256, i256* %a, i256 1
740 %bp1 = getelementptr i256, i256* %b, i256 1
741 %a1 = load i256, i256* %ap1
742 %b1 = load i256, i256* %bp1
743 %xor2 = xor i256 %a1, %b1
744 %or = or i256 %xor1, %xor2
745 %cmp = icmp eq i256 %or, 0
746 %z = zext i1 %cmp to i32
750 ; This test models the expansion of 'memcmp(a, b, 64) != 0'
751 ; if we allowed 2 pairs of 64-byte loads per block.
753 define i32 @ne_i512_pair(i512* %a, i512* %b) {
754 ; NO512-LABEL: ne_i512_pair:
756 ; NO512-NEXT: movq 32(%rdi), %r8
757 ; NO512-NEXT: movq 48(%rdi), %r9
758 ; NO512-NEXT: movq 40(%rdi), %rdx
759 ; NO512-NEXT: movq 56(%rdi), %rcx
760 ; NO512-NEXT: xorq 56(%rsi), %rcx
761 ; NO512-NEXT: movq 120(%rdi), %rax
762 ; NO512-NEXT: xorq 120(%rsi), %rax
763 ; NO512-NEXT: orq %rcx, %rax
764 ; NO512-NEXT: movq 88(%rdi), %rcx
765 ; NO512-NEXT: xorq 88(%rsi), %rcx
766 ; NO512-NEXT: orq %rcx, %rax
767 ; NO512-NEXT: movq 24(%rdi), %rcx
768 ; NO512-NEXT: xorq 24(%rsi), %rcx
769 ; NO512-NEXT: xorq 40(%rsi), %rdx
770 ; NO512-NEXT: orq %rcx, %rax
771 ; NO512-NEXT: movq 104(%rdi), %rcx
772 ; NO512-NEXT: xorq 104(%rsi), %rcx
773 ; NO512-NEXT: orq %rdx, %rcx
774 ; NO512-NEXT: movq 72(%rdi), %rdx
775 ; NO512-NEXT: xorq 72(%rsi), %rdx
776 ; NO512-NEXT: orq %rdx, %rcx
777 ; NO512-NEXT: movq 16(%rdi), %r10
778 ; NO512-NEXT: orq %rax, %rcx
779 ; NO512-NEXT: movq 8(%rdi), %rax
780 ; NO512-NEXT: xorq 8(%rsi), %rax
781 ; NO512-NEXT: xorq 48(%rsi), %r9
782 ; NO512-NEXT: orq %rax, %rcx
783 ; NO512-NEXT: movq 112(%rdi), %rax
784 ; NO512-NEXT: xorq 112(%rsi), %rax
785 ; NO512-NEXT: orq %r9, %rax
786 ; NO512-NEXT: movq 80(%rdi), %rdx
787 ; NO512-NEXT: xorq 80(%rsi), %rdx
788 ; NO512-NEXT: orq %rdx, %rax
789 ; NO512-NEXT: movq (%rdi), %r9
790 ; NO512-NEXT: xorq 16(%rsi), %r10
791 ; NO512-NEXT: xorq (%rsi), %r9
792 ; NO512-NEXT: xorq 32(%rsi), %r8
793 ; NO512-NEXT: orq %r10, %rax
794 ; NO512-NEXT: movq 96(%rdi), %rdx
795 ; NO512-NEXT: movq 64(%rdi), %rdi
796 ; NO512-NEXT: xorq 64(%rsi), %rdi
797 ; NO512-NEXT: xorq 96(%rsi), %rdx
798 ; NO512-NEXT: orq %r8, %rdx
799 ; NO512-NEXT: orq %rdi, %rdx
800 ; NO512-NEXT: orq %rax, %rdx
801 ; NO512-NEXT: orq %r9, %rdx
802 ; NO512-NEXT: xorl %eax, %eax
803 ; NO512-NEXT: orq %rcx, %rdx
804 ; NO512-NEXT: setne %al
807 ; AVX512-LABEL: ne_i512_pair:
809 ; AVX512-NEXT: vmovdqu64 (%rdi), %zmm0
810 ; AVX512-NEXT: vmovdqu64 64(%rdi), %zmm1
811 ; AVX512-NEXT: vpcmpeqd (%rsi), %zmm0, %k1
812 ; AVX512-NEXT: vpcmpeqd 64(%rsi), %zmm1, %k0 {%k1}
813 ; AVX512-NEXT: xorl %eax, %eax
814 ; AVX512-NEXT: kortestw %k0, %k0
815 ; AVX512-NEXT: setae %al
816 ; AVX512-NEXT: vzeroupper
818 %a0 = load i512, i512* %a
819 %b0 = load i512, i512* %b
820 %xor1 = xor i512 %a0, %b0
821 %ap1 = getelementptr i512, i512* %a, i512 1
822 %bp1 = getelementptr i512, i512* %b, i512 1
823 %a1 = load i512, i512* %ap1
824 %b1 = load i512, i512* %bp1
825 %xor2 = xor i512 %a1, %b1
826 %or = or i512 %xor1, %xor2
827 %cmp = icmp ne i512 %or, 0
828 %z = zext i1 %cmp to i32
832 ; This test models the expansion of 'memcmp(a, b, 64) == 0'
833 ; if we allowed 2 pairs of 64-byte loads per block.
835 define i32 @eq_i512_pair(i512* %a, i512* %b) {
836 ; NO512-LABEL: eq_i512_pair:
838 ; NO512-NEXT: movq 32(%rdi), %r8
839 ; NO512-NEXT: movq 48(%rdi), %r9
840 ; NO512-NEXT: movq 40(%rdi), %rdx
841 ; NO512-NEXT: movq 56(%rdi), %rcx
842 ; NO512-NEXT: xorq 56(%rsi), %rcx
843 ; NO512-NEXT: movq 120(%rdi), %rax
844 ; NO512-NEXT: xorq 120(%rsi), %rax
845 ; NO512-NEXT: orq %rcx, %rax
846 ; NO512-NEXT: movq 88(%rdi), %rcx
847 ; NO512-NEXT: xorq 88(%rsi), %rcx
848 ; NO512-NEXT: orq %rcx, %rax
849 ; NO512-NEXT: movq 24(%rdi), %rcx
850 ; NO512-NEXT: xorq 24(%rsi), %rcx
851 ; NO512-NEXT: xorq 40(%rsi), %rdx
852 ; NO512-NEXT: orq %rcx, %rax
853 ; NO512-NEXT: movq 104(%rdi), %rcx
854 ; NO512-NEXT: xorq 104(%rsi), %rcx
855 ; NO512-NEXT: orq %rdx, %rcx
856 ; NO512-NEXT: movq 72(%rdi), %rdx
857 ; NO512-NEXT: xorq 72(%rsi), %rdx
858 ; NO512-NEXT: orq %rdx, %rcx
859 ; NO512-NEXT: movq 16(%rdi), %r10
860 ; NO512-NEXT: orq %rax, %rcx
861 ; NO512-NEXT: movq 8(%rdi), %rax
862 ; NO512-NEXT: xorq 8(%rsi), %rax
863 ; NO512-NEXT: xorq 48(%rsi), %r9
864 ; NO512-NEXT: orq %rax, %rcx
865 ; NO512-NEXT: movq 112(%rdi), %rax
866 ; NO512-NEXT: xorq 112(%rsi), %rax
867 ; NO512-NEXT: orq %r9, %rax
868 ; NO512-NEXT: movq 80(%rdi), %rdx
869 ; NO512-NEXT: xorq 80(%rsi), %rdx
870 ; NO512-NEXT: orq %rdx, %rax
871 ; NO512-NEXT: movq (%rdi), %r9
872 ; NO512-NEXT: xorq 16(%rsi), %r10
873 ; NO512-NEXT: xorq (%rsi), %r9
874 ; NO512-NEXT: xorq 32(%rsi), %r8
875 ; NO512-NEXT: orq %r10, %rax
876 ; NO512-NEXT: movq 96(%rdi), %rdx
877 ; NO512-NEXT: movq 64(%rdi), %rdi
878 ; NO512-NEXT: xorq 64(%rsi), %rdi
879 ; NO512-NEXT: xorq 96(%rsi), %rdx
880 ; NO512-NEXT: orq %r8, %rdx
881 ; NO512-NEXT: orq %rdi, %rdx
882 ; NO512-NEXT: orq %rax, %rdx
883 ; NO512-NEXT: orq %r9, %rdx
884 ; NO512-NEXT: xorl %eax, %eax
885 ; NO512-NEXT: orq %rcx, %rdx
886 ; NO512-NEXT: sete %al
889 ; AVX512-LABEL: eq_i512_pair:
891 ; AVX512-NEXT: vmovdqu64 (%rdi), %zmm0
892 ; AVX512-NEXT: vmovdqu64 64(%rdi), %zmm1
893 ; AVX512-NEXT: vpcmpeqd (%rsi), %zmm0, %k1
894 ; AVX512-NEXT: vpcmpeqd 64(%rsi), %zmm1, %k0 {%k1}
895 ; AVX512-NEXT: xorl %eax, %eax
896 ; AVX512-NEXT: kortestw %k0, %k0
897 ; AVX512-NEXT: setb %al
898 ; AVX512-NEXT: vzeroupper
900 %a0 = load i512, i512* %a
901 %b0 = load i512, i512* %b
902 %xor1 = xor i512 %a0, %b0
903 %ap1 = getelementptr i512, i512* %a, i512 1
904 %bp1 = getelementptr i512, i512* %b, i512 1
905 %a1 = load i512, i512* %ap1
906 %b1 = load i512, i512* %bp1
907 %xor2 = xor i512 %a1, %b1
908 %or = or i512 %xor1, %xor2
909 %cmp = icmp eq i512 %or, 0
910 %z = zext i1 %cmp to i32