[Types] Define a getWithNewBitWidth for Types and make use of it
[llvm-complete.git] / test / CodeGen / X86 / setcc-wide-types.ll
blobc1106af2f14bed3cbbb1c186054cebb10b92d3cf
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=sse4.1   | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --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,0,1]
79 ; SSE2-NEXT:    movq %xmm4, %rax
80 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
81 ; SSE2-NEXT:    movq %xmm4, %rcx
82 ; SSE2-NEXT:    movq %xmm0, %rdx
83 ; SSE2-NEXT:    movq %xmm1, %r8
84 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
85 ; SSE2-NEXT:    movq %xmm0, %rdi
86 ; SSE2-NEXT:    xorq %rax, %rdi
87 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,0,1]
88 ; SSE2-NEXT:    movq %xmm0, %rsi
89 ; SSE2-NEXT:    xorq %rcx, %rsi
90 ; SSE2-NEXT:    orq %rdi, %rsi
91 ; SSE2-NEXT:    movq %xmm2, %rax
92 ; SSE2-NEXT:    xorq %rdx, %rax
93 ; SSE2-NEXT:    movq %xmm3, %rcx
94 ; SSE2-NEXT:    xorq %r8, %rcx
95 ; SSE2-NEXT:    orq %rax, %rcx
96 ; SSE2-NEXT:    xorl %eax, %eax
97 ; SSE2-NEXT:    orq %rsi, %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, %r8
107 ; SSE41-NEXT:    movq %xmm2, %rdi
108 ; SSE41-NEXT:    xorq %rax, %rdi
109 ; SSE41-NEXT:    movq %xmm3, %rsi
110 ; SSE41-NEXT:    xorq %rcx, %rsi
111 ; SSE41-NEXT:    orq %rdi, %rsi
112 ; SSE41-NEXT:    pextrq $1, %xmm2, %rax
113 ; SSE41-NEXT:    xorq %rdx, %rax
114 ; SSE41-NEXT:    pextrq $1, %xmm3, %rcx
115 ; SSE41-NEXT:    xorq %r8, %rcx
116 ; SSE41-NEXT:    orq %rax, %rcx
117 ; SSE41-NEXT:    xorl %eax, %eax
118 ; SSE41-NEXT:    orq %rsi, %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,0,1]
159 ; SSE2-NEXT:    movq %xmm4, %rax
160 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
161 ; SSE2-NEXT:    movq %xmm4, %rcx
162 ; SSE2-NEXT:    movq %xmm0, %rdx
163 ; SSE2-NEXT:    movq %xmm1, %r8
164 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
165 ; SSE2-NEXT:    movq %xmm0, %rdi
166 ; SSE2-NEXT:    xorq %rax, %rdi
167 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,0,1]
168 ; SSE2-NEXT:    movq %xmm0, %rsi
169 ; SSE2-NEXT:    xorq %rcx, %rsi
170 ; SSE2-NEXT:    orq %rdi, %rsi
171 ; SSE2-NEXT:    movq %xmm2, %rax
172 ; SSE2-NEXT:    xorq %rdx, %rax
173 ; SSE2-NEXT:    movq %xmm3, %rcx
174 ; SSE2-NEXT:    xorq %r8, %rcx
175 ; SSE2-NEXT:    orq %rax, %rcx
176 ; SSE2-NEXT:    xorl %eax, %eax
177 ; SSE2-NEXT:    orq %rsi, %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, %r8
187 ; SSE41-NEXT:    movq %xmm2, %rdi
188 ; SSE41-NEXT:    xorq %rax, %rdi
189 ; SSE41-NEXT:    movq %xmm3, %rsi
190 ; SSE41-NEXT:    xorq %rcx, %rsi
191 ; SSE41-NEXT:    orq %rdi, %rsi
192 ; SSE41-NEXT:    pextrq $1, %xmm2, %rax
193 ; SSE41-NEXT:    xorq %rdx, %rax
194 ; SSE41-NEXT:    pextrq $1, %xmm3, %rcx
195 ; SSE41-NEXT:    xorq %r8, %rcx
196 ; SSE41-NEXT:    orq %rax, %rcx
197 ; SSE41-NEXT:    xorl %eax, %eax
198 ; SSE41-NEXT:    orq %rsi, %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,0,1]
239 ; SSE2-NEXT:    movq %xmm8, %rax
240 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm2[2,3,0,1]
241 ; SSE2-NEXT:    movq %xmm8, %rcx
242 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm1[2,3,0,1]
243 ; SSE2-NEXT:    movq %xmm8, %rdx
244 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[2,3,0,1]
245 ; SSE2-NEXT:    movq %xmm8, %rsi
246 ; SSE2-NEXT:    movq %xmm0, %r11
247 ; SSE2-NEXT:    movq %xmm2, %r8
248 ; SSE2-NEXT:    movq %xmm1, %r9
249 ; SSE2-NEXT:    movq %xmm3, %r10
250 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
251 ; SSE2-NEXT:    movq %xmm0, %rdi
252 ; SSE2-NEXT:    xorq %rax, %rdi
253 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[2,3,0,1]
254 ; SSE2-NEXT:    movq %xmm0, %rax
255 ; SSE2-NEXT:    xorq %rcx, %rax
256 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[2,3,0,1]
257 ; SSE2-NEXT:    movq %xmm0, %rcx
258 ; SSE2-NEXT:    xorq %rdx, %rcx
259 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[2,3,0,1]
260 ; SSE2-NEXT:    movq %xmm0, %rdx
261 ; SSE2-NEXT:    xorq %rsi, %rdx
262 ; SSE2-NEXT:    orq %rcx, %rdx
263 ; SSE2-NEXT:    orq %rax, %rdx
264 ; SSE2-NEXT:    orq %rdi, %rdx
265 ; SSE2-NEXT:    movq %xmm4, %rax
266 ; SSE2-NEXT:    xorq %r11, %rax
267 ; SSE2-NEXT:    movq %xmm6, %rcx
268 ; SSE2-NEXT:    xorq %r8, %rcx
269 ; SSE2-NEXT:    movq %xmm5, %rsi
270 ; SSE2-NEXT:    xorq %r9, %rsi
271 ; SSE2-NEXT:    movq %xmm7, %rdi
272 ; SSE2-NEXT:    xorq %r10, %rdi
273 ; SSE2-NEXT:    orq %rsi, %rdi
274 ; SSE2-NEXT:    orq %rcx, %rdi
275 ; SSE2-NEXT:    orq %rax, %rdi
276 ; SSE2-NEXT:    xorl %eax, %eax
277 ; SSE2-NEXT:    orq %rdx, %rdi
278 ; SSE2-NEXT:    setne %al
279 ; SSE2-NEXT:    retq
281 ; SSE41-LABEL: ne_i512:
282 ; SSE41:       # %bb.0:
283 ; SSE41-NEXT:    movq %xmm0, %rax
284 ; SSE41-NEXT:    movq %xmm2, %rcx
285 ; SSE41-NEXT:    movq %xmm1, %rdx
286 ; SSE41-NEXT:    movq %xmm3, %rsi
287 ; SSE41-NEXT:    pextrq $1, %xmm0, %r11
288 ; SSE41-NEXT:    pextrq $1, %xmm2, %r8
289 ; SSE41-NEXT:    pextrq $1, %xmm1, %r9
290 ; SSE41-NEXT:    pextrq $1, %xmm3, %r10
291 ; SSE41-NEXT:    movq %xmm4, %rdi
292 ; SSE41-NEXT:    xorq %rax, %rdi
293 ; SSE41-NEXT:    movq %xmm6, %rax
294 ; SSE41-NEXT:    xorq %rcx, %rax
295 ; SSE41-NEXT:    movq %xmm5, %rcx
296 ; SSE41-NEXT:    xorq %rdx, %rcx
297 ; SSE41-NEXT:    movq %xmm7, %rdx
298 ; SSE41-NEXT:    xorq %rsi, %rdx
299 ; SSE41-NEXT:    orq %rcx, %rdx
300 ; SSE41-NEXT:    orq %rax, %rdx
301 ; SSE41-NEXT:    orq %rdi, %rdx
302 ; SSE41-NEXT:    pextrq $1, %xmm4, %rax
303 ; SSE41-NEXT:    xorq %r11, %rax
304 ; SSE41-NEXT:    pextrq $1, %xmm6, %rcx
305 ; SSE41-NEXT:    xorq %r8, %rcx
306 ; SSE41-NEXT:    pextrq $1, %xmm5, %rsi
307 ; SSE41-NEXT:    xorq %r9, %rsi
308 ; SSE41-NEXT:    pextrq $1, %xmm7, %rdi
309 ; SSE41-NEXT:    xorq %r10, %rdi
310 ; SSE41-NEXT:    orq %rsi, %rdi
311 ; SSE41-NEXT:    orq %rcx, %rdi
312 ; SSE41-NEXT:    orq %rax, %rdi
313 ; SSE41-NEXT:    xorl %eax, %eax
314 ; SSE41-NEXT:    orq %rdx, %rdi
315 ; SSE41-NEXT:    setne %al
316 ; SSE41-NEXT:    retq
318 ; AVX1-LABEL: ne_i512:
319 ; AVX1:       # %bb.0:
320 ; AVX1-NEXT:    vmovq %xmm0, %rax
321 ; AVX1-NEXT:    vmovq %xmm1, %rcx
322 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
323 ; AVX1-NEXT:    vmovq %xmm4, %rdx
324 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
325 ; AVX1-NEXT:    vmovq %xmm5, %rsi
326 ; AVX1-NEXT:    vpextrq $1, %xmm0, %r11
327 ; AVX1-NEXT:    vpextrq $1, %xmm1, %r8
328 ; AVX1-NEXT:    vpextrq $1, %xmm4, %r9
329 ; AVX1-NEXT:    vpextrq $1, %xmm5, %r10
330 ; AVX1-NEXT:    vmovq %xmm2, %rdi
331 ; AVX1-NEXT:    xorq %rax, %rdi
332 ; AVX1-NEXT:    vmovq %xmm3, %rax
333 ; AVX1-NEXT:    xorq %rcx, %rax
334 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm0
335 ; AVX1-NEXT:    vmovq %xmm0, %rcx
336 ; AVX1-NEXT:    xorq %rdx, %rcx
337 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm1
338 ; AVX1-NEXT:    vmovq %xmm1, %rdx
339 ; AVX1-NEXT:    xorq %rsi, %rdx
340 ; AVX1-NEXT:    orq %rcx, %rdx
341 ; AVX1-NEXT:    orq %rax, %rdx
342 ; AVX1-NEXT:    orq %rdi, %rdx
343 ; AVX1-NEXT:    vpextrq $1, %xmm2, %rax
344 ; AVX1-NEXT:    xorq %r11, %rax
345 ; AVX1-NEXT:    vpextrq $1, %xmm3, %rcx
346 ; AVX1-NEXT:    xorq %r8, %rcx
347 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rsi
348 ; AVX1-NEXT:    xorq %r9, %rsi
349 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rdi
350 ; AVX1-NEXT:    xorq %r10, %rdi
351 ; AVX1-NEXT:    orq %rsi, %rdi
352 ; AVX1-NEXT:    orq %rcx, %rdi
353 ; AVX1-NEXT:    orq %rax, %rdi
354 ; AVX1-NEXT:    xorl %eax, %eax
355 ; AVX1-NEXT:    orq %rdx, %rdi
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, %rax
363 ; AVX2-NEXT:    vmovq %xmm1, %rcx
364 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
365 ; AVX2-NEXT:    vmovq %xmm4, %rdx
366 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm5
367 ; AVX2-NEXT:    vmovq %xmm5, %rsi
368 ; AVX2-NEXT:    vpextrq $1, %xmm0, %r11
369 ; AVX2-NEXT:    vpextrq $1, %xmm1, %r8
370 ; AVX2-NEXT:    vpextrq $1, %xmm4, %r9
371 ; AVX2-NEXT:    vpextrq $1, %xmm5, %r10
372 ; AVX2-NEXT:    vmovq %xmm2, %rdi
373 ; AVX2-NEXT:    xorq %rax, %rdi
374 ; AVX2-NEXT:    vmovq %xmm3, %rax
375 ; AVX2-NEXT:    xorq %rcx, %rax
376 ; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm0
377 ; AVX2-NEXT:    vmovq %xmm0, %rcx
378 ; AVX2-NEXT:    xorq %rdx, %rcx
379 ; AVX2-NEXT:    vextracti128 $1, %ymm3, %xmm1
380 ; AVX2-NEXT:    vmovq %xmm1, %rdx
381 ; AVX2-NEXT:    xorq %rsi, %rdx
382 ; AVX2-NEXT:    orq %rcx, %rdx
383 ; AVX2-NEXT:    orq %rax, %rdx
384 ; AVX2-NEXT:    orq %rdi, %rdx
385 ; AVX2-NEXT:    vpextrq $1, %xmm2, %rax
386 ; AVX2-NEXT:    xorq %r11, %rax
387 ; AVX2-NEXT:    vpextrq $1, %xmm3, %rcx
388 ; AVX2-NEXT:    xorq %r8, %rcx
389 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rsi
390 ; AVX2-NEXT:    xorq %r9, %rsi
391 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rdi
392 ; AVX2-NEXT:    xorq %r10, %rdi
393 ; AVX2-NEXT:    orq %rsi, %rdi
394 ; AVX2-NEXT:    orq %rcx, %rdi
395 ; AVX2-NEXT:    orq %rax, %rdi
396 ; AVX2-NEXT:    xorl %eax, %eax
397 ; AVX2-NEXT:    orq %rdx, %rdi
398 ; AVX2-NEXT:    setne %al
399 ; AVX2-NEXT:    vzeroupper
400 ; AVX2-NEXT:    retq
402 ; AVX512F-LABEL: ne_i512:
403 ; AVX512F:       # %bb.0:
404 ; AVX512F-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
405 ; AVX512F-NEXT:    xorl %eax, %eax
406 ; AVX512F-NEXT:    kortestw %k0, %k0
407 ; AVX512F-NEXT:    setae %al
408 ; AVX512F-NEXT:    vzeroupper
409 ; AVX512F-NEXT:    retq
411 ; AVX512BW-LABEL: ne_i512:
412 ; AVX512BW:       # %bb.0:
413 ; AVX512BW-NEXT:    vpcmpeqb %zmm1, %zmm0, %k0
414 ; AVX512BW-NEXT:    xorl %eax, %eax
415 ; AVX512BW-NEXT:    kortestq %k0, %k0
416 ; AVX512BW-NEXT:    setae %al
417 ; AVX512BW-NEXT:    vzeroupper
418 ; AVX512BW-NEXT:    retq
419   %bcx = bitcast <8 x i64> %x to i512
420   %bcy = bitcast <8 x i64> %y to i512
421   %cmp = icmp ne i512 %bcx, %bcy
422   %zext = zext i1 %cmp to i32
423   ret i32 %zext
426 define i32 @eq_i512(<8 x i64> %x, <8 x i64> %y) {
427 ; SSE2-LABEL: eq_i512:
428 ; SSE2:       # %bb.0:
429 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm0[2,3,0,1]
430 ; SSE2-NEXT:    movq %xmm8, %rax
431 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm2[2,3,0,1]
432 ; SSE2-NEXT:    movq %xmm8, %rcx
433 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm1[2,3,0,1]
434 ; SSE2-NEXT:    movq %xmm8, %rdx
435 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[2,3,0,1]
436 ; SSE2-NEXT:    movq %xmm8, %rsi
437 ; SSE2-NEXT:    movq %xmm0, %r11
438 ; SSE2-NEXT:    movq %xmm2, %r8
439 ; SSE2-NEXT:    movq %xmm1, %r9
440 ; SSE2-NEXT:    movq %xmm3, %r10
441 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
442 ; SSE2-NEXT:    movq %xmm0, %rdi
443 ; SSE2-NEXT:    xorq %rax, %rdi
444 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[2,3,0,1]
445 ; SSE2-NEXT:    movq %xmm0, %rax
446 ; SSE2-NEXT:    xorq %rcx, %rax
447 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[2,3,0,1]
448 ; SSE2-NEXT:    movq %xmm0, %rcx
449 ; SSE2-NEXT:    xorq %rdx, %rcx
450 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[2,3,0,1]
451 ; SSE2-NEXT:    movq %xmm0, %rdx
452 ; SSE2-NEXT:    xorq %rsi, %rdx
453 ; SSE2-NEXT:    orq %rcx, %rdx
454 ; SSE2-NEXT:    orq %rax, %rdx
455 ; SSE2-NEXT:    orq %rdi, %rdx
456 ; SSE2-NEXT:    movq %xmm4, %rax
457 ; SSE2-NEXT:    xorq %r11, %rax
458 ; SSE2-NEXT:    movq %xmm6, %rcx
459 ; SSE2-NEXT:    xorq %r8, %rcx
460 ; SSE2-NEXT:    movq %xmm5, %rsi
461 ; SSE2-NEXT:    xorq %r9, %rsi
462 ; SSE2-NEXT:    movq %xmm7, %rdi
463 ; SSE2-NEXT:    xorq %r10, %rdi
464 ; SSE2-NEXT:    orq %rsi, %rdi
465 ; SSE2-NEXT:    orq %rcx, %rdi
466 ; SSE2-NEXT:    orq %rax, %rdi
467 ; SSE2-NEXT:    xorl %eax, %eax
468 ; SSE2-NEXT:    orq %rdx, %rdi
469 ; SSE2-NEXT:    sete %al
470 ; SSE2-NEXT:    retq
472 ; SSE41-LABEL: eq_i512:
473 ; SSE41:       # %bb.0:
474 ; SSE41-NEXT:    movq %xmm0, %rax
475 ; SSE41-NEXT:    movq %xmm2, %rcx
476 ; SSE41-NEXT:    movq %xmm1, %rdx
477 ; SSE41-NEXT:    movq %xmm3, %rsi
478 ; SSE41-NEXT:    pextrq $1, %xmm0, %r11
479 ; SSE41-NEXT:    pextrq $1, %xmm2, %r8
480 ; SSE41-NEXT:    pextrq $1, %xmm1, %r9
481 ; SSE41-NEXT:    pextrq $1, %xmm3, %r10
482 ; SSE41-NEXT:    movq %xmm4, %rdi
483 ; SSE41-NEXT:    xorq %rax, %rdi
484 ; SSE41-NEXT:    movq %xmm6, %rax
485 ; SSE41-NEXT:    xorq %rcx, %rax
486 ; SSE41-NEXT:    movq %xmm5, %rcx
487 ; SSE41-NEXT:    xorq %rdx, %rcx
488 ; SSE41-NEXT:    movq %xmm7, %rdx
489 ; SSE41-NEXT:    xorq %rsi, %rdx
490 ; SSE41-NEXT:    orq %rcx, %rdx
491 ; SSE41-NEXT:    orq %rax, %rdx
492 ; SSE41-NEXT:    orq %rdi, %rdx
493 ; SSE41-NEXT:    pextrq $1, %xmm4, %rax
494 ; SSE41-NEXT:    xorq %r11, %rax
495 ; SSE41-NEXT:    pextrq $1, %xmm6, %rcx
496 ; SSE41-NEXT:    xorq %r8, %rcx
497 ; SSE41-NEXT:    pextrq $1, %xmm5, %rsi
498 ; SSE41-NEXT:    xorq %r9, %rsi
499 ; SSE41-NEXT:    pextrq $1, %xmm7, %rdi
500 ; SSE41-NEXT:    xorq %r10, %rdi
501 ; SSE41-NEXT:    orq %rsi, %rdi
502 ; SSE41-NEXT:    orq %rcx, %rdi
503 ; SSE41-NEXT:    orq %rax, %rdi
504 ; SSE41-NEXT:    xorl %eax, %eax
505 ; SSE41-NEXT:    orq %rdx, %rdi
506 ; SSE41-NEXT:    sete %al
507 ; SSE41-NEXT:    retq
509 ; AVX1-LABEL: eq_i512:
510 ; AVX1:       # %bb.0:
511 ; AVX1-NEXT:    vmovq %xmm0, %rax
512 ; AVX1-NEXT:    vmovq %xmm1, %rcx
513 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
514 ; AVX1-NEXT:    vmovq %xmm4, %rdx
515 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
516 ; AVX1-NEXT:    vmovq %xmm5, %rsi
517 ; AVX1-NEXT:    vpextrq $1, %xmm0, %r11
518 ; AVX1-NEXT:    vpextrq $1, %xmm1, %r8
519 ; AVX1-NEXT:    vpextrq $1, %xmm4, %r9
520 ; AVX1-NEXT:    vpextrq $1, %xmm5, %r10
521 ; AVX1-NEXT:    vmovq %xmm2, %rdi
522 ; AVX1-NEXT:    xorq %rax, %rdi
523 ; AVX1-NEXT:    vmovq %xmm3, %rax
524 ; AVX1-NEXT:    xorq %rcx, %rax
525 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm0
526 ; AVX1-NEXT:    vmovq %xmm0, %rcx
527 ; AVX1-NEXT:    xorq %rdx, %rcx
528 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm1
529 ; AVX1-NEXT:    vmovq %xmm1, %rdx
530 ; AVX1-NEXT:    xorq %rsi, %rdx
531 ; AVX1-NEXT:    orq %rcx, %rdx
532 ; AVX1-NEXT:    orq %rax, %rdx
533 ; AVX1-NEXT:    orq %rdi, %rdx
534 ; AVX1-NEXT:    vpextrq $1, %xmm2, %rax
535 ; AVX1-NEXT:    xorq %r11, %rax
536 ; AVX1-NEXT:    vpextrq $1, %xmm3, %rcx
537 ; AVX1-NEXT:    xorq %r8, %rcx
538 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rsi
539 ; AVX1-NEXT:    xorq %r9, %rsi
540 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rdi
541 ; AVX1-NEXT:    xorq %r10, %rdi
542 ; AVX1-NEXT:    orq %rsi, %rdi
543 ; AVX1-NEXT:    orq %rcx, %rdi
544 ; AVX1-NEXT:    orq %rax, %rdi
545 ; AVX1-NEXT:    xorl %eax, %eax
546 ; AVX1-NEXT:    orq %rdx, %rdi
547 ; AVX1-NEXT:    sete %al
548 ; AVX1-NEXT:    vzeroupper
549 ; AVX1-NEXT:    retq
551 ; AVX2-LABEL: eq_i512:
552 ; AVX2:       # %bb.0:
553 ; AVX2-NEXT:    vmovq %xmm0, %rax
554 ; AVX2-NEXT:    vmovq %xmm1, %rcx
555 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
556 ; AVX2-NEXT:    vmovq %xmm4, %rdx
557 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm5
558 ; AVX2-NEXT:    vmovq %xmm5, %rsi
559 ; AVX2-NEXT:    vpextrq $1, %xmm0, %r11
560 ; AVX2-NEXT:    vpextrq $1, %xmm1, %r8
561 ; AVX2-NEXT:    vpextrq $1, %xmm4, %r9
562 ; AVX2-NEXT:    vpextrq $1, %xmm5, %r10
563 ; AVX2-NEXT:    vmovq %xmm2, %rdi
564 ; AVX2-NEXT:    xorq %rax, %rdi
565 ; AVX2-NEXT:    vmovq %xmm3, %rax
566 ; AVX2-NEXT:    xorq %rcx, %rax
567 ; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm0
568 ; AVX2-NEXT:    vmovq %xmm0, %rcx
569 ; AVX2-NEXT:    xorq %rdx, %rcx
570 ; AVX2-NEXT:    vextracti128 $1, %ymm3, %xmm1
571 ; AVX2-NEXT:    vmovq %xmm1, %rdx
572 ; AVX2-NEXT:    xorq %rsi, %rdx
573 ; AVX2-NEXT:    orq %rcx, %rdx
574 ; AVX2-NEXT:    orq %rax, %rdx
575 ; AVX2-NEXT:    orq %rdi, %rdx
576 ; AVX2-NEXT:    vpextrq $1, %xmm2, %rax
577 ; AVX2-NEXT:    xorq %r11, %rax
578 ; AVX2-NEXT:    vpextrq $1, %xmm3, %rcx
579 ; AVX2-NEXT:    xorq %r8, %rcx
580 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rsi
581 ; AVX2-NEXT:    xorq %r9, %rsi
582 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rdi
583 ; AVX2-NEXT:    xorq %r10, %rdi
584 ; AVX2-NEXT:    orq %rsi, %rdi
585 ; AVX2-NEXT:    orq %rcx, %rdi
586 ; AVX2-NEXT:    orq %rax, %rdi
587 ; AVX2-NEXT:    xorl %eax, %eax
588 ; AVX2-NEXT:    orq %rdx, %rdi
589 ; AVX2-NEXT:    sete %al
590 ; AVX2-NEXT:    vzeroupper
591 ; AVX2-NEXT:    retq
593 ; AVX512F-LABEL: eq_i512:
594 ; AVX512F:       # %bb.0:
595 ; AVX512F-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
596 ; AVX512F-NEXT:    xorl %eax, %eax
597 ; AVX512F-NEXT:    kortestw %k0, %k0
598 ; AVX512F-NEXT:    setb %al
599 ; AVX512F-NEXT:    vzeroupper
600 ; AVX512F-NEXT:    retq
602 ; AVX512BW-LABEL: eq_i512:
603 ; AVX512BW:       # %bb.0:
604 ; AVX512BW-NEXT:    vpcmpeqb %zmm1, %zmm0, %k0
605 ; AVX512BW-NEXT:    xorl %eax, %eax
606 ; AVX512BW-NEXT:    kortestq %k0, %k0
607 ; AVX512BW-NEXT:    setb %al
608 ; AVX512BW-NEXT:    vzeroupper
609 ; AVX512BW-NEXT:    retq
610   %bcx = bitcast <8 x i64> %x to i512
611   %bcy = bitcast <8 x i64> %y to i512
612   %cmp = icmp eq i512 %bcx, %bcy
613   %zext = zext i1 %cmp to i32
614   ret i32 %zext
617 ; This test models the expansion of 'memcmp(a, b, 32) != 0'
618 ; if we allowed 2 pairs of 16-byte loads per block.
620 define i32 @ne_i128_pair(i128* %a, i128* %b) {
621 ; SSE2-LABEL: ne_i128_pair:
622 ; SSE2:       # %bb.0:
623 ; SSE2-NEXT:    movdqu (%rdi), %xmm0
624 ; SSE2-NEXT:    movdqu 16(%rdi), %xmm1
625 ; SSE2-NEXT:    movdqu (%rsi), %xmm2
626 ; SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
627 ; SSE2-NEXT:    movdqu 16(%rsi), %xmm0
628 ; SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
629 ; SSE2-NEXT:    pand %xmm2, %xmm0
630 ; SSE2-NEXT:    pmovmskb %xmm0, %ecx
631 ; SSE2-NEXT:    xorl %eax, %eax
632 ; SSE2-NEXT:    cmpl $65535, %ecx # imm = 0xFFFF
633 ; SSE2-NEXT:    setne %al
634 ; SSE2-NEXT:    retq
636 ; SSE41-LABEL: ne_i128_pair:
637 ; SSE41:       # %bb.0:
638 ; SSE41-NEXT:    movdqu (%rdi), %xmm0
639 ; SSE41-NEXT:    movdqu 16(%rdi), %xmm1
640 ; SSE41-NEXT:    movdqu (%rsi), %xmm2
641 ; SSE41-NEXT:    pxor %xmm0, %xmm2
642 ; SSE41-NEXT:    movdqu 16(%rsi), %xmm0
643 ; SSE41-NEXT:    pxor %xmm1, %xmm0
644 ; SSE41-NEXT:    por %xmm2, %xmm0
645 ; SSE41-NEXT:    xorl %eax, %eax
646 ; SSE41-NEXT:    ptest %xmm0, %xmm0
647 ; SSE41-NEXT:    setne %al
648 ; SSE41-NEXT:    retq
650 ; AVXANY-LABEL: ne_i128_pair:
651 ; AVXANY:       # %bb.0:
652 ; AVXANY-NEXT:    vmovdqu (%rdi), %xmm0
653 ; AVXANY-NEXT:    vmovdqu 16(%rdi), %xmm1
654 ; AVXANY-NEXT:    vpxor 16(%rsi), %xmm1, %xmm1
655 ; AVXANY-NEXT:    vpxor (%rsi), %xmm0, %xmm0
656 ; AVXANY-NEXT:    vpor %xmm1, %xmm0, %xmm0
657 ; AVXANY-NEXT:    xorl %eax, %eax
658 ; AVXANY-NEXT:    vptest %xmm0, %xmm0
659 ; AVXANY-NEXT:    setne %al
660 ; AVXANY-NEXT:    retq
661   %a0 = load i128, i128* %a
662   %b0 = load i128, i128* %b
663   %xor1 = xor i128 %a0, %b0
664   %ap1 = getelementptr i128, i128* %a, i128 1
665   %bp1 = getelementptr i128, i128* %b, i128 1
666   %a1 = load i128, i128* %ap1
667   %b1 = load i128, i128* %bp1
668   %xor2 = xor i128 %a1, %b1
669   %or = or i128 %xor1, %xor2
670   %cmp = icmp ne i128 %or, 0
671   %z = zext i1 %cmp to i32
672   ret i32 %z
675 ; This test models the expansion of 'memcmp(a, b, 32) == 0'
676 ; if we allowed 2 pairs of 16-byte loads per block.
678 define i32 @eq_i128_pair(i128* %a, i128* %b) {
679 ; SSE2-LABEL: eq_i128_pair:
680 ; SSE2:       # %bb.0:
681 ; SSE2-NEXT:    movdqu (%rdi), %xmm0
682 ; SSE2-NEXT:    movdqu 16(%rdi), %xmm1
683 ; SSE2-NEXT:    movdqu (%rsi), %xmm2
684 ; SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
685 ; SSE2-NEXT:    movdqu 16(%rsi), %xmm0
686 ; SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
687 ; SSE2-NEXT:    pand %xmm2, %xmm0
688 ; SSE2-NEXT:    pmovmskb %xmm0, %ecx
689 ; SSE2-NEXT:    xorl %eax, %eax
690 ; SSE2-NEXT:    cmpl $65535, %ecx # imm = 0xFFFF
691 ; SSE2-NEXT:    sete %al
692 ; SSE2-NEXT:    retq
694 ; SSE41-LABEL: eq_i128_pair:
695 ; SSE41:       # %bb.0:
696 ; SSE41-NEXT:    movdqu (%rdi), %xmm0
697 ; SSE41-NEXT:    movdqu 16(%rdi), %xmm1
698 ; SSE41-NEXT:    movdqu (%rsi), %xmm2
699 ; SSE41-NEXT:    pxor %xmm0, %xmm2
700 ; SSE41-NEXT:    movdqu 16(%rsi), %xmm0
701 ; SSE41-NEXT:    pxor %xmm1, %xmm0
702 ; SSE41-NEXT:    por %xmm2, %xmm0
703 ; SSE41-NEXT:    xorl %eax, %eax
704 ; SSE41-NEXT:    ptest %xmm0, %xmm0
705 ; SSE41-NEXT:    sete %al
706 ; SSE41-NEXT:    retq
708 ; AVXANY-LABEL: eq_i128_pair:
709 ; AVXANY:       # %bb.0:
710 ; AVXANY-NEXT:    vmovdqu (%rdi), %xmm0
711 ; AVXANY-NEXT:    vmovdqu 16(%rdi), %xmm1
712 ; AVXANY-NEXT:    vpxor 16(%rsi), %xmm1, %xmm1
713 ; AVXANY-NEXT:    vpxor (%rsi), %xmm0, %xmm0
714 ; AVXANY-NEXT:    vpor %xmm1, %xmm0, %xmm0
715 ; AVXANY-NEXT:    xorl %eax, %eax
716 ; AVXANY-NEXT:    vptest %xmm0, %xmm0
717 ; AVXANY-NEXT:    sete %al
718 ; AVXANY-NEXT:    retq
719   %a0 = load i128, i128* %a
720   %b0 = load i128, i128* %b
721   %xor1 = xor i128 %a0, %b0
722   %ap1 = getelementptr i128, i128* %a, i128 1
723   %bp1 = getelementptr i128, i128* %b, i128 1
724   %a1 = load i128, i128* %ap1
725   %b1 = load i128, i128* %bp1
726   %xor2 = xor i128 %a1, %b1
727   %or = or i128 %xor1, %xor2
728   %cmp = icmp eq i128 %or, 0
729   %z = zext i1 %cmp to i32
730   ret i32 %z
733 ; This test models the expansion of 'memcmp(a, b, 64) != 0'
734 ; if we allowed 2 pairs of 32-byte loads per block.
736 define i32 @ne_i256_pair(i256* %a, i256* %b) {
737 ; SSE2-LABEL: ne_i256_pair:
738 ; SSE2:       # %bb.0:
739 ; SSE2-NEXT:    movq 16(%rdi), %r9
740 ; SSE2-NEXT:    movq 24(%rdi), %r11
741 ; SSE2-NEXT:    movq (%rdi), %r8
742 ; SSE2-NEXT:    movq 8(%rdi), %r10
743 ; SSE2-NEXT:    xorq 8(%rsi), %r10
744 ; SSE2-NEXT:    xorq 24(%rsi), %r11
745 ; SSE2-NEXT:    xorq (%rsi), %r8
746 ; SSE2-NEXT:    xorq 16(%rsi), %r9
747 ; SSE2-NEXT:    movq 48(%rdi), %rdx
748 ; SSE2-NEXT:    movq 32(%rdi), %rax
749 ; SSE2-NEXT:    movq 56(%rdi), %rcx
750 ; SSE2-NEXT:    movq 40(%rdi), %rdi
751 ; SSE2-NEXT:    xorq 40(%rsi), %rdi
752 ; SSE2-NEXT:    xorq 56(%rsi), %rcx
753 ; SSE2-NEXT:    orq %r11, %rcx
754 ; SSE2-NEXT:    orq %rdi, %rcx
755 ; SSE2-NEXT:    orq %r10, %rcx
756 ; SSE2-NEXT:    xorq 32(%rsi), %rax
757 ; SSE2-NEXT:    xorq 48(%rsi), %rdx
758 ; SSE2-NEXT:    orq %r9, %rdx
759 ; SSE2-NEXT:    orq %rax, %rdx
760 ; SSE2-NEXT:    orq %r8, %rdx
761 ; SSE2-NEXT:    xorl %eax, %eax
762 ; SSE2-NEXT:    orq %rcx, %rdx
763 ; SSE2-NEXT:    setne %al
764 ; SSE2-NEXT:    retq
766 ; SSE41-LABEL: ne_i256_pair:
767 ; SSE41:       # %bb.0:
768 ; SSE41-NEXT:    movq 16(%rdi), %r9
769 ; SSE41-NEXT:    movq 24(%rdi), %r11
770 ; SSE41-NEXT:    movq (%rdi), %r8
771 ; SSE41-NEXT:    movq 8(%rdi), %r10
772 ; SSE41-NEXT:    xorq 8(%rsi), %r10
773 ; SSE41-NEXT:    xorq 24(%rsi), %r11
774 ; SSE41-NEXT:    xorq (%rsi), %r8
775 ; SSE41-NEXT:    xorq 16(%rsi), %r9
776 ; SSE41-NEXT:    movq 48(%rdi), %rdx
777 ; SSE41-NEXT:    movq 32(%rdi), %rax
778 ; SSE41-NEXT:    movq 56(%rdi), %rcx
779 ; SSE41-NEXT:    movq 40(%rdi), %rdi
780 ; SSE41-NEXT:    xorq 40(%rsi), %rdi
781 ; SSE41-NEXT:    xorq 56(%rsi), %rcx
782 ; SSE41-NEXT:    orq %r11, %rcx
783 ; SSE41-NEXT:    orq %rdi, %rcx
784 ; SSE41-NEXT:    orq %r10, %rcx
785 ; SSE41-NEXT:    xorq 32(%rsi), %rax
786 ; SSE41-NEXT:    xorq 48(%rsi), %rdx
787 ; SSE41-NEXT:    orq %r9, %rdx
788 ; SSE41-NEXT:    orq %rax, %rdx
789 ; SSE41-NEXT:    orq %r8, %rdx
790 ; SSE41-NEXT:    xorl %eax, %eax
791 ; SSE41-NEXT:    orq %rcx, %rdx
792 ; SSE41-NEXT:    setne %al
793 ; SSE41-NEXT:    retq
795 ; AVX1-LABEL: ne_i256_pair:
796 ; AVX1:       # %bb.0:
797 ; AVX1-NEXT:    vmovups (%rdi), %ymm0
798 ; AVX1-NEXT:    vmovups 32(%rdi), %ymm1
799 ; AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1
800 ; AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
801 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
802 ; AVX1-NEXT:    xorl %eax, %eax
803 ; AVX1-NEXT:    vptest %ymm0, %ymm0
804 ; AVX1-NEXT:    setne %al
805 ; AVX1-NEXT:    vzeroupper
806 ; AVX1-NEXT:    retq
808 ; AVX2-LABEL: ne_i256_pair:
809 ; AVX2:       # %bb.0:
810 ; AVX2-NEXT:    vmovdqu (%rdi), %ymm0
811 ; AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
812 ; AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
813 ; AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
814 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
815 ; AVX2-NEXT:    xorl %eax, %eax
816 ; AVX2-NEXT:    vptest %ymm0, %ymm0
817 ; AVX2-NEXT:    setne %al
818 ; AVX2-NEXT:    vzeroupper
819 ; AVX2-NEXT:    retq
821 ; AVX512-LABEL: ne_i256_pair:
822 ; AVX512:       # %bb.0:
823 ; AVX512-NEXT:    vmovdqu (%rdi), %ymm0
824 ; AVX512-NEXT:    vmovdqu 32(%rdi), %ymm1
825 ; AVX512-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
826 ; AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
827 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
828 ; AVX512-NEXT:    xorl %eax, %eax
829 ; AVX512-NEXT:    vptest %ymm0, %ymm0
830 ; AVX512-NEXT:    setne %al
831 ; AVX512-NEXT:    vzeroupper
832 ; AVX512-NEXT:    retq
833   %a0 = load i256, i256* %a
834   %b0 = load i256, i256* %b
835   %xor1 = xor i256 %a0, %b0
836   %ap1 = getelementptr i256, i256* %a, i256 1
837   %bp1 = getelementptr i256, i256* %b, i256 1
838   %a1 = load i256, i256* %ap1
839   %b1 = load i256, i256* %bp1
840   %xor2 = xor i256 %a1, %b1
841   %or = or i256 %xor1, %xor2
842   %cmp = icmp ne i256 %or, 0
843   %z = zext i1 %cmp to i32
844   ret i32 %z
847 ; This test models the expansion of 'memcmp(a, b, 64) == 0'
848 ; if we allowed 2 pairs of 32-byte loads per block.
850 define i32 @eq_i256_pair(i256* %a, i256* %b) {
851 ; SSE2-LABEL: eq_i256_pair:
852 ; SSE2:       # %bb.0:
853 ; SSE2-NEXT:    movq 16(%rdi), %r9
854 ; SSE2-NEXT:    movq 24(%rdi), %r11
855 ; SSE2-NEXT:    movq (%rdi), %r8
856 ; SSE2-NEXT:    movq 8(%rdi), %r10
857 ; SSE2-NEXT:    xorq 8(%rsi), %r10
858 ; SSE2-NEXT:    xorq 24(%rsi), %r11
859 ; SSE2-NEXT:    xorq (%rsi), %r8
860 ; SSE2-NEXT:    xorq 16(%rsi), %r9
861 ; SSE2-NEXT:    movq 48(%rdi), %rdx
862 ; SSE2-NEXT:    movq 32(%rdi), %rax
863 ; SSE2-NEXT:    movq 56(%rdi), %rcx
864 ; SSE2-NEXT:    movq 40(%rdi), %rdi
865 ; SSE2-NEXT:    xorq 40(%rsi), %rdi
866 ; SSE2-NEXT:    xorq 56(%rsi), %rcx
867 ; SSE2-NEXT:    orq %r11, %rcx
868 ; SSE2-NEXT:    orq %rdi, %rcx
869 ; SSE2-NEXT:    orq %r10, %rcx
870 ; SSE2-NEXT:    xorq 32(%rsi), %rax
871 ; SSE2-NEXT:    xorq 48(%rsi), %rdx
872 ; SSE2-NEXT:    orq %r9, %rdx
873 ; SSE2-NEXT:    orq %rax, %rdx
874 ; SSE2-NEXT:    orq %r8, %rdx
875 ; SSE2-NEXT:    xorl %eax, %eax
876 ; SSE2-NEXT:    orq %rcx, %rdx
877 ; SSE2-NEXT:    sete %al
878 ; SSE2-NEXT:    retq
880 ; SSE41-LABEL: eq_i256_pair:
881 ; SSE41:       # %bb.0:
882 ; SSE41-NEXT:    movq 16(%rdi), %r9
883 ; SSE41-NEXT:    movq 24(%rdi), %r11
884 ; SSE41-NEXT:    movq (%rdi), %r8
885 ; SSE41-NEXT:    movq 8(%rdi), %r10
886 ; SSE41-NEXT:    xorq 8(%rsi), %r10
887 ; SSE41-NEXT:    xorq 24(%rsi), %r11
888 ; SSE41-NEXT:    xorq (%rsi), %r8
889 ; SSE41-NEXT:    xorq 16(%rsi), %r9
890 ; SSE41-NEXT:    movq 48(%rdi), %rdx
891 ; SSE41-NEXT:    movq 32(%rdi), %rax
892 ; SSE41-NEXT:    movq 56(%rdi), %rcx
893 ; SSE41-NEXT:    movq 40(%rdi), %rdi
894 ; SSE41-NEXT:    xorq 40(%rsi), %rdi
895 ; SSE41-NEXT:    xorq 56(%rsi), %rcx
896 ; SSE41-NEXT:    orq %r11, %rcx
897 ; SSE41-NEXT:    orq %rdi, %rcx
898 ; SSE41-NEXT:    orq %r10, %rcx
899 ; SSE41-NEXT:    xorq 32(%rsi), %rax
900 ; SSE41-NEXT:    xorq 48(%rsi), %rdx
901 ; SSE41-NEXT:    orq %r9, %rdx
902 ; SSE41-NEXT:    orq %rax, %rdx
903 ; SSE41-NEXT:    orq %r8, %rdx
904 ; SSE41-NEXT:    xorl %eax, %eax
905 ; SSE41-NEXT:    orq %rcx, %rdx
906 ; SSE41-NEXT:    sete %al
907 ; SSE41-NEXT:    retq
909 ; AVX1-LABEL: eq_i256_pair:
910 ; AVX1:       # %bb.0:
911 ; AVX1-NEXT:    vmovups (%rdi), %ymm0
912 ; AVX1-NEXT:    vmovups 32(%rdi), %ymm1
913 ; AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1
914 ; AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
915 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
916 ; AVX1-NEXT:    xorl %eax, %eax
917 ; AVX1-NEXT:    vptest %ymm0, %ymm0
918 ; AVX1-NEXT:    sete %al
919 ; AVX1-NEXT:    vzeroupper
920 ; AVX1-NEXT:    retq
922 ; AVX2-LABEL: eq_i256_pair:
923 ; AVX2:       # %bb.0:
924 ; AVX2-NEXT:    vmovdqu (%rdi), %ymm0
925 ; AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
926 ; AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
927 ; AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
928 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
929 ; AVX2-NEXT:    xorl %eax, %eax
930 ; AVX2-NEXT:    vptest %ymm0, %ymm0
931 ; AVX2-NEXT:    sete %al
932 ; AVX2-NEXT:    vzeroupper
933 ; AVX2-NEXT:    retq
935 ; AVX512-LABEL: eq_i256_pair:
936 ; AVX512:       # %bb.0:
937 ; AVX512-NEXT:    vmovdqu (%rdi), %ymm0
938 ; AVX512-NEXT:    vmovdqu 32(%rdi), %ymm1
939 ; AVX512-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
940 ; AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
941 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
942 ; AVX512-NEXT:    xorl %eax, %eax
943 ; AVX512-NEXT:    vptest %ymm0, %ymm0
944 ; AVX512-NEXT:    sete %al
945 ; AVX512-NEXT:    vzeroupper
946 ; AVX512-NEXT:    retq
947   %a0 = load i256, i256* %a
948   %b0 = load i256, i256* %b
949   %xor1 = xor i256 %a0, %b0
950   %ap1 = getelementptr i256, i256* %a, i256 1
951   %bp1 = getelementptr i256, i256* %b, i256 1
952   %a1 = load i256, i256* %ap1
953   %b1 = load i256, i256* %bp1
954   %xor2 = xor i256 %a1, %b1
955   %or = or i256 %xor1, %xor2
956   %cmp = icmp eq i256 %or, 0
957   %z = zext i1 %cmp to i32
958   ret i32 %z
961 ; This test models the expansion of 'memcmp(a, b, 64) != 0'
962 ; if we allowed 2 pairs of 64-byte loads per block.
964 define i32 @ne_i512_pair(i512* %a, i512* %b) {
965 ; NO512-LABEL: ne_i512_pair:
966 ; NO512:       # %bb.0:
967 ; NO512-NEXT:    movq 32(%rdi), %r8
968 ; NO512-NEXT:    movq 48(%rdi), %r9
969 ; NO512-NEXT:    movq 40(%rdi), %rdx
970 ; NO512-NEXT:    movq 56(%rdi), %rcx
971 ; NO512-NEXT:    xorq 56(%rsi), %rcx
972 ; NO512-NEXT:    movq 120(%rdi), %rax
973 ; NO512-NEXT:    xorq 120(%rsi), %rax
974 ; NO512-NEXT:    orq %rcx, %rax
975 ; NO512-NEXT:    movq 88(%rdi), %rcx
976 ; NO512-NEXT:    xorq 88(%rsi), %rcx
977 ; NO512-NEXT:    orq %rcx, %rax
978 ; NO512-NEXT:    movq 24(%rdi), %rcx
979 ; NO512-NEXT:    xorq 24(%rsi), %rcx
980 ; NO512-NEXT:    xorq 40(%rsi), %rdx
981 ; NO512-NEXT:    orq %rcx, %rax
982 ; NO512-NEXT:    movq 104(%rdi), %rcx
983 ; NO512-NEXT:    xorq 104(%rsi), %rcx
984 ; NO512-NEXT:    orq %rdx, %rcx
985 ; NO512-NEXT:    movq 72(%rdi), %rdx
986 ; NO512-NEXT:    xorq 72(%rsi), %rdx
987 ; NO512-NEXT:    orq %rdx, %rcx
988 ; NO512-NEXT:    movq 16(%rdi), %r10
989 ; NO512-NEXT:    orq %rax, %rcx
990 ; NO512-NEXT:    movq 8(%rdi), %rax
991 ; NO512-NEXT:    xorq 8(%rsi), %rax
992 ; NO512-NEXT:    xorq 48(%rsi), %r9
993 ; NO512-NEXT:    orq %rax, %rcx
994 ; NO512-NEXT:    movq 112(%rdi), %rax
995 ; NO512-NEXT:    xorq 112(%rsi), %rax
996 ; NO512-NEXT:    orq %r9, %rax
997 ; NO512-NEXT:    movq 80(%rdi), %rdx
998 ; NO512-NEXT:    xorq 80(%rsi), %rdx
999 ; NO512-NEXT:    orq %rdx, %rax
1000 ; NO512-NEXT:    movq (%rdi), %r9
1001 ; NO512-NEXT:    xorq 16(%rsi), %r10
1002 ; NO512-NEXT:    xorq (%rsi), %r9
1003 ; NO512-NEXT:    xorq 32(%rsi), %r8
1004 ; NO512-NEXT:    orq %r10, %rax
1005 ; NO512-NEXT:    movq 96(%rdi), %rdx
1006 ; NO512-NEXT:    movq 64(%rdi), %rdi
1007 ; NO512-NEXT:    xorq 64(%rsi), %rdi
1008 ; NO512-NEXT:    xorq 96(%rsi), %rdx
1009 ; NO512-NEXT:    orq %r8, %rdx
1010 ; NO512-NEXT:    orq %rdi, %rdx
1011 ; NO512-NEXT:    orq %rax, %rdx
1012 ; NO512-NEXT:    orq %r9, %rdx
1013 ; NO512-NEXT:    xorl %eax, %eax
1014 ; NO512-NEXT:    orq %rcx, %rdx
1015 ; NO512-NEXT:    setne %al
1016 ; NO512-NEXT:    retq
1018 ; AVX512F-LABEL: ne_i512_pair:
1019 ; AVX512F:       # %bb.0:
1020 ; AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
1021 ; AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
1022 ; AVX512F-NEXT:    vpcmpeqd (%rsi), %zmm0, %k1
1023 ; AVX512F-NEXT:    vpcmpeqd 64(%rsi), %zmm1, %k0 {%k1}
1024 ; AVX512F-NEXT:    xorl %eax, %eax
1025 ; AVX512F-NEXT:    kortestw %k0, %k0
1026 ; AVX512F-NEXT:    setae %al
1027 ; AVX512F-NEXT:    vzeroupper
1028 ; AVX512F-NEXT:    retq
1030 ; AVX512BW-LABEL: ne_i512_pair:
1031 ; AVX512BW:       # %bb.0:
1032 ; AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
1033 ; AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
1034 ; AVX512BW-NEXT:    vpcmpeqb (%rsi), %zmm0, %k1
1035 ; AVX512BW-NEXT:    vpcmpeqb 64(%rsi), %zmm1, %k0 {%k1}
1036 ; AVX512BW-NEXT:    xorl %eax, %eax
1037 ; AVX512BW-NEXT:    kortestq %k0, %k0
1038 ; AVX512BW-NEXT:    setae %al
1039 ; AVX512BW-NEXT:    vzeroupper
1040 ; AVX512BW-NEXT:    retq
1041   %a0 = load i512, i512* %a
1042   %b0 = load i512, i512* %b
1043   %xor1 = xor i512 %a0, %b0
1044   %ap1 = getelementptr i512, i512* %a, i512 1
1045   %bp1 = getelementptr i512, i512* %b, i512 1
1046   %a1 = load i512, i512* %ap1
1047   %b1 = load i512, i512* %bp1
1048   %xor2 = xor i512 %a1, %b1
1049   %or = or i512 %xor1, %xor2
1050   %cmp = icmp ne i512 %or, 0
1051   %z = zext i1 %cmp to i32
1052   ret i32 %z
1055 ; This test models the expansion of 'memcmp(a, b, 64) == 0'
1056 ; if we allowed 2 pairs of 64-byte loads per block.
1058 define i32 @eq_i512_pair(i512* %a, i512* %b) {
1059 ; NO512-LABEL: eq_i512_pair:
1060 ; NO512:       # %bb.0:
1061 ; NO512-NEXT:    movq 32(%rdi), %r8
1062 ; NO512-NEXT:    movq 48(%rdi), %r9
1063 ; NO512-NEXT:    movq 40(%rdi), %rdx
1064 ; NO512-NEXT:    movq 56(%rdi), %rcx
1065 ; NO512-NEXT:    xorq 56(%rsi), %rcx
1066 ; NO512-NEXT:    movq 120(%rdi), %rax
1067 ; NO512-NEXT:    xorq 120(%rsi), %rax
1068 ; NO512-NEXT:    orq %rcx, %rax
1069 ; NO512-NEXT:    movq 88(%rdi), %rcx
1070 ; NO512-NEXT:    xorq 88(%rsi), %rcx
1071 ; NO512-NEXT:    orq %rcx, %rax
1072 ; NO512-NEXT:    movq 24(%rdi), %rcx
1073 ; NO512-NEXT:    xorq 24(%rsi), %rcx
1074 ; NO512-NEXT:    xorq 40(%rsi), %rdx
1075 ; NO512-NEXT:    orq %rcx, %rax
1076 ; NO512-NEXT:    movq 104(%rdi), %rcx
1077 ; NO512-NEXT:    xorq 104(%rsi), %rcx
1078 ; NO512-NEXT:    orq %rdx, %rcx
1079 ; NO512-NEXT:    movq 72(%rdi), %rdx
1080 ; NO512-NEXT:    xorq 72(%rsi), %rdx
1081 ; NO512-NEXT:    orq %rdx, %rcx
1082 ; NO512-NEXT:    movq 16(%rdi), %r10
1083 ; NO512-NEXT:    orq %rax, %rcx
1084 ; NO512-NEXT:    movq 8(%rdi), %rax
1085 ; NO512-NEXT:    xorq 8(%rsi), %rax
1086 ; NO512-NEXT:    xorq 48(%rsi), %r9
1087 ; NO512-NEXT:    orq %rax, %rcx
1088 ; NO512-NEXT:    movq 112(%rdi), %rax
1089 ; NO512-NEXT:    xorq 112(%rsi), %rax
1090 ; NO512-NEXT:    orq %r9, %rax
1091 ; NO512-NEXT:    movq 80(%rdi), %rdx
1092 ; NO512-NEXT:    xorq 80(%rsi), %rdx
1093 ; NO512-NEXT:    orq %rdx, %rax
1094 ; NO512-NEXT:    movq (%rdi), %r9
1095 ; NO512-NEXT:    xorq 16(%rsi), %r10
1096 ; NO512-NEXT:    xorq (%rsi), %r9
1097 ; NO512-NEXT:    xorq 32(%rsi), %r8
1098 ; NO512-NEXT:    orq %r10, %rax
1099 ; NO512-NEXT:    movq 96(%rdi), %rdx
1100 ; NO512-NEXT:    movq 64(%rdi), %rdi
1101 ; NO512-NEXT:    xorq 64(%rsi), %rdi
1102 ; NO512-NEXT:    xorq 96(%rsi), %rdx
1103 ; NO512-NEXT:    orq %r8, %rdx
1104 ; NO512-NEXT:    orq %rdi, %rdx
1105 ; NO512-NEXT:    orq %rax, %rdx
1106 ; NO512-NEXT:    orq %r9, %rdx
1107 ; NO512-NEXT:    xorl %eax, %eax
1108 ; NO512-NEXT:    orq %rcx, %rdx
1109 ; NO512-NEXT:    sete %al
1110 ; NO512-NEXT:    retq
1112 ; AVX512F-LABEL: eq_i512_pair:
1113 ; AVX512F:       # %bb.0:
1114 ; AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
1115 ; AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
1116 ; AVX512F-NEXT:    vpcmpeqd (%rsi), %zmm0, %k1
1117 ; AVX512F-NEXT:    vpcmpeqd 64(%rsi), %zmm1, %k0 {%k1}
1118 ; AVX512F-NEXT:    xorl %eax, %eax
1119 ; AVX512F-NEXT:    kortestw %k0, %k0
1120 ; AVX512F-NEXT:    setb %al
1121 ; AVX512F-NEXT:    vzeroupper
1122 ; AVX512F-NEXT:    retq
1124 ; AVX512BW-LABEL: eq_i512_pair:
1125 ; AVX512BW:       # %bb.0:
1126 ; AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
1127 ; AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
1128 ; AVX512BW-NEXT:    vpcmpeqb (%rsi), %zmm0, %k1
1129 ; AVX512BW-NEXT:    vpcmpeqb 64(%rsi), %zmm1, %k0 {%k1}
1130 ; AVX512BW-NEXT:    xorl %eax, %eax
1131 ; AVX512BW-NEXT:    kortestq %k0, %k0
1132 ; AVX512BW-NEXT:    setb %al
1133 ; AVX512BW-NEXT:    vzeroupper
1134 ; AVX512BW-NEXT:    retq
1135   %a0 = load i512, i512* %a
1136   %b0 = load i512, i512* %b
1137   %xor1 = xor i512 %a0, %b0
1138   %ap1 = getelementptr i512, i512* %a, i512 1
1139   %bp1 = getelementptr i512, i512* %b, i512 1
1140   %a1 = load i512, i512* %ap1
1141   %b1 = load i512, i512* %bp1
1142   %xor2 = xor i512 %a1, %b1
1143   %or = or i512 %xor1, %xor2
1144   %cmp = icmp eq i512 %or, 0
1145   %z = zext i1 %cmp to i32
1146   ret i32 %z
1149 ; PR41971: Comparison using vector types is not favorable here.
1150 define i1 @eq_i128_args(i128 %a, i128 %b) {
1151 ; ANY-LABEL: eq_i128_args:
1152 ; ANY:       # %bb.0:
1153 ; ANY-NEXT:    xorq %rcx, %rsi
1154 ; ANY-NEXT:    xorq %rdx, %rdi
1155 ; ANY-NEXT:    orq %rsi, %rdi
1156 ; ANY-NEXT:    sete %al
1157 ; ANY-NEXT:    retq
1158   %r = icmp eq i128 %a, %b
1159   ret i1 %r
1162 define i1 @eq_i256_args(i256 %a, i256 %b) {
1163 ; ANY-LABEL: eq_i256_args:
1164 ; ANY:       # %bb.0:
1165 ; ANY-NEXT:    xorq %r9, %rsi
1166 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
1167 ; ANY-NEXT:    orq %rsi, %rcx
1168 ; ANY-NEXT:    xorq %r8, %rdi
1169 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdx
1170 ; ANY-NEXT:    orq %rdi, %rdx
1171 ; ANY-NEXT:    orq %rcx, %rdx
1172 ; ANY-NEXT:    sete %al
1173 ; ANY-NEXT:    retq
1174   %r = icmp eq i256 %a, %b
1175   ret i1 %r
1178 define i1 @eq_i512_args(i512 %a, i512 %b) {
1179 ; ANY-LABEL: eq_i512_args:
1180 ; ANY:       # %bb.0:
1181 ; ANY-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1182 ; ANY-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1183 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rax
1184 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
1185 ; ANY-NEXT:    orq %rax, %rcx
1186 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r9
1187 ; ANY-NEXT:    orq %rcx, %r9
1188 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rsi
1189 ; ANY-NEXT:    orq %r9, %rsi
1190 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r10
1191 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdx
1192 ; ANY-NEXT:    orq %r10, %rdx
1193 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r8
1194 ; ANY-NEXT:    orq %rdx, %r8
1195 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdi
1196 ; ANY-NEXT:    orq %r8, %rdi
1197 ; ANY-NEXT:    orq %rsi, %rdi
1198 ; ANY-NEXT:    sete %al
1199 ; ANY-NEXT:    retq
1200   %r = icmp eq i512 %a, %b
1201   ret i1 %r
1204 define i1 @eq_i128_op(i128 %a, i128 %b) {
1205 ; ANY-LABEL: eq_i128_op:
1206 ; ANY:       # %bb.0:
1207 ; ANY-NEXT:    addq $1, %rdi
1208 ; ANY-NEXT:    adcq $0, %rsi
1209 ; ANY-NEXT:    xorq %rdx, %rdi
1210 ; ANY-NEXT:    xorq %rcx, %rsi
1211 ; ANY-NEXT:    orq %rdi, %rsi
1212 ; ANY-NEXT:    sete %al
1213 ; ANY-NEXT:    retq
1214   %a2 = add i128 %a, 1
1215   %r = icmp eq i128 %a2, %b
1216   ret i1 %r
1219 define i1 @eq_i256_op(i256 %a, i256 %b) {
1220 ; ANY-LABEL: eq_i256_op:
1221 ; ANY:       # %bb.0:
1222 ; ANY-NEXT:    addq $1, %rdi
1223 ; ANY-NEXT:    adcq $0, %rsi
1224 ; ANY-NEXT:    adcq $0, %rdx
1225 ; ANY-NEXT:    adcq $0, %rcx
1226 ; ANY-NEXT:    xorq %r8, %rdi
1227 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdx
1228 ; ANY-NEXT:    orq %rdi, %rdx
1229 ; ANY-NEXT:    xorq %r9, %rsi
1230 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
1231 ; ANY-NEXT:    orq %rsi, %rcx
1232 ; ANY-NEXT:    orq %rdx, %rcx
1233 ; ANY-NEXT:    sete %al
1234 ; ANY-NEXT:    retq
1235   %a2 = add i256 %a, 1
1236   %r = icmp eq i256 %a2, %b
1237   ret i1 %r
1240 define i1 @eq_i512_op(i512 %a, i512 %b) {
1241 ; ANY-LABEL: eq_i512_op:
1242 ; ANY:       # %bb.0:
1243 ; ANY-NEXT:    movq {{[0-9]+}}(%rsp), %r10
1244 ; ANY-NEXT:    movq {{[0-9]+}}(%rsp), %rax
1245 ; ANY-NEXT:    addq $1, %rdi
1246 ; ANY-NEXT:    adcq $0, %rsi
1247 ; ANY-NEXT:    adcq $0, %rdx
1248 ; ANY-NEXT:    adcq $0, %rcx
1249 ; ANY-NEXT:    adcq $0, %r8
1250 ; ANY-NEXT:    adcq $0, %r9
1251 ; ANY-NEXT:    adcq $0, %r10
1252 ; ANY-NEXT:    adcq $0, %rax
1253 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rsi
1254 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r9
1255 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
1256 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rax
1257 ; ANY-NEXT:    orq %rcx, %rax
1258 ; ANY-NEXT:    orq %r9, %rax
1259 ; ANY-NEXT:    orq %rsi, %rax
1260 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdx
1261 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r10
1262 ; ANY-NEXT:    orq %rdx, %r10
1263 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r8
1264 ; ANY-NEXT:    orq %r10, %r8
1265 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rdi
1266 ; ANY-NEXT:    orq %r8, %rdi
1267 ; ANY-NEXT:    orq %rax, %rdi
1268 ; ANY-NEXT:    sete %al
1269 ; ANY-NEXT:    retq
1270   %a2 = add i512 %a, 1
1271   %r = icmp eq i512 %a2, %b
1272   ret i1 %r
1275 define i1 @eq_i128_load_arg(i128 *%p, i128 %b) {
1276 ; ANY-LABEL: eq_i128_load_arg:
1277 ; ANY:       # %bb.0:
1278 ; ANY-NEXT:    xorq 8(%rdi), %rdx
1279 ; ANY-NEXT:    xorq (%rdi), %rsi
1280 ; ANY-NEXT:    orq %rdx, %rsi
1281 ; ANY-NEXT:    sete %al
1282 ; ANY-NEXT:    retq
1283   %a = load i128, i128* %p
1284   %r = icmp eq i128 %a, %b
1285   ret i1 %r
1288 define i1 @eq_i256_load_arg(i256 *%p, i256 %b) {
1289 ; ANY-LABEL: eq_i256_load_arg:
1290 ; ANY:       # %bb.0:
1291 ; ANY-NEXT:    xorq 24(%rdi), %r8
1292 ; ANY-NEXT:    xorq 8(%rdi), %rdx
1293 ; ANY-NEXT:    orq %r8, %rdx
1294 ; ANY-NEXT:    xorq 16(%rdi), %rcx
1295 ; ANY-NEXT:    xorq (%rdi), %rsi
1296 ; ANY-NEXT:    orq %rcx, %rsi
1297 ; ANY-NEXT:    orq %rdx, %rsi
1298 ; ANY-NEXT:    sete %al
1299 ; ANY-NEXT:    retq
1300   %a = load i256, i256* %p
1301   %r = icmp eq i256 %a, %b
1302   ret i1 %r
1305 define i1 @eq_i512_load_arg(i512 *%p, i512 %b) {
1306 ; ANY-LABEL: eq_i512_load_arg:
1307 ; ANY:       # %bb.0:
1308 ; ANY-NEXT:    movq 40(%rdi), %r10
1309 ; ANY-NEXT:    movq 48(%rdi), %rax
1310 ; ANY-NEXT:    movq 56(%rdi), %r11
1311 ; ANY-NEXT:    xorq 24(%rdi), %r8
1312 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r11
1313 ; ANY-NEXT:    orq %r8, %r11
1314 ; ANY-NEXT:    xorq 8(%rdi), %rdx
1315 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %r10
1316 ; ANY-NEXT:    orq %r11, %r10
1317 ; ANY-NEXT:    orq %rdx, %r10
1318 ; ANY-NEXT:    xorq 32(%rdi), %r9
1319 ; ANY-NEXT:    xorq (%rdi), %rsi
1320 ; ANY-NEXT:    xorq 16(%rdi), %rcx
1321 ; ANY-NEXT:    xorq {{[0-9]+}}(%rsp), %rax
1322 ; ANY-NEXT:    orq %rcx, %rax
1323 ; ANY-NEXT:    orq %r9, %rax
1324 ; ANY-NEXT:    orq %rsi, %rax
1325 ; ANY-NEXT:    orq %r10, %rax
1326 ; ANY-NEXT:    sete %al
1327 ; ANY-NEXT:    retq
1328   %a = load i512, i512* %p
1329   %r = icmp eq i512 %a, %b
1330   ret i1 %r