[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / setcc-wide-types.ll
blob5aa266db6553d3f5e2432ba47be1e155aecf7799
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:
13 ; SSE2:       # %bb.0:
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
19 ; SSE2-NEXT:    retq
21 ; SSE41-LABEL: ne_i128:
22 ; SSE41:       # %bb.0:
23 ; SSE41-NEXT:    pxor %xmm1, %xmm0
24 ; SSE41-NEXT:    xorl %eax, %eax
25 ; SSE41-NEXT:    ptest %xmm0, %xmm0
26 ; SSE41-NEXT:    setne %al
27 ; SSE41-NEXT:    retq
29 ; AVXANY-LABEL: ne_i128:
30 ; AVXANY:       # %bb.0:
31 ; AVXANY-NEXT:    vpxor %xmm1, %xmm0, %xmm0
32 ; AVXANY-NEXT:    xorl %eax, %eax
33 ; AVXANY-NEXT:    vptest %xmm0, %xmm0
34 ; AVXANY-NEXT:    setne %al
35 ; AVXANY-NEXT:    retq
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
40   ret i32 %zext
43 define i32 @eq_i128(<2 x i64> %x, <2 x i64> %y) {
44 ; SSE2-LABEL: eq_i128:
45 ; SSE2:       # %bb.0:
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
50 ; SSE2-NEXT:    sete %al
51 ; SSE2-NEXT:    retq
53 ; SSE41-LABEL: eq_i128:
54 ; SSE41:       # %bb.0:
55 ; SSE41-NEXT:    pxor %xmm1, %xmm0
56 ; SSE41-NEXT:    xorl %eax, %eax
57 ; SSE41-NEXT:    ptest %xmm0, %xmm0
58 ; SSE41-NEXT:    sete %al
59 ; SSE41-NEXT:    retq
61 ; AVXANY-LABEL: eq_i128:
62 ; AVXANY:       # %bb.0:
63 ; AVXANY-NEXT:    vpxor %xmm1, %xmm0, %xmm0
64 ; AVXANY-NEXT:    xorl %eax, %eax
65 ; AVXANY-NEXT:    vptest %xmm0, %xmm0
66 ; AVXANY-NEXT:    sete %al
67 ; AVXANY-NEXT:    retq
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
72   ret i32 %zext
75 define i32 @ne_i256(<4 x i64> %x, <4 x i64> %y) {
76 ; SSE2-LABEL: ne_i256:
77 ; SSE2:       # %bb.0:
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
99 ; SSE2-NEXT:    retq
101 ; SSE41-LABEL: ne_i256:
102 ; SSE41:       # %bb.0:
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
120 ; SSE41-NEXT:    retq
122 ; AVX1-LABEL: ne_i256:
123 ; AVX1:       # %bb.0:
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
129 ; AVX1-NEXT:    retq
131 ; AVX2-LABEL: ne_i256:
132 ; AVX2:       # %bb.0:
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
138 ; AVX2-NEXT:    retq
140 ; AVX512-LABEL: ne_i256:
141 ; AVX512:       # %bb.0:
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
147 ; AVX512-NEXT:    retq
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
152   ret i32 %zext
155 define i32 @eq_i256(<4 x i64> %x, <4 x i64> %y) {
156 ; SSE2-LABEL: eq_i256:
157 ; SSE2:       # %bb.0:
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
179 ; SSE2-NEXT:    retq
181 ; SSE41-LABEL: eq_i256:
182 ; SSE41:       # %bb.0:
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
200 ; SSE41-NEXT:    retq
202 ; AVX1-LABEL: eq_i256:
203 ; AVX1:       # %bb.0:
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
209 ; AVX1-NEXT:    retq
211 ; AVX2-LABEL: eq_i256:
212 ; AVX2:       # %bb.0:
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
218 ; AVX2-NEXT:    retq
220 ; AVX512-LABEL: eq_i256:
221 ; AVX512:       # %bb.0:
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
227 ; AVX512-NEXT:    retq
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
232   ret i32 %zext
235 define i32 @ne_i512(<8 x i64> %x, <8 x i64> %y) {
236 ; SSE2-LABEL: ne_i512:
237 ; SSE2:       # %bb.0:
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
279 ; SSE2-NEXT:    retq
281 ; SSE41-LABEL: ne_i512:
282 ; SSE41:       # %bb.0:
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
316 ; SSE41-NEXT:    retq
318 ; AVX1-LABEL: ne_i512:
319 ; AVX1:       # %bb.0:
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
358 ; AVX1-NEXT:    retq
360 ; AVX2-LABEL: ne_i512:
361 ; AVX2:       # %bb.0:
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
400 ; AVX2-NEXT:    retq
402 ; AVX512-LABEL: ne_i512:
403 ; AVX512:       # %bb.0:
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
409 ; AVX512-NEXT:    retq
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
414   ret i32 %zext
417 define i32 @eq_i512(<8 x i64> %x, <8 x i64> %y) {
418 ; SSE2-LABEL: eq_i512:
419 ; SSE2:       # %bb.0:
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
461 ; SSE2-NEXT:    retq
463 ; SSE41-LABEL: eq_i512:
464 ; SSE41:       # %bb.0:
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
498 ; SSE41-NEXT:    retq
500 ; AVX1-LABEL: eq_i512:
501 ; AVX1:       # %bb.0:
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
540 ; AVX1-NEXT:    retq
542 ; AVX2-LABEL: eq_i512:
543 ; AVX2:       # %bb.0:
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
582 ; AVX2-NEXT:    retq
584 ; AVX512-LABEL: eq_i512:
585 ; AVX512:       # %bb.0:
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
591 ; AVX512-NEXT:    retq
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
596   ret i32 %zext
599 define i1 @ne_v4i256(<4 x i256> %a0) {
600 ; SSE2-LABEL: ne_v4i256:
601 ; SSE2:       # %bb.0:
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
632 ; SSE2-NEXT:    retq
634 ; SSE41-LABEL: ne_v4i256:
635 ; SSE41:       # %bb.0:
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
663 ; SSE41-NEXT:    retq
665 ; AVX1-LABEL: ne_v4i256:
666 ; AVX1:       # %bb.0:
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
691 ; AVX1-NEXT:    retq
693 ; AVX2-LABEL: ne_v4i256:
694 ; AVX2:       # %bb.0:
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
719 ; AVX2-NEXT:    retq
721 ; AVX512-LABEL: ne_v4i256:
722 ; AVX512:       # %bb.0:
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
764 ; AVX512-NEXT:    retq
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
768   ret i1 %r
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:
776 ; SSE2:       # %bb.0:
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
786 ; SSE2-NEXT:    retq
788 ; SSE41-LABEL: ne_i128_pair:
789 ; SSE41:       # %bb.0:
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
798 ; SSE41-NEXT:    retq
800 ; AVXANY-LABEL: ne_i128_pair:
801 ; AVXANY:       # %bb.0:
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
810 ; AVXANY-NEXT:    retq
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
822   ret i32 %z
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:
830 ; SSE2:       # %bb.0:
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
840 ; SSE2-NEXT:    retq
842 ; SSE41-LABEL: eq_i128_pair:
843 ; SSE41:       # %bb.0:
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
852 ; SSE41-NEXT:    retq
854 ; AVXANY-LABEL: eq_i128_pair:
855 ; AVXANY:       # %bb.0:
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
864 ; AVXANY-NEXT:    retq
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
876   ret i32 %z
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:
884 ; SSE:       # %bb.0:
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
910 ; SSE-NEXT:    retq
912 ; AVX1-LABEL: ne_i256_pair:
913 ; AVX1:       # %bb.0:
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
923 ; AVX1-NEXT:    retq
925 ; AVX2-LABEL: ne_i256_pair:
926 ; AVX2:       # %bb.0:
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
936 ; AVX2-NEXT:    retq
938 ; AVX512-LABEL: ne_i256_pair:
939 ; AVX512:       # %bb.0:
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
949 ; AVX512-NEXT:    retq
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
961   ret i32 %z
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:
969 ; SSE:       # %bb.0:
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
994 ; SSE-NEXT:    sete %al
995 ; SSE-NEXT:    retq
997 ; AVX1-LABEL: eq_i256_pair:
998 ; AVX1:       # %bb.0:
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
1008 ; AVX1-NEXT:    retq
1010 ; AVX2-LABEL: eq_i256_pair:
1011 ; AVX2:       # %bb.0:
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
1021 ; AVX2-NEXT:    retq
1023 ; AVX512-LABEL: eq_i256_pair:
1024 ; AVX512:       # %bb.0:
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
1034 ; AVX512-NEXT:    retq
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
1046   ret i32 %z
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:
1054 ; NO512:       # %bb.0:
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
1104 ; NO512-NEXT:    retq
1106 ; AVX512F-LABEL: ne_i512_pair:
1107 ; AVX512F:       # %bb.0:
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
1140   ret i32 %z
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:
1148 ; NO512:       # %bb.0:
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
1198 ; NO512-NEXT:    retq
1200 ; AVX512F-LABEL: eq_i512_pair:
1201 ; AVX512F:       # %bb.0:
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
1234   ret i32 %z
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:
1240 ; ANY:       # %bb.0:
1241 ; ANY-NEXT:    xorq %rcx, %rsi
1242 ; ANY-NEXT:    xorq %rdx, %rdi
1243 ; ANY-NEXT:    orq %rsi, %rdi
1244 ; ANY-NEXT:    sete %al
1245 ; ANY-NEXT:    retq
1246   %r = icmp eq i128 %a, %b
1247   ret i1 %r
1250 define i1 @eq_i256_args(i256 %a, i256 %b) {
1251 ; ANY-LABEL: eq_i256_args:
1252 ; ANY:       # %bb.0:
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
1261 ; ANY-NEXT:    retq
1262   %r = icmp eq i256 %a, %b
1263   ret i1 %r
1266 define i1 @eq_i512_args(i512 %a, i512 %b) {
1267 ; ANY-LABEL: eq_i512_args:
1268 ; ANY:       # %bb.0:
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
1287 ; ANY-NEXT:    retq
1288   %r = icmp eq i512 %a, %b
1289   ret i1 %r
1292 define i1 @eq_i128_op(i128 %a, i128 %b) {
1293 ; ANY-LABEL: eq_i128_op:
1294 ; ANY:       # %bb.0:
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
1301 ; ANY-NEXT:    retq
1302   %a2 = add i128 %a, 1
1303   %r = icmp eq i128 %a2, %b
1304   ret i1 %r
1307 define i1 @eq_i256_op(i256 %a, i256 %b) {
1308 ; ANY-LABEL: eq_i256_op:
1309 ; ANY:       # %bb.0:
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
1322 ; ANY-NEXT:    retq
1323   %a2 = add i256 %a, 1
1324   %r = icmp eq i256 %a2, %b
1325   ret i1 %r
1328 define i1 @eq_i512_op(i512 %a, i512 %b) {
1329 ; SSE-LABEL: eq_i512_op:
1330 ; SSE:       # %bb.0:
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
1357 ; SSE-NEXT:    retq
1359 ; AVXANY-LABEL: eq_i512_op:
1360 ; AVXANY:       # %bb.0:
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
1387 ; AVXANY-NEXT:    retq
1388   %a2 = add i512 %a, 1
1389   %r = icmp eq i512 %a2, %b
1390   ret i1 %r
1393 define i1 @eq_i128_load_arg(ptr%p, i128 %b) {
1394 ; ANY-LABEL: eq_i128_load_arg:
1395 ; ANY:       # %bb.0:
1396 ; ANY-NEXT:    xorq 8(%rdi), %rdx
1397 ; ANY-NEXT:    xorq (%rdi), %rsi
1398 ; ANY-NEXT:    orq %rdx, %rsi
1399 ; ANY-NEXT:    sete %al
1400 ; ANY-NEXT:    retq
1401   %a = load i128, ptr %p
1402   %r = icmp eq i128 %a, %b
1403   ret i1 %r
1406 define i1 @eq_i256_load_arg(ptr%p, i256 %b) {
1407 ; ANY-LABEL: eq_i256_load_arg:
1408 ; ANY:       # %bb.0:
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
1417 ; ANY-NEXT:    retq
1418   %a = load i256, ptr %p
1419   %r = icmp eq i256 %a, %b
1420   ret i1 %r
1423 define i1 @eq_i512_load_arg(ptr%p, i512 %b) {
1424 ; ANY-LABEL: eq_i512_load_arg:
1425 ; ANY:       # %bb.0:
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
1445 ; ANY-NEXT:    retq
1446   %a = load i512, ptr %p
1447   %r = icmp eq i512 %a, %b
1448   ret i1 %r