1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; NOTE: This is a copy of llvm/test/CodeGen/X86/memcmp.ll with more load pairs. Please keep it that way.
3 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=cmov | FileCheck %s --check-prefixes=X86,X86-NOSSE
4 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=+sse | FileCheck %s --check-prefixes=X86,X86-SSE1
5 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X86,X86-SSE2
6 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=X86,X86-SSE41
8 ; This tests codegen time inlining/optimization of memcmp
11 @.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 1
13 declare dso_local i32 @memcmp(ptr, ptr, i32)
15 define i32 @length0(ptr %X, ptr %Y) nounwind {
18 ; X86-NEXT: xorl %eax, %eax
20 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 0) nounwind
24 define i1 @length0_eq(ptr %X, ptr %Y) nounwind {
25 ; X86-LABEL: length0_eq:
27 ; X86-NEXT: movb $1, %al
29 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 0) nounwind
30 %c = icmp eq i32 %m, 0
34 define i1 @length0_lt(ptr %X, ptr %Y) nounwind {
35 ; X86-LABEL: length0_lt:
37 ; X86-NEXT: xorl %eax, %eax
39 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 0) nounwind
40 %c = icmp slt i32 %m, 0
44 define i32 @length2(ptr %X, ptr %Y) nounwind {
47 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
48 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
49 ; X86-NEXT: movzwl (%ecx), %ecx
50 ; X86-NEXT: movzwl (%eax), %edx
51 ; X86-NEXT: rolw $8, %cx
52 ; X86-NEXT: rolw $8, %dx
53 ; X86-NEXT: movzwl %cx, %eax
54 ; X86-NEXT: movzwl %dx, %ecx
55 ; X86-NEXT: subl %ecx, %eax
57 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind
61 define i1 @length2_eq(ptr %X, ptr %Y) nounwind {
62 ; X86-LABEL: length2_eq:
64 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
65 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
66 ; X86-NEXT: movzwl (%ecx), %ecx
67 ; X86-NEXT: cmpw (%eax), %cx
70 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind
71 %c = icmp eq i32 %m, 0
75 define i1 @length2_lt(ptr %X, ptr %Y) nounwind {
76 ; X86-LABEL: length2_lt:
78 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
79 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
80 ; X86-NEXT: movzwl (%ecx), %ecx
81 ; X86-NEXT: movzwl (%eax), %edx
82 ; X86-NEXT: rolw $8, %cx
83 ; X86-NEXT: rolw $8, %dx
84 ; X86-NEXT: movzwl %cx, %eax
85 ; X86-NEXT: movzwl %dx, %ecx
86 ; X86-NEXT: subl %ecx, %eax
87 ; X86-NEXT: shrl $31, %eax
88 ; X86-NEXT: # kill: def $al killed $al killed $eax
90 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind
91 %c = icmp slt i32 %m, 0
95 define i1 @length2_gt(ptr %X, ptr %Y) nounwind {
96 ; X86-LABEL: length2_gt:
98 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
99 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
100 ; X86-NEXT: movzwl (%ecx), %ecx
101 ; X86-NEXT: movzwl (%eax), %eax
102 ; X86-NEXT: rolw $8, %cx
103 ; X86-NEXT: rolw $8, %ax
104 ; X86-NEXT: movzwl %cx, %ecx
105 ; X86-NEXT: movzwl %ax, %eax
106 ; X86-NEXT: subl %eax, %ecx
107 ; X86-NEXT: testl %ecx, %ecx
110 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind
111 %c = icmp sgt i32 %m, 0
115 define i1 @length2_eq_const(ptr %X) nounwind {
116 ; X86-LABEL: length2_eq_const:
118 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
119 ; X86-NEXT: cmpw $12849, (%eax) # imm = 0x3231
120 ; X86-NEXT: setne %al
122 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i32 2) nounwind
123 %c = icmp ne i32 %m, 0
127 define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind {
128 ; X86-LABEL: length2_eq_nobuiltin_attr:
131 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
132 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
133 ; X86-NEXT: calll memcmp
134 ; X86-NEXT: addl $12, %esp
135 ; X86-NEXT: testl %eax, %eax
138 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind nobuiltin
139 %c = icmp eq i32 %m, 0
143 define i32 @length3(ptr %X, ptr %Y) nounwind {
144 ; X86-LABEL: length3:
146 ; X86-NEXT: pushl %esi
147 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
148 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
149 ; X86-NEXT: movzwl (%eax), %edx
150 ; X86-NEXT: movzwl (%ecx), %esi
151 ; X86-NEXT: rolw $8, %dx
152 ; X86-NEXT: rolw $8, %si
153 ; X86-NEXT: cmpw %si, %dx
154 ; X86-NEXT: jne .LBB9_3
155 ; X86-NEXT: # %bb.1: # %loadbb1
156 ; X86-NEXT: movzbl 2(%eax), %eax
157 ; X86-NEXT: movzbl 2(%ecx), %ecx
158 ; X86-NEXT: subl %ecx, %eax
159 ; X86-NEXT: popl %esi
161 ; X86-NEXT: .LBB9_3: # %res_block
162 ; X86-NEXT: xorl %eax, %eax
163 ; X86-NEXT: cmpw %si, %dx
164 ; X86-NEXT: sbbl %eax, %eax
165 ; X86-NEXT: orl $1, %eax
166 ; X86-NEXT: popl %esi
168 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 3) nounwind
172 define i1 @length3_eq(ptr %X, ptr %Y) nounwind {
173 ; X86-LABEL: length3_eq:
175 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
176 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
177 ; X86-NEXT: movzwl (%ecx), %edx
178 ; X86-NEXT: xorw (%eax), %dx
179 ; X86-NEXT: movzbl 2(%ecx), %ecx
180 ; X86-NEXT: xorb 2(%eax), %cl
181 ; X86-NEXT: movzbl %cl, %eax
182 ; X86-NEXT: orw %dx, %ax
183 ; X86-NEXT: setne %al
185 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 3) nounwind
186 %c = icmp ne i32 %m, 0
190 define i32 @length4(ptr %X, ptr %Y) nounwind {
191 ; X86-LABEL: length4:
193 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
194 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
195 ; X86-NEXT: movl (%ecx), %ecx
196 ; X86-NEXT: movl (%eax), %eax
197 ; X86-NEXT: bswapl %ecx
198 ; X86-NEXT: bswapl %eax
199 ; X86-NEXT: cmpl %eax, %ecx
201 ; X86-NEXT: sbbb $0, %al
202 ; X86-NEXT: movsbl %al, %eax
204 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind
208 define i1 @length4_eq(ptr %X, ptr %Y) nounwind {
209 ; X86-LABEL: length4_eq:
211 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
212 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
213 ; X86-NEXT: movl (%ecx), %ecx
214 ; X86-NEXT: cmpl (%eax), %ecx
215 ; X86-NEXT: setne %al
217 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind
218 %c = icmp ne i32 %m, 0
222 define i1 @length4_lt(ptr %X, ptr %Y) nounwind {
223 ; X86-LABEL: length4_lt:
225 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
226 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
227 ; X86-NEXT: movl (%ecx), %ecx
228 ; X86-NEXT: movl (%eax), %eax
229 ; X86-NEXT: bswapl %ecx
230 ; X86-NEXT: bswapl %eax
231 ; X86-NEXT: cmpl %eax, %ecx
234 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind
235 %c = icmp slt i32 %m, 0
239 define i1 @length4_gt(ptr %X, ptr %Y) nounwind {
240 ; X86-LABEL: length4_gt:
242 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
243 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
244 ; X86-NEXT: movl (%ecx), %ecx
245 ; X86-NEXT: movl (%eax), %eax
246 ; X86-NEXT: bswapl %ecx
247 ; X86-NEXT: bswapl %eax
248 ; X86-NEXT: cmpl %eax, %ecx
251 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind
252 %c = icmp sgt i32 %m, 0
256 define i1 @length4_eq_const(ptr %X) nounwind {
257 ; X86-LABEL: length4_eq_const:
259 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
260 ; X86-NEXT: cmpl $875770417, (%eax) # imm = 0x34333231
263 %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i32 4) nounwind
264 %c = icmp eq i32 %m, 0
268 define i32 @length5(ptr %X, ptr %Y) nounwind {
269 ; X86-LABEL: length5:
271 ; X86-NEXT: pushl %esi
272 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
273 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
274 ; X86-NEXT: movl (%eax), %edx
275 ; X86-NEXT: movl (%ecx), %esi
276 ; X86-NEXT: bswapl %edx
277 ; X86-NEXT: bswapl %esi
278 ; X86-NEXT: cmpl %esi, %edx
279 ; X86-NEXT: jne .LBB16_3
280 ; X86-NEXT: # %bb.1: # %loadbb1
281 ; X86-NEXT: movzbl 4(%eax), %eax
282 ; X86-NEXT: movzbl 4(%ecx), %ecx
283 ; X86-NEXT: subl %ecx, %eax
284 ; X86-NEXT: popl %esi
286 ; X86-NEXT: .LBB16_3: # %res_block
287 ; X86-NEXT: xorl %eax, %eax
288 ; X86-NEXT: cmpl %esi, %edx
289 ; X86-NEXT: sbbl %eax, %eax
290 ; X86-NEXT: orl $1, %eax
291 ; X86-NEXT: popl %esi
293 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind
297 define i1 @length5_eq(ptr %X, ptr %Y) nounwind {
298 ; X86-LABEL: length5_eq:
300 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
301 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
302 ; X86-NEXT: movl (%ecx), %edx
303 ; X86-NEXT: xorl (%eax), %edx
304 ; X86-NEXT: movzbl 4(%ecx), %ecx
305 ; X86-NEXT: xorb 4(%eax), %cl
306 ; X86-NEXT: movzbl %cl, %eax
307 ; X86-NEXT: orl %edx, %eax
308 ; X86-NEXT: setne %al
310 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind
311 %c = icmp ne i32 %m, 0
315 define i1 @length5_lt(ptr %X, ptr %Y) nounwind {
316 ; X86-LABEL: length5_lt:
318 ; X86-NEXT: pushl %esi
319 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
320 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
321 ; X86-NEXT: movl (%eax), %edx
322 ; X86-NEXT: movl (%ecx), %esi
323 ; X86-NEXT: bswapl %edx
324 ; X86-NEXT: bswapl %esi
325 ; X86-NEXT: cmpl %esi, %edx
326 ; X86-NEXT: jne .LBB18_3
327 ; X86-NEXT: # %bb.1: # %loadbb1
328 ; X86-NEXT: movzbl 4(%eax), %eax
329 ; X86-NEXT: movzbl 4(%ecx), %ecx
330 ; X86-NEXT: subl %ecx, %eax
331 ; X86-NEXT: jmp .LBB18_2
332 ; X86-NEXT: .LBB18_3: # %res_block
333 ; X86-NEXT: xorl %eax, %eax
334 ; X86-NEXT: cmpl %esi, %edx
335 ; X86-NEXT: sbbl %eax, %eax
336 ; X86-NEXT: orl $1, %eax
337 ; X86-NEXT: .LBB18_2: # %endblock
338 ; X86-NEXT: shrl $31, %eax
339 ; X86-NEXT: # kill: def $al killed $al killed $eax
340 ; X86-NEXT: popl %esi
342 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind
343 %c = icmp slt i32 %m, 0
347 define i32 @length7(ptr %X, ptr %Y) nounwind {
348 ; X86-LABEL: length7:
350 ; X86-NEXT: pushl %esi
351 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
352 ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
353 ; X86-NEXT: movl (%esi), %ecx
354 ; X86-NEXT: movl (%eax), %edx
355 ; X86-NEXT: bswapl %ecx
356 ; X86-NEXT: bswapl %edx
357 ; X86-NEXT: cmpl %edx, %ecx
358 ; X86-NEXT: jne .LBB19_2
359 ; X86-NEXT: # %bb.1: # %loadbb1
360 ; X86-NEXT: movl 3(%esi), %ecx
361 ; X86-NEXT: movl 3(%eax), %edx
362 ; X86-NEXT: bswapl %ecx
363 ; X86-NEXT: bswapl %edx
364 ; X86-NEXT: xorl %eax, %eax
365 ; X86-NEXT: cmpl %edx, %ecx
366 ; X86-NEXT: je .LBB19_3
367 ; X86-NEXT: .LBB19_2: # %res_block
368 ; X86-NEXT: xorl %eax, %eax
369 ; X86-NEXT: cmpl %edx, %ecx
370 ; X86-NEXT: sbbl %eax, %eax
371 ; X86-NEXT: orl $1, %eax
372 ; X86-NEXT: .LBB19_3: # %endblock
373 ; X86-NEXT: popl %esi
375 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 7) nounwind
379 define i1 @length7_eq(ptr %X, ptr %Y) nounwind {
380 ; X86-LABEL: length7_eq:
382 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
383 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
384 ; X86-NEXT: movl (%ecx), %edx
385 ; X86-NEXT: movl 3(%ecx), %ecx
386 ; X86-NEXT: xorl (%eax), %edx
387 ; X86-NEXT: xorl 3(%eax), %ecx
388 ; X86-NEXT: orl %edx, %ecx
389 ; X86-NEXT: setne %al
391 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 7) nounwind
392 %c = icmp ne i32 %m, 0
396 define i1 @length7_lt(ptr %X, ptr %Y) nounwind {
397 ; X86-LABEL: length7_lt:
399 ; X86-NEXT: pushl %esi
400 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
401 ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
402 ; X86-NEXT: movl (%esi), %ecx
403 ; X86-NEXT: movl (%eax), %edx
404 ; X86-NEXT: bswapl %ecx
405 ; X86-NEXT: bswapl %edx
406 ; X86-NEXT: cmpl %edx, %ecx
407 ; X86-NEXT: jne .LBB21_2
408 ; X86-NEXT: # %bb.1: # %loadbb1
409 ; X86-NEXT: movl 3(%esi), %ecx
410 ; X86-NEXT: movl 3(%eax), %edx
411 ; X86-NEXT: bswapl %ecx
412 ; X86-NEXT: bswapl %edx
413 ; X86-NEXT: xorl %eax, %eax
414 ; X86-NEXT: cmpl %edx, %ecx
415 ; X86-NEXT: je .LBB21_3
416 ; X86-NEXT: .LBB21_2: # %res_block
417 ; X86-NEXT: xorl %eax, %eax
418 ; X86-NEXT: cmpl %edx, %ecx
419 ; X86-NEXT: sbbl %eax, %eax
420 ; X86-NEXT: orl $1, %eax
421 ; X86-NEXT: .LBB21_3: # %endblock
422 ; X86-NEXT: shrl $31, %eax
423 ; X86-NEXT: # kill: def $al killed $al killed $eax
424 ; X86-NEXT: popl %esi
426 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 7) nounwind
427 %c = icmp slt i32 %m, 0
431 define i32 @length8(ptr %X, ptr %Y) nounwind {
432 ; X86-LABEL: length8:
434 ; X86-NEXT: pushl %esi
435 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
436 ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
437 ; X86-NEXT: movl (%esi), %ecx
438 ; X86-NEXT: movl (%eax), %edx
439 ; X86-NEXT: bswapl %ecx
440 ; X86-NEXT: bswapl %edx
441 ; X86-NEXT: cmpl %edx, %ecx
442 ; X86-NEXT: jne .LBB22_2
443 ; X86-NEXT: # %bb.1: # %loadbb1
444 ; X86-NEXT: movl 4(%esi), %ecx
445 ; X86-NEXT: movl 4(%eax), %edx
446 ; X86-NEXT: bswapl %ecx
447 ; X86-NEXT: bswapl %edx
448 ; X86-NEXT: xorl %eax, %eax
449 ; X86-NEXT: cmpl %edx, %ecx
450 ; X86-NEXT: je .LBB22_3
451 ; X86-NEXT: .LBB22_2: # %res_block
452 ; X86-NEXT: xorl %eax, %eax
453 ; X86-NEXT: cmpl %edx, %ecx
454 ; X86-NEXT: sbbl %eax, %eax
455 ; X86-NEXT: orl $1, %eax
456 ; X86-NEXT: .LBB22_3: # %endblock
457 ; X86-NEXT: popl %esi
459 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 8) nounwind
463 define i1 @length8_eq(ptr %X, ptr %Y) nounwind {
464 ; X86-LABEL: length8_eq:
466 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
467 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
468 ; X86-NEXT: movl (%ecx), %edx
469 ; X86-NEXT: movl 4(%ecx), %ecx
470 ; X86-NEXT: xorl (%eax), %edx
471 ; X86-NEXT: xorl 4(%eax), %ecx
472 ; X86-NEXT: orl %edx, %ecx
475 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 8) nounwind
476 %c = icmp eq i32 %m, 0
480 define i1 @length8_eq_const(ptr %X) nounwind {
481 ; X86-LABEL: length8_eq_const:
483 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
484 ; X86-NEXT: movl $858927408, %ecx # imm = 0x33323130
485 ; X86-NEXT: xorl (%eax), %ecx
486 ; X86-NEXT: movl $926299444, %edx # imm = 0x37363534
487 ; X86-NEXT: xorl 4(%eax), %edx
488 ; X86-NEXT: orl %ecx, %edx
489 ; X86-NEXT: setne %al
491 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 8) nounwind
492 %c = icmp ne i32 %m, 0
496 define i1 @length9_eq(ptr %X, ptr %Y) nounwind {
497 ; X86-LABEL: length9_eq:
499 ; X86-NEXT: pushl %esi
500 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
501 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
502 ; X86-NEXT: movl (%ecx), %edx
503 ; X86-NEXT: movl 4(%ecx), %esi
504 ; X86-NEXT: xorl (%eax), %edx
505 ; X86-NEXT: xorl 4(%eax), %esi
506 ; X86-NEXT: orl %edx, %esi
507 ; X86-NEXT: movzbl 8(%ecx), %ecx
508 ; X86-NEXT: xorb 8(%eax), %cl
509 ; X86-NEXT: movzbl %cl, %eax
510 ; X86-NEXT: orl %esi, %eax
512 ; X86-NEXT: popl %esi
514 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 9) nounwind
515 %c = icmp eq i32 %m, 0
519 define i1 @length10_eq(ptr %X, ptr %Y) nounwind {
520 ; X86-LABEL: length10_eq:
522 ; X86-NEXT: pushl %esi
523 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
524 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
525 ; X86-NEXT: movl (%ecx), %edx
526 ; X86-NEXT: movl 4(%ecx), %esi
527 ; X86-NEXT: xorl (%eax), %edx
528 ; X86-NEXT: xorl 4(%eax), %esi
529 ; X86-NEXT: orl %edx, %esi
530 ; X86-NEXT: movzwl 8(%ecx), %ecx
531 ; X86-NEXT: xorw 8(%eax), %cx
532 ; X86-NEXT: movzwl %cx, %eax
533 ; X86-NEXT: orl %esi, %eax
535 ; X86-NEXT: popl %esi
537 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 10) nounwind
538 %c = icmp eq i32 %m, 0
542 define i1 @length11_eq(ptr %X, ptr %Y) nounwind {
543 ; X86-LABEL: length11_eq:
545 ; X86-NEXT: pushl %esi
546 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
547 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
548 ; X86-NEXT: movl (%ecx), %edx
549 ; X86-NEXT: movl 4(%ecx), %esi
550 ; X86-NEXT: xorl (%eax), %edx
551 ; X86-NEXT: xorl 4(%eax), %esi
552 ; X86-NEXT: orl %edx, %esi
553 ; X86-NEXT: movl 7(%ecx), %ecx
554 ; X86-NEXT: xorl 7(%eax), %ecx
555 ; X86-NEXT: orl %esi, %ecx
557 ; X86-NEXT: popl %esi
559 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 11) nounwind
560 %c = icmp eq i32 %m, 0
564 define i1 @length12_eq(ptr %X, ptr %Y) nounwind {
565 ; X86-LABEL: length12_eq:
567 ; X86-NEXT: pushl %esi
568 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
569 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
570 ; X86-NEXT: movl (%ecx), %edx
571 ; X86-NEXT: movl 4(%ecx), %esi
572 ; X86-NEXT: xorl (%eax), %edx
573 ; X86-NEXT: xorl 4(%eax), %esi
574 ; X86-NEXT: orl %edx, %esi
575 ; X86-NEXT: movl 8(%ecx), %ecx
576 ; X86-NEXT: xorl 8(%eax), %ecx
577 ; X86-NEXT: orl %esi, %ecx
578 ; X86-NEXT: setne %al
579 ; X86-NEXT: popl %esi
581 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 12) nounwind
582 %c = icmp ne i32 %m, 0
586 define i32 @length12(ptr %X, ptr %Y) nounwind {
587 ; X86-LABEL: length12:
589 ; X86-NEXT: pushl %esi
590 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
591 ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
592 ; X86-NEXT: movl (%esi), %ecx
593 ; X86-NEXT: movl (%eax), %edx
594 ; X86-NEXT: bswapl %ecx
595 ; X86-NEXT: bswapl %edx
596 ; X86-NEXT: cmpl %edx, %ecx
597 ; X86-NEXT: jne .LBB29_3
598 ; X86-NEXT: # %bb.1: # %loadbb1
599 ; X86-NEXT: movl 4(%esi), %ecx
600 ; X86-NEXT: movl 4(%eax), %edx
601 ; X86-NEXT: bswapl %ecx
602 ; X86-NEXT: bswapl %edx
603 ; X86-NEXT: cmpl %edx, %ecx
604 ; X86-NEXT: jne .LBB29_3
605 ; X86-NEXT: # %bb.2: # %loadbb2
606 ; X86-NEXT: movl 8(%esi), %ecx
607 ; X86-NEXT: movl 8(%eax), %edx
608 ; X86-NEXT: bswapl %ecx
609 ; X86-NEXT: bswapl %edx
610 ; X86-NEXT: xorl %eax, %eax
611 ; X86-NEXT: cmpl %edx, %ecx
612 ; X86-NEXT: je .LBB29_4
613 ; X86-NEXT: .LBB29_3: # %res_block
614 ; X86-NEXT: xorl %eax, %eax
615 ; X86-NEXT: cmpl %edx, %ecx
616 ; X86-NEXT: sbbl %eax, %eax
617 ; X86-NEXT: orl $1, %eax
618 ; X86-NEXT: .LBB29_4: # %endblock
619 ; X86-NEXT: popl %esi
621 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 12) nounwind
625 define i1 @length13_eq(ptr %X, ptr %Y) nounwind {
626 ; X86-LABEL: length13_eq:
628 ; X86-NEXT: pushl %esi
629 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
630 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
631 ; X86-NEXT: movl (%edx), %esi
632 ; X86-NEXT: movl 4(%edx), %eax
633 ; X86-NEXT: xorl (%ecx), %esi
634 ; X86-NEXT: xorl 4(%ecx), %eax
635 ; X86-NEXT: orl %esi, %eax
636 ; X86-NEXT: movl 8(%edx), %esi
637 ; X86-NEXT: xorl 8(%ecx), %esi
638 ; X86-NEXT: movzbl 12(%edx), %edx
639 ; X86-NEXT: xorb 12(%ecx), %dl
640 ; X86-NEXT: movzbl %dl, %ecx
641 ; X86-NEXT: orl %esi, %ecx
642 ; X86-NEXT: orl %eax, %ecx
644 ; X86-NEXT: popl %esi
646 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 13) nounwind
647 %c = icmp eq i32 %m, 0
651 define i1 @length14_eq(ptr %X, ptr %Y) nounwind {
652 ; X86-LABEL: length14_eq:
654 ; X86-NEXT: pushl %esi
655 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
656 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
657 ; X86-NEXT: movl (%edx), %esi
658 ; X86-NEXT: movl 4(%edx), %eax
659 ; X86-NEXT: xorl (%ecx), %esi
660 ; X86-NEXT: xorl 4(%ecx), %eax
661 ; X86-NEXT: orl %esi, %eax
662 ; X86-NEXT: movl 8(%edx), %esi
663 ; X86-NEXT: xorl 8(%ecx), %esi
664 ; X86-NEXT: movzwl 12(%edx), %edx
665 ; X86-NEXT: xorw 12(%ecx), %dx
666 ; X86-NEXT: movzwl %dx, %ecx
667 ; X86-NEXT: orl %esi, %ecx
668 ; X86-NEXT: orl %eax, %ecx
670 ; X86-NEXT: popl %esi
672 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 14) nounwind
673 %c = icmp eq i32 %m, 0
677 define i1 @length15_eq(ptr %X, ptr %Y) nounwind {
678 ; X86-LABEL: length15_eq:
680 ; X86-NEXT: pushl %esi
681 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
682 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
683 ; X86-NEXT: movl (%edx), %esi
684 ; X86-NEXT: movl 4(%edx), %eax
685 ; X86-NEXT: xorl (%ecx), %esi
686 ; X86-NEXT: xorl 4(%ecx), %eax
687 ; X86-NEXT: orl %esi, %eax
688 ; X86-NEXT: movl 8(%edx), %esi
689 ; X86-NEXT: xorl 8(%ecx), %esi
690 ; X86-NEXT: movl 11(%edx), %edx
691 ; X86-NEXT: xorl 11(%ecx), %edx
692 ; X86-NEXT: orl %esi, %edx
693 ; X86-NEXT: orl %eax, %edx
695 ; X86-NEXT: popl %esi
697 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 15) nounwind
698 %c = icmp eq i32 %m, 0
702 ; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329
704 define i32 @length16(ptr %X, ptr %Y) nounwind {
705 ; X86-LABEL: length16:
707 ; X86-NEXT: pushl %esi
708 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
709 ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
710 ; X86-NEXT: movl (%esi), %ecx
711 ; X86-NEXT: movl (%eax), %edx
712 ; X86-NEXT: bswapl %ecx
713 ; X86-NEXT: bswapl %edx
714 ; X86-NEXT: cmpl %edx, %ecx
715 ; X86-NEXT: jne .LBB33_4
716 ; X86-NEXT: # %bb.1: # %loadbb1
717 ; X86-NEXT: movl 4(%esi), %ecx
718 ; X86-NEXT: movl 4(%eax), %edx
719 ; X86-NEXT: bswapl %ecx
720 ; X86-NEXT: bswapl %edx
721 ; X86-NEXT: cmpl %edx, %ecx
722 ; X86-NEXT: jne .LBB33_4
723 ; X86-NEXT: # %bb.2: # %loadbb2
724 ; X86-NEXT: movl 8(%esi), %ecx
725 ; X86-NEXT: movl 8(%eax), %edx
726 ; X86-NEXT: bswapl %ecx
727 ; X86-NEXT: bswapl %edx
728 ; X86-NEXT: cmpl %edx, %ecx
729 ; X86-NEXT: jne .LBB33_4
730 ; X86-NEXT: # %bb.3: # %loadbb3
731 ; X86-NEXT: movl 12(%esi), %ecx
732 ; X86-NEXT: movl 12(%eax), %edx
733 ; X86-NEXT: bswapl %ecx
734 ; X86-NEXT: bswapl %edx
735 ; X86-NEXT: xorl %eax, %eax
736 ; X86-NEXT: cmpl %edx, %ecx
737 ; X86-NEXT: je .LBB33_5
738 ; X86-NEXT: .LBB33_4: # %res_block
739 ; X86-NEXT: xorl %eax, %eax
740 ; X86-NEXT: cmpl %edx, %ecx
741 ; X86-NEXT: sbbl %eax, %eax
742 ; X86-NEXT: orl $1, %eax
743 ; X86-NEXT: .LBB33_5: # %endblock
744 ; X86-NEXT: popl %esi
746 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 16) nounwind
750 define i1 @length16_eq(ptr %x, ptr %y) nounwind {
751 ; X86-NOSSE-LABEL: length16_eq:
752 ; X86-NOSSE: # %bb.0:
753 ; X86-NOSSE-NEXT: pushl %esi
754 ; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %ecx
755 ; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %edx
756 ; X86-NOSSE-NEXT: movl (%edx), %esi
757 ; X86-NOSSE-NEXT: movl 4(%edx), %eax
758 ; X86-NOSSE-NEXT: xorl (%ecx), %esi
759 ; X86-NOSSE-NEXT: xorl 4(%ecx), %eax
760 ; X86-NOSSE-NEXT: orl %esi, %eax
761 ; X86-NOSSE-NEXT: movl 8(%edx), %esi
762 ; X86-NOSSE-NEXT: xorl 8(%ecx), %esi
763 ; X86-NOSSE-NEXT: movl 12(%edx), %edx
764 ; X86-NOSSE-NEXT: xorl 12(%ecx), %edx
765 ; X86-NOSSE-NEXT: orl %esi, %edx
766 ; X86-NOSSE-NEXT: orl %eax, %edx
767 ; X86-NOSSE-NEXT: setne %al
768 ; X86-NOSSE-NEXT: popl %esi
769 ; X86-NOSSE-NEXT: retl
771 ; X86-SSE1-LABEL: length16_eq:
773 ; X86-SSE1-NEXT: pushl %esi
774 ; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %ecx
775 ; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %edx
776 ; X86-SSE1-NEXT: movl (%edx), %esi
777 ; X86-SSE1-NEXT: movl 4(%edx), %eax
778 ; X86-SSE1-NEXT: xorl (%ecx), %esi
779 ; X86-SSE1-NEXT: xorl 4(%ecx), %eax
780 ; X86-SSE1-NEXT: orl %esi, %eax
781 ; X86-SSE1-NEXT: movl 8(%edx), %esi
782 ; X86-SSE1-NEXT: xorl 8(%ecx), %esi
783 ; X86-SSE1-NEXT: movl 12(%edx), %edx
784 ; X86-SSE1-NEXT: xorl 12(%ecx), %edx
785 ; X86-SSE1-NEXT: orl %esi, %edx
786 ; X86-SSE1-NEXT: orl %eax, %edx
787 ; X86-SSE1-NEXT: setne %al
788 ; X86-SSE1-NEXT: popl %esi
789 ; X86-SSE1-NEXT: retl
791 ; X86-SSE2-LABEL: length16_eq:
793 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
794 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
795 ; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
796 ; X86-SSE2-NEXT: movdqu (%eax), %xmm1
797 ; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
798 ; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
799 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
800 ; X86-SSE2-NEXT: setne %al
801 ; X86-SSE2-NEXT: retl
803 ; X86-SSE41-LABEL: length16_eq:
804 ; X86-SSE41: # %bb.0:
805 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
806 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
807 ; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
808 ; X86-SSE41-NEXT: movdqu (%eax), %xmm1
809 ; X86-SSE41-NEXT: pxor %xmm0, %xmm1
810 ; X86-SSE41-NEXT: ptest %xmm1, %xmm1
811 ; X86-SSE41-NEXT: setne %al
812 ; X86-SSE41-NEXT: retl
813 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 16) nounwind
814 %cmp = icmp ne i32 %call, 0
818 define i1 @length16_lt(ptr %x, ptr %y) nounwind {
819 ; X86-LABEL: length16_lt:
821 ; X86-NEXT: pushl %esi
822 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
823 ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
824 ; X86-NEXT: movl (%esi), %ecx
825 ; X86-NEXT: movl (%eax), %edx
826 ; X86-NEXT: bswapl %ecx
827 ; X86-NEXT: bswapl %edx
828 ; X86-NEXT: cmpl %edx, %ecx
829 ; X86-NEXT: jne .LBB35_4
830 ; X86-NEXT: # %bb.1: # %loadbb1
831 ; X86-NEXT: movl 4(%esi), %ecx
832 ; X86-NEXT: movl 4(%eax), %edx
833 ; X86-NEXT: bswapl %ecx
834 ; X86-NEXT: bswapl %edx
835 ; X86-NEXT: cmpl %edx, %ecx
836 ; X86-NEXT: jne .LBB35_4
837 ; X86-NEXT: # %bb.2: # %loadbb2
838 ; X86-NEXT: movl 8(%esi), %ecx
839 ; X86-NEXT: movl 8(%eax), %edx
840 ; X86-NEXT: bswapl %ecx
841 ; X86-NEXT: bswapl %edx
842 ; X86-NEXT: cmpl %edx, %ecx
843 ; X86-NEXT: jne .LBB35_4
844 ; X86-NEXT: # %bb.3: # %loadbb3
845 ; X86-NEXT: movl 12(%esi), %ecx
846 ; X86-NEXT: movl 12(%eax), %edx
847 ; X86-NEXT: bswapl %ecx
848 ; X86-NEXT: bswapl %edx
849 ; X86-NEXT: xorl %eax, %eax
850 ; X86-NEXT: cmpl %edx, %ecx
851 ; X86-NEXT: je .LBB35_5
852 ; X86-NEXT: .LBB35_4: # %res_block
853 ; X86-NEXT: xorl %eax, %eax
854 ; X86-NEXT: cmpl %edx, %ecx
855 ; X86-NEXT: sbbl %eax, %eax
856 ; X86-NEXT: orl $1, %eax
857 ; X86-NEXT: .LBB35_5: # %endblock
858 ; X86-NEXT: shrl $31, %eax
859 ; X86-NEXT: # kill: def $al killed $al killed $eax
860 ; X86-NEXT: popl %esi
862 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 16) nounwind
863 %cmp = icmp slt i32 %call, 0
867 define i1 @length16_gt(ptr %x, ptr %y) nounwind {
868 ; X86-LABEL: length16_gt:
870 ; X86-NEXT: pushl %esi
871 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
872 ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
873 ; X86-NEXT: movl (%esi), %eax
874 ; X86-NEXT: movl (%edx), %ecx
875 ; X86-NEXT: bswapl %eax
876 ; X86-NEXT: bswapl %ecx
877 ; X86-NEXT: cmpl %ecx, %eax
878 ; X86-NEXT: jne .LBB36_4
879 ; X86-NEXT: # %bb.1: # %loadbb1
880 ; X86-NEXT: movl 4(%esi), %eax
881 ; X86-NEXT: movl 4(%edx), %ecx
882 ; X86-NEXT: bswapl %eax
883 ; X86-NEXT: bswapl %ecx
884 ; X86-NEXT: cmpl %ecx, %eax
885 ; X86-NEXT: jne .LBB36_4
886 ; X86-NEXT: # %bb.2: # %loadbb2
887 ; X86-NEXT: movl 8(%esi), %eax
888 ; X86-NEXT: movl 8(%edx), %ecx
889 ; X86-NEXT: bswapl %eax
890 ; X86-NEXT: bswapl %ecx
891 ; X86-NEXT: cmpl %ecx, %eax
892 ; X86-NEXT: jne .LBB36_4
893 ; X86-NEXT: # %bb.3: # %loadbb3
894 ; X86-NEXT: movl 12(%esi), %eax
895 ; X86-NEXT: movl 12(%edx), %ecx
896 ; X86-NEXT: bswapl %eax
897 ; X86-NEXT: bswapl %ecx
898 ; X86-NEXT: xorl %edx, %edx
899 ; X86-NEXT: cmpl %ecx, %eax
900 ; X86-NEXT: je .LBB36_5
901 ; X86-NEXT: .LBB36_4: # %res_block
902 ; X86-NEXT: xorl %edx, %edx
903 ; X86-NEXT: cmpl %ecx, %eax
904 ; X86-NEXT: sbbl %edx, %edx
905 ; X86-NEXT: orl $1, %edx
906 ; X86-NEXT: .LBB36_5: # %endblock
907 ; X86-NEXT: testl %edx, %edx
909 ; X86-NEXT: popl %esi
911 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 16) nounwind
912 %cmp = icmp sgt i32 %call, 0
916 define i1 @length16_eq_const(ptr %X) nounwind {
917 ; X86-NOSSE-LABEL: length16_eq_const:
918 ; X86-NOSSE: # %bb.0:
919 ; X86-NOSSE-NEXT: pushl %esi
920 ; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax
921 ; X86-NOSSE-NEXT: movl $858927408, %ecx # imm = 0x33323130
922 ; X86-NOSSE-NEXT: xorl (%eax), %ecx
923 ; X86-NOSSE-NEXT: movl $926299444, %edx # imm = 0x37363534
924 ; X86-NOSSE-NEXT: xorl 4(%eax), %edx
925 ; X86-NOSSE-NEXT: orl %ecx, %edx
926 ; X86-NOSSE-NEXT: movl $825243960, %ecx # imm = 0x31303938
927 ; X86-NOSSE-NEXT: xorl 8(%eax), %ecx
928 ; X86-NOSSE-NEXT: movl $892613426, %esi # imm = 0x35343332
929 ; X86-NOSSE-NEXT: xorl 12(%eax), %esi
930 ; X86-NOSSE-NEXT: orl %ecx, %esi
931 ; X86-NOSSE-NEXT: orl %edx, %esi
932 ; X86-NOSSE-NEXT: sete %al
933 ; X86-NOSSE-NEXT: popl %esi
934 ; X86-NOSSE-NEXT: retl
936 ; X86-SSE1-LABEL: length16_eq_const:
938 ; X86-SSE1-NEXT: pushl %esi
939 ; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %eax
940 ; X86-SSE1-NEXT: movl $858927408, %ecx # imm = 0x33323130
941 ; X86-SSE1-NEXT: xorl (%eax), %ecx
942 ; X86-SSE1-NEXT: movl $926299444, %edx # imm = 0x37363534
943 ; X86-SSE1-NEXT: xorl 4(%eax), %edx
944 ; X86-SSE1-NEXT: orl %ecx, %edx
945 ; X86-SSE1-NEXT: movl $825243960, %ecx # imm = 0x31303938
946 ; X86-SSE1-NEXT: xorl 8(%eax), %ecx
947 ; X86-SSE1-NEXT: movl $892613426, %esi # imm = 0x35343332
948 ; X86-SSE1-NEXT: xorl 12(%eax), %esi
949 ; X86-SSE1-NEXT: orl %ecx, %esi
950 ; X86-SSE1-NEXT: orl %edx, %esi
951 ; X86-SSE1-NEXT: sete %al
952 ; X86-SSE1-NEXT: popl %esi
953 ; X86-SSE1-NEXT: retl
955 ; X86-SSE2-LABEL: length16_eq_const:
957 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
958 ; X86-SSE2-NEXT: movdqu (%eax), %xmm0
959 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
960 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
961 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
962 ; X86-SSE2-NEXT: sete %al
963 ; X86-SSE2-NEXT: retl
965 ; X86-SSE41-LABEL: length16_eq_const:
966 ; X86-SSE41: # %bb.0:
967 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
968 ; X86-SSE41-NEXT: movdqu (%eax), %xmm0
969 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
970 ; X86-SSE41-NEXT: ptest %xmm0, %xmm0
971 ; X86-SSE41-NEXT: sete %al
972 ; X86-SSE41-NEXT: retl
973 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 16) nounwind
974 %c = icmp eq i32 %m, 0
978 ; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914
980 define i32 @length24(ptr %X, ptr %Y) nounwind {
981 ; X86-LABEL: length24:
983 ; X86-NEXT: pushl $24
984 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
985 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
986 ; X86-NEXT: calll memcmp
987 ; X86-NEXT: addl $12, %esp
989 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 24) nounwind
993 define i1 @length24_eq(ptr %x, ptr %y) nounwind {
994 ; X86-NOSSE-LABEL: length24_eq:
995 ; X86-NOSSE: # %bb.0:
996 ; X86-NOSSE-NEXT: pushl $24
997 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
998 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
999 ; X86-NOSSE-NEXT: calll memcmp
1000 ; X86-NOSSE-NEXT: addl $12, %esp
1001 ; X86-NOSSE-NEXT: testl %eax, %eax
1002 ; X86-NOSSE-NEXT: sete %al
1003 ; X86-NOSSE-NEXT: retl
1005 ; X86-SSE1-LABEL: length24_eq:
1006 ; X86-SSE1: # %bb.0:
1007 ; X86-SSE1-NEXT: pushl $24
1008 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1009 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1010 ; X86-SSE1-NEXT: calll memcmp
1011 ; X86-SSE1-NEXT: addl $12, %esp
1012 ; X86-SSE1-NEXT: testl %eax, %eax
1013 ; X86-SSE1-NEXT: sete %al
1014 ; X86-SSE1-NEXT: retl
1016 ; X86-SSE2-LABEL: length24_eq:
1017 ; X86-SSE2: # %bb.0:
1018 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
1019 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
1020 ; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
1021 ; X86-SSE2-NEXT: movdqu 8(%ecx), %xmm1
1022 ; X86-SSE2-NEXT: movdqu (%eax), %xmm2
1023 ; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
1024 ; X86-SSE2-NEXT: movdqu 8(%eax), %xmm0
1025 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1026 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
1027 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
1028 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1029 ; X86-SSE2-NEXT: sete %al
1030 ; X86-SSE2-NEXT: retl
1032 ; X86-SSE41-LABEL: length24_eq:
1033 ; X86-SSE41: # %bb.0:
1034 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
1035 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
1036 ; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
1037 ; X86-SSE41-NEXT: movdqu 8(%ecx), %xmm1
1038 ; X86-SSE41-NEXT: movdqu (%eax), %xmm2
1039 ; X86-SSE41-NEXT: pxor %xmm0, %xmm2
1040 ; X86-SSE41-NEXT: movdqu 8(%eax), %xmm0
1041 ; X86-SSE41-NEXT: pxor %xmm1, %xmm0
1042 ; X86-SSE41-NEXT: por %xmm2, %xmm0
1043 ; X86-SSE41-NEXT: ptest %xmm0, %xmm0
1044 ; X86-SSE41-NEXT: sete %al
1045 ; X86-SSE41-NEXT: retl
1046 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 24) nounwind
1047 %cmp = icmp eq i32 %call, 0
1051 define i1 @length24_lt(ptr %x, ptr %y) nounwind {
1052 ; X86-LABEL: length24_lt:
1054 ; X86-NEXT: pushl $24
1055 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1056 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1057 ; X86-NEXT: calll memcmp
1058 ; X86-NEXT: addl $12, %esp
1059 ; X86-NEXT: shrl $31, %eax
1060 ; X86-NEXT: # kill: def $al killed $al killed $eax
1062 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 24) nounwind
1063 %cmp = icmp slt i32 %call, 0
1067 define i1 @length24_gt(ptr %x, ptr %y) nounwind {
1068 ; X86-LABEL: length24_gt:
1070 ; X86-NEXT: pushl $24
1071 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1072 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1073 ; X86-NEXT: calll memcmp
1074 ; X86-NEXT: addl $12, %esp
1075 ; X86-NEXT: testl %eax, %eax
1076 ; X86-NEXT: setg %al
1078 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 24) nounwind
1079 %cmp = icmp sgt i32 %call, 0
1083 define i1 @length24_eq_const(ptr %X) nounwind {
1084 ; X86-NOSSE-LABEL: length24_eq_const:
1085 ; X86-NOSSE: # %bb.0:
1086 ; X86-NOSSE-NEXT: pushl $24
1087 ; X86-NOSSE-NEXT: pushl $.L.str
1088 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1089 ; X86-NOSSE-NEXT: calll memcmp
1090 ; X86-NOSSE-NEXT: addl $12, %esp
1091 ; X86-NOSSE-NEXT: testl %eax, %eax
1092 ; X86-NOSSE-NEXT: setne %al
1093 ; X86-NOSSE-NEXT: retl
1095 ; X86-SSE1-LABEL: length24_eq_const:
1096 ; X86-SSE1: # %bb.0:
1097 ; X86-SSE1-NEXT: pushl $24
1098 ; X86-SSE1-NEXT: pushl $.L.str
1099 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1100 ; X86-SSE1-NEXT: calll memcmp
1101 ; X86-SSE1-NEXT: addl $12, %esp
1102 ; X86-SSE1-NEXT: testl %eax, %eax
1103 ; X86-SSE1-NEXT: setne %al
1104 ; X86-SSE1-NEXT: retl
1106 ; X86-SSE2-LABEL: length24_eq_const:
1107 ; X86-SSE2: # %bb.0:
1108 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
1109 ; X86-SSE2-NEXT: movdqu (%eax), %xmm0
1110 ; X86-SSE2-NEXT: movdqu 8(%eax), %xmm1
1111 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1112 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1113 ; X86-SSE2-NEXT: pand %xmm1, %xmm0
1114 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
1115 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1116 ; X86-SSE2-NEXT: setne %al
1117 ; X86-SSE2-NEXT: retl
1119 ; X86-SSE41-LABEL: length24_eq_const:
1120 ; X86-SSE41: # %bb.0:
1121 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
1122 ; X86-SSE41-NEXT: movdqu (%eax), %xmm0
1123 ; X86-SSE41-NEXT: movdqu 8(%eax), %xmm1
1124 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1125 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1126 ; X86-SSE41-NEXT: por %xmm1, %xmm0
1127 ; X86-SSE41-NEXT: ptest %xmm0, %xmm0
1128 ; X86-SSE41-NEXT: setne %al
1129 ; X86-SSE41-NEXT: retl
1130 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 24) nounwind
1131 %c = icmp ne i32 %m, 0
1135 define i32 @length31(ptr %X, ptr %Y) nounwind {
1136 ; X86-LABEL: length31:
1138 ; X86-NEXT: pushl $31
1139 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1140 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1141 ; X86-NEXT: calll memcmp
1142 ; X86-NEXT: addl $12, %esp
1144 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 31) nounwind
1148 define i1 @length31_eq(ptr %x, ptr %y) nounwind {
1149 ; X86-NOSSE-LABEL: length31_eq:
1150 ; X86-NOSSE: # %bb.0:
1151 ; X86-NOSSE-NEXT: pushl $31
1152 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1153 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1154 ; X86-NOSSE-NEXT: calll memcmp
1155 ; X86-NOSSE-NEXT: addl $12, %esp
1156 ; X86-NOSSE-NEXT: testl %eax, %eax
1157 ; X86-NOSSE-NEXT: sete %al
1158 ; X86-NOSSE-NEXT: retl
1160 ; X86-SSE1-LABEL: length31_eq:
1161 ; X86-SSE1: # %bb.0:
1162 ; X86-SSE1-NEXT: pushl $31
1163 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1164 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1165 ; X86-SSE1-NEXT: calll memcmp
1166 ; X86-SSE1-NEXT: addl $12, %esp
1167 ; X86-SSE1-NEXT: testl %eax, %eax
1168 ; X86-SSE1-NEXT: sete %al
1169 ; X86-SSE1-NEXT: retl
1171 ; X86-SSE2-LABEL: length31_eq:
1172 ; X86-SSE2: # %bb.0:
1173 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
1174 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
1175 ; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
1176 ; X86-SSE2-NEXT: movdqu 15(%ecx), %xmm1
1177 ; X86-SSE2-NEXT: movdqu (%eax), %xmm2
1178 ; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
1179 ; X86-SSE2-NEXT: movdqu 15(%eax), %xmm0
1180 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1181 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
1182 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
1183 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1184 ; X86-SSE2-NEXT: sete %al
1185 ; X86-SSE2-NEXT: retl
1187 ; X86-SSE41-LABEL: length31_eq:
1188 ; X86-SSE41: # %bb.0:
1189 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
1190 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
1191 ; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
1192 ; X86-SSE41-NEXT: movdqu 15(%ecx), %xmm1
1193 ; X86-SSE41-NEXT: movdqu (%eax), %xmm2
1194 ; X86-SSE41-NEXT: pxor %xmm0, %xmm2
1195 ; X86-SSE41-NEXT: movdqu 15(%eax), %xmm0
1196 ; X86-SSE41-NEXT: pxor %xmm1, %xmm0
1197 ; X86-SSE41-NEXT: por %xmm2, %xmm0
1198 ; X86-SSE41-NEXT: ptest %xmm0, %xmm0
1199 ; X86-SSE41-NEXT: sete %al
1200 ; X86-SSE41-NEXT: retl
1201 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind
1202 %cmp = icmp eq i32 %call, 0
1206 define i1 @length31_lt(ptr %x, ptr %y) nounwind {
1207 ; X86-LABEL: length31_lt:
1209 ; X86-NEXT: pushl $31
1210 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1211 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1212 ; X86-NEXT: calll memcmp
1213 ; X86-NEXT: addl $12, %esp
1214 ; X86-NEXT: shrl $31, %eax
1215 ; X86-NEXT: # kill: def $al killed $al killed $eax
1217 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind
1218 %cmp = icmp slt i32 %call, 0
1222 define i1 @length31_gt(ptr %x, ptr %y) nounwind {
1223 ; X86-LABEL: length31_gt:
1225 ; X86-NEXT: pushl $31
1226 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1227 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1228 ; X86-NEXT: calll memcmp
1229 ; X86-NEXT: addl $12, %esp
1230 ; X86-NEXT: testl %eax, %eax
1231 ; X86-NEXT: setg %al
1233 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind
1234 %cmp = icmp sgt i32 %call, 0
1238 define i1 @length31_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1239 ; X86-NOSSE-LABEL: length31_eq_prefer128:
1240 ; X86-NOSSE: # %bb.0:
1241 ; X86-NOSSE-NEXT: pushl $31
1242 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1243 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1244 ; X86-NOSSE-NEXT: calll memcmp
1245 ; X86-NOSSE-NEXT: addl $12, %esp
1246 ; X86-NOSSE-NEXT: testl %eax, %eax
1247 ; X86-NOSSE-NEXT: sete %al
1248 ; X86-NOSSE-NEXT: retl
1250 ; X86-SSE1-LABEL: length31_eq_prefer128:
1251 ; X86-SSE1: # %bb.0:
1252 ; X86-SSE1-NEXT: pushl $31
1253 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1254 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1255 ; X86-SSE1-NEXT: calll memcmp
1256 ; X86-SSE1-NEXT: addl $12, %esp
1257 ; X86-SSE1-NEXT: testl %eax, %eax
1258 ; X86-SSE1-NEXT: sete %al
1259 ; X86-SSE1-NEXT: retl
1261 ; X86-SSE2-LABEL: length31_eq_prefer128:
1262 ; X86-SSE2: # %bb.0:
1263 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
1264 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
1265 ; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
1266 ; X86-SSE2-NEXT: movdqu 15(%ecx), %xmm1
1267 ; X86-SSE2-NEXT: movdqu (%eax), %xmm2
1268 ; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
1269 ; X86-SSE2-NEXT: movdqu 15(%eax), %xmm0
1270 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1271 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
1272 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
1273 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1274 ; X86-SSE2-NEXT: sete %al
1275 ; X86-SSE2-NEXT: retl
1277 ; X86-SSE41-LABEL: length31_eq_prefer128:
1278 ; X86-SSE41: # %bb.0:
1279 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
1280 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
1281 ; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
1282 ; X86-SSE41-NEXT: movdqu 15(%ecx), %xmm1
1283 ; X86-SSE41-NEXT: movdqu (%eax), %xmm2
1284 ; X86-SSE41-NEXT: pxor %xmm0, %xmm2
1285 ; X86-SSE41-NEXT: movdqu 15(%eax), %xmm0
1286 ; X86-SSE41-NEXT: pxor %xmm1, %xmm0
1287 ; X86-SSE41-NEXT: por %xmm2, %xmm0
1288 ; X86-SSE41-NEXT: ptest %xmm0, %xmm0
1289 ; X86-SSE41-NEXT: sete %al
1290 ; X86-SSE41-NEXT: retl
1291 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind
1292 %cmp = icmp eq i32 %call, 0
1296 define i1 @length31_eq_const(ptr %X) nounwind {
1297 ; X86-NOSSE-LABEL: length31_eq_const:
1298 ; X86-NOSSE: # %bb.0:
1299 ; X86-NOSSE-NEXT: pushl $31
1300 ; X86-NOSSE-NEXT: pushl $.L.str
1301 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1302 ; X86-NOSSE-NEXT: calll memcmp
1303 ; X86-NOSSE-NEXT: addl $12, %esp
1304 ; X86-NOSSE-NEXT: testl %eax, %eax
1305 ; X86-NOSSE-NEXT: setne %al
1306 ; X86-NOSSE-NEXT: retl
1308 ; X86-SSE1-LABEL: length31_eq_const:
1309 ; X86-SSE1: # %bb.0:
1310 ; X86-SSE1-NEXT: pushl $31
1311 ; X86-SSE1-NEXT: pushl $.L.str
1312 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1313 ; X86-SSE1-NEXT: calll memcmp
1314 ; X86-SSE1-NEXT: addl $12, %esp
1315 ; X86-SSE1-NEXT: testl %eax, %eax
1316 ; X86-SSE1-NEXT: setne %al
1317 ; X86-SSE1-NEXT: retl
1319 ; X86-SSE2-LABEL: length31_eq_const:
1320 ; X86-SSE2: # %bb.0:
1321 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
1322 ; X86-SSE2-NEXT: movdqu (%eax), %xmm0
1323 ; X86-SSE2-NEXT: movdqu 15(%eax), %xmm1
1324 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1325 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1326 ; X86-SSE2-NEXT: pand %xmm1, %xmm0
1327 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
1328 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1329 ; X86-SSE2-NEXT: setne %al
1330 ; X86-SSE2-NEXT: retl
1332 ; X86-SSE41-LABEL: length31_eq_const:
1333 ; X86-SSE41: # %bb.0:
1334 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
1335 ; X86-SSE41-NEXT: movdqu (%eax), %xmm0
1336 ; X86-SSE41-NEXT: movdqu 15(%eax), %xmm1
1337 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1338 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1339 ; X86-SSE41-NEXT: por %xmm1, %xmm0
1340 ; X86-SSE41-NEXT: ptest %xmm0, %xmm0
1341 ; X86-SSE41-NEXT: setne %al
1342 ; X86-SSE41-NEXT: retl
1343 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 31) nounwind
1344 %c = icmp ne i32 %m, 0
1348 define i32 @length32(ptr %X, ptr %Y) nounwind {
1349 ; X86-LABEL: length32:
1351 ; X86-NEXT: pushl $32
1352 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1353 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1354 ; X86-NEXT: calll memcmp
1355 ; X86-NEXT: addl $12, %esp
1357 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 32) nounwind
1361 ; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=33325
1363 define i1 @length32_eq(ptr %x, ptr %y) nounwind {
1364 ; X86-NOSSE-LABEL: length32_eq:
1365 ; X86-NOSSE: # %bb.0:
1366 ; X86-NOSSE-NEXT: pushl $32
1367 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1368 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1369 ; X86-NOSSE-NEXT: calll memcmp
1370 ; X86-NOSSE-NEXT: addl $12, %esp
1371 ; X86-NOSSE-NEXT: testl %eax, %eax
1372 ; X86-NOSSE-NEXT: sete %al
1373 ; X86-NOSSE-NEXT: retl
1375 ; X86-SSE1-LABEL: length32_eq:
1376 ; X86-SSE1: # %bb.0:
1377 ; X86-SSE1-NEXT: pushl $32
1378 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1379 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1380 ; X86-SSE1-NEXT: calll memcmp
1381 ; X86-SSE1-NEXT: addl $12, %esp
1382 ; X86-SSE1-NEXT: testl %eax, %eax
1383 ; X86-SSE1-NEXT: sete %al
1384 ; X86-SSE1-NEXT: retl
1386 ; X86-SSE2-LABEL: length32_eq:
1387 ; X86-SSE2: # %bb.0:
1388 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
1389 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
1390 ; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
1391 ; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1
1392 ; X86-SSE2-NEXT: movdqu (%eax), %xmm2
1393 ; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
1394 ; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0
1395 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1396 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
1397 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
1398 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1399 ; X86-SSE2-NEXT: sete %al
1400 ; X86-SSE2-NEXT: retl
1402 ; X86-SSE41-LABEL: length32_eq:
1403 ; X86-SSE41: # %bb.0:
1404 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
1405 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
1406 ; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
1407 ; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1
1408 ; X86-SSE41-NEXT: movdqu (%eax), %xmm2
1409 ; X86-SSE41-NEXT: pxor %xmm0, %xmm2
1410 ; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0
1411 ; X86-SSE41-NEXT: pxor %xmm1, %xmm0
1412 ; X86-SSE41-NEXT: por %xmm2, %xmm0
1413 ; X86-SSE41-NEXT: ptest %xmm0, %xmm0
1414 ; X86-SSE41-NEXT: sete %al
1415 ; X86-SSE41-NEXT: retl
1416 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind
1417 %cmp = icmp eq i32 %call, 0
1421 define i1 @length32_lt(ptr %x, ptr %y) nounwind {
1422 ; X86-LABEL: length32_lt:
1424 ; X86-NEXT: pushl $32
1425 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1426 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1427 ; X86-NEXT: calll memcmp
1428 ; X86-NEXT: addl $12, %esp
1429 ; X86-NEXT: shrl $31, %eax
1430 ; X86-NEXT: # kill: def $al killed $al killed $eax
1432 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind
1433 %cmp = icmp slt i32 %call, 0
1437 define i1 @length32_gt(ptr %x, ptr %y) nounwind {
1438 ; X86-LABEL: length32_gt:
1440 ; X86-NEXT: pushl $32
1441 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1442 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1443 ; X86-NEXT: calll memcmp
1444 ; X86-NEXT: addl $12, %esp
1445 ; X86-NEXT: testl %eax, %eax
1446 ; X86-NEXT: setg %al
1448 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind
1449 %cmp = icmp sgt i32 %call, 0
1453 define i1 @length32_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1454 ; X86-NOSSE-LABEL: length32_eq_prefer128:
1455 ; X86-NOSSE: # %bb.0:
1456 ; X86-NOSSE-NEXT: pushl $32
1457 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1458 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1459 ; X86-NOSSE-NEXT: calll memcmp
1460 ; X86-NOSSE-NEXT: addl $12, %esp
1461 ; X86-NOSSE-NEXT: testl %eax, %eax
1462 ; X86-NOSSE-NEXT: sete %al
1463 ; X86-NOSSE-NEXT: retl
1465 ; X86-SSE1-LABEL: length32_eq_prefer128:
1466 ; X86-SSE1: # %bb.0:
1467 ; X86-SSE1-NEXT: pushl $32
1468 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1469 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1470 ; X86-SSE1-NEXT: calll memcmp
1471 ; X86-SSE1-NEXT: addl $12, %esp
1472 ; X86-SSE1-NEXT: testl %eax, %eax
1473 ; X86-SSE1-NEXT: sete %al
1474 ; X86-SSE1-NEXT: retl
1476 ; X86-SSE2-LABEL: length32_eq_prefer128:
1477 ; X86-SSE2: # %bb.0:
1478 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
1479 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
1480 ; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
1481 ; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1
1482 ; X86-SSE2-NEXT: movdqu (%eax), %xmm2
1483 ; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
1484 ; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0
1485 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1486 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
1487 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
1488 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1489 ; X86-SSE2-NEXT: sete %al
1490 ; X86-SSE2-NEXT: retl
1492 ; X86-SSE41-LABEL: length32_eq_prefer128:
1493 ; X86-SSE41: # %bb.0:
1494 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
1495 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
1496 ; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
1497 ; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1
1498 ; X86-SSE41-NEXT: movdqu (%eax), %xmm2
1499 ; X86-SSE41-NEXT: pxor %xmm0, %xmm2
1500 ; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0
1501 ; X86-SSE41-NEXT: pxor %xmm1, %xmm0
1502 ; X86-SSE41-NEXT: por %xmm2, %xmm0
1503 ; X86-SSE41-NEXT: ptest %xmm0, %xmm0
1504 ; X86-SSE41-NEXT: sete %al
1505 ; X86-SSE41-NEXT: retl
1506 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind
1507 %cmp = icmp eq i32 %call, 0
1511 define i1 @length32_eq_const(ptr %X) nounwind {
1512 ; X86-NOSSE-LABEL: length32_eq_const:
1513 ; X86-NOSSE: # %bb.0:
1514 ; X86-NOSSE-NEXT: pushl $32
1515 ; X86-NOSSE-NEXT: pushl $.L.str
1516 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1517 ; X86-NOSSE-NEXT: calll memcmp
1518 ; X86-NOSSE-NEXT: addl $12, %esp
1519 ; X86-NOSSE-NEXT: testl %eax, %eax
1520 ; X86-NOSSE-NEXT: setne %al
1521 ; X86-NOSSE-NEXT: retl
1523 ; X86-SSE1-LABEL: length32_eq_const:
1524 ; X86-SSE1: # %bb.0:
1525 ; X86-SSE1-NEXT: pushl $32
1526 ; X86-SSE1-NEXT: pushl $.L.str
1527 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1528 ; X86-SSE1-NEXT: calll memcmp
1529 ; X86-SSE1-NEXT: addl $12, %esp
1530 ; X86-SSE1-NEXT: testl %eax, %eax
1531 ; X86-SSE1-NEXT: setne %al
1532 ; X86-SSE1-NEXT: retl
1534 ; X86-SSE2-LABEL: length32_eq_const:
1535 ; X86-SSE2: # %bb.0:
1536 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
1537 ; X86-SSE2-NEXT: movdqu (%eax), %xmm0
1538 ; X86-SSE2-NEXT: movdqu 16(%eax), %xmm1
1539 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1540 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1541 ; X86-SSE2-NEXT: pand %xmm1, %xmm0
1542 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
1543 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1544 ; X86-SSE2-NEXT: setne %al
1545 ; X86-SSE2-NEXT: retl
1547 ; X86-SSE41-LABEL: length32_eq_const:
1548 ; X86-SSE41: # %bb.0:
1549 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
1550 ; X86-SSE41-NEXT: movdqu (%eax), %xmm0
1551 ; X86-SSE41-NEXT: movdqu 16(%eax), %xmm1
1552 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1553 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1554 ; X86-SSE41-NEXT: por %xmm1, %xmm0
1555 ; X86-SSE41-NEXT: ptest %xmm0, %xmm0
1556 ; X86-SSE41-NEXT: setne %al
1557 ; X86-SSE41-NEXT: retl
1558 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 32) nounwind
1559 %c = icmp ne i32 %m, 0
1563 define i32 @length48(ptr %X, ptr %Y) nounwind {
1564 ; X86-LABEL: length48:
1566 ; X86-NEXT: pushl $48
1567 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1568 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1569 ; X86-NEXT: calll memcmp
1570 ; X86-NEXT: addl $12, %esp
1572 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 48) nounwind
1576 define i1 @length48_eq(ptr %x, ptr %y) nounwind {
1577 ; X86-NOSSE-LABEL: length48_eq:
1578 ; X86-NOSSE: # %bb.0:
1579 ; X86-NOSSE-NEXT: pushl $48
1580 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1581 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1582 ; X86-NOSSE-NEXT: calll memcmp
1583 ; X86-NOSSE-NEXT: addl $12, %esp
1584 ; X86-NOSSE-NEXT: testl %eax, %eax
1585 ; X86-NOSSE-NEXT: sete %al
1586 ; X86-NOSSE-NEXT: retl
1588 ; X86-SSE1-LABEL: length48_eq:
1589 ; X86-SSE1: # %bb.0:
1590 ; X86-SSE1-NEXT: pushl $48
1591 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1592 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1593 ; X86-SSE1-NEXT: calll memcmp
1594 ; X86-SSE1-NEXT: addl $12, %esp
1595 ; X86-SSE1-NEXT: testl %eax, %eax
1596 ; X86-SSE1-NEXT: sete %al
1597 ; X86-SSE1-NEXT: retl
1599 ; X86-SSE2-LABEL: length48_eq:
1600 ; X86-SSE2: # %bb.0:
1601 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
1602 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
1603 ; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
1604 ; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1
1605 ; X86-SSE2-NEXT: movdqu (%eax), %xmm2
1606 ; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
1607 ; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0
1608 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1609 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
1610 ; X86-SSE2-NEXT: movdqu 32(%ecx), %xmm1
1611 ; X86-SSE2-NEXT: movdqu 32(%eax), %xmm2
1612 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm2
1613 ; X86-SSE2-NEXT: pand %xmm0, %xmm2
1614 ; X86-SSE2-NEXT: pmovmskb %xmm2, %eax
1615 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1616 ; X86-SSE2-NEXT: sete %al
1617 ; X86-SSE2-NEXT: retl
1619 ; X86-SSE41-LABEL: length48_eq:
1620 ; X86-SSE41: # %bb.0:
1621 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
1622 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
1623 ; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
1624 ; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1
1625 ; X86-SSE41-NEXT: movdqu (%eax), %xmm2
1626 ; X86-SSE41-NEXT: pxor %xmm0, %xmm2
1627 ; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0
1628 ; X86-SSE41-NEXT: pxor %xmm1, %xmm0
1629 ; X86-SSE41-NEXT: por %xmm2, %xmm0
1630 ; X86-SSE41-NEXT: movdqu 32(%ecx), %xmm1
1631 ; X86-SSE41-NEXT: movdqu 32(%eax), %xmm2
1632 ; X86-SSE41-NEXT: pxor %xmm1, %xmm2
1633 ; X86-SSE41-NEXT: por %xmm0, %xmm2
1634 ; X86-SSE41-NEXT: ptest %xmm2, %xmm2
1635 ; X86-SSE41-NEXT: sete %al
1636 ; X86-SSE41-NEXT: retl
1637 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind
1638 %cmp = icmp eq i32 %call, 0
1642 define i1 @length48_lt(ptr %x, ptr %y) nounwind {
1643 ; X86-LABEL: length48_lt:
1645 ; X86-NEXT: pushl $48
1646 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1647 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1648 ; X86-NEXT: calll memcmp
1649 ; X86-NEXT: addl $12, %esp
1650 ; X86-NEXT: shrl $31, %eax
1651 ; X86-NEXT: # kill: def $al killed $al killed $eax
1653 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind
1654 %cmp = icmp slt i32 %call, 0
1658 define i1 @length48_gt(ptr %x, ptr %y) nounwind {
1659 ; X86-LABEL: length48_gt:
1661 ; X86-NEXT: pushl $48
1662 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1663 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1664 ; X86-NEXT: calll memcmp
1665 ; X86-NEXT: addl $12, %esp
1666 ; X86-NEXT: testl %eax, %eax
1667 ; X86-NEXT: setg %al
1669 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind
1670 %cmp = icmp sgt i32 %call, 0
1674 define i1 @length48_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1675 ; X86-NOSSE-LABEL: length48_eq_prefer128:
1676 ; X86-NOSSE: # %bb.0:
1677 ; X86-NOSSE-NEXT: pushl $48
1678 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1679 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1680 ; X86-NOSSE-NEXT: calll memcmp
1681 ; X86-NOSSE-NEXT: addl $12, %esp
1682 ; X86-NOSSE-NEXT: testl %eax, %eax
1683 ; X86-NOSSE-NEXT: sete %al
1684 ; X86-NOSSE-NEXT: retl
1686 ; X86-SSE1-LABEL: length48_eq_prefer128:
1687 ; X86-SSE1: # %bb.0:
1688 ; X86-SSE1-NEXT: pushl $48
1689 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1690 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1691 ; X86-SSE1-NEXT: calll memcmp
1692 ; X86-SSE1-NEXT: addl $12, %esp
1693 ; X86-SSE1-NEXT: testl %eax, %eax
1694 ; X86-SSE1-NEXT: sete %al
1695 ; X86-SSE1-NEXT: retl
1697 ; X86-SSE2-LABEL: length48_eq_prefer128:
1698 ; X86-SSE2: # %bb.0:
1699 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
1700 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
1701 ; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
1702 ; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1
1703 ; X86-SSE2-NEXT: movdqu (%eax), %xmm2
1704 ; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
1705 ; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0
1706 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1707 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
1708 ; X86-SSE2-NEXT: movdqu 32(%ecx), %xmm1
1709 ; X86-SSE2-NEXT: movdqu 32(%eax), %xmm2
1710 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm2
1711 ; X86-SSE2-NEXT: pand %xmm0, %xmm2
1712 ; X86-SSE2-NEXT: pmovmskb %xmm2, %eax
1713 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1714 ; X86-SSE2-NEXT: sete %al
1715 ; X86-SSE2-NEXT: retl
1717 ; X86-SSE41-LABEL: length48_eq_prefer128:
1718 ; X86-SSE41: # %bb.0:
1719 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
1720 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
1721 ; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
1722 ; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1
1723 ; X86-SSE41-NEXT: movdqu (%eax), %xmm2
1724 ; X86-SSE41-NEXT: pxor %xmm0, %xmm2
1725 ; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0
1726 ; X86-SSE41-NEXT: pxor %xmm1, %xmm0
1727 ; X86-SSE41-NEXT: por %xmm2, %xmm0
1728 ; X86-SSE41-NEXT: movdqu 32(%ecx), %xmm1
1729 ; X86-SSE41-NEXT: movdqu 32(%eax), %xmm2
1730 ; X86-SSE41-NEXT: pxor %xmm1, %xmm2
1731 ; X86-SSE41-NEXT: por %xmm0, %xmm2
1732 ; X86-SSE41-NEXT: ptest %xmm2, %xmm2
1733 ; X86-SSE41-NEXT: sete %al
1734 ; X86-SSE41-NEXT: retl
1735 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind
1736 %cmp = icmp eq i32 %call, 0
1740 define i1 @length48_eq_const(ptr %X) nounwind {
1741 ; X86-NOSSE-LABEL: length48_eq_const:
1742 ; X86-NOSSE: # %bb.0:
1743 ; X86-NOSSE-NEXT: pushl $48
1744 ; X86-NOSSE-NEXT: pushl $.L.str
1745 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1746 ; X86-NOSSE-NEXT: calll memcmp
1747 ; X86-NOSSE-NEXT: addl $12, %esp
1748 ; X86-NOSSE-NEXT: testl %eax, %eax
1749 ; X86-NOSSE-NEXT: setne %al
1750 ; X86-NOSSE-NEXT: retl
1752 ; X86-SSE1-LABEL: length48_eq_const:
1753 ; X86-SSE1: # %bb.0:
1754 ; X86-SSE1-NEXT: pushl $48
1755 ; X86-SSE1-NEXT: pushl $.L.str
1756 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1757 ; X86-SSE1-NEXT: calll memcmp
1758 ; X86-SSE1-NEXT: addl $12, %esp
1759 ; X86-SSE1-NEXT: testl %eax, %eax
1760 ; X86-SSE1-NEXT: setne %al
1761 ; X86-SSE1-NEXT: retl
1763 ; X86-SSE2-LABEL: length48_eq_const:
1764 ; X86-SSE2: # %bb.0:
1765 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
1766 ; X86-SSE2-NEXT: movdqu (%eax), %xmm0
1767 ; X86-SSE2-NEXT: movdqu 16(%eax), %xmm1
1768 ; X86-SSE2-NEXT: movdqu 32(%eax), %xmm2
1769 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1770 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1771 ; X86-SSE2-NEXT: pand %xmm1, %xmm0
1772 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
1773 ; X86-SSE2-NEXT: pand %xmm0, %xmm2
1774 ; X86-SSE2-NEXT: pmovmskb %xmm2, %eax
1775 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1776 ; X86-SSE2-NEXT: setne %al
1777 ; X86-SSE2-NEXT: retl
1779 ; X86-SSE41-LABEL: length48_eq_const:
1780 ; X86-SSE41: # %bb.0:
1781 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
1782 ; X86-SSE41-NEXT: movdqu (%eax), %xmm0
1783 ; X86-SSE41-NEXT: movdqu 16(%eax), %xmm1
1784 ; X86-SSE41-NEXT: movdqu 32(%eax), %xmm2
1785 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1786 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1787 ; X86-SSE41-NEXT: por %xmm1, %xmm0
1788 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
1789 ; X86-SSE41-NEXT: por %xmm0, %xmm2
1790 ; X86-SSE41-NEXT: ptest %xmm2, %xmm2
1791 ; X86-SSE41-NEXT: setne %al
1792 ; X86-SSE41-NEXT: retl
1793 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 48) nounwind
1794 %c = icmp ne i32 %m, 0
1798 define i32 @length63(ptr %X, ptr %Y) nounwind {
1799 ; X86-LABEL: length63:
1801 ; X86-NEXT: pushl $63
1802 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1803 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1804 ; X86-NEXT: calll memcmp
1805 ; X86-NEXT: addl $12, %esp
1807 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 63) nounwind
1811 define i1 @length63_eq(ptr %x, ptr %y) nounwind {
1812 ; X86-NOSSE-LABEL: length63_eq:
1813 ; X86-NOSSE: # %bb.0:
1814 ; X86-NOSSE-NEXT: pushl $63
1815 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1816 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1817 ; X86-NOSSE-NEXT: calll memcmp
1818 ; X86-NOSSE-NEXT: addl $12, %esp
1819 ; X86-NOSSE-NEXT: testl %eax, %eax
1820 ; X86-NOSSE-NEXT: setne %al
1821 ; X86-NOSSE-NEXT: retl
1823 ; X86-SSE1-LABEL: length63_eq:
1824 ; X86-SSE1: # %bb.0:
1825 ; X86-SSE1-NEXT: pushl $63
1826 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1827 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1828 ; X86-SSE1-NEXT: calll memcmp
1829 ; X86-SSE1-NEXT: addl $12, %esp
1830 ; X86-SSE1-NEXT: testl %eax, %eax
1831 ; X86-SSE1-NEXT: setne %al
1832 ; X86-SSE1-NEXT: retl
1834 ; X86-SSE2-LABEL: length63_eq:
1835 ; X86-SSE2: # %bb.0:
1836 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
1837 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
1838 ; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
1839 ; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1
1840 ; X86-SSE2-NEXT: movdqu (%eax), %xmm2
1841 ; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
1842 ; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0
1843 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
1844 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
1845 ; X86-SSE2-NEXT: movdqu 32(%ecx), %xmm1
1846 ; X86-SSE2-NEXT: movdqu 32(%eax), %xmm2
1847 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm2
1848 ; X86-SSE2-NEXT: movdqu 47(%ecx), %xmm1
1849 ; X86-SSE2-NEXT: movdqu 47(%eax), %xmm3
1850 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm3
1851 ; X86-SSE2-NEXT: pand %xmm2, %xmm3
1852 ; X86-SSE2-NEXT: pand %xmm0, %xmm3
1853 ; X86-SSE2-NEXT: pmovmskb %xmm3, %eax
1854 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1855 ; X86-SSE2-NEXT: setne %al
1856 ; X86-SSE2-NEXT: retl
1858 ; X86-SSE41-LABEL: length63_eq:
1859 ; X86-SSE41: # %bb.0:
1860 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
1861 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
1862 ; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
1863 ; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1
1864 ; X86-SSE41-NEXT: movdqu (%eax), %xmm2
1865 ; X86-SSE41-NEXT: pxor %xmm0, %xmm2
1866 ; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0
1867 ; X86-SSE41-NEXT: pxor %xmm1, %xmm0
1868 ; X86-SSE41-NEXT: por %xmm2, %xmm0
1869 ; X86-SSE41-NEXT: movdqu 32(%ecx), %xmm1
1870 ; X86-SSE41-NEXT: movdqu 32(%eax), %xmm2
1871 ; X86-SSE41-NEXT: pxor %xmm1, %xmm2
1872 ; X86-SSE41-NEXT: movdqu 47(%ecx), %xmm1
1873 ; X86-SSE41-NEXT: movdqu 47(%eax), %xmm3
1874 ; X86-SSE41-NEXT: pxor %xmm1, %xmm3
1875 ; X86-SSE41-NEXT: por %xmm2, %xmm3
1876 ; X86-SSE41-NEXT: por %xmm0, %xmm3
1877 ; X86-SSE41-NEXT: ptest %xmm3, %xmm3
1878 ; X86-SSE41-NEXT: setne %al
1879 ; X86-SSE41-NEXT: retl
1880 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 63) nounwind
1881 %cmp = icmp ne i32 %call, 0
1885 define i1 @length63_lt(ptr %x, ptr %y) nounwind {
1886 ; X86-LABEL: length63_lt:
1888 ; X86-NEXT: pushl $63
1889 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1890 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1891 ; X86-NEXT: calll memcmp
1892 ; X86-NEXT: addl $12, %esp
1893 ; X86-NEXT: shrl $31, %eax
1894 ; X86-NEXT: # kill: def $al killed $al killed $eax
1896 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 63) nounwind
1897 %cmp = icmp slt i32 %call, 0
1901 define i1 @length63_gt(ptr %x, ptr %y) nounwind {
1902 ; X86-LABEL: length63_gt:
1904 ; X86-NEXT: pushl $63
1905 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1906 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1907 ; X86-NEXT: calll memcmp
1908 ; X86-NEXT: addl $12, %esp
1909 ; X86-NEXT: testl %eax, %eax
1910 ; X86-NEXT: setg %al
1912 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 63) nounwind
1913 %cmp = icmp sgt i32 %call, 0
1917 define i1 @length63_eq_const(ptr %X) nounwind {
1918 ; X86-NOSSE-LABEL: length63_eq_const:
1919 ; X86-NOSSE: # %bb.0:
1920 ; X86-NOSSE-NEXT: pushl $63
1921 ; X86-NOSSE-NEXT: pushl $.L.str
1922 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1923 ; X86-NOSSE-NEXT: calll memcmp
1924 ; X86-NOSSE-NEXT: addl $12, %esp
1925 ; X86-NOSSE-NEXT: testl %eax, %eax
1926 ; X86-NOSSE-NEXT: sete %al
1927 ; X86-NOSSE-NEXT: retl
1929 ; X86-SSE1-LABEL: length63_eq_const:
1930 ; X86-SSE1: # %bb.0:
1931 ; X86-SSE1-NEXT: pushl $63
1932 ; X86-SSE1-NEXT: pushl $.L.str
1933 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
1934 ; X86-SSE1-NEXT: calll memcmp
1935 ; X86-SSE1-NEXT: addl $12, %esp
1936 ; X86-SSE1-NEXT: testl %eax, %eax
1937 ; X86-SSE1-NEXT: sete %al
1938 ; X86-SSE1-NEXT: retl
1940 ; X86-SSE2-LABEL: length63_eq_const:
1941 ; X86-SSE2: # %bb.0:
1942 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
1943 ; X86-SSE2-NEXT: movdqu (%eax), %xmm0
1944 ; X86-SSE2-NEXT: movdqu 16(%eax), %xmm1
1945 ; X86-SSE2-NEXT: movdqu 32(%eax), %xmm2
1946 ; X86-SSE2-NEXT: movdqu 47(%eax), %xmm3
1947 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
1948 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
1949 ; X86-SSE2-NEXT: pand %xmm3, %xmm2
1950 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1951 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1952 ; X86-SSE2-NEXT: pand %xmm1, %xmm0
1953 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
1954 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
1955 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
1956 ; X86-SSE2-NEXT: sete %al
1957 ; X86-SSE2-NEXT: retl
1959 ; X86-SSE41-LABEL: length63_eq_const:
1960 ; X86-SSE41: # %bb.0:
1961 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
1962 ; X86-SSE41-NEXT: movdqu (%eax), %xmm0
1963 ; X86-SSE41-NEXT: movdqu 16(%eax), %xmm1
1964 ; X86-SSE41-NEXT: movdqu 32(%eax), %xmm2
1965 ; X86-SSE41-NEXT: movdqu 47(%eax), %xmm3
1966 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
1967 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
1968 ; X86-SSE41-NEXT: por %xmm3, %xmm2
1969 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1970 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1971 ; X86-SSE41-NEXT: por %xmm1, %xmm0
1972 ; X86-SSE41-NEXT: por %xmm2, %xmm0
1973 ; X86-SSE41-NEXT: ptest %xmm0, %xmm0
1974 ; X86-SSE41-NEXT: sete %al
1975 ; X86-SSE41-NEXT: retl
1976 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 63) nounwind
1977 %c = icmp eq i32 %m, 0
1981 define i32 @length64(ptr %X, ptr %Y) nounwind {
1982 ; X86-LABEL: length64:
1984 ; X86-NEXT: pushl $64
1985 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1986 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
1987 ; X86-NEXT: calll memcmp
1988 ; X86-NEXT: addl $12, %esp
1990 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 64) nounwind
1994 define i1 @length64_eq(ptr %x, ptr %y) nounwind {
1995 ; X86-NOSSE-LABEL: length64_eq:
1996 ; X86-NOSSE: # %bb.0:
1997 ; X86-NOSSE-NEXT: pushl $64
1998 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
1999 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
2000 ; X86-NOSSE-NEXT: calll memcmp
2001 ; X86-NOSSE-NEXT: addl $12, %esp
2002 ; X86-NOSSE-NEXT: testl %eax, %eax
2003 ; X86-NOSSE-NEXT: setne %al
2004 ; X86-NOSSE-NEXT: retl
2006 ; X86-SSE1-LABEL: length64_eq:
2007 ; X86-SSE1: # %bb.0:
2008 ; X86-SSE1-NEXT: pushl $64
2009 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
2010 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
2011 ; X86-SSE1-NEXT: calll memcmp
2012 ; X86-SSE1-NEXT: addl $12, %esp
2013 ; X86-SSE1-NEXT: testl %eax, %eax
2014 ; X86-SSE1-NEXT: setne %al
2015 ; X86-SSE1-NEXT: retl
2017 ; X86-SSE2-LABEL: length64_eq:
2018 ; X86-SSE2: # %bb.0:
2019 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
2020 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
2021 ; X86-SSE2-NEXT: movdqu (%ecx), %xmm0
2022 ; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1
2023 ; X86-SSE2-NEXT: movdqu (%eax), %xmm2
2024 ; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2
2025 ; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0
2026 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
2027 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
2028 ; X86-SSE2-NEXT: movdqu 32(%ecx), %xmm1
2029 ; X86-SSE2-NEXT: movdqu 32(%eax), %xmm2
2030 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm2
2031 ; X86-SSE2-NEXT: movdqu 48(%ecx), %xmm1
2032 ; X86-SSE2-NEXT: movdqu 48(%eax), %xmm3
2033 ; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm3
2034 ; X86-SSE2-NEXT: pand %xmm2, %xmm3
2035 ; X86-SSE2-NEXT: pand %xmm0, %xmm3
2036 ; X86-SSE2-NEXT: pmovmskb %xmm3, %eax
2037 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
2038 ; X86-SSE2-NEXT: setne %al
2039 ; X86-SSE2-NEXT: retl
2041 ; X86-SSE41-LABEL: length64_eq:
2042 ; X86-SSE41: # %bb.0:
2043 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
2044 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx
2045 ; X86-SSE41-NEXT: movdqu (%ecx), %xmm0
2046 ; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1
2047 ; X86-SSE41-NEXT: movdqu (%eax), %xmm2
2048 ; X86-SSE41-NEXT: pxor %xmm0, %xmm2
2049 ; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0
2050 ; X86-SSE41-NEXT: pxor %xmm1, %xmm0
2051 ; X86-SSE41-NEXT: por %xmm2, %xmm0
2052 ; X86-SSE41-NEXT: movdqu 32(%ecx), %xmm1
2053 ; X86-SSE41-NEXT: movdqu 32(%eax), %xmm2
2054 ; X86-SSE41-NEXT: pxor %xmm1, %xmm2
2055 ; X86-SSE41-NEXT: movdqu 48(%ecx), %xmm1
2056 ; X86-SSE41-NEXT: movdqu 48(%eax), %xmm3
2057 ; X86-SSE41-NEXT: pxor %xmm1, %xmm3
2058 ; X86-SSE41-NEXT: por %xmm2, %xmm3
2059 ; X86-SSE41-NEXT: por %xmm0, %xmm3
2060 ; X86-SSE41-NEXT: ptest %xmm3, %xmm3
2061 ; X86-SSE41-NEXT: setne %al
2062 ; X86-SSE41-NEXT: retl
2063 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 64) nounwind
2064 %cmp = icmp ne i32 %call, 0
2068 define i1 @length64_lt(ptr %x, ptr %y) nounwind {
2069 ; X86-LABEL: length64_lt:
2071 ; X86-NEXT: pushl $64
2072 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2073 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2074 ; X86-NEXT: calll memcmp
2075 ; X86-NEXT: addl $12, %esp
2076 ; X86-NEXT: shrl $31, %eax
2077 ; X86-NEXT: # kill: def $al killed $al killed $eax
2079 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 64) nounwind
2080 %cmp = icmp slt i32 %call, 0
2084 define i1 @length64_gt(ptr %x, ptr %y) nounwind {
2085 ; X86-LABEL: length64_gt:
2087 ; X86-NEXT: pushl $64
2088 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2089 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2090 ; X86-NEXT: calll memcmp
2091 ; X86-NEXT: addl $12, %esp
2092 ; X86-NEXT: testl %eax, %eax
2093 ; X86-NEXT: setg %al
2095 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 64) nounwind
2096 %cmp = icmp sgt i32 %call, 0
2100 define i1 @length64_eq_const(ptr %X) nounwind {
2101 ; X86-NOSSE-LABEL: length64_eq_const:
2102 ; X86-NOSSE: # %bb.0:
2103 ; X86-NOSSE-NEXT: pushl $64
2104 ; X86-NOSSE-NEXT: pushl $.L.str
2105 ; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp)
2106 ; X86-NOSSE-NEXT: calll memcmp
2107 ; X86-NOSSE-NEXT: addl $12, %esp
2108 ; X86-NOSSE-NEXT: testl %eax, %eax
2109 ; X86-NOSSE-NEXT: sete %al
2110 ; X86-NOSSE-NEXT: retl
2112 ; X86-SSE1-LABEL: length64_eq_const:
2113 ; X86-SSE1: # %bb.0:
2114 ; X86-SSE1-NEXT: pushl $64
2115 ; X86-SSE1-NEXT: pushl $.L.str
2116 ; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp)
2117 ; X86-SSE1-NEXT: calll memcmp
2118 ; X86-SSE1-NEXT: addl $12, %esp
2119 ; X86-SSE1-NEXT: testl %eax, %eax
2120 ; X86-SSE1-NEXT: sete %al
2121 ; X86-SSE1-NEXT: retl
2123 ; X86-SSE2-LABEL: length64_eq_const:
2124 ; X86-SSE2: # %bb.0:
2125 ; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
2126 ; X86-SSE2-NEXT: movdqu (%eax), %xmm0
2127 ; X86-SSE2-NEXT: movdqu 16(%eax), %xmm1
2128 ; X86-SSE2-NEXT: movdqu 32(%eax), %xmm2
2129 ; X86-SSE2-NEXT: movdqu 48(%eax), %xmm3
2130 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
2131 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
2132 ; X86-SSE2-NEXT: pand %xmm3, %xmm2
2133 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
2134 ; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2135 ; X86-SSE2-NEXT: pand %xmm1, %xmm0
2136 ; X86-SSE2-NEXT: pand %xmm2, %xmm0
2137 ; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
2138 ; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF
2139 ; X86-SSE2-NEXT: sete %al
2140 ; X86-SSE2-NEXT: retl
2142 ; X86-SSE41-LABEL: length64_eq_const:
2143 ; X86-SSE41: # %bb.0:
2144 ; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax
2145 ; X86-SSE41-NEXT: movdqu (%eax), %xmm0
2146 ; X86-SSE41-NEXT: movdqu 16(%eax), %xmm1
2147 ; X86-SSE41-NEXT: movdqu 32(%eax), %xmm2
2148 ; X86-SSE41-NEXT: movdqu 48(%eax), %xmm3
2149 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
2150 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
2151 ; X86-SSE41-NEXT: por %xmm3, %xmm2
2152 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
2153 ; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2154 ; X86-SSE41-NEXT: por %xmm1, %xmm0
2155 ; X86-SSE41-NEXT: por %xmm2, %xmm0
2156 ; X86-SSE41-NEXT: ptest %xmm0, %xmm0
2157 ; X86-SSE41-NEXT: sete %al
2158 ; X86-SSE41-NEXT: retl
2159 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 64) nounwind
2160 %c = icmp eq i32 %m, 0
2164 define i32 @length96(ptr %X, ptr %Y) nounwind {
2165 ; X86-LABEL: length96:
2167 ; X86-NEXT: pushl $96
2168 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2169 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2170 ; X86-NEXT: calll memcmp
2171 ; X86-NEXT: addl $12, %esp
2173 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 96) nounwind
2177 define i1 @length96_eq(ptr %x, ptr %y) nounwind {
2178 ; X86-LABEL: length96_eq:
2180 ; X86-NEXT: pushl $96
2181 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2182 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2183 ; X86-NEXT: calll memcmp
2184 ; X86-NEXT: addl $12, %esp
2185 ; X86-NEXT: testl %eax, %eax
2186 ; X86-NEXT: setne %al
2188 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 96) nounwind
2189 %cmp = icmp ne i32 %call, 0
2193 define i1 @length96_lt(ptr %x, ptr %y) nounwind {
2194 ; X86-LABEL: length96_lt:
2196 ; X86-NEXT: pushl $96
2197 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2198 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2199 ; X86-NEXT: calll memcmp
2200 ; X86-NEXT: addl $12, %esp
2201 ; X86-NEXT: shrl $31, %eax
2202 ; X86-NEXT: # kill: def $al killed $al killed $eax
2204 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 96) nounwind
2205 %cmp = icmp slt i32 %call, 0
2209 define i1 @length96_gt(ptr %x, ptr %y) nounwind {
2210 ; X86-LABEL: length96_gt:
2212 ; X86-NEXT: pushl $96
2213 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2214 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2215 ; X86-NEXT: calll memcmp
2216 ; X86-NEXT: addl $12, %esp
2217 ; X86-NEXT: testl %eax, %eax
2218 ; X86-NEXT: setg %al
2220 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 96) nounwind
2221 %cmp = icmp sgt i32 %call, 0
2225 define i1 @length96_eq_const(ptr %X) nounwind {
2226 ; X86-LABEL: length96_eq_const:
2228 ; X86-NEXT: pushl $96
2229 ; X86-NEXT: pushl $.L.str
2230 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2231 ; X86-NEXT: calll memcmp
2232 ; X86-NEXT: addl $12, %esp
2233 ; X86-NEXT: testl %eax, %eax
2234 ; X86-NEXT: sete %al
2236 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 96) nounwind
2237 %c = icmp eq i32 %m, 0
2241 define i32 @length127(ptr %X, ptr %Y) nounwind {
2242 ; X86-LABEL: length127:
2244 ; X86-NEXT: pushl $127
2245 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2246 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2247 ; X86-NEXT: calll memcmp
2248 ; X86-NEXT: addl $12, %esp
2250 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 127) nounwind
2254 define i1 @length127_eq(ptr %x, ptr %y) nounwind {
2255 ; X86-LABEL: length127_eq:
2257 ; X86-NEXT: pushl $127
2258 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2259 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2260 ; X86-NEXT: calll memcmp
2261 ; X86-NEXT: addl $12, %esp
2262 ; X86-NEXT: testl %eax, %eax
2263 ; X86-NEXT: setne %al
2265 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 127) nounwind
2266 %cmp = icmp ne i32 %call, 0
2270 define i1 @length127_lt(ptr %x, ptr %y) nounwind {
2271 ; X86-LABEL: length127_lt:
2273 ; X86-NEXT: pushl $127
2274 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2275 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2276 ; X86-NEXT: calll memcmp
2277 ; X86-NEXT: addl $12, %esp
2278 ; X86-NEXT: shrl $31, %eax
2279 ; X86-NEXT: # kill: def $al killed $al killed $eax
2281 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 127) nounwind
2282 %cmp = icmp slt i32 %call, 0
2286 define i1 @length127_gt(ptr %x, ptr %y) nounwind {
2287 ; X86-LABEL: length127_gt:
2289 ; X86-NEXT: pushl $127
2290 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2291 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2292 ; X86-NEXT: calll memcmp
2293 ; X86-NEXT: addl $12, %esp
2294 ; X86-NEXT: testl %eax, %eax
2295 ; X86-NEXT: setg %al
2297 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 127) nounwind
2298 %cmp = icmp sgt i32 %call, 0
2302 define i1 @length127_eq_const(ptr %X) nounwind {
2303 ; X86-LABEL: length127_eq_const:
2305 ; X86-NEXT: pushl $127
2306 ; X86-NEXT: pushl $.L.str
2307 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2308 ; X86-NEXT: calll memcmp
2309 ; X86-NEXT: addl $12, %esp
2310 ; X86-NEXT: testl %eax, %eax
2311 ; X86-NEXT: sete %al
2313 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 127) nounwind
2314 %c = icmp eq i32 %m, 0
2318 define i32 @length128(ptr %X, ptr %Y) nounwind {
2319 ; X86-LABEL: length128:
2321 ; X86-NEXT: pushl $128
2322 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2323 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2324 ; X86-NEXT: calll memcmp
2325 ; X86-NEXT: addl $12, %esp
2327 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 128) nounwind
2331 define i1 @length128_eq(ptr %x, ptr %y) nounwind {
2332 ; X86-LABEL: length128_eq:
2334 ; X86-NEXT: pushl $128
2335 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2336 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2337 ; X86-NEXT: calll memcmp
2338 ; X86-NEXT: addl $12, %esp
2339 ; X86-NEXT: testl %eax, %eax
2340 ; X86-NEXT: setne %al
2342 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 128) nounwind
2343 %cmp = icmp ne i32 %call, 0
2347 define i1 @length128_lt(ptr %x, ptr %y) nounwind {
2348 ; X86-LABEL: length128_lt:
2350 ; X86-NEXT: pushl $128
2351 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2352 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2353 ; X86-NEXT: calll memcmp
2354 ; X86-NEXT: addl $12, %esp
2355 ; X86-NEXT: shrl $31, %eax
2356 ; X86-NEXT: # kill: def $al killed $al killed $eax
2358 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 128) nounwind
2359 %cmp = icmp slt i32 %call, 0
2363 define i1 @length128_gt(ptr %x, ptr %y) nounwind {
2364 ; X86-LABEL: length128_gt:
2366 ; X86-NEXT: pushl $128
2367 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2368 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2369 ; X86-NEXT: calll memcmp
2370 ; X86-NEXT: addl $12, %esp
2371 ; X86-NEXT: testl %eax, %eax
2372 ; X86-NEXT: setg %al
2374 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 128) nounwind
2375 %cmp = icmp sgt i32 %call, 0
2379 define i1 @length128_eq_const(ptr %X) nounwind {
2380 ; X86-LABEL: length128_eq_const:
2382 ; X86-NEXT: pushl $128
2383 ; X86-NEXT: pushl $.L.str
2384 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2385 ; X86-NEXT: calll memcmp
2386 ; X86-NEXT: addl $12, %esp
2387 ; X86-NEXT: testl %eax, %eax
2388 ; X86-NEXT: sete %al
2390 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 128) nounwind
2391 %c = icmp eq i32 %m, 0
2395 define i32 @length192(ptr %X, ptr %Y) nounwind {
2396 ; X86-LABEL: length192:
2398 ; X86-NEXT: pushl $192
2399 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2400 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2401 ; X86-NEXT: calll memcmp
2402 ; X86-NEXT: addl $12, %esp
2404 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 192) nounwind
2408 define i1 @length192_eq(ptr %x, ptr %y) nounwind {
2409 ; X86-LABEL: length192_eq:
2411 ; X86-NEXT: pushl $192
2412 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2413 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2414 ; X86-NEXT: calll memcmp
2415 ; X86-NEXT: addl $12, %esp
2416 ; X86-NEXT: testl %eax, %eax
2417 ; X86-NEXT: setne %al
2419 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 192) nounwind
2420 %cmp = icmp ne i32 %call, 0
2424 define i1 @length192_lt(ptr %x, ptr %y) nounwind {
2425 ; X86-LABEL: length192_lt:
2427 ; X86-NEXT: pushl $192
2428 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2429 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2430 ; X86-NEXT: calll memcmp
2431 ; X86-NEXT: addl $12, %esp
2432 ; X86-NEXT: shrl $31, %eax
2433 ; X86-NEXT: # kill: def $al killed $al killed $eax
2435 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 192) nounwind
2436 %cmp = icmp slt i32 %call, 0
2440 define i1 @length192_gt(ptr %x, ptr %y) nounwind {
2441 ; X86-LABEL: length192_gt:
2443 ; X86-NEXT: pushl $192
2444 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2445 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2446 ; X86-NEXT: calll memcmp
2447 ; X86-NEXT: addl $12, %esp
2448 ; X86-NEXT: testl %eax, %eax
2449 ; X86-NEXT: setg %al
2451 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 192) nounwind
2452 %cmp = icmp sgt i32 %call, 0
2456 define i1 @length192_eq_const(ptr %X) nounwind {
2457 ; X86-LABEL: length192_eq_const:
2459 ; X86-NEXT: pushl $192
2460 ; X86-NEXT: pushl $.L.str
2461 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2462 ; X86-NEXT: calll memcmp
2463 ; X86-NEXT: addl $12, %esp
2464 ; X86-NEXT: testl %eax, %eax
2465 ; X86-NEXT: sete %al
2467 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 192) nounwind
2468 %c = icmp eq i32 %m, 0
2472 define i32 @length255(ptr %X, ptr %Y) nounwind {
2473 ; X86-LABEL: length255:
2475 ; X86-NEXT: pushl $255
2476 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2477 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2478 ; X86-NEXT: calll memcmp
2479 ; X86-NEXT: addl $12, %esp
2481 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 255) nounwind
2485 define i1 @length255_eq(ptr %x, ptr %y) nounwind {
2486 ; X86-LABEL: length255_eq:
2488 ; X86-NEXT: pushl $255
2489 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2490 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2491 ; X86-NEXT: calll memcmp
2492 ; X86-NEXT: addl $12, %esp
2493 ; X86-NEXT: testl %eax, %eax
2494 ; X86-NEXT: setne %al
2496 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 255) nounwind
2497 %cmp = icmp ne i32 %call, 0
2501 define i1 @length255_lt(ptr %x, ptr %y) nounwind {
2502 ; X86-LABEL: length255_lt:
2504 ; X86-NEXT: pushl $255
2505 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2506 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2507 ; X86-NEXT: calll memcmp
2508 ; X86-NEXT: addl $12, %esp
2509 ; X86-NEXT: shrl $31, %eax
2510 ; X86-NEXT: # kill: def $al killed $al killed $eax
2512 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 255) nounwind
2513 %cmp = icmp slt i32 %call, 0
2517 define i1 @length255_gt(ptr %x, ptr %y) nounwind {
2518 ; X86-LABEL: length255_gt:
2520 ; X86-NEXT: pushl $255
2521 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2522 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2523 ; X86-NEXT: calll memcmp
2524 ; X86-NEXT: addl $12, %esp
2525 ; X86-NEXT: testl %eax, %eax
2526 ; X86-NEXT: setg %al
2528 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 255) nounwind
2529 %cmp = icmp sgt i32 %call, 0
2533 define i1 @length255_eq_const(ptr %X) nounwind {
2534 ; X86-LABEL: length255_eq_const:
2536 ; X86-NEXT: pushl $255
2537 ; X86-NEXT: pushl $.L.str
2538 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2539 ; X86-NEXT: calll memcmp
2540 ; X86-NEXT: addl $12, %esp
2541 ; X86-NEXT: testl %eax, %eax
2542 ; X86-NEXT: sete %al
2544 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 255) nounwind
2545 %c = icmp eq i32 %m, 0
2549 define i32 @length256(ptr %X, ptr %Y) nounwind {
2550 ; X86-LABEL: length256:
2552 ; X86-NEXT: pushl $256 # imm = 0x100
2553 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2554 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2555 ; X86-NEXT: calll memcmp
2556 ; X86-NEXT: addl $12, %esp
2558 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 256) nounwind
2562 define i1 @length256_eq(ptr %x, ptr %y) nounwind {
2563 ; X86-LABEL: length256_eq:
2565 ; X86-NEXT: pushl $256 # imm = 0x100
2566 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2567 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2568 ; X86-NEXT: calll memcmp
2569 ; X86-NEXT: addl $12, %esp
2570 ; X86-NEXT: testl %eax, %eax
2571 ; X86-NEXT: setne %al
2573 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 256) nounwind
2574 %cmp = icmp ne i32 %call, 0
2578 define i1 @length256_lt(ptr %x, ptr %y) nounwind {
2579 ; X86-LABEL: length256_lt:
2581 ; X86-NEXT: pushl $256 # imm = 0x100
2582 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2583 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2584 ; X86-NEXT: calll memcmp
2585 ; X86-NEXT: addl $12, %esp
2586 ; X86-NEXT: shrl $31, %eax
2587 ; X86-NEXT: # kill: def $al killed $al killed $eax
2589 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 256) nounwind
2590 %cmp = icmp slt i32 %call, 0
2594 define i1 @length256_gt(ptr %x, ptr %y) nounwind {
2595 ; X86-LABEL: length256_gt:
2597 ; X86-NEXT: pushl $256 # imm = 0x100
2598 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2599 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2600 ; X86-NEXT: calll memcmp
2601 ; X86-NEXT: addl $12, %esp
2602 ; X86-NEXT: testl %eax, %eax
2603 ; X86-NEXT: setg %al
2605 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 256) nounwind
2606 %cmp = icmp sgt i32 %call, 0
2610 define i1 @length256_eq_const(ptr %X) nounwind {
2611 ; X86-LABEL: length256_eq_const:
2613 ; X86-NEXT: pushl $256 # imm = 0x100
2614 ; X86-NEXT: pushl $.L.str
2615 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2616 ; X86-NEXT: calll memcmp
2617 ; X86-NEXT: addl $12, %esp
2618 ; X86-NEXT: testl %eax, %eax
2619 ; X86-NEXT: sete %al
2621 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 256) nounwind
2622 %c = icmp eq i32 %m, 0
2626 define i32 @length384(ptr %X, ptr %Y) nounwind {
2627 ; X86-LABEL: length384:
2629 ; X86-NEXT: pushl $384 # imm = 0x180
2630 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2631 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2632 ; X86-NEXT: calll memcmp
2633 ; X86-NEXT: addl $12, %esp
2635 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 384) nounwind
2639 define i1 @length384_eq(ptr %x, ptr %y) nounwind {
2640 ; X86-LABEL: length384_eq:
2642 ; X86-NEXT: pushl $384 # imm = 0x180
2643 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2644 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2645 ; X86-NEXT: calll memcmp
2646 ; X86-NEXT: addl $12, %esp
2647 ; X86-NEXT: testl %eax, %eax
2648 ; X86-NEXT: setne %al
2650 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 384) nounwind
2651 %cmp = icmp ne i32 %call, 0
2655 define i1 @length384_lt(ptr %x, ptr %y) nounwind {
2656 ; X86-LABEL: length384_lt:
2658 ; X86-NEXT: pushl $384 # imm = 0x180
2659 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2660 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2661 ; X86-NEXT: calll memcmp
2662 ; X86-NEXT: addl $12, %esp
2663 ; X86-NEXT: shrl $31, %eax
2664 ; X86-NEXT: # kill: def $al killed $al killed $eax
2666 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 384) nounwind
2667 %cmp = icmp slt i32 %call, 0
2671 define i1 @length384_gt(ptr %x, ptr %y) nounwind {
2672 ; X86-LABEL: length384_gt:
2674 ; X86-NEXT: pushl $384 # imm = 0x180
2675 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2676 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2677 ; X86-NEXT: calll memcmp
2678 ; X86-NEXT: addl $12, %esp
2679 ; X86-NEXT: testl %eax, %eax
2680 ; X86-NEXT: setg %al
2682 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 384) nounwind
2683 %cmp = icmp sgt i32 %call, 0
2687 define i1 @length384_eq_const(ptr %X) nounwind {
2688 ; X86-LABEL: length384_eq_const:
2690 ; X86-NEXT: pushl $384 # imm = 0x180
2691 ; X86-NEXT: pushl $.L.str
2692 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2693 ; X86-NEXT: calll memcmp
2694 ; X86-NEXT: addl $12, %esp
2695 ; X86-NEXT: testl %eax, %eax
2696 ; X86-NEXT: sete %al
2698 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 384) nounwind
2699 %c = icmp eq i32 %m, 0
2703 define i32 @length511(ptr %X, ptr %Y) nounwind {
2704 ; X86-LABEL: length511:
2706 ; X86-NEXT: pushl $511 # imm = 0x1FF
2707 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2708 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2709 ; X86-NEXT: calll memcmp
2710 ; X86-NEXT: addl $12, %esp
2712 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 511) nounwind
2716 define i1 @length511_eq(ptr %x, ptr %y) nounwind {
2717 ; X86-LABEL: length511_eq:
2719 ; X86-NEXT: pushl $511 # imm = 0x1FF
2720 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2721 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2722 ; X86-NEXT: calll memcmp
2723 ; X86-NEXT: addl $12, %esp
2724 ; X86-NEXT: testl %eax, %eax
2725 ; X86-NEXT: setne %al
2727 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 511) nounwind
2728 %cmp = icmp ne i32 %call, 0
2732 define i1 @length511_lt(ptr %x, ptr %y) nounwind {
2733 ; X86-LABEL: length511_lt:
2735 ; X86-NEXT: pushl $511 # imm = 0x1FF
2736 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2737 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2738 ; X86-NEXT: calll memcmp
2739 ; X86-NEXT: addl $12, %esp
2740 ; X86-NEXT: shrl $31, %eax
2741 ; X86-NEXT: # kill: def $al killed $al killed $eax
2743 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 511) nounwind
2744 %cmp = icmp slt i32 %call, 0
2748 define i1 @length511_gt(ptr %x, ptr %y) nounwind {
2749 ; X86-LABEL: length511_gt:
2751 ; X86-NEXT: pushl $511 # imm = 0x1FF
2752 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2753 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2754 ; X86-NEXT: calll memcmp
2755 ; X86-NEXT: addl $12, %esp
2756 ; X86-NEXT: testl %eax, %eax
2757 ; X86-NEXT: setg %al
2759 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 511) nounwind
2760 %cmp = icmp sgt i32 %call, 0
2764 define i1 @length511_eq_const(ptr %X) nounwind {
2765 ; X86-LABEL: length511_eq_const:
2767 ; X86-NEXT: pushl $511 # imm = 0x1FF
2768 ; X86-NEXT: pushl $.L.str
2769 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2770 ; X86-NEXT: calll memcmp
2771 ; X86-NEXT: addl $12, %esp
2772 ; X86-NEXT: testl %eax, %eax
2773 ; X86-NEXT: sete %al
2775 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 511) nounwind
2776 %c = icmp eq i32 %m, 0
2780 define i32 @length512(ptr %X, ptr %Y) nounwind {
2781 ; X86-LABEL: length512:
2783 ; X86-NEXT: pushl $512 # imm = 0x200
2784 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2785 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2786 ; X86-NEXT: calll memcmp
2787 ; X86-NEXT: addl $12, %esp
2789 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 512) nounwind
2793 define i1 @length512_eq(ptr %x, ptr %y) nounwind {
2794 ; X86-LABEL: length512_eq:
2796 ; X86-NEXT: pushl $512 # imm = 0x200
2797 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2798 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2799 ; X86-NEXT: calll memcmp
2800 ; X86-NEXT: addl $12, %esp
2801 ; X86-NEXT: testl %eax, %eax
2802 ; X86-NEXT: setne %al
2804 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 512) nounwind
2805 %cmp = icmp ne i32 %call, 0
2809 define i1 @length512_lt(ptr %x, ptr %y) nounwind {
2810 ; X86-LABEL: length512_lt:
2812 ; X86-NEXT: pushl $512 # imm = 0x200
2813 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2814 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2815 ; X86-NEXT: calll memcmp
2816 ; X86-NEXT: addl $12, %esp
2817 ; X86-NEXT: shrl $31, %eax
2818 ; X86-NEXT: # kill: def $al killed $al killed $eax
2820 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 512) nounwind
2821 %cmp = icmp slt i32 %call, 0
2825 define i1 @length512_gt(ptr %x, ptr %y) nounwind {
2826 ; X86-LABEL: length512_gt:
2828 ; X86-NEXT: pushl $512 # imm = 0x200
2829 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2830 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2831 ; X86-NEXT: calll memcmp
2832 ; X86-NEXT: addl $12, %esp
2833 ; X86-NEXT: testl %eax, %eax
2834 ; X86-NEXT: setg %al
2836 %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 512) nounwind
2837 %cmp = icmp sgt i32 %call, 0
2841 define i1 @length512_eq_const(ptr %X) nounwind {
2842 ; X86-LABEL: length512_eq_const:
2844 ; X86-NEXT: pushl $512 # imm = 0x200
2845 ; X86-NEXT: pushl $.L.str
2846 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2847 ; X86-NEXT: calll memcmp
2848 ; X86-NEXT: addl $12, %esp
2849 ; X86-NEXT: testl %eax, %eax
2850 ; X86-NEXT: sete %al
2852 %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 512) nounwind
2853 %c = icmp eq i32 %m, 0
2857 ; This checks that we do not do stupid things with huge sizes.
2858 define i32 @huge_length(ptr %X, ptr %Y) nounwind {
2859 ; X86-LABEL: huge_length:
2861 ; X86-NEXT: pushl $-1
2862 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2863 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2864 ; X86-NEXT: calll memcmp
2865 ; X86-NEXT: addl $12, %esp
2867 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 9223372036854775807) nounwind
2871 define i1 @huge_length_eq(ptr %X, ptr %Y) nounwind {
2872 ; X86-LABEL: huge_length_eq:
2874 ; X86-NEXT: pushl $-1
2875 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2876 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2877 ; X86-NEXT: calll memcmp
2878 ; X86-NEXT: addl $12, %esp
2879 ; X86-NEXT: testl %eax, %eax
2880 ; X86-NEXT: sete %al
2882 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 9223372036854775807) nounwind
2883 %c = icmp eq i32 %m, 0
2887 ; This checks non-constant sizes.
2888 define i32 @nonconst_length(ptr %X, ptr %Y, i32 %size) nounwind {
2889 ; X86-LABEL: nonconst_length:
2891 ; X86-NEXT: jmp memcmp # TAILCALL
2892 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 %size) nounwind
2896 define i1 @nonconst_length_eq(ptr %X, ptr %Y, i32 %size) nounwind {
2897 ; X86-LABEL: nonconst_length_eq:
2899 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2900 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2901 ; X86-NEXT: pushl {{[0-9]+}}(%esp)
2902 ; X86-NEXT: calll memcmp
2903 ; X86-NEXT: addl $12, %esp
2904 ; X86-NEXT: testl %eax, %eax
2905 ; X86-NEXT: sete %al
2907 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 %size) nounwind
2908 %c = icmp eq i32 %m, 0