[Demangle] Add a few more options to the microsoft demangler
[llvm-complete.git] / test / CodeGen / X86 / setcc-wide-types.ll
blob58baea95fcd0b2f7ced0af20d91a4d50127c9670
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 ; AVX512F-LABEL: ne_i512:
323 ; AVX512F:       # %bb.0:
324 ; AVX512F-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
325 ; AVX512F-NEXT:    xorl %eax, %eax
326 ; AVX512F-NEXT:    kortestw %k0, %k0
327 ; AVX512F-NEXT:    setae %al
328 ; AVX512F-NEXT:    vzeroupper
329 ; AVX512F-NEXT:    retq
331 ; AVX512BW-LABEL: ne_i512:
332 ; AVX512BW:       # %bb.0:
333 ; AVX512BW-NEXT:    vpcmpeqb %zmm1, %zmm0, %k0
334 ; AVX512BW-NEXT:    xorl %eax, %eax
335 ; AVX512BW-NEXT:    kortestq %k0, %k0
336 ; AVX512BW-NEXT:    setae %al
337 ; AVX512BW-NEXT:    vzeroupper
338 ; AVX512BW-NEXT:    retq
339   %bcx = bitcast <8 x i64> %x to i512
340   %bcy = bitcast <8 x i64> %y to i512
341   %cmp = icmp ne i512 %bcx, %bcy
342   %zext = zext i1 %cmp to i32
343   ret i32 %zext
346 define i32 @eq_i512(<8 x i64> %x, <8 x i64> %y) {
347 ; SSE2-LABEL: eq_i512:
348 ; SSE2:       # %bb.0:
349 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm0[2,3,0,1]
350 ; SSE2-NEXT:    movq %xmm8, %rax
351 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm2[2,3,0,1]
352 ; SSE2-NEXT:    movq %xmm8, %rcx
353 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm1[2,3,0,1]
354 ; SSE2-NEXT:    movq %xmm8, %rdx
355 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[2,3,0,1]
356 ; SSE2-NEXT:    movq %xmm8, %rsi
357 ; SSE2-NEXT:    movq %xmm0, %r11
358 ; SSE2-NEXT:    movq %xmm2, %r8
359 ; SSE2-NEXT:    movq %xmm1, %r9
360 ; SSE2-NEXT:    movq %xmm3, %r10
361 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
362 ; SSE2-NEXT:    movq %xmm0, %rdi
363 ; SSE2-NEXT:    xorq %rax, %rdi
364 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[2,3,0,1]
365 ; SSE2-NEXT:    movq %xmm0, %rax
366 ; SSE2-NEXT:    xorq %rcx, %rax
367 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[2,3,0,1]
368 ; SSE2-NEXT:    movq %xmm0, %rcx
369 ; SSE2-NEXT:    xorq %rdx, %rcx
370 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[2,3,0,1]
371 ; SSE2-NEXT:    movq %xmm0, %rdx
372 ; SSE2-NEXT:    xorq %rsi, %rdx
373 ; SSE2-NEXT:    orq %rcx, %rdx
374 ; SSE2-NEXT:    orq %rax, %rdx
375 ; SSE2-NEXT:    orq %rdi, %rdx
376 ; SSE2-NEXT:    movq %xmm4, %rax
377 ; SSE2-NEXT:    xorq %r11, %rax
378 ; SSE2-NEXT:    movq %xmm6, %rcx
379 ; SSE2-NEXT:    xorq %r8, %rcx
380 ; SSE2-NEXT:    movq %xmm5, %rsi
381 ; SSE2-NEXT:    xorq %r9, %rsi
382 ; SSE2-NEXT:    movq %xmm7, %rdi
383 ; SSE2-NEXT:    xorq %r10, %rdi
384 ; SSE2-NEXT:    orq %rsi, %rdi
385 ; SSE2-NEXT:    orq %rcx, %rdi
386 ; SSE2-NEXT:    orq %rax, %rdi
387 ; SSE2-NEXT:    xorl %eax, %eax
388 ; SSE2-NEXT:    orq %rdx, %rdi
389 ; SSE2-NEXT:    sete %al
390 ; SSE2-NEXT:    retq
392 ; AVX1-LABEL: eq_i512:
393 ; AVX1:       # %bb.0:
394 ; AVX1-NEXT:    vmovq %xmm0, %rax
395 ; AVX1-NEXT:    vmovq %xmm1, %rcx
396 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
397 ; AVX1-NEXT:    vmovq %xmm4, %rdx
398 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
399 ; AVX1-NEXT:    vmovq %xmm5, %rsi
400 ; AVX1-NEXT:    vpextrq $1, %xmm0, %r11
401 ; AVX1-NEXT:    vpextrq $1, %xmm1, %r8
402 ; AVX1-NEXT:    vpextrq $1, %xmm4, %r9
403 ; AVX1-NEXT:    vpextrq $1, %xmm5, %r10
404 ; AVX1-NEXT:    vmovq %xmm2, %rdi
405 ; AVX1-NEXT:    xorq %rax, %rdi
406 ; AVX1-NEXT:    vmovq %xmm3, %rax
407 ; AVX1-NEXT:    xorq %rcx, %rax
408 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm0
409 ; AVX1-NEXT:    vmovq %xmm0, %rcx
410 ; AVX1-NEXT:    xorq %rdx, %rcx
411 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm1
412 ; AVX1-NEXT:    vmovq %xmm1, %rdx
413 ; AVX1-NEXT:    xorq %rsi, %rdx
414 ; AVX1-NEXT:    orq %rcx, %rdx
415 ; AVX1-NEXT:    orq %rax, %rdx
416 ; AVX1-NEXT:    orq %rdi, %rdx
417 ; AVX1-NEXT:    vpextrq $1, %xmm2, %rax
418 ; AVX1-NEXT:    xorq %r11, %rax
419 ; AVX1-NEXT:    vpextrq $1, %xmm3, %rcx
420 ; AVX1-NEXT:    xorq %r8, %rcx
421 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rsi
422 ; AVX1-NEXT:    xorq %r9, %rsi
423 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rdi
424 ; AVX1-NEXT:    xorq %r10, %rdi
425 ; AVX1-NEXT:    orq %rsi, %rdi
426 ; AVX1-NEXT:    orq %rcx, %rdi
427 ; AVX1-NEXT:    orq %rax, %rdi
428 ; AVX1-NEXT:    xorl %eax, %eax
429 ; AVX1-NEXT:    orq %rdx, %rdi
430 ; AVX1-NEXT:    sete %al
431 ; AVX1-NEXT:    vzeroupper
432 ; AVX1-NEXT:    retq
434 ; AVX2-LABEL: eq_i512:
435 ; AVX2:       # %bb.0:
436 ; AVX2-NEXT:    vmovq %xmm0, %rax
437 ; AVX2-NEXT:    vmovq %xmm1, %rcx
438 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
439 ; AVX2-NEXT:    vmovq %xmm4, %rdx
440 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm5
441 ; AVX2-NEXT:    vmovq %xmm5, %rsi
442 ; AVX2-NEXT:    vpextrq $1, %xmm0, %r11
443 ; AVX2-NEXT:    vpextrq $1, %xmm1, %r8
444 ; AVX2-NEXT:    vpextrq $1, %xmm4, %r9
445 ; AVX2-NEXT:    vpextrq $1, %xmm5, %r10
446 ; AVX2-NEXT:    vmovq %xmm2, %rdi
447 ; AVX2-NEXT:    xorq %rax, %rdi
448 ; AVX2-NEXT:    vmovq %xmm3, %rax
449 ; AVX2-NEXT:    xorq %rcx, %rax
450 ; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm0
451 ; AVX2-NEXT:    vmovq %xmm0, %rcx
452 ; AVX2-NEXT:    xorq %rdx, %rcx
453 ; AVX2-NEXT:    vextracti128 $1, %ymm3, %xmm1
454 ; AVX2-NEXT:    vmovq %xmm1, %rdx
455 ; AVX2-NEXT:    xorq %rsi, %rdx
456 ; AVX2-NEXT:    orq %rcx, %rdx
457 ; AVX2-NEXT:    orq %rax, %rdx
458 ; AVX2-NEXT:    orq %rdi, %rdx
459 ; AVX2-NEXT:    vpextrq $1, %xmm2, %rax
460 ; AVX2-NEXT:    xorq %r11, %rax
461 ; AVX2-NEXT:    vpextrq $1, %xmm3, %rcx
462 ; AVX2-NEXT:    xorq %r8, %rcx
463 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rsi
464 ; AVX2-NEXT:    xorq %r9, %rsi
465 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rdi
466 ; AVX2-NEXT:    xorq %r10, %rdi
467 ; AVX2-NEXT:    orq %rsi, %rdi
468 ; AVX2-NEXT:    orq %rcx, %rdi
469 ; AVX2-NEXT:    orq %rax, %rdi
470 ; AVX2-NEXT:    xorl %eax, %eax
471 ; AVX2-NEXT:    orq %rdx, %rdi
472 ; AVX2-NEXT:    sete %al
473 ; AVX2-NEXT:    vzeroupper
474 ; AVX2-NEXT:    retq
476 ; AVX512F-LABEL: eq_i512:
477 ; AVX512F:       # %bb.0:
478 ; AVX512F-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
479 ; AVX512F-NEXT:    xorl %eax, %eax
480 ; AVX512F-NEXT:    kortestw %k0, %k0
481 ; AVX512F-NEXT:    setb %al
482 ; AVX512F-NEXT:    vzeroupper
483 ; AVX512F-NEXT:    retq
485 ; AVX512BW-LABEL: eq_i512:
486 ; AVX512BW:       # %bb.0:
487 ; AVX512BW-NEXT:    vpcmpeqb %zmm1, %zmm0, %k0
488 ; AVX512BW-NEXT:    xorl %eax, %eax
489 ; AVX512BW-NEXT:    kortestq %k0, %k0
490 ; AVX512BW-NEXT:    setb %al
491 ; AVX512BW-NEXT:    vzeroupper
492 ; AVX512BW-NEXT:    retq
493   %bcx = bitcast <8 x i64> %x to i512
494   %bcy = bitcast <8 x i64> %y to i512
495   %cmp = icmp eq i512 %bcx, %bcy
496   %zext = zext i1 %cmp to i32
497   ret i32 %zext
500 ; This test models the expansion of 'memcmp(a, b, 32) != 0'
501 ; if we allowed 2 pairs of 16-byte loads per block.
503 define i32 @ne_i128_pair(i128* %a, i128* %b) {
504 ; SSE2-LABEL: ne_i128_pair:
505 ; SSE2:       # %bb.0:
506 ; SSE2-NEXT:    movdqu (%rdi), %xmm0
507 ; SSE2-NEXT:    movdqu 16(%rdi), %xmm1
508 ; SSE2-NEXT:    movdqu (%rsi), %xmm2
509 ; SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
510 ; SSE2-NEXT:    movdqu 16(%rsi), %xmm0
511 ; SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
512 ; SSE2-NEXT:    pand %xmm2, %xmm0
513 ; SSE2-NEXT:    pmovmskb %xmm0, %ecx
514 ; SSE2-NEXT:    xorl %eax, %eax
515 ; SSE2-NEXT:    cmpl $65535, %ecx # imm = 0xFFFF
516 ; SSE2-NEXT:    setne %al
517 ; SSE2-NEXT:    retq
519 ; AVXANY-LABEL: ne_i128_pair:
520 ; AVXANY:       # %bb.0:
521 ; AVXANY-NEXT:    vmovdqu (%rdi), %xmm0
522 ; AVXANY-NEXT:    vmovdqu 16(%rdi), %xmm1
523 ; AVXANY-NEXT:    vpcmpeqb 16(%rsi), %xmm1, %xmm1
524 ; AVXANY-NEXT:    vpcmpeqb (%rsi), %xmm0, %xmm0
525 ; AVXANY-NEXT:    vpand %xmm1, %xmm0, %xmm0
526 ; AVXANY-NEXT:    vpmovmskb %xmm0, %ecx
527 ; AVXANY-NEXT:    xorl %eax, %eax
528 ; AVXANY-NEXT:    cmpl $65535, %ecx # imm = 0xFFFF
529 ; AVXANY-NEXT:    setne %al
530 ; AVXANY-NEXT:    retq
531   %a0 = load i128, i128* %a
532   %b0 = load i128, i128* %b
533   %xor1 = xor i128 %a0, %b0
534   %ap1 = getelementptr i128, i128* %a, i128 1
535   %bp1 = getelementptr i128, i128* %b, i128 1
536   %a1 = load i128, i128* %ap1
537   %b1 = load i128, i128* %bp1
538   %xor2 = xor i128 %a1, %b1
539   %or = or i128 %xor1, %xor2
540   %cmp = icmp ne i128 %or, 0
541   %z = zext i1 %cmp to i32
542   ret i32 %z
545 ; This test models the expansion of 'memcmp(a, b, 32) == 0'
546 ; if we allowed 2 pairs of 16-byte loads per block.
548 define i32 @eq_i128_pair(i128* %a, i128* %b) {
549 ; SSE2-LABEL: eq_i128_pair:
550 ; SSE2:       # %bb.0:
551 ; SSE2-NEXT:    movdqu (%rdi), %xmm0
552 ; SSE2-NEXT:    movdqu 16(%rdi), %xmm1
553 ; SSE2-NEXT:    movdqu (%rsi), %xmm2
554 ; SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
555 ; SSE2-NEXT:    movdqu 16(%rsi), %xmm0
556 ; SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
557 ; SSE2-NEXT:    pand %xmm2, %xmm0
558 ; SSE2-NEXT:    pmovmskb %xmm0, %ecx
559 ; SSE2-NEXT:    xorl %eax, %eax
560 ; SSE2-NEXT:    cmpl $65535, %ecx # imm = 0xFFFF
561 ; SSE2-NEXT:    sete %al
562 ; SSE2-NEXT:    retq
564 ; AVXANY-LABEL: eq_i128_pair:
565 ; AVXANY:       # %bb.0:
566 ; AVXANY-NEXT:    vmovdqu (%rdi), %xmm0
567 ; AVXANY-NEXT:    vmovdqu 16(%rdi), %xmm1
568 ; AVXANY-NEXT:    vpcmpeqb 16(%rsi), %xmm1, %xmm1
569 ; AVXANY-NEXT:    vpcmpeqb (%rsi), %xmm0, %xmm0
570 ; AVXANY-NEXT:    vpand %xmm1, %xmm0, %xmm0
571 ; AVXANY-NEXT:    vpmovmskb %xmm0, %ecx
572 ; AVXANY-NEXT:    xorl %eax, %eax
573 ; AVXANY-NEXT:    cmpl $65535, %ecx # imm = 0xFFFF
574 ; AVXANY-NEXT:    sete %al
575 ; AVXANY-NEXT:    retq
576   %a0 = load i128, i128* %a
577   %b0 = load i128, i128* %b
578   %xor1 = xor i128 %a0, %b0
579   %ap1 = getelementptr i128, i128* %a, i128 1
580   %bp1 = getelementptr i128, i128* %b, i128 1
581   %a1 = load i128, i128* %ap1
582   %b1 = load i128, i128* %bp1
583   %xor2 = xor i128 %a1, %b1
584   %or = or i128 %xor1, %xor2
585   %cmp = icmp eq i128 %or, 0
586   %z = zext i1 %cmp to i32
587   ret i32 %z
590 ; This test models the expansion of 'memcmp(a, b, 64) != 0'
591 ; if we allowed 2 pairs of 32-byte loads per block.
593 define i32 @ne_i256_pair(i256* %a, i256* %b) {
594 ; SSE2-LABEL: ne_i256_pair:
595 ; SSE2:       # %bb.0:
596 ; SSE2-NEXT:    movq 16(%rdi), %r9
597 ; SSE2-NEXT:    movq 24(%rdi), %r11
598 ; SSE2-NEXT:    movq (%rdi), %r8
599 ; SSE2-NEXT:    movq 8(%rdi), %r10
600 ; SSE2-NEXT:    xorq 8(%rsi), %r10
601 ; SSE2-NEXT:    xorq 24(%rsi), %r11
602 ; SSE2-NEXT:    xorq (%rsi), %r8
603 ; SSE2-NEXT:    xorq 16(%rsi), %r9
604 ; SSE2-NEXT:    movq 48(%rdi), %rdx
605 ; SSE2-NEXT:    movq 32(%rdi), %rax
606 ; SSE2-NEXT:    movq 56(%rdi), %rcx
607 ; SSE2-NEXT:    movq 40(%rdi), %rdi
608 ; SSE2-NEXT:    xorq 40(%rsi), %rdi
609 ; SSE2-NEXT:    xorq 56(%rsi), %rcx
610 ; SSE2-NEXT:    orq %r11, %rcx
611 ; SSE2-NEXT:    orq %rdi, %rcx
612 ; SSE2-NEXT:    orq %r10, %rcx
613 ; SSE2-NEXT:    xorq 32(%rsi), %rax
614 ; SSE2-NEXT:    xorq 48(%rsi), %rdx
615 ; SSE2-NEXT:    orq %r9, %rdx
616 ; SSE2-NEXT:    orq %rax, %rdx
617 ; SSE2-NEXT:    orq %r8, %rdx
618 ; SSE2-NEXT:    xorl %eax, %eax
619 ; SSE2-NEXT:    orq %rcx, %rdx
620 ; SSE2-NEXT:    setne %al
621 ; SSE2-NEXT:    retq
623 ; AVX1-LABEL: ne_i256_pair:
624 ; AVX1:       # %bb.0:
625 ; AVX1-NEXT:    movq 16(%rdi), %r9
626 ; AVX1-NEXT:    movq 24(%rdi), %r11
627 ; AVX1-NEXT:    movq (%rdi), %r8
628 ; AVX1-NEXT:    movq 8(%rdi), %r10
629 ; AVX1-NEXT:    xorq 8(%rsi), %r10
630 ; AVX1-NEXT:    xorq 24(%rsi), %r11
631 ; AVX1-NEXT:    xorq (%rsi), %r8
632 ; AVX1-NEXT:    xorq 16(%rsi), %r9
633 ; AVX1-NEXT:    movq 48(%rdi), %rdx
634 ; AVX1-NEXT:    movq 32(%rdi), %rax
635 ; AVX1-NEXT:    movq 56(%rdi), %rcx
636 ; AVX1-NEXT:    movq 40(%rdi), %rdi
637 ; AVX1-NEXT:    xorq 40(%rsi), %rdi
638 ; AVX1-NEXT:    xorq 56(%rsi), %rcx
639 ; AVX1-NEXT:    orq %r11, %rcx
640 ; AVX1-NEXT:    orq %rdi, %rcx
641 ; AVX1-NEXT:    orq %r10, %rcx
642 ; AVX1-NEXT:    xorq 32(%rsi), %rax
643 ; AVX1-NEXT:    xorq 48(%rsi), %rdx
644 ; AVX1-NEXT:    orq %r9, %rdx
645 ; AVX1-NEXT:    orq %rax, %rdx
646 ; AVX1-NEXT:    orq %r8, %rdx
647 ; AVX1-NEXT:    xorl %eax, %eax
648 ; AVX1-NEXT:    orq %rcx, %rdx
649 ; AVX1-NEXT:    setne %al
650 ; AVX1-NEXT:    retq
652 ; AVX256-LABEL: ne_i256_pair:
653 ; AVX256:       # %bb.0:
654 ; AVX256-NEXT:    vmovdqu (%rdi), %ymm0
655 ; AVX256-NEXT:    vmovdqu 32(%rdi), %ymm1
656 ; AVX256-NEXT:    vpcmpeqb 32(%rsi), %ymm1, %ymm1
657 ; AVX256-NEXT:    vpcmpeqb (%rsi), %ymm0, %ymm0
658 ; AVX256-NEXT:    vpand %ymm1, %ymm0, %ymm0
659 ; AVX256-NEXT:    vpmovmskb %ymm0, %ecx
660 ; AVX256-NEXT:    xorl %eax, %eax
661 ; AVX256-NEXT:    cmpl $-1, %ecx
662 ; AVX256-NEXT:    setne %al
663 ; AVX256-NEXT:    vzeroupper
664 ; AVX256-NEXT:    retq
665   %a0 = load i256, i256* %a
666   %b0 = load i256, i256* %b
667   %xor1 = xor i256 %a0, %b0
668   %ap1 = getelementptr i256, i256* %a, i256 1
669   %bp1 = getelementptr i256, i256* %b, i256 1
670   %a1 = load i256, i256* %ap1
671   %b1 = load i256, i256* %bp1
672   %xor2 = xor i256 %a1, %b1
673   %or = or i256 %xor1, %xor2
674   %cmp = icmp ne i256 %or, 0
675   %z = zext i1 %cmp to i32
676   ret i32 %z
679 ; This test models the expansion of 'memcmp(a, b, 64) == 0'
680 ; if we allowed 2 pairs of 32-byte loads per block.
682 define i32 @eq_i256_pair(i256* %a, i256* %b) {
683 ; SSE2-LABEL: eq_i256_pair:
684 ; SSE2:       # %bb.0:
685 ; SSE2-NEXT:    movq 16(%rdi), %r9
686 ; SSE2-NEXT:    movq 24(%rdi), %r11
687 ; SSE2-NEXT:    movq (%rdi), %r8
688 ; SSE2-NEXT:    movq 8(%rdi), %r10
689 ; SSE2-NEXT:    xorq 8(%rsi), %r10
690 ; SSE2-NEXT:    xorq 24(%rsi), %r11
691 ; SSE2-NEXT:    xorq (%rsi), %r8
692 ; SSE2-NEXT:    xorq 16(%rsi), %r9
693 ; SSE2-NEXT:    movq 48(%rdi), %rdx
694 ; SSE2-NEXT:    movq 32(%rdi), %rax
695 ; SSE2-NEXT:    movq 56(%rdi), %rcx
696 ; SSE2-NEXT:    movq 40(%rdi), %rdi
697 ; SSE2-NEXT:    xorq 40(%rsi), %rdi
698 ; SSE2-NEXT:    xorq 56(%rsi), %rcx
699 ; SSE2-NEXT:    orq %r11, %rcx
700 ; SSE2-NEXT:    orq %rdi, %rcx
701 ; SSE2-NEXT:    orq %r10, %rcx
702 ; SSE2-NEXT:    xorq 32(%rsi), %rax
703 ; SSE2-NEXT:    xorq 48(%rsi), %rdx
704 ; SSE2-NEXT:    orq %r9, %rdx
705 ; SSE2-NEXT:    orq %rax, %rdx
706 ; SSE2-NEXT:    orq %r8, %rdx
707 ; SSE2-NEXT:    xorl %eax, %eax
708 ; SSE2-NEXT:    orq %rcx, %rdx
709 ; SSE2-NEXT:    sete %al
710 ; SSE2-NEXT:    retq
712 ; AVX1-LABEL: eq_i256_pair:
713 ; AVX1:       # %bb.0:
714 ; AVX1-NEXT:    movq 16(%rdi), %r9
715 ; AVX1-NEXT:    movq 24(%rdi), %r11
716 ; AVX1-NEXT:    movq (%rdi), %r8
717 ; AVX1-NEXT:    movq 8(%rdi), %r10
718 ; AVX1-NEXT:    xorq 8(%rsi), %r10
719 ; AVX1-NEXT:    xorq 24(%rsi), %r11
720 ; AVX1-NEXT:    xorq (%rsi), %r8
721 ; AVX1-NEXT:    xorq 16(%rsi), %r9
722 ; AVX1-NEXT:    movq 48(%rdi), %rdx
723 ; AVX1-NEXT:    movq 32(%rdi), %rax
724 ; AVX1-NEXT:    movq 56(%rdi), %rcx
725 ; AVX1-NEXT:    movq 40(%rdi), %rdi
726 ; AVX1-NEXT:    xorq 40(%rsi), %rdi
727 ; AVX1-NEXT:    xorq 56(%rsi), %rcx
728 ; AVX1-NEXT:    orq %r11, %rcx
729 ; AVX1-NEXT:    orq %rdi, %rcx
730 ; AVX1-NEXT:    orq %r10, %rcx
731 ; AVX1-NEXT:    xorq 32(%rsi), %rax
732 ; AVX1-NEXT:    xorq 48(%rsi), %rdx
733 ; AVX1-NEXT:    orq %r9, %rdx
734 ; AVX1-NEXT:    orq %rax, %rdx
735 ; AVX1-NEXT:    orq %r8, %rdx
736 ; AVX1-NEXT:    xorl %eax, %eax
737 ; AVX1-NEXT:    orq %rcx, %rdx
738 ; AVX1-NEXT:    sete %al
739 ; AVX1-NEXT:    retq
741 ; AVX256-LABEL: eq_i256_pair:
742 ; AVX256:       # %bb.0:
743 ; AVX256-NEXT:    vmovdqu (%rdi), %ymm0
744 ; AVX256-NEXT:    vmovdqu 32(%rdi), %ymm1
745 ; AVX256-NEXT:    vpcmpeqb 32(%rsi), %ymm1, %ymm1
746 ; AVX256-NEXT:    vpcmpeqb (%rsi), %ymm0, %ymm0
747 ; AVX256-NEXT:    vpand %ymm1, %ymm0, %ymm0
748 ; AVX256-NEXT:    vpmovmskb %ymm0, %ecx
749 ; AVX256-NEXT:    xorl %eax, %eax
750 ; AVX256-NEXT:    cmpl $-1, %ecx
751 ; AVX256-NEXT:    sete %al
752 ; AVX256-NEXT:    vzeroupper
753 ; AVX256-NEXT:    retq
754   %a0 = load i256, i256* %a
755   %b0 = load i256, i256* %b
756   %xor1 = xor i256 %a0, %b0
757   %ap1 = getelementptr i256, i256* %a, i256 1
758   %bp1 = getelementptr i256, i256* %b, i256 1
759   %a1 = load i256, i256* %ap1
760   %b1 = load i256, i256* %bp1
761   %xor2 = xor i256 %a1, %b1
762   %or = or i256 %xor1, %xor2
763   %cmp = icmp eq i256 %or, 0
764   %z = zext i1 %cmp to i32
765   ret i32 %z
768 ; This test models the expansion of 'memcmp(a, b, 64) != 0'
769 ; if we allowed 2 pairs of 64-byte loads per block.
771 define i32 @ne_i512_pair(i512* %a, i512* %b) {
772 ; NO512-LABEL: ne_i512_pair:
773 ; NO512:       # %bb.0:
774 ; NO512-NEXT:    movq 32(%rdi), %r8
775 ; NO512-NEXT:    movq 48(%rdi), %r9
776 ; NO512-NEXT:    movq 40(%rdi), %rdx
777 ; NO512-NEXT:    movq 56(%rdi), %rcx
778 ; NO512-NEXT:    xorq 56(%rsi), %rcx
779 ; NO512-NEXT:    movq 120(%rdi), %rax
780 ; NO512-NEXT:    xorq 120(%rsi), %rax
781 ; NO512-NEXT:    orq %rcx, %rax
782 ; NO512-NEXT:    movq 88(%rdi), %rcx
783 ; NO512-NEXT:    xorq 88(%rsi), %rcx
784 ; NO512-NEXT:    orq %rcx, %rax
785 ; NO512-NEXT:    movq 24(%rdi), %rcx
786 ; NO512-NEXT:    xorq 24(%rsi), %rcx
787 ; NO512-NEXT:    xorq 40(%rsi), %rdx
788 ; NO512-NEXT:    orq %rcx, %rax
789 ; NO512-NEXT:    movq 104(%rdi), %rcx
790 ; NO512-NEXT:    xorq 104(%rsi), %rcx
791 ; NO512-NEXT:    orq %rdx, %rcx
792 ; NO512-NEXT:    movq 72(%rdi), %rdx
793 ; NO512-NEXT:    xorq 72(%rsi), %rdx
794 ; NO512-NEXT:    orq %rdx, %rcx
795 ; NO512-NEXT:    movq 16(%rdi), %r10
796 ; NO512-NEXT:    orq %rax, %rcx
797 ; NO512-NEXT:    movq 8(%rdi), %rax
798 ; NO512-NEXT:    xorq 8(%rsi), %rax
799 ; NO512-NEXT:    xorq 48(%rsi), %r9
800 ; NO512-NEXT:    orq %rax, %rcx
801 ; NO512-NEXT:    movq 112(%rdi), %rax
802 ; NO512-NEXT:    xorq 112(%rsi), %rax
803 ; NO512-NEXT:    orq %r9, %rax
804 ; NO512-NEXT:    movq 80(%rdi), %rdx
805 ; NO512-NEXT:    xorq 80(%rsi), %rdx
806 ; NO512-NEXT:    orq %rdx, %rax
807 ; NO512-NEXT:    movq (%rdi), %r9
808 ; NO512-NEXT:    xorq 16(%rsi), %r10
809 ; NO512-NEXT:    xorq (%rsi), %r9
810 ; NO512-NEXT:    xorq 32(%rsi), %r8
811 ; NO512-NEXT:    orq %r10, %rax
812 ; NO512-NEXT:    movq 96(%rdi), %rdx
813 ; NO512-NEXT:    movq 64(%rdi), %rdi
814 ; NO512-NEXT:    xorq 64(%rsi), %rdi
815 ; NO512-NEXT:    xorq 96(%rsi), %rdx
816 ; NO512-NEXT:    orq %r8, %rdx
817 ; NO512-NEXT:    orq %rdi, %rdx
818 ; NO512-NEXT:    orq %rax, %rdx
819 ; NO512-NEXT:    orq %r9, %rdx
820 ; NO512-NEXT:    xorl %eax, %eax
821 ; NO512-NEXT:    orq %rcx, %rdx
822 ; NO512-NEXT:    setne %al
823 ; NO512-NEXT:    retq
825 ; AVX512F-LABEL: ne_i512_pair:
826 ; AVX512F:       # %bb.0:
827 ; AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
828 ; AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
829 ; AVX512F-NEXT:    vpcmpeqd (%rsi), %zmm0, %k1
830 ; AVX512F-NEXT:    vpcmpeqd 64(%rsi), %zmm1, %k0 {%k1}
831 ; AVX512F-NEXT:    xorl %eax, %eax
832 ; AVX512F-NEXT:    kortestw %k0, %k0
833 ; AVX512F-NEXT:    setae %al
834 ; AVX512F-NEXT:    vzeroupper
835 ; AVX512F-NEXT:    retq
837 ; AVX512BW-LABEL: ne_i512_pair:
838 ; AVX512BW:       # %bb.0:
839 ; AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
840 ; AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
841 ; AVX512BW-NEXT:    vpcmpeqb (%rsi), %zmm0, %k1
842 ; AVX512BW-NEXT:    vpcmpeqb 64(%rsi), %zmm1, %k0 {%k1}
843 ; AVX512BW-NEXT:    xorl %eax, %eax
844 ; AVX512BW-NEXT:    kortestq %k0, %k0
845 ; AVX512BW-NEXT:    setae %al
846 ; AVX512BW-NEXT:    vzeroupper
847 ; AVX512BW-NEXT:    retq
848   %a0 = load i512, i512* %a
849   %b0 = load i512, i512* %b
850   %xor1 = xor i512 %a0, %b0
851   %ap1 = getelementptr i512, i512* %a, i512 1
852   %bp1 = getelementptr i512, i512* %b, i512 1
853   %a1 = load i512, i512* %ap1
854   %b1 = load i512, i512* %bp1
855   %xor2 = xor i512 %a1, %b1
856   %or = or i512 %xor1, %xor2
857   %cmp = icmp ne i512 %or, 0
858   %z = zext i1 %cmp to i32
859   ret i32 %z
862 ; This test models the expansion of 'memcmp(a, b, 64) == 0'
863 ; if we allowed 2 pairs of 64-byte loads per block.
865 define i32 @eq_i512_pair(i512* %a, i512* %b) {
866 ; NO512-LABEL: eq_i512_pair:
867 ; NO512:       # %bb.0:
868 ; NO512-NEXT:    movq 32(%rdi), %r8
869 ; NO512-NEXT:    movq 48(%rdi), %r9
870 ; NO512-NEXT:    movq 40(%rdi), %rdx
871 ; NO512-NEXT:    movq 56(%rdi), %rcx
872 ; NO512-NEXT:    xorq 56(%rsi), %rcx
873 ; NO512-NEXT:    movq 120(%rdi), %rax
874 ; NO512-NEXT:    xorq 120(%rsi), %rax
875 ; NO512-NEXT:    orq %rcx, %rax
876 ; NO512-NEXT:    movq 88(%rdi), %rcx
877 ; NO512-NEXT:    xorq 88(%rsi), %rcx
878 ; NO512-NEXT:    orq %rcx, %rax
879 ; NO512-NEXT:    movq 24(%rdi), %rcx
880 ; NO512-NEXT:    xorq 24(%rsi), %rcx
881 ; NO512-NEXT:    xorq 40(%rsi), %rdx
882 ; NO512-NEXT:    orq %rcx, %rax
883 ; NO512-NEXT:    movq 104(%rdi), %rcx
884 ; NO512-NEXT:    xorq 104(%rsi), %rcx
885 ; NO512-NEXT:    orq %rdx, %rcx
886 ; NO512-NEXT:    movq 72(%rdi), %rdx
887 ; NO512-NEXT:    xorq 72(%rsi), %rdx
888 ; NO512-NEXT:    orq %rdx, %rcx
889 ; NO512-NEXT:    movq 16(%rdi), %r10
890 ; NO512-NEXT:    orq %rax, %rcx
891 ; NO512-NEXT:    movq 8(%rdi), %rax
892 ; NO512-NEXT:    xorq 8(%rsi), %rax
893 ; NO512-NEXT:    xorq 48(%rsi), %r9
894 ; NO512-NEXT:    orq %rax, %rcx
895 ; NO512-NEXT:    movq 112(%rdi), %rax
896 ; NO512-NEXT:    xorq 112(%rsi), %rax
897 ; NO512-NEXT:    orq %r9, %rax
898 ; NO512-NEXT:    movq 80(%rdi), %rdx
899 ; NO512-NEXT:    xorq 80(%rsi), %rdx
900 ; NO512-NEXT:    orq %rdx, %rax
901 ; NO512-NEXT:    movq (%rdi), %r9
902 ; NO512-NEXT:    xorq 16(%rsi), %r10
903 ; NO512-NEXT:    xorq (%rsi), %r9
904 ; NO512-NEXT:    xorq 32(%rsi), %r8
905 ; NO512-NEXT:    orq %r10, %rax
906 ; NO512-NEXT:    movq 96(%rdi), %rdx
907 ; NO512-NEXT:    movq 64(%rdi), %rdi
908 ; NO512-NEXT:    xorq 64(%rsi), %rdi
909 ; NO512-NEXT:    xorq 96(%rsi), %rdx
910 ; NO512-NEXT:    orq %r8, %rdx
911 ; NO512-NEXT:    orq %rdi, %rdx
912 ; NO512-NEXT:    orq %rax, %rdx
913 ; NO512-NEXT:    orq %r9, %rdx
914 ; NO512-NEXT:    xorl %eax, %eax
915 ; NO512-NEXT:    orq %rcx, %rdx
916 ; NO512-NEXT:    sete %al
917 ; NO512-NEXT:    retq
919 ; AVX512F-LABEL: eq_i512_pair:
920 ; AVX512F:       # %bb.0:
921 ; AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
922 ; AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
923 ; AVX512F-NEXT:    vpcmpeqd (%rsi), %zmm0, %k1
924 ; AVX512F-NEXT:    vpcmpeqd 64(%rsi), %zmm1, %k0 {%k1}
925 ; AVX512F-NEXT:    xorl %eax, %eax
926 ; AVX512F-NEXT:    kortestw %k0, %k0
927 ; AVX512F-NEXT:    setb %al
928 ; AVX512F-NEXT:    vzeroupper
929 ; AVX512F-NEXT:    retq
931 ; AVX512BW-LABEL: eq_i512_pair:
932 ; AVX512BW:       # %bb.0:
933 ; AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
934 ; AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
935 ; AVX512BW-NEXT:    vpcmpeqb (%rsi), %zmm0, %k1
936 ; AVX512BW-NEXT:    vpcmpeqb 64(%rsi), %zmm1, %k0 {%k1}
937 ; AVX512BW-NEXT:    xorl %eax, %eax
938 ; AVX512BW-NEXT:    kortestq %k0, %k0
939 ; AVX512BW-NEXT:    setb %al
940 ; AVX512BW-NEXT:    vzeroupper
941 ; AVX512BW-NEXT:    retq
942   %a0 = load i512, i512* %a
943   %b0 = load i512, i512* %b
944   %xor1 = xor i512 %a0, %b0
945   %ap1 = getelementptr i512, i512* %a, i512 1
946   %bp1 = getelementptr i512, i512* %b, i512 1
947   %a1 = load i512, i512* %ap1
948   %b1 = load i512, i512* %bp1
949   %xor2 = xor i512 %a1, %b1
950   %or = or i512 %xor1, %xor2
951   %cmp = icmp eq i512 %or, 0
952   %z = zext i1 %cmp to i32
953   ret i32 %z
956 ; PR41971: Comparison using vector types is not favorable here.
957 define i1 @eq_i128_args(i128 %a, i128 %b) {
958 ; ANY-LABEL: eq_i128_args:
959 ; ANY:       # %bb.0:
960 ; ANY-NEXT:    xorq %rcx, %rsi
961 ; ANY-NEXT:    xorq %rdx, %rdi
962 ; ANY-NEXT:    orq %rsi, %rdi
963 ; ANY-NEXT:    sete %al
964 ; ANY-NEXT:    retq
965   %r = icmp eq i128 %a, %b
966   ret i1 %r
969 define i1 @eq_i256_args(i256 %a, i256 %b) {
970 ; ANY-LABEL: eq_i256_args:
971 ; ANY:       # %bb.0:
972 ; ANY-NEXT:    xorq %r9, %rsi
973 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
974 ; ANY-NEXT:    orq %rsi, %rcx
975 ; ANY-NEXT:    xorq %r8, %rdi
976 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdx
977 ; ANY-NEXT:    orq %rdi, %rdx
978 ; ANY-NEXT:    orq %rcx, %rdx
979 ; ANY-NEXT:    sete %al
980 ; ANY-NEXT:    retq
981   %r = icmp eq i256 %a, %b
982   ret i1 %r
985 define i1 @eq_i512_args(i512 %a, i512 %b) {
986 ; ANY-LABEL: eq_i512_args:
987 ; ANY:       # %bb.0:
988 ; ANY-NEXT:    movq {{[0-9]+}}(%rsp), %r10
989 ; ANY-NEXT:    movq {{[0-9]+}}(%rsp), %rax
990 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rax
991 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
992 ; ANY-NEXT:    orq %rax, %rcx
993 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r9
994 ; ANY-NEXT:    orq %rcx, %r9
995 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rsi
996 ; ANY-NEXT:    orq %r9, %rsi
997 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r10
998 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdx
999 ; ANY-NEXT:    orq %r10, %rdx
1000 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r8
1001 ; ANY-NEXT:    orq %rdx, %r8
1002 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdi
1003 ; ANY-NEXT:    orq %r8, %rdi
1004 ; ANY-NEXT:    orq %rsi, %rdi
1005 ; ANY-NEXT:    sete %al
1006 ; ANY-NEXT:    retq
1007   %r = icmp eq i512 %a, %b
1008   ret i1 %r
1011 define i1 @eq_i128_op(i128 %a, i128 %b) {
1012 ; ANY-LABEL: eq_i128_op:
1013 ; ANY:       # %bb.0:
1014 ; ANY-NEXT:    addq $1, %rdi
1015 ; ANY-NEXT:    adcq $0, %rsi
1016 ; ANY-NEXT:    xorq %rdx, %rdi
1017 ; ANY-NEXT:    xorq %rcx, %rsi
1018 ; ANY-NEXT:    orq %rdi, %rsi
1019 ; ANY-NEXT:    sete %al
1020 ; ANY-NEXT:    retq
1021   %a2 = add i128 %a, 1
1022   %r = icmp eq i128 %a2, %b
1023   ret i1 %r
1026 define i1 @eq_i256_op(i256 %a, i256 %b) {
1027 ; ANY-LABEL: eq_i256_op:
1028 ; ANY:       # %bb.0:
1029 ; ANY-NEXT:    addq $1, %rdi
1030 ; ANY-NEXT:    adcq $0, %rsi
1031 ; ANY-NEXT:    adcq $0, %rdx
1032 ; ANY-NEXT:    adcq $0, %rcx
1033 ; ANY-NEXT:    xorq %r8, %rdi
1034 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdx
1035 ; ANY-NEXT:    orq %rdi, %rdx
1036 ; ANY-NEXT:    xorq %r9, %rsi
1037 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
1038 ; ANY-NEXT:    orq %rsi, %rcx
1039 ; ANY-NEXT:    orq %rdx, %rcx
1040 ; ANY-NEXT:    sete %al
1041 ; ANY-NEXT:    retq
1042   %a2 = add i256 %a, 1
1043   %r = icmp eq i256 %a2, %b
1044   ret i1 %r
1047 define i1 @eq_i512_op(i512 %a, i512 %b) {
1048 ; ANY-LABEL: eq_i512_op:
1049 ; ANY:       # %bb.0:
1050 ; ANY-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1051 ; ANY-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1052 ; ANY-NEXT:    addq $1, %rdi
1053 ; ANY-NEXT:    adcq $0, %rsi
1054 ; ANY-NEXT:    adcq $0, %rdx
1055 ; ANY-NEXT:    adcq $0, %rcx
1056 ; ANY-NEXT:    adcq $0, %r8
1057 ; ANY-NEXT:    adcq $0, %r9
1058 ; ANY-NEXT:    adcq $0, %r10
1059 ; ANY-NEXT:    adcq $0, %rax
1060 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rsi
1061 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r9
1062 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
1063 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rax
1064 ; ANY-NEXT:    orq %rcx, %rax
1065 ; ANY-NEXT:    orq %r9, %rax
1066 ; ANY-NEXT:    orq %rsi, %rax
1067 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdx
1068 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r10
1069 ; ANY-NEXT:    orq %rdx, %r10
1070 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r8
1071 ; ANY-NEXT:    orq %r10, %r8
1072 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdi
1073 ; ANY-NEXT:    orq %r8, %rdi
1074 ; ANY-NEXT:    orq %rax, %rdi
1075 ; ANY-NEXT:    sete %al
1076 ; ANY-NEXT:    retq
1077   %a2 = add i512 %a, 1
1078   %r = icmp eq i512 %a2, %b
1079   ret i1 %r
1082 define i1 @eq_i128_load_arg(i128 *%p, i128 %b) {
1083 ; ANY-LABEL: eq_i128_load_arg:
1084 ; ANY:       # %bb.0:
1085 ; ANY-NEXT:    xorq 8(%rdi), %rdx
1086 ; ANY-NEXT:    xorq (%rdi), %rsi
1087 ; ANY-NEXT:    orq %rdx, %rsi
1088 ; ANY-NEXT:    sete %al
1089 ; ANY-NEXT:    retq
1090   %a = load i128, i128* %p
1091   %r = icmp eq i128 %a, %b
1092   ret i1 %r
1095 define i1 @eq_i256_load_arg(i256 *%p, i256 %b) {
1096 ; ANY-LABEL: eq_i256_load_arg:
1097 ; ANY:       # %bb.0:
1098 ; ANY-NEXT:    xorq 24(%rdi), %r8
1099 ; ANY-NEXT:    xorq 8(%rdi), %rdx
1100 ; ANY-NEXT:    orq %r8, %rdx
1101 ; ANY-NEXT:    xorq 16(%rdi), %rcx
1102 ; ANY-NEXT:    xorq (%rdi), %rsi
1103 ; ANY-NEXT:    orq %rcx, %rsi
1104 ; ANY-NEXT:    orq %rdx, %rsi
1105 ; ANY-NEXT:    sete %al
1106 ; ANY-NEXT:    retq
1107   %a = load i256, i256* %p
1108   %r = icmp eq i256 %a, %b
1109   ret i1 %r
1112 define i1 @eq_i512_load_arg(i512 *%p, i512 %b) {
1113 ; ANY-LABEL: eq_i512_load_arg:
1114 ; ANY:       # %bb.0:
1115 ; ANY-NEXT:    movq 40(%rdi), %r10
1116 ; ANY-NEXT:    movq 48(%rdi), %rax
1117 ; ANY-NEXT:    movq 56(%rdi), %r11
1118 ; ANY-NEXT:    xorq 24(%rdi), %r8
1119 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r11
1120 ; ANY-NEXT:    orq %r8, %r11
1121 ; ANY-NEXT:    xorq 8(%rdi), %rdx
1122 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r10
1123 ; ANY-NEXT:    orq %r11, %r10
1124 ; ANY-NEXT:    orq %rdx, %r10
1125 ; ANY-NEXT:    xorq 32(%rdi), %r9
1126 ; ANY-NEXT:    xorq (%rdi), %rsi
1127 ; ANY-NEXT:    xorq 16(%rdi), %rcx
1128 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rax
1129 ; ANY-NEXT:    orq %rcx, %rax
1130 ; ANY-NEXT:    orq %r9, %rax
1131 ; ANY-NEXT:    orq %rsi, %rax
1132 ; ANY-NEXT:    orq %r10, %rax
1133 ; ANY-NEXT:    sete %al
1134 ; ANY-NEXT:    retq
1135   %a = load i512, i512* %p
1136   %r = icmp eq i512 %a, %b
1137   ret i1 %r