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