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=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.1 | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=SSE --check-prefix=SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=AVXANY --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=AVXANY --check-prefix=AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f | FileCheck %s --check-prefix=ANY --check-prefix=AVXANY --check-prefix=AVX512 --check-prefix=AVX512F
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw | FileCheck %s --check-prefix=ANY --check-prefix=AVXANY --check-prefix=AVX512 --check-prefix=AVX512BW
9 ; Equality checks of 128/256-bit values can use PMOVMSK or PTEST to avoid scalarization.
11 define i32 @ne_i128(<2 x i64> %x, <2 x i64> %y) {
12 ; SSE2-LABEL: ne_i128:
14 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
15 ; SSE2-NEXT: pmovmskb %xmm0, %ecx
16 ; SSE2-NEXT: xorl %eax, %eax
17 ; SSE2-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
18 ; SSE2-NEXT: setne %al
21 ; SSE41-LABEL: ne_i128:
23 ; SSE41-NEXT: pxor %xmm1, %xmm0
24 ; SSE41-NEXT: xorl %eax, %eax
25 ; SSE41-NEXT: ptest %xmm0, %xmm0
26 ; SSE41-NEXT: setne %al
29 ; AVXANY-LABEL: ne_i128:
31 ; AVXANY-NEXT: vpxor %xmm1, %xmm0, %xmm0
32 ; AVXANY-NEXT: xorl %eax, %eax
33 ; AVXANY-NEXT: vptest %xmm0, %xmm0
34 ; AVXANY-NEXT: setne %al
36 %bcx = bitcast <2 x i64> %x to i128
37 %bcy = bitcast <2 x i64> %y to i128
38 %cmp = icmp ne i128 %bcx, %bcy
39 %zext = zext i1 %cmp to i32
43 define i32 @eq_i128(<2 x i64> %x, <2 x i64> %y) {
44 ; SSE2-LABEL: eq_i128:
46 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0
47 ; SSE2-NEXT: pmovmskb %xmm0, %ecx
48 ; SSE2-NEXT: xorl %eax, %eax
49 ; SSE2-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
53 ; SSE41-LABEL: eq_i128:
55 ; SSE41-NEXT: pxor %xmm1, %xmm0
56 ; SSE41-NEXT: xorl %eax, %eax
57 ; SSE41-NEXT: ptest %xmm0, %xmm0
58 ; SSE41-NEXT: sete %al
61 ; AVXANY-LABEL: eq_i128:
63 ; AVXANY-NEXT: vpxor %xmm1, %xmm0, %xmm0
64 ; AVXANY-NEXT: xorl %eax, %eax
65 ; AVXANY-NEXT: vptest %xmm0, %xmm0
66 ; AVXANY-NEXT: sete %al
68 %bcx = bitcast <2 x i64> %x to i128
69 %bcy = bitcast <2 x i64> %y to i128
70 %cmp = icmp eq i128 %bcx, %bcy
71 %zext = zext i1 %cmp to i32
75 define i32 @ne_i256(<4 x i64> %x, <4 x i64> %y) {
76 ; SSE2-LABEL: ne_i256:
78 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[2,3,2,3]
79 ; SSE2-NEXT: movq %xmm4, %rax
80 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3]
81 ; SSE2-NEXT: movq %xmm4, %rcx
82 ; SSE2-NEXT: movq %xmm0, %rdx
83 ; SSE2-NEXT: movq %xmm1, %rsi
84 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
85 ; SSE2-NEXT: movq %xmm0, %rdi
86 ; SSE2-NEXT: xorq %rax, %rdi
87 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
88 ; SSE2-NEXT: movq %xmm0, %r8
89 ; SSE2-NEXT: xorq %rcx, %r8
90 ; SSE2-NEXT: orq %rdi, %r8
91 ; SSE2-NEXT: movq %xmm2, %rax
92 ; SSE2-NEXT: xorq %rdx, %rax
93 ; SSE2-NEXT: movq %xmm3, %rcx
94 ; SSE2-NEXT: xorq %rsi, %rcx
95 ; SSE2-NEXT: orq %rax, %rcx
96 ; SSE2-NEXT: xorl %eax, %eax
97 ; SSE2-NEXT: orq %r8, %rcx
98 ; SSE2-NEXT: setne %al
101 ; SSE41-LABEL: ne_i256:
103 ; SSE41-NEXT: movq %xmm0, %rax
104 ; SSE41-NEXT: movq %xmm1, %rcx
105 ; SSE41-NEXT: pextrq $1, %xmm0, %rdx
106 ; SSE41-NEXT: pextrq $1, %xmm1, %rsi
107 ; SSE41-NEXT: movq %xmm2, %rdi
108 ; SSE41-NEXT: xorq %rax, %rdi
109 ; SSE41-NEXT: movq %xmm3, %r8
110 ; SSE41-NEXT: xorq %rcx, %r8
111 ; SSE41-NEXT: orq %rdi, %r8
112 ; SSE41-NEXT: pextrq $1, %xmm2, %rax
113 ; SSE41-NEXT: xorq %rdx, %rax
114 ; SSE41-NEXT: pextrq $1, %xmm3, %rcx
115 ; SSE41-NEXT: xorq %rsi, %rcx
116 ; SSE41-NEXT: orq %rax, %rcx
117 ; SSE41-NEXT: xorl %eax, %eax
118 ; SSE41-NEXT: orq %r8, %rcx
119 ; SSE41-NEXT: setne %al
122 ; AVX1-LABEL: ne_i256:
124 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
125 ; AVX1-NEXT: xorl %eax, %eax
126 ; AVX1-NEXT: vptest %ymm0, %ymm0
127 ; AVX1-NEXT: setne %al
128 ; AVX1-NEXT: vzeroupper
131 ; AVX2-LABEL: ne_i256:
133 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
134 ; AVX2-NEXT: xorl %eax, %eax
135 ; AVX2-NEXT: vptest %ymm0, %ymm0
136 ; AVX2-NEXT: setne %al
137 ; AVX2-NEXT: vzeroupper
140 ; AVX512-LABEL: ne_i256:
142 ; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
143 ; AVX512-NEXT: xorl %eax, %eax
144 ; AVX512-NEXT: vptest %ymm0, %ymm0
145 ; AVX512-NEXT: setne %al
146 ; AVX512-NEXT: vzeroupper
148 %bcx = bitcast <4 x i64> %x to i256
149 %bcy = bitcast <4 x i64> %y to i256
150 %cmp = icmp ne i256 %bcx, %bcy
151 %zext = zext i1 %cmp to i32
155 define i32 @eq_i256(<4 x i64> %x, <4 x i64> %y) {
156 ; SSE2-LABEL: eq_i256:
158 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[2,3,2,3]
159 ; SSE2-NEXT: movq %xmm4, %rax
160 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3]
161 ; SSE2-NEXT: movq %xmm4, %rcx
162 ; SSE2-NEXT: movq %xmm0, %rdx
163 ; SSE2-NEXT: movq %xmm1, %rsi
164 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
165 ; SSE2-NEXT: movq %xmm0, %rdi
166 ; SSE2-NEXT: xorq %rax, %rdi
167 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
168 ; SSE2-NEXT: movq %xmm0, %r8
169 ; SSE2-NEXT: xorq %rcx, %r8
170 ; SSE2-NEXT: orq %rdi, %r8
171 ; SSE2-NEXT: movq %xmm2, %rax
172 ; SSE2-NEXT: xorq %rdx, %rax
173 ; SSE2-NEXT: movq %xmm3, %rcx
174 ; SSE2-NEXT: xorq %rsi, %rcx
175 ; SSE2-NEXT: orq %rax, %rcx
176 ; SSE2-NEXT: xorl %eax, %eax
177 ; SSE2-NEXT: orq %r8, %rcx
178 ; SSE2-NEXT: sete %al
181 ; SSE41-LABEL: eq_i256:
183 ; SSE41-NEXT: movq %xmm0, %rax
184 ; SSE41-NEXT: movq %xmm1, %rcx
185 ; SSE41-NEXT: pextrq $1, %xmm0, %rdx
186 ; SSE41-NEXT: pextrq $1, %xmm1, %rsi
187 ; SSE41-NEXT: movq %xmm2, %rdi
188 ; SSE41-NEXT: xorq %rax, %rdi
189 ; SSE41-NEXT: movq %xmm3, %r8
190 ; SSE41-NEXT: xorq %rcx, %r8
191 ; SSE41-NEXT: orq %rdi, %r8
192 ; SSE41-NEXT: pextrq $1, %xmm2, %rax
193 ; SSE41-NEXT: xorq %rdx, %rax
194 ; SSE41-NEXT: pextrq $1, %xmm3, %rcx
195 ; SSE41-NEXT: xorq %rsi, %rcx
196 ; SSE41-NEXT: orq %rax, %rcx
197 ; SSE41-NEXT: xorl %eax, %eax
198 ; SSE41-NEXT: orq %r8, %rcx
199 ; SSE41-NEXT: sete %al
202 ; AVX1-LABEL: eq_i256:
204 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
205 ; AVX1-NEXT: xorl %eax, %eax
206 ; AVX1-NEXT: vptest %ymm0, %ymm0
207 ; AVX1-NEXT: sete %al
208 ; AVX1-NEXT: vzeroupper
211 ; AVX2-LABEL: eq_i256:
213 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
214 ; AVX2-NEXT: xorl %eax, %eax
215 ; AVX2-NEXT: vptest %ymm0, %ymm0
216 ; AVX2-NEXT: sete %al
217 ; AVX2-NEXT: vzeroupper
220 ; AVX512-LABEL: eq_i256:
222 ; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
223 ; AVX512-NEXT: xorl %eax, %eax
224 ; AVX512-NEXT: vptest %ymm0, %ymm0
225 ; AVX512-NEXT: sete %al
226 ; AVX512-NEXT: vzeroupper
228 %bcx = bitcast <4 x i64> %x to i256
229 %bcy = bitcast <4 x i64> %y to i256
230 %cmp = icmp eq i256 %bcx, %bcy
231 %zext = zext i1 %cmp to i32
235 define i32 @ne_i512(<8 x i64> %x, <8 x i64> %y) {
236 ; SSE2-LABEL: ne_i512:
238 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm0[2,3,2,3]
239 ; SSE2-NEXT: movq %xmm8, %rdx
240 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm2[2,3,2,3]
241 ; SSE2-NEXT: movq %xmm8, %rsi
242 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm1[2,3,2,3]
243 ; SSE2-NEXT: movq %xmm8, %rdi
244 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm3[2,3,2,3]
245 ; SSE2-NEXT: movq %xmm8, %r8
246 ; SSE2-NEXT: movq %xmm0, %r9
247 ; SSE2-NEXT: movq %xmm2, %r10
248 ; SSE2-NEXT: movq %xmm1, %rcx
249 ; SSE2-NEXT: movq %xmm3, %rax
250 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
251 ; SSE2-NEXT: movq %xmm0, %r11
252 ; SSE2-NEXT: xorq %rdx, %r11
253 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[2,3,2,3]
254 ; SSE2-NEXT: movq %xmm0, %rdx
255 ; SSE2-NEXT: xorq %rsi, %rdx
256 ; SSE2-NEXT: orq %r11, %rdx
257 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[2,3,2,3]
258 ; SSE2-NEXT: movq %xmm0, %rsi
259 ; SSE2-NEXT: xorq %rdi, %rsi
260 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[2,3,2,3]
261 ; SSE2-NEXT: movq %xmm0, %rdi
262 ; SSE2-NEXT: xorq %r8, %rdi
263 ; SSE2-NEXT: orq %rsi, %rdi
264 ; SSE2-NEXT: orq %rdx, %rdi
265 ; SSE2-NEXT: movq %xmm4, %rdx
266 ; SSE2-NEXT: xorq %r9, %rdx
267 ; SSE2-NEXT: movq %xmm6, %rsi
268 ; SSE2-NEXT: xorq %r10, %rsi
269 ; SSE2-NEXT: orq %rdx, %rsi
270 ; SSE2-NEXT: movq %xmm5, %rdx
271 ; SSE2-NEXT: xorq %rcx, %rdx
272 ; SSE2-NEXT: movq %xmm7, %rcx
273 ; SSE2-NEXT: xorq %rax, %rcx
274 ; SSE2-NEXT: orq %rdx, %rcx
275 ; SSE2-NEXT: orq %rsi, %rcx
276 ; SSE2-NEXT: xorl %eax, %eax
277 ; SSE2-NEXT: orq %rdi, %rcx
278 ; SSE2-NEXT: setne %al
281 ; SSE41-LABEL: ne_i512:
283 ; SSE41-NEXT: movq %xmm0, %rcx
284 ; SSE41-NEXT: movq %xmm2, %rdx
285 ; SSE41-NEXT: movq %xmm1, %rsi
286 ; SSE41-NEXT: movq %xmm3, %rdi
287 ; SSE41-NEXT: pextrq $1, %xmm0, %r8
288 ; SSE41-NEXT: pextrq $1, %xmm2, %r9
289 ; SSE41-NEXT: pextrq $1, %xmm1, %r10
290 ; SSE41-NEXT: pextrq $1, %xmm3, %rax
291 ; SSE41-NEXT: movq %xmm4, %r11
292 ; SSE41-NEXT: xorq %rcx, %r11
293 ; SSE41-NEXT: movq %xmm6, %rcx
294 ; SSE41-NEXT: xorq %rdx, %rcx
295 ; SSE41-NEXT: orq %r11, %rcx
296 ; SSE41-NEXT: movq %xmm5, %rdx
297 ; SSE41-NEXT: xorq %rsi, %rdx
298 ; SSE41-NEXT: movq %xmm7, %rsi
299 ; SSE41-NEXT: xorq %rdi, %rsi
300 ; SSE41-NEXT: orq %rdx, %rsi
301 ; SSE41-NEXT: orq %rcx, %rsi
302 ; SSE41-NEXT: pextrq $1, %xmm4, %rcx
303 ; SSE41-NEXT: xorq %r8, %rcx
304 ; SSE41-NEXT: pextrq $1, %xmm6, %rdx
305 ; SSE41-NEXT: xorq %r9, %rdx
306 ; SSE41-NEXT: orq %rcx, %rdx
307 ; SSE41-NEXT: pextrq $1, %xmm5, %rcx
308 ; SSE41-NEXT: xorq %r10, %rcx
309 ; SSE41-NEXT: pextrq $1, %xmm7, %rdi
310 ; SSE41-NEXT: xorq %rax, %rdi
311 ; SSE41-NEXT: orq %rcx, %rdi
312 ; SSE41-NEXT: orq %rdx, %rdi
313 ; SSE41-NEXT: xorl %eax, %eax
314 ; SSE41-NEXT: orq %rsi, %rdi
315 ; SSE41-NEXT: setne %al
318 ; AVX1-LABEL: ne_i512:
320 ; AVX1-NEXT: vmovq %xmm0, %rdx
321 ; AVX1-NEXT: vmovq %xmm1, %rsi
322 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
323 ; AVX1-NEXT: vmovq %xmm4, %rdi
324 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
325 ; AVX1-NEXT: vmovq %xmm5, %r8
326 ; AVX1-NEXT: vpextrq $1, %xmm0, %r9
327 ; AVX1-NEXT: vpextrq $1, %xmm1, %r10
328 ; AVX1-NEXT: vpextrq $1, %xmm4, %rcx
329 ; AVX1-NEXT: vpextrq $1, %xmm5, %rax
330 ; AVX1-NEXT: vmovq %xmm2, %r11
331 ; AVX1-NEXT: xorq %rdx, %r11
332 ; AVX1-NEXT: vmovq %xmm3, %rdx
333 ; AVX1-NEXT: xorq %rsi, %rdx
334 ; AVX1-NEXT: orq %r11, %rdx
335 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm0
336 ; AVX1-NEXT: vmovq %xmm0, %rsi
337 ; AVX1-NEXT: xorq %rdi, %rsi
338 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1
339 ; AVX1-NEXT: vmovq %xmm1, %rdi
340 ; AVX1-NEXT: xorq %r8, %rdi
341 ; AVX1-NEXT: orq %rsi, %rdi
342 ; AVX1-NEXT: orq %rdx, %rdi
343 ; AVX1-NEXT: vpextrq $1, %xmm2, %rdx
344 ; AVX1-NEXT: xorq %r9, %rdx
345 ; AVX1-NEXT: vpextrq $1, %xmm3, %rsi
346 ; AVX1-NEXT: xorq %r10, %rsi
347 ; AVX1-NEXT: orq %rdx, %rsi
348 ; AVX1-NEXT: vpextrq $1, %xmm0, %rdx
349 ; AVX1-NEXT: xorq %rcx, %rdx
350 ; AVX1-NEXT: vpextrq $1, %xmm1, %rcx
351 ; AVX1-NEXT: xorq %rax, %rcx
352 ; AVX1-NEXT: orq %rdx, %rcx
353 ; AVX1-NEXT: orq %rsi, %rcx
354 ; AVX1-NEXT: xorl %eax, %eax
355 ; AVX1-NEXT: orq %rdi, %rcx
356 ; AVX1-NEXT: setne %al
357 ; AVX1-NEXT: vzeroupper
360 ; AVX2-LABEL: ne_i512:
362 ; AVX2-NEXT: vmovq %xmm0, %rdx
363 ; AVX2-NEXT: vmovq %xmm1, %rsi
364 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
365 ; AVX2-NEXT: vmovq %xmm4, %rdi
366 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5
367 ; AVX2-NEXT: vmovq %xmm5, %r8
368 ; AVX2-NEXT: vpextrq $1, %xmm0, %r9
369 ; AVX2-NEXT: vpextrq $1, %xmm1, %r10
370 ; AVX2-NEXT: vpextrq $1, %xmm4, %rcx
371 ; AVX2-NEXT: vpextrq $1, %xmm5, %rax
372 ; AVX2-NEXT: vmovq %xmm2, %r11
373 ; AVX2-NEXT: xorq %rdx, %r11
374 ; AVX2-NEXT: vmovq %xmm3, %rdx
375 ; AVX2-NEXT: xorq %rsi, %rdx
376 ; AVX2-NEXT: orq %r11, %rdx
377 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm0
378 ; AVX2-NEXT: vmovq %xmm0, %rsi
379 ; AVX2-NEXT: xorq %rdi, %rsi
380 ; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm1
381 ; AVX2-NEXT: vmovq %xmm1, %rdi
382 ; AVX2-NEXT: xorq %r8, %rdi
383 ; AVX2-NEXT: orq %rsi, %rdi
384 ; AVX2-NEXT: orq %rdx, %rdi
385 ; AVX2-NEXT: vpextrq $1, %xmm2, %rdx
386 ; AVX2-NEXT: xorq %r9, %rdx
387 ; AVX2-NEXT: vpextrq $1, %xmm3, %rsi
388 ; AVX2-NEXT: xorq %r10, %rsi
389 ; AVX2-NEXT: orq %rdx, %rsi
390 ; AVX2-NEXT: vpextrq $1, %xmm0, %rdx
391 ; AVX2-NEXT: xorq %rcx, %rdx
392 ; AVX2-NEXT: vpextrq $1, %xmm1, %rcx
393 ; AVX2-NEXT: xorq %rax, %rcx
394 ; AVX2-NEXT: orq %rdx, %rcx
395 ; AVX2-NEXT: orq %rsi, %rcx
396 ; AVX2-NEXT: xorl %eax, %eax
397 ; AVX2-NEXT: orq %rdi, %rcx
398 ; AVX2-NEXT: setne %al
399 ; AVX2-NEXT: vzeroupper
402 ; AVX512-LABEL: ne_i512:
404 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
405 ; AVX512-NEXT: xorl %eax, %eax
406 ; AVX512-NEXT: kortestw %k0, %k0
407 ; AVX512-NEXT: setne %al
408 ; AVX512-NEXT: vzeroupper
410 %bcx = bitcast <8 x i64> %x to i512
411 %bcy = bitcast <8 x i64> %y to i512
412 %cmp = icmp ne i512 %bcx, %bcy
413 %zext = zext i1 %cmp to i32
417 define i32 @eq_i512(<8 x i64> %x, <8 x i64> %y) {
418 ; SSE2-LABEL: eq_i512:
420 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm0[2,3,2,3]
421 ; SSE2-NEXT: movq %xmm8, %rdx
422 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm2[2,3,2,3]
423 ; SSE2-NEXT: movq %xmm8, %rsi
424 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm1[2,3,2,3]
425 ; SSE2-NEXT: movq %xmm8, %rdi
426 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm3[2,3,2,3]
427 ; SSE2-NEXT: movq %xmm8, %r8
428 ; SSE2-NEXT: movq %xmm0, %r9
429 ; SSE2-NEXT: movq %xmm2, %r10
430 ; SSE2-NEXT: movq %xmm1, %rcx
431 ; SSE2-NEXT: movq %xmm3, %rax
432 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
433 ; SSE2-NEXT: movq %xmm0, %r11
434 ; SSE2-NEXT: xorq %rdx, %r11
435 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[2,3,2,3]
436 ; SSE2-NEXT: movq %xmm0, %rdx
437 ; SSE2-NEXT: xorq %rsi, %rdx
438 ; SSE2-NEXT: orq %r11, %rdx
439 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[2,3,2,3]
440 ; SSE2-NEXT: movq %xmm0, %rsi
441 ; SSE2-NEXT: xorq %rdi, %rsi
442 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[2,3,2,3]
443 ; SSE2-NEXT: movq %xmm0, %rdi
444 ; SSE2-NEXT: xorq %r8, %rdi
445 ; SSE2-NEXT: orq %rsi, %rdi
446 ; SSE2-NEXT: orq %rdx, %rdi
447 ; SSE2-NEXT: movq %xmm4, %rdx
448 ; SSE2-NEXT: xorq %r9, %rdx
449 ; SSE2-NEXT: movq %xmm6, %rsi
450 ; SSE2-NEXT: xorq %r10, %rsi
451 ; SSE2-NEXT: orq %rdx, %rsi
452 ; SSE2-NEXT: movq %xmm5, %rdx
453 ; SSE2-NEXT: xorq %rcx, %rdx
454 ; SSE2-NEXT: movq %xmm7, %rcx
455 ; SSE2-NEXT: xorq %rax, %rcx
456 ; SSE2-NEXT: orq %rdx, %rcx
457 ; SSE2-NEXT: orq %rsi, %rcx
458 ; SSE2-NEXT: xorl %eax, %eax
459 ; SSE2-NEXT: orq %rdi, %rcx
460 ; SSE2-NEXT: sete %al
463 ; SSE41-LABEL: eq_i512:
465 ; SSE41-NEXT: movq %xmm0, %rcx
466 ; SSE41-NEXT: movq %xmm2, %rdx
467 ; SSE41-NEXT: movq %xmm1, %rsi
468 ; SSE41-NEXT: movq %xmm3, %rdi
469 ; SSE41-NEXT: pextrq $1, %xmm0, %r8
470 ; SSE41-NEXT: pextrq $1, %xmm2, %r9
471 ; SSE41-NEXT: pextrq $1, %xmm1, %r10
472 ; SSE41-NEXT: pextrq $1, %xmm3, %rax
473 ; SSE41-NEXT: movq %xmm4, %r11
474 ; SSE41-NEXT: xorq %rcx, %r11
475 ; SSE41-NEXT: movq %xmm6, %rcx
476 ; SSE41-NEXT: xorq %rdx, %rcx
477 ; SSE41-NEXT: orq %r11, %rcx
478 ; SSE41-NEXT: movq %xmm5, %rdx
479 ; SSE41-NEXT: xorq %rsi, %rdx
480 ; SSE41-NEXT: movq %xmm7, %rsi
481 ; SSE41-NEXT: xorq %rdi, %rsi
482 ; SSE41-NEXT: orq %rdx, %rsi
483 ; SSE41-NEXT: orq %rcx, %rsi
484 ; SSE41-NEXT: pextrq $1, %xmm4, %rcx
485 ; SSE41-NEXT: xorq %r8, %rcx
486 ; SSE41-NEXT: pextrq $1, %xmm6, %rdx
487 ; SSE41-NEXT: xorq %r9, %rdx
488 ; SSE41-NEXT: orq %rcx, %rdx
489 ; SSE41-NEXT: pextrq $1, %xmm5, %rcx
490 ; SSE41-NEXT: xorq %r10, %rcx
491 ; SSE41-NEXT: pextrq $1, %xmm7, %rdi
492 ; SSE41-NEXT: xorq %rax, %rdi
493 ; SSE41-NEXT: orq %rcx, %rdi
494 ; SSE41-NEXT: orq %rdx, %rdi
495 ; SSE41-NEXT: xorl %eax, %eax
496 ; SSE41-NEXT: orq %rsi, %rdi
497 ; SSE41-NEXT: sete %al
500 ; AVX1-LABEL: eq_i512:
502 ; AVX1-NEXT: vmovq %xmm0, %rdx
503 ; AVX1-NEXT: vmovq %xmm1, %rsi
504 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
505 ; AVX1-NEXT: vmovq %xmm4, %rdi
506 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
507 ; AVX1-NEXT: vmovq %xmm5, %r8
508 ; AVX1-NEXT: vpextrq $1, %xmm0, %r9
509 ; AVX1-NEXT: vpextrq $1, %xmm1, %r10
510 ; AVX1-NEXT: vpextrq $1, %xmm4, %rcx
511 ; AVX1-NEXT: vpextrq $1, %xmm5, %rax
512 ; AVX1-NEXT: vmovq %xmm2, %r11
513 ; AVX1-NEXT: xorq %rdx, %r11
514 ; AVX1-NEXT: vmovq %xmm3, %rdx
515 ; AVX1-NEXT: xorq %rsi, %rdx
516 ; AVX1-NEXT: orq %r11, %rdx
517 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm0
518 ; AVX1-NEXT: vmovq %xmm0, %rsi
519 ; AVX1-NEXT: xorq %rdi, %rsi
520 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1
521 ; AVX1-NEXT: vmovq %xmm1, %rdi
522 ; AVX1-NEXT: xorq %r8, %rdi
523 ; AVX1-NEXT: orq %rsi, %rdi
524 ; AVX1-NEXT: orq %rdx, %rdi
525 ; AVX1-NEXT: vpextrq $1, %xmm2, %rdx
526 ; AVX1-NEXT: xorq %r9, %rdx
527 ; AVX1-NEXT: vpextrq $1, %xmm3, %rsi
528 ; AVX1-NEXT: xorq %r10, %rsi
529 ; AVX1-NEXT: orq %rdx, %rsi
530 ; AVX1-NEXT: vpextrq $1, %xmm0, %rdx
531 ; AVX1-NEXT: xorq %rcx, %rdx
532 ; AVX1-NEXT: vpextrq $1, %xmm1, %rcx
533 ; AVX1-NEXT: xorq %rax, %rcx
534 ; AVX1-NEXT: orq %rdx, %rcx
535 ; AVX1-NEXT: orq %rsi, %rcx
536 ; AVX1-NEXT: xorl %eax, %eax
537 ; AVX1-NEXT: orq %rdi, %rcx
538 ; AVX1-NEXT: sete %al
539 ; AVX1-NEXT: vzeroupper
542 ; AVX2-LABEL: eq_i512:
544 ; AVX2-NEXT: vmovq %xmm0, %rdx
545 ; AVX2-NEXT: vmovq %xmm1, %rsi
546 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
547 ; AVX2-NEXT: vmovq %xmm4, %rdi
548 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5
549 ; AVX2-NEXT: vmovq %xmm5, %r8
550 ; AVX2-NEXT: vpextrq $1, %xmm0, %r9
551 ; AVX2-NEXT: vpextrq $1, %xmm1, %r10
552 ; AVX2-NEXT: vpextrq $1, %xmm4, %rcx
553 ; AVX2-NEXT: vpextrq $1, %xmm5, %rax
554 ; AVX2-NEXT: vmovq %xmm2, %r11
555 ; AVX2-NEXT: xorq %rdx, %r11
556 ; AVX2-NEXT: vmovq %xmm3, %rdx
557 ; AVX2-NEXT: xorq %rsi, %rdx
558 ; AVX2-NEXT: orq %r11, %rdx
559 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm0
560 ; AVX2-NEXT: vmovq %xmm0, %rsi
561 ; AVX2-NEXT: xorq %rdi, %rsi
562 ; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm1
563 ; AVX2-NEXT: vmovq %xmm1, %rdi
564 ; AVX2-NEXT: xorq %r8, %rdi
565 ; AVX2-NEXT: orq %rsi, %rdi
566 ; AVX2-NEXT: orq %rdx, %rdi
567 ; AVX2-NEXT: vpextrq $1, %xmm2, %rdx
568 ; AVX2-NEXT: xorq %r9, %rdx
569 ; AVX2-NEXT: vpextrq $1, %xmm3, %rsi
570 ; AVX2-NEXT: xorq %r10, %rsi
571 ; AVX2-NEXT: orq %rdx, %rsi
572 ; AVX2-NEXT: vpextrq $1, %xmm0, %rdx
573 ; AVX2-NEXT: xorq %rcx, %rdx
574 ; AVX2-NEXT: vpextrq $1, %xmm1, %rcx
575 ; AVX2-NEXT: xorq %rax, %rcx
576 ; AVX2-NEXT: orq %rdx, %rcx
577 ; AVX2-NEXT: orq %rsi, %rcx
578 ; AVX2-NEXT: xorl %eax, %eax
579 ; AVX2-NEXT: orq %rdi, %rcx
580 ; AVX2-NEXT: sete %al
581 ; AVX2-NEXT: vzeroupper
584 ; AVX512-LABEL: eq_i512:
586 ; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0
587 ; AVX512-NEXT: xorl %eax, %eax
588 ; AVX512-NEXT: kortestw %k0, %k0
589 ; AVX512-NEXT: sete %al
590 ; AVX512-NEXT: vzeroupper
592 %bcx = bitcast <8 x i64> %x to i512
593 %bcy = bitcast <8 x i64> %y to i512
594 %cmp = icmp eq i512 %bcx, %bcy
595 %zext = zext i1 %cmp to i32
599 define i1 @ne_v4i256(<4 x i256> %a0) {
600 ; SSE2-LABEL: ne_v4i256:
602 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rax
603 ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r10
604 ; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %r10
605 ; SSE2-NEXT: movq %r10, %xmm0
606 ; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %rax
607 ; SSE2-NEXT: movq %rax, %xmm1
608 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
609 ; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %rcx
610 ; SSE2-NEXT: movq %rcx, %xmm0
611 ; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %rdx
612 ; SSE2-NEXT: movq %rdx, %xmm2
613 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
614 ; SSE2-NEXT: por %xmm1, %xmm2
615 ; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %r9
616 ; SSE2-NEXT: movq %r9, %xmm0
617 ; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %r8
618 ; SSE2-NEXT: movq %r8, %xmm1
619 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
620 ; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %rsi
621 ; SSE2-NEXT: movq %rsi, %xmm0
622 ; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %rdi
623 ; SSE2-NEXT: movq %rdi, %xmm3
624 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
625 ; SSE2-NEXT: por %xmm1, %xmm3
626 ; SSE2-NEXT: por %xmm2, %xmm3
627 ; SSE2-NEXT: pxor %xmm0, %xmm0
628 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm0
629 ; SSE2-NEXT: movmskps %xmm0, %eax
630 ; SSE2-NEXT: xorl $15, %eax
631 ; SSE2-NEXT: sete %al
634 ; SSE41-LABEL: ne_v4i256:
636 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rax
637 ; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r10
638 ; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %r10
639 ; SSE41-NEXT: movq %r10, %xmm0
640 ; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %rax
641 ; SSE41-NEXT: movq %rax, %xmm1
642 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
643 ; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %rcx
644 ; SSE41-NEXT: movq %rcx, %xmm0
645 ; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %rdx
646 ; SSE41-NEXT: movq %rdx, %xmm2
647 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
648 ; SSE41-NEXT: por %xmm1, %xmm2
649 ; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %r9
650 ; SSE41-NEXT: movq %r9, %xmm0
651 ; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %r8
652 ; SSE41-NEXT: movq %r8, %xmm1
653 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
654 ; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %rsi
655 ; SSE41-NEXT: movq %rsi, %xmm0
656 ; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %rdi
657 ; SSE41-NEXT: movq %rdi, %xmm3
658 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
659 ; SSE41-NEXT: por %xmm1, %xmm3
660 ; SSE41-NEXT: por %xmm2, %xmm3
661 ; SSE41-NEXT: ptest %xmm3, %xmm3
662 ; SSE41-NEXT: sete %al
665 ; AVX1-LABEL: ne_v4i256:
667 ; AVX1-NEXT: movq {{[0-9]+}}(%rsp), %rax
668 ; AVX1-NEXT: movq {{[0-9]+}}(%rsp), %r10
669 ; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %r10
670 ; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %rcx
671 ; AVX1-NEXT: orq %r10, %rcx
672 ; AVX1-NEXT: vmovq %rcx, %xmm0
673 ; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %rax
674 ; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %rdx
675 ; AVX1-NEXT: orq %rax, %rdx
676 ; AVX1-NEXT: vmovq %rdx, %xmm1
677 ; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
678 ; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %r9
679 ; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %rsi
680 ; AVX1-NEXT: orq %r9, %rsi
681 ; AVX1-NEXT: vmovq %rsi, %xmm1
682 ; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %r8
683 ; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %rdi
684 ; AVX1-NEXT: orq %r8, %rdi
685 ; AVX1-NEXT: vmovq %rdi, %xmm2
686 ; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
687 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
688 ; AVX1-NEXT: vptest %ymm0, %ymm0
689 ; AVX1-NEXT: sete %al
690 ; AVX1-NEXT: vzeroupper
693 ; AVX2-LABEL: ne_v4i256:
695 ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %rax
696 ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r10
697 ; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %r10
698 ; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %rcx
699 ; AVX2-NEXT: orq %r10, %rcx
700 ; AVX2-NEXT: vmovq %rcx, %xmm0
701 ; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %rax
702 ; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %rdx
703 ; AVX2-NEXT: orq %rax, %rdx
704 ; AVX2-NEXT: vmovq %rdx, %xmm1
705 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
706 ; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %r9
707 ; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %rsi
708 ; AVX2-NEXT: orq %r9, %rsi
709 ; AVX2-NEXT: vmovq %rsi, %xmm1
710 ; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %r8
711 ; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %rdi
712 ; AVX2-NEXT: orq %r8, %rdi
713 ; AVX2-NEXT: vmovq %rdi, %xmm2
714 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]
715 ; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
716 ; AVX2-NEXT: vptest %ymm0, %ymm0
717 ; AVX2-NEXT: sete %al
718 ; AVX2-NEXT: vzeroupper
721 ; AVX512-LABEL: ne_v4i256:
723 ; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %rax
724 ; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %r10
725 ; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %rax
726 ; AVX512-NEXT: vmovd %eax, %xmm0
727 ; AVX512-NEXT: shrq $32, %rax
728 ; AVX512-NEXT: vpinsrd $1, %eax, %xmm0, %xmm0
729 ; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %r10
730 ; AVX512-NEXT: vpinsrd $2, %r10d, %xmm0, %xmm0
731 ; AVX512-NEXT: shrq $32, %r10
732 ; AVX512-NEXT: vpinsrd $3, %r10d, %xmm0, %xmm0
733 ; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %r8
734 ; AVX512-NEXT: vmovd %r8d, %xmm1
735 ; AVX512-NEXT: shrq $32, %r8
736 ; AVX512-NEXT: vpinsrd $1, %r8d, %xmm1, %xmm1
737 ; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %r9
738 ; AVX512-NEXT: vpinsrd $2, %r9d, %xmm1, %xmm1
739 ; AVX512-NEXT: shrq $32, %r9
740 ; AVX512-NEXT: vpinsrd $3, %r9d, %xmm1, %xmm1
741 ; AVX512-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
742 ; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %rdx
743 ; AVX512-NEXT: vmovd %edx, %xmm1
744 ; AVX512-NEXT: shrq $32, %rdx
745 ; AVX512-NEXT: vpinsrd $1, %edx, %xmm1, %xmm1
746 ; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %rcx
747 ; AVX512-NEXT: vpinsrd $2, %ecx, %xmm1, %xmm1
748 ; AVX512-NEXT: shrq $32, %rcx
749 ; AVX512-NEXT: vpinsrd $3, %ecx, %xmm1, %xmm1
750 ; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %rdi
751 ; AVX512-NEXT: vmovd %edi, %xmm2
752 ; AVX512-NEXT: shrq $32, %rdi
753 ; AVX512-NEXT: vpinsrd $1, %edi, %xmm2, %xmm2
754 ; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %rsi
755 ; AVX512-NEXT: vpinsrd $2, %esi, %xmm2, %xmm2
756 ; AVX512-NEXT: shrq $32, %rsi
757 ; AVX512-NEXT: vpinsrd $3, %esi, %xmm2, %xmm2
758 ; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm2, %ymm1
759 ; AVX512-NEXT: vinserti64x4 $1, %ymm0, %zmm1, %zmm0
760 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
761 ; AVX512-NEXT: kortestw %k0, %k0
762 ; AVX512-NEXT: sete %al
763 ; AVX512-NEXT: vzeroupper
765 %c = icmp ne <4 x i256> %a0, zeroinitializer
766 %b = bitcast <4 x i1> %c to i4
767 %r = icmp eq i4 %b, 0
771 ; This test models the expansion of 'memcmp(a, b, 32) != 0'
772 ; if we allowed 2 pairs of 16-byte loads per block.
774 define i32 @ne_i128_pair(ptr %a, ptr %b) {
775 ; SSE2-LABEL: ne_i128_pair:
777 ; SSE2-NEXT: movdqa (%rdi), %xmm0
778 ; SSE2-NEXT: movdqa 16(%rdi), %xmm1
779 ; SSE2-NEXT: pcmpeqb 16(%rsi), %xmm1
780 ; SSE2-NEXT: pcmpeqb (%rsi), %xmm0
781 ; SSE2-NEXT: pand %xmm1, %xmm0
782 ; SSE2-NEXT: pmovmskb %xmm0, %ecx
783 ; SSE2-NEXT: xorl %eax, %eax
784 ; SSE2-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
785 ; SSE2-NEXT: setne %al
788 ; SSE41-LABEL: ne_i128_pair:
790 ; SSE41-NEXT: movdqa (%rdi), %xmm0
791 ; SSE41-NEXT: movdqa 16(%rdi), %xmm1
792 ; SSE41-NEXT: pxor 16(%rsi), %xmm1
793 ; SSE41-NEXT: pxor (%rsi), %xmm0
794 ; SSE41-NEXT: por %xmm1, %xmm0
795 ; SSE41-NEXT: xorl %eax, %eax
796 ; SSE41-NEXT: ptest %xmm0, %xmm0
797 ; SSE41-NEXT: setne %al
800 ; AVXANY-LABEL: ne_i128_pair:
802 ; AVXANY-NEXT: vmovdqa (%rdi), %xmm0
803 ; AVXANY-NEXT: vmovdqa 16(%rdi), %xmm1
804 ; AVXANY-NEXT: vpxor 16(%rsi), %xmm1, %xmm1
805 ; AVXANY-NEXT: vpxor (%rsi), %xmm0, %xmm0
806 ; AVXANY-NEXT: vpor %xmm1, %xmm0, %xmm0
807 ; AVXANY-NEXT: xorl %eax, %eax
808 ; AVXANY-NEXT: vptest %xmm0, %xmm0
809 ; AVXANY-NEXT: setne %al
811 %a0 = load i128, ptr %a
812 %b0 = load i128, ptr %b
813 %xor1 = xor i128 %a0, %b0
814 %ap1 = getelementptr i128, ptr %a, i128 1
815 %bp1 = getelementptr i128, ptr %b, i128 1
816 %a1 = load i128, ptr %ap1
817 %b1 = load i128, ptr %bp1
818 %xor2 = xor i128 %a1, %b1
819 %or = or i128 %xor1, %xor2
820 %cmp = icmp ne i128 %or, 0
821 %z = zext i1 %cmp to i32
825 ; This test models the expansion of 'memcmp(a, b, 32) == 0'
826 ; if we allowed 2 pairs of 16-byte loads per block.
828 define i32 @eq_i128_pair(ptr %a, ptr %b) {
829 ; SSE2-LABEL: eq_i128_pair:
831 ; SSE2-NEXT: movdqa (%rdi), %xmm0
832 ; SSE2-NEXT: movdqa 16(%rdi), %xmm1
833 ; SSE2-NEXT: pcmpeqb 16(%rsi), %xmm1
834 ; SSE2-NEXT: pcmpeqb (%rsi), %xmm0
835 ; SSE2-NEXT: pand %xmm1, %xmm0
836 ; SSE2-NEXT: pmovmskb %xmm0, %ecx
837 ; SSE2-NEXT: xorl %eax, %eax
838 ; SSE2-NEXT: cmpl $65535, %ecx # imm = 0xFFFF
839 ; SSE2-NEXT: sete %al
842 ; SSE41-LABEL: eq_i128_pair:
844 ; SSE41-NEXT: movdqa (%rdi), %xmm0
845 ; SSE41-NEXT: movdqa 16(%rdi), %xmm1
846 ; SSE41-NEXT: pxor 16(%rsi), %xmm1
847 ; SSE41-NEXT: pxor (%rsi), %xmm0
848 ; SSE41-NEXT: por %xmm1, %xmm0
849 ; SSE41-NEXT: xorl %eax, %eax
850 ; SSE41-NEXT: ptest %xmm0, %xmm0
851 ; SSE41-NEXT: sete %al
854 ; AVXANY-LABEL: eq_i128_pair:
856 ; AVXANY-NEXT: vmovdqa (%rdi), %xmm0
857 ; AVXANY-NEXT: vmovdqa 16(%rdi), %xmm1
858 ; AVXANY-NEXT: vpxor 16(%rsi), %xmm1, %xmm1
859 ; AVXANY-NEXT: vpxor (%rsi), %xmm0, %xmm0
860 ; AVXANY-NEXT: vpor %xmm1, %xmm0, %xmm0
861 ; AVXANY-NEXT: xorl %eax, %eax
862 ; AVXANY-NEXT: vptest %xmm0, %xmm0
863 ; AVXANY-NEXT: sete %al
865 %a0 = load i128, ptr %a
866 %b0 = load i128, ptr %b
867 %xor1 = xor i128 %a0, %b0
868 %ap1 = getelementptr i128, ptr %a, i128 1
869 %bp1 = getelementptr i128, ptr %b, i128 1
870 %a1 = load i128, ptr %ap1
871 %b1 = load i128, ptr %bp1
872 %xor2 = xor i128 %a1, %b1
873 %or = or i128 %xor1, %xor2
874 %cmp = icmp eq i128 %or, 0
875 %z = zext i1 %cmp to i32
879 ; This test models the expansion of 'memcmp(a, b, 64) != 0'
880 ; if we allowed 2 pairs of 32-byte loads per block.
882 define i32 @ne_i256_pair(ptr %a, ptr %b) {
883 ; SSE-LABEL: ne_i256_pair:
885 ; SSE-NEXT: movq 16(%rdi), %rax
886 ; SSE-NEXT: movq 24(%rdi), %rcx
887 ; SSE-NEXT: movq (%rdi), %rdx
888 ; SSE-NEXT: movq 8(%rdi), %r8
889 ; SSE-NEXT: xorq 8(%rsi), %r8
890 ; SSE-NEXT: xorq 24(%rsi), %rcx
891 ; SSE-NEXT: xorq (%rsi), %rdx
892 ; SSE-NEXT: xorq 16(%rsi), %rax
893 ; SSE-NEXT: movq 48(%rdi), %r9
894 ; SSE-NEXT: movq 32(%rdi), %r10
895 ; SSE-NEXT: movq 56(%rdi), %r11
896 ; SSE-NEXT: movq 40(%rdi), %rdi
897 ; SSE-NEXT: xorq 40(%rsi), %rdi
898 ; SSE-NEXT: orq %r8, %rdi
899 ; SSE-NEXT: xorq 56(%rsi), %r11
900 ; SSE-NEXT: orq %rcx, %r11
901 ; SSE-NEXT: orq %rdi, %r11
902 ; SSE-NEXT: xorq 32(%rsi), %r10
903 ; SSE-NEXT: orq %rdx, %r10
904 ; SSE-NEXT: xorq 48(%rsi), %r9
905 ; SSE-NEXT: orq %rax, %r9
906 ; SSE-NEXT: orq %r10, %r9
907 ; SSE-NEXT: xorl %eax, %eax
908 ; SSE-NEXT: orq %r11, %r9
909 ; SSE-NEXT: setne %al
912 ; AVX1-LABEL: ne_i256_pair:
914 ; AVX1-NEXT: vmovups (%rdi), %ymm0
915 ; AVX1-NEXT: vmovups 32(%rdi), %ymm1
916 ; AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1
917 ; AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0
918 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
919 ; AVX1-NEXT: xorl %eax, %eax
920 ; AVX1-NEXT: vptest %ymm0, %ymm0
921 ; AVX1-NEXT: setne %al
922 ; AVX1-NEXT: vzeroupper
925 ; AVX2-LABEL: ne_i256_pair:
927 ; AVX2-NEXT: vmovdqu (%rdi), %ymm0
928 ; AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
929 ; AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1
930 ; AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
931 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
932 ; AVX2-NEXT: xorl %eax, %eax
933 ; AVX2-NEXT: vptest %ymm0, %ymm0
934 ; AVX2-NEXT: setne %al
935 ; AVX2-NEXT: vzeroupper
938 ; AVX512-LABEL: ne_i256_pair:
940 ; AVX512-NEXT: vmovdqu (%rdi), %ymm0
941 ; AVX512-NEXT: vmovdqu 32(%rdi), %ymm1
942 ; AVX512-NEXT: vpxor 32(%rsi), %ymm1, %ymm1
943 ; AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0
944 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
945 ; AVX512-NEXT: xorl %eax, %eax
946 ; AVX512-NEXT: vptest %ymm0, %ymm0
947 ; AVX512-NEXT: setne %al
948 ; AVX512-NEXT: vzeroupper
950 %a0 = load i256, ptr %a
951 %b0 = load i256, ptr %b
952 %xor1 = xor i256 %a0, %b0
953 %ap1 = getelementptr i256, ptr %a, i256 1
954 %bp1 = getelementptr i256, ptr %b, i256 1
955 %a1 = load i256, ptr %ap1
956 %b1 = load i256, ptr %bp1
957 %xor2 = xor i256 %a1, %b1
958 %or = or i256 %xor1, %xor2
959 %cmp = icmp ne i256 %or, 0
960 %z = zext i1 %cmp to i32
964 ; This test models the expansion of 'memcmp(a, b, 64) == 0'
965 ; if we allowed 2 pairs of 32-byte loads per block.
967 define i32 @eq_i256_pair(ptr %a, ptr %b) {
968 ; SSE-LABEL: eq_i256_pair:
970 ; SSE-NEXT: movq 16(%rdi), %rax
971 ; SSE-NEXT: movq 24(%rdi), %rcx
972 ; SSE-NEXT: movq (%rdi), %rdx
973 ; SSE-NEXT: movq 8(%rdi), %r8
974 ; SSE-NEXT: xorq 8(%rsi), %r8
975 ; SSE-NEXT: xorq 24(%rsi), %rcx
976 ; SSE-NEXT: xorq (%rsi), %rdx
977 ; SSE-NEXT: xorq 16(%rsi), %rax
978 ; SSE-NEXT: movq 48(%rdi), %r9
979 ; SSE-NEXT: movq 32(%rdi), %r10
980 ; SSE-NEXT: movq 56(%rdi), %r11
981 ; SSE-NEXT: movq 40(%rdi), %rdi
982 ; SSE-NEXT: xorq 40(%rsi), %rdi
983 ; SSE-NEXT: orq %r8, %rdi
984 ; SSE-NEXT: xorq 56(%rsi), %r11
985 ; SSE-NEXT: orq %rcx, %r11
986 ; SSE-NEXT: orq %rdi, %r11
987 ; SSE-NEXT: xorq 32(%rsi), %r10
988 ; SSE-NEXT: orq %rdx, %r10
989 ; SSE-NEXT: xorq 48(%rsi), %r9
990 ; SSE-NEXT: orq %rax, %r9
991 ; SSE-NEXT: orq %r10, %r9
992 ; SSE-NEXT: xorl %eax, %eax
993 ; SSE-NEXT: orq %r11, %r9
997 ; AVX1-LABEL: eq_i256_pair:
999 ; AVX1-NEXT: vmovups (%rdi), %ymm0
1000 ; AVX1-NEXT: vmovups 32(%rdi), %ymm1
1001 ; AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1
1002 ; AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0
1003 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1004 ; AVX1-NEXT: xorl %eax, %eax
1005 ; AVX1-NEXT: vptest %ymm0, %ymm0
1006 ; AVX1-NEXT: sete %al
1007 ; AVX1-NEXT: vzeroupper
1010 ; AVX2-LABEL: eq_i256_pair:
1012 ; AVX2-NEXT: vmovdqu (%rdi), %ymm0
1013 ; AVX2-NEXT: vmovdqu 32(%rdi), %ymm1
1014 ; AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1
1015 ; AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
1016 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1017 ; AVX2-NEXT: xorl %eax, %eax
1018 ; AVX2-NEXT: vptest %ymm0, %ymm0
1019 ; AVX2-NEXT: sete %al
1020 ; AVX2-NEXT: vzeroupper
1023 ; AVX512-LABEL: eq_i256_pair:
1025 ; AVX512-NEXT: vmovdqu (%rdi), %ymm0
1026 ; AVX512-NEXT: vmovdqu 32(%rdi), %ymm1
1027 ; AVX512-NEXT: vpxor 32(%rsi), %ymm1, %ymm1
1028 ; AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0
1029 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
1030 ; AVX512-NEXT: xorl %eax, %eax
1031 ; AVX512-NEXT: vptest %ymm0, %ymm0
1032 ; AVX512-NEXT: sete %al
1033 ; AVX512-NEXT: vzeroupper
1035 %a0 = load i256, ptr %a
1036 %b0 = load i256, ptr %b
1037 %xor1 = xor i256 %a0, %b0
1038 %ap1 = getelementptr i256, ptr %a, i256 1
1039 %bp1 = getelementptr i256, ptr %b, i256 1
1040 %a1 = load i256, ptr %ap1
1041 %b1 = load i256, ptr %bp1
1042 %xor2 = xor i256 %a1, %b1
1043 %or = or i256 %xor1, %xor2
1044 %cmp = icmp eq i256 %or, 0
1045 %z = zext i1 %cmp to i32
1049 ; This test models the expansion of 'memcmp(a, b, 64) != 0'
1050 ; if we allowed 2 pairs of 64-byte loads per block.
1052 define i32 @ne_i512_pair(ptr %a, ptr %b) {
1053 ; NO512-LABEL: ne_i512_pair:
1055 ; NO512-NEXT: movq 40(%rdi), %rax
1056 ; NO512-NEXT: movq 56(%rdi), %rcx
1057 ; NO512-NEXT: movq 24(%rdi), %rdx
1058 ; NO512-NEXT: xorq 24(%rsi), %rdx
1059 ; NO512-NEXT: xorq 56(%rsi), %rcx
1060 ; NO512-NEXT: movq 88(%rdi), %r8
1061 ; NO512-NEXT: xorq 88(%rsi), %r8
1062 ; NO512-NEXT: orq %rdx, %r8
1063 ; NO512-NEXT: movq 120(%rdi), %rdx
1064 ; NO512-NEXT: xorq 120(%rsi), %rdx
1065 ; NO512-NEXT: orq %rcx, %rdx
1066 ; NO512-NEXT: movq 8(%rdi), %rcx
1067 ; NO512-NEXT: xorq 8(%rsi), %rcx
1068 ; NO512-NEXT: xorq 40(%rsi), %rax
1069 ; NO512-NEXT: orq %r8, %rdx
1070 ; NO512-NEXT: movq 72(%rdi), %r8
1071 ; NO512-NEXT: xorq 72(%rsi), %r8
1072 ; NO512-NEXT: orq %rcx, %r8
1073 ; NO512-NEXT: movq 104(%rdi), %rcx
1074 ; NO512-NEXT: xorq 104(%rsi), %rcx
1075 ; NO512-NEXT: orq %rax, %rcx
1076 ; NO512-NEXT: movq 48(%rdi), %rax
1077 ; NO512-NEXT: orq %r8, %rcx
1078 ; NO512-NEXT: movq 16(%rdi), %r8
1079 ; NO512-NEXT: xorq 16(%rsi), %r8
1080 ; NO512-NEXT: xorq 48(%rsi), %rax
1081 ; NO512-NEXT: orq %rdx, %rcx
1082 ; NO512-NEXT: movq 80(%rdi), %rdx
1083 ; NO512-NEXT: xorq 80(%rsi), %rdx
1084 ; NO512-NEXT: orq %r8, %rdx
1085 ; NO512-NEXT: movq 112(%rdi), %r8
1086 ; NO512-NEXT: xorq 112(%rsi), %r8
1087 ; NO512-NEXT: orq %rax, %r8
1088 ; NO512-NEXT: movq (%rdi), %rax
1089 ; NO512-NEXT: xorq (%rsi), %rax
1090 ; NO512-NEXT: orq %rdx, %r8
1091 ; NO512-NEXT: movq 64(%rdi), %rdx
1092 ; NO512-NEXT: xorq 64(%rsi), %rdx
1093 ; NO512-NEXT: orq %rax, %rdx
1094 ; NO512-NEXT: movq 32(%rdi), %rax
1095 ; NO512-NEXT: xorq 32(%rsi), %rax
1096 ; NO512-NEXT: movq 96(%rdi), %rdi
1097 ; NO512-NEXT: xorq 96(%rsi), %rdi
1098 ; NO512-NEXT: orq %rax, %rdi
1099 ; NO512-NEXT: orq %rdx, %rdi
1100 ; NO512-NEXT: orq %r8, %rdi
1101 ; NO512-NEXT: xorl %eax, %eax
1102 ; NO512-NEXT: orq %rcx, %rdi
1103 ; NO512-NEXT: setne %al
1106 ; AVX512F-LABEL: ne_i512_pair:
1108 ; AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
1109 ; AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
1110 ; AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0
1111 ; AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1
1112 ; AVX512F-NEXT: xorl %eax, %eax
1113 ; AVX512F-NEXT: kortestw %k0, %k1
1114 ; AVX512F-NEXT: setne %al
1115 ; AVX512F-NEXT: vzeroupper
1116 ; AVX512F-NEXT: retq
1118 ; AVX512BW-LABEL: ne_i512_pair:
1119 ; AVX512BW: # %bb.0:
1120 ; AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0
1121 ; AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1
1122 ; AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k0
1123 ; AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k1
1124 ; AVX512BW-NEXT: xorl %eax, %eax
1125 ; AVX512BW-NEXT: kortestq %k0, %k1
1126 ; AVX512BW-NEXT: setne %al
1127 ; AVX512BW-NEXT: vzeroupper
1128 ; AVX512BW-NEXT: retq
1129 %a0 = load i512, ptr %a
1130 %b0 = load i512, ptr %b
1131 %xor1 = xor i512 %a0, %b0
1132 %ap1 = getelementptr i512, ptr %a, i512 1
1133 %bp1 = getelementptr i512, ptr %b, i512 1
1134 %a1 = load i512, ptr %ap1
1135 %b1 = load i512, ptr %bp1
1136 %xor2 = xor i512 %a1, %b1
1137 %or = or i512 %xor1, %xor2
1138 %cmp = icmp ne i512 %or, 0
1139 %z = zext i1 %cmp to i32
1143 ; This test models the expansion of 'memcmp(a, b, 64) == 0'
1144 ; if we allowed 2 pairs of 64-byte loads per block.
1146 define i32 @eq_i512_pair(ptr %a, ptr %b) {
1147 ; NO512-LABEL: eq_i512_pair:
1149 ; NO512-NEXT: movq 40(%rdi), %rax
1150 ; NO512-NEXT: movq 56(%rdi), %rcx
1151 ; NO512-NEXT: movq 24(%rdi), %rdx
1152 ; NO512-NEXT: xorq 24(%rsi), %rdx
1153 ; NO512-NEXT: xorq 56(%rsi), %rcx
1154 ; NO512-NEXT: movq 88(%rdi), %r8
1155 ; NO512-NEXT: xorq 88(%rsi), %r8
1156 ; NO512-NEXT: orq %rdx, %r8
1157 ; NO512-NEXT: movq 120(%rdi), %rdx
1158 ; NO512-NEXT: xorq 120(%rsi), %rdx
1159 ; NO512-NEXT: orq %rcx, %rdx
1160 ; NO512-NEXT: movq 8(%rdi), %rcx
1161 ; NO512-NEXT: xorq 8(%rsi), %rcx
1162 ; NO512-NEXT: xorq 40(%rsi), %rax
1163 ; NO512-NEXT: orq %r8, %rdx
1164 ; NO512-NEXT: movq 72(%rdi), %r8
1165 ; NO512-NEXT: xorq 72(%rsi), %r8
1166 ; NO512-NEXT: orq %rcx, %r8
1167 ; NO512-NEXT: movq 104(%rdi), %rcx
1168 ; NO512-NEXT: xorq 104(%rsi), %rcx
1169 ; NO512-NEXT: orq %rax, %rcx
1170 ; NO512-NEXT: movq 48(%rdi), %rax
1171 ; NO512-NEXT: orq %r8, %rcx
1172 ; NO512-NEXT: movq 16(%rdi), %r8
1173 ; NO512-NEXT: xorq 16(%rsi), %r8
1174 ; NO512-NEXT: xorq 48(%rsi), %rax
1175 ; NO512-NEXT: orq %rdx, %rcx
1176 ; NO512-NEXT: movq 80(%rdi), %rdx
1177 ; NO512-NEXT: xorq 80(%rsi), %rdx
1178 ; NO512-NEXT: orq %r8, %rdx
1179 ; NO512-NEXT: movq 112(%rdi), %r8
1180 ; NO512-NEXT: xorq 112(%rsi), %r8
1181 ; NO512-NEXT: orq %rax, %r8
1182 ; NO512-NEXT: movq (%rdi), %rax
1183 ; NO512-NEXT: xorq (%rsi), %rax
1184 ; NO512-NEXT: orq %rdx, %r8
1185 ; NO512-NEXT: movq 64(%rdi), %rdx
1186 ; NO512-NEXT: xorq 64(%rsi), %rdx
1187 ; NO512-NEXT: orq %rax, %rdx
1188 ; NO512-NEXT: movq 32(%rdi), %rax
1189 ; NO512-NEXT: xorq 32(%rsi), %rax
1190 ; NO512-NEXT: movq 96(%rdi), %rdi
1191 ; NO512-NEXT: xorq 96(%rsi), %rdi
1192 ; NO512-NEXT: orq %rax, %rdi
1193 ; NO512-NEXT: orq %rdx, %rdi
1194 ; NO512-NEXT: orq %r8, %rdi
1195 ; NO512-NEXT: xorl %eax, %eax
1196 ; NO512-NEXT: orq %rcx, %rdi
1197 ; NO512-NEXT: sete %al
1200 ; AVX512F-LABEL: eq_i512_pair:
1202 ; AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
1203 ; AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1
1204 ; AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0
1205 ; AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1
1206 ; AVX512F-NEXT: xorl %eax, %eax
1207 ; AVX512F-NEXT: kortestw %k0, %k1
1208 ; AVX512F-NEXT: sete %al
1209 ; AVX512F-NEXT: vzeroupper
1210 ; AVX512F-NEXT: retq
1212 ; AVX512BW-LABEL: eq_i512_pair:
1213 ; AVX512BW: # %bb.0:
1214 ; AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0
1215 ; AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1
1216 ; AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k0
1217 ; AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k1
1218 ; AVX512BW-NEXT: xorl %eax, %eax
1219 ; AVX512BW-NEXT: kortestq %k0, %k1
1220 ; AVX512BW-NEXT: sete %al
1221 ; AVX512BW-NEXT: vzeroupper
1222 ; AVX512BW-NEXT: retq
1223 %a0 = load i512, ptr %a
1224 %b0 = load i512, ptr %b
1225 %xor1 = xor i512 %a0, %b0
1226 %ap1 = getelementptr i512, ptr %a, i512 1
1227 %bp1 = getelementptr i512, ptr %b, i512 1
1228 %a1 = load i512, ptr %ap1
1229 %b1 = load i512, ptr %bp1
1230 %xor2 = xor i512 %a1, %b1
1231 %or = or i512 %xor1, %xor2
1232 %cmp = icmp eq i512 %or, 0
1233 %z = zext i1 %cmp to i32
1237 ; PR41971: Comparison using vector types is not favorable here.
1238 define i1 @eq_i128_args(i128 %a, i128 %b) {
1239 ; ANY-LABEL: eq_i128_args:
1241 ; ANY-NEXT: xorq %rcx, %rsi
1242 ; ANY-NEXT: xorq %rdx, %rdi
1243 ; ANY-NEXT: orq %rsi, %rdi
1244 ; ANY-NEXT: sete %al
1246 %r = icmp eq i128 %a, %b
1250 define i1 @eq_i256_args(i256 %a, i256 %b) {
1251 ; ANY-LABEL: eq_i256_args:
1253 ; ANY-NEXT: xorq %r9, %rsi
1254 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rcx
1255 ; ANY-NEXT: orq %rsi, %rcx
1256 ; ANY-NEXT: xorq %r8, %rdi
1257 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rdx
1258 ; ANY-NEXT: orq %rdi, %rdx
1259 ; ANY-NEXT: orq %rcx, %rdx
1260 ; ANY-NEXT: sete %al
1262 %r = icmp eq i256 %a, %b
1266 define i1 @eq_i512_args(i512 %a, i512 %b) {
1267 ; ANY-LABEL: eq_i512_args:
1269 ; ANY-NEXT: movq {{[0-9]+}}(%rsp), %rax
1270 ; ANY-NEXT: movq {{[0-9]+}}(%rsp), %r10
1271 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %r10
1272 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rcx
1273 ; ANY-NEXT: orq %r10, %rcx
1274 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %r9
1275 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rsi
1276 ; ANY-NEXT: orq %r9, %rsi
1277 ; ANY-NEXT: orq %rcx, %rsi
1278 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rax
1279 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rdx
1280 ; ANY-NEXT: orq %rax, %rdx
1281 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %r8
1282 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rdi
1283 ; ANY-NEXT: orq %r8, %rdi
1284 ; ANY-NEXT: orq %rdx, %rdi
1285 ; ANY-NEXT: orq %rsi, %rdi
1286 ; ANY-NEXT: sete %al
1288 %r = icmp eq i512 %a, %b
1292 define i1 @eq_i128_op(i128 %a, i128 %b) {
1293 ; ANY-LABEL: eq_i128_op:
1295 ; ANY-NEXT: addq $1, %rdi
1296 ; ANY-NEXT: adcq $0, %rsi
1297 ; ANY-NEXT: xorq %rdx, %rdi
1298 ; ANY-NEXT: xorq %rcx, %rsi
1299 ; ANY-NEXT: orq %rdi, %rsi
1300 ; ANY-NEXT: sete %al
1302 %a2 = add i128 %a, 1
1303 %r = icmp eq i128 %a2, %b
1307 define i1 @eq_i256_op(i256 %a, i256 %b) {
1308 ; ANY-LABEL: eq_i256_op:
1310 ; ANY-NEXT: addq $1, %rdi
1311 ; ANY-NEXT: adcq $0, %rsi
1312 ; ANY-NEXT: adcq $0, %rdx
1313 ; ANY-NEXT: adcq $0, %rcx
1314 ; ANY-NEXT: xorq %r8, %rdi
1315 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rdx
1316 ; ANY-NEXT: orq %rdi, %rdx
1317 ; ANY-NEXT: xorq %r9, %rsi
1318 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rcx
1319 ; ANY-NEXT: orq %rsi, %rcx
1320 ; ANY-NEXT: orq %rdx, %rcx
1321 ; ANY-NEXT: sete %al
1323 %a2 = add i256 %a, 1
1324 %r = icmp eq i256 %a2, %b
1328 define i1 @eq_i512_op(i512 %a, i512 %b) {
1329 ; SSE-LABEL: eq_i512_op:
1331 ; SSE-NEXT: movq {{[0-9]+}}(%rsp), %rax
1332 ; SSE-NEXT: movq {{[0-9]+}}(%rsp), %r10
1333 ; SSE-NEXT: addq $1, %rdi
1334 ; SSE-NEXT: adcq $0, %rsi
1335 ; SSE-NEXT: adcq $0, %rdx
1336 ; SSE-NEXT: adcq $0, %rcx
1337 ; SSE-NEXT: adcq $0, %r8
1338 ; SSE-NEXT: adcq $0, %r9
1339 ; SSE-NEXT: adcq $0, %r10
1340 ; SSE-NEXT: adcq $0, %rax
1341 ; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %rsi
1342 ; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %r9
1343 ; SSE-NEXT: orq %rsi, %r9
1344 ; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %rcx
1345 ; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %rax
1346 ; SSE-NEXT: orq %rcx, %rax
1347 ; SSE-NEXT: orq %r9, %rax
1348 ; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %rdx
1349 ; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %r10
1350 ; SSE-NEXT: orq %rdx, %r10
1351 ; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %r8
1352 ; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %rdi
1353 ; SSE-NEXT: orq %r8, %rdi
1354 ; SSE-NEXT: orq %r10, %rdi
1355 ; SSE-NEXT: orq %rax, %rdi
1356 ; SSE-NEXT: sete %al
1359 ; AVXANY-LABEL: eq_i512_op:
1361 ; AVXANY-NEXT: movq {{[0-9]+}}(%rsp), %r10
1362 ; AVXANY-NEXT: movq {{[0-9]+}}(%rsp), %rax
1363 ; AVXANY-NEXT: addq $1, %rdi
1364 ; AVXANY-NEXT: adcq $0, %rsi
1365 ; AVXANY-NEXT: adcq $0, %rdx
1366 ; AVXANY-NEXT: adcq $0, %rcx
1367 ; AVXANY-NEXT: adcq $0, %r8
1368 ; AVXANY-NEXT: adcq $0, %r9
1369 ; AVXANY-NEXT: adcq $0, %r10
1370 ; AVXANY-NEXT: adcq $0, %rax
1371 ; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %rsi
1372 ; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %r9
1373 ; AVXANY-NEXT: orq %rsi, %r9
1374 ; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %rcx
1375 ; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %rax
1376 ; AVXANY-NEXT: orq %rcx, %rax
1377 ; AVXANY-NEXT: orq %r9, %rax
1378 ; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %rdx
1379 ; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %r10
1380 ; AVXANY-NEXT: orq %rdx, %r10
1381 ; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %r8
1382 ; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %rdi
1383 ; AVXANY-NEXT: orq %r8, %rdi
1384 ; AVXANY-NEXT: orq %r10, %rdi
1385 ; AVXANY-NEXT: orq %rax, %rdi
1386 ; AVXANY-NEXT: sete %al
1388 %a2 = add i512 %a, 1
1389 %r = icmp eq i512 %a2, %b
1393 define i1 @eq_i128_load_arg(ptr%p, i128 %b) {
1394 ; ANY-LABEL: eq_i128_load_arg:
1396 ; ANY-NEXT: xorq 8(%rdi), %rdx
1397 ; ANY-NEXT: xorq (%rdi), %rsi
1398 ; ANY-NEXT: orq %rdx, %rsi
1399 ; ANY-NEXT: sete %al
1401 %a = load i128, ptr %p
1402 %r = icmp eq i128 %a, %b
1406 define i1 @eq_i256_load_arg(ptr%p, i256 %b) {
1407 ; ANY-LABEL: eq_i256_load_arg:
1409 ; ANY-NEXT: xorq 24(%rdi), %r8
1410 ; ANY-NEXT: xorq 8(%rdi), %rdx
1411 ; ANY-NEXT: orq %r8, %rdx
1412 ; ANY-NEXT: xorq 16(%rdi), %rcx
1413 ; ANY-NEXT: xorq (%rdi), %rsi
1414 ; ANY-NEXT: orq %rcx, %rsi
1415 ; ANY-NEXT: orq %rdx, %rsi
1416 ; ANY-NEXT: sete %al
1418 %a = load i256, ptr %p
1419 %r = icmp eq i256 %a, %b
1423 define i1 @eq_i512_load_arg(ptr%p, i512 %b) {
1424 ; ANY-LABEL: eq_i512_load_arg:
1426 ; ANY-NEXT: movq 40(%rdi), %rax
1427 ; ANY-NEXT: movq 48(%rdi), %r10
1428 ; ANY-NEXT: movq 56(%rdi), %r11
1429 ; ANY-NEXT: xorq 24(%rdi), %r8
1430 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %r11
1431 ; ANY-NEXT: orq %r8, %r11
1432 ; ANY-NEXT: xorq 8(%rdi), %rdx
1433 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rax
1434 ; ANY-NEXT: orq %rdx, %rax
1435 ; ANY-NEXT: orq %r11, %rax
1436 ; ANY-NEXT: xorq 32(%rdi), %r9
1437 ; ANY-NEXT: xorq (%rdi), %rsi
1438 ; ANY-NEXT: orq %r9, %rsi
1439 ; ANY-NEXT: xorq 16(%rdi), %rcx
1440 ; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %r10
1441 ; ANY-NEXT: orq %rcx, %r10
1442 ; ANY-NEXT: orq %rsi, %r10
1443 ; ANY-NEXT: orq %rax, %r10
1444 ; ANY-NEXT: sete %al
1446 %a = load i512, ptr %p
1447 %r = icmp eq i512 %a, %b