Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / memcmp-more-load-pairs-x32.ll
blobc0f8f86e6e8b1075bdff2f6e6131b7c0a79b7ec8
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
9 ; rdar://6480398
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 {
16 ; X86-LABEL: length0:
17 ; X86:       # %bb.0:
18 ; X86-NEXT:    xorl %eax, %eax
19 ; X86-NEXT:    retl
20    %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 0) nounwind
21    ret i32 %m
22  }
24 define i1 @length0_eq(ptr %X, ptr %Y) nounwind {
25 ; X86-LABEL: length0_eq:
26 ; X86:       # %bb.0:
27 ; X86-NEXT:    movb $1, %al
28 ; X86-NEXT:    retl
29   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 0) nounwind
30   %c = icmp eq i32 %m, 0
31   ret i1 %c
34 define i1 @length0_lt(ptr %X, ptr %Y) nounwind {
35 ; X86-LABEL: length0_lt:
36 ; X86:       # %bb.0:
37 ; X86-NEXT:    xorl %eax, %eax
38 ; X86-NEXT:    retl
39   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 0) nounwind
40   %c = icmp slt i32 %m, 0
41   ret i1 %c
44 define i32 @length2(ptr %X, ptr %Y) nounwind {
45 ; X86-LABEL: length2:
46 ; X86:       # %bb.0:
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
56 ; X86-NEXT:    retl
57   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind
58   ret i32 %m
61 define i1 @length2_eq(ptr %X, ptr %Y) nounwind {
62 ; X86-LABEL: length2_eq:
63 ; X86:       # %bb.0:
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
68 ; X86-NEXT:    sete %al
69 ; X86-NEXT:    retl
70   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind
71   %c = icmp eq i32 %m, 0
72   ret i1 %c
75 define i1 @length2_lt(ptr %X, ptr %Y) nounwind {
76 ; X86-LABEL: length2_lt:
77 ; X86:       # %bb.0:
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
89 ; X86-NEXT:    retl
90   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind
91   %c = icmp slt i32 %m, 0
92   ret i1 %c
95 define i1 @length2_gt(ptr %X, ptr %Y) nounwind {
96 ; X86-LABEL: length2_gt:
97 ; X86:       # %bb.0:
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
108 ; X86-NEXT:    setg %al
109 ; X86-NEXT:    retl
110   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind
111   %c = icmp sgt i32 %m, 0
112   ret i1 %c
115 define i1 @length2_eq_const(ptr %X) nounwind {
116 ; X86-LABEL: length2_eq_const:
117 ; X86:       # %bb.0:
118 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
119 ; X86-NEXT:    movzwl (%eax), %eax
120 ; X86-NEXT:    cmpl $12849, %eax # imm = 0x3231
121 ; X86-NEXT:    setne %al
122 ; X86-NEXT:    retl
123   %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i32 2) nounwind
124   %c = icmp ne i32 %m, 0
125   ret i1 %c
128 define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind {
129 ; X86-LABEL: length2_eq_nobuiltin_attr:
130 ; X86:       # %bb.0:
131 ; X86-NEXT:    pushl $2
132 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
133 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
134 ; X86-NEXT:    calll memcmp
135 ; X86-NEXT:    addl $12, %esp
136 ; X86-NEXT:    testl %eax, %eax
137 ; X86-NEXT:    sete %al
138 ; X86-NEXT:    retl
139   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 2) nounwind nobuiltin
140   %c = icmp eq i32 %m, 0
141   ret i1 %c
144 define i32 @length3(ptr %X, ptr %Y) nounwind {
145 ; X86-LABEL: length3:
146 ; X86:       # %bb.0:
147 ; X86-NEXT:    pushl %esi
148 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
149 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
150 ; X86-NEXT:    movzwl (%eax), %edx
151 ; X86-NEXT:    movzwl (%ecx), %esi
152 ; X86-NEXT:    rolw $8, %dx
153 ; X86-NEXT:    rolw $8, %si
154 ; X86-NEXT:    cmpw %si, %dx
155 ; X86-NEXT:    jne .LBB9_3
156 ; X86-NEXT:  # %bb.1: # %loadbb1
157 ; X86-NEXT:    movzbl 2(%eax), %eax
158 ; X86-NEXT:    movzbl 2(%ecx), %ecx
159 ; X86-NEXT:    subl %ecx, %eax
160 ; X86-NEXT:    popl %esi
161 ; X86-NEXT:    retl
162 ; X86-NEXT:  .LBB9_3: # %res_block
163 ; X86-NEXT:    xorl %eax, %eax
164 ; X86-NEXT:    cmpw %si, %dx
165 ; X86-NEXT:    sbbl %eax, %eax
166 ; X86-NEXT:    orl $1, %eax
167 ; X86-NEXT:    popl %esi
168 ; X86-NEXT:    retl
169   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 3) nounwind
170   ret i32 %m
173 define i1 @length3_eq(ptr %X, ptr %Y) nounwind {
174 ; X86-LABEL: length3_eq:
175 ; X86:       # %bb.0:
176 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
177 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
178 ; X86-NEXT:    movzwl (%ecx), %edx
179 ; X86-NEXT:    xorw (%eax), %dx
180 ; X86-NEXT:    movzbl 2(%ecx), %ecx
181 ; X86-NEXT:    xorb 2(%eax), %cl
182 ; X86-NEXT:    movzbl %cl, %eax
183 ; X86-NEXT:    orw %dx, %ax
184 ; X86-NEXT:    setne %al
185 ; X86-NEXT:    retl
186   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 3) nounwind
187   %c = icmp ne i32 %m, 0
188   ret i1 %c
191 define i32 @length4(ptr %X, ptr %Y) nounwind {
192 ; X86-LABEL: length4:
193 ; X86:       # %bb.0:
194 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
195 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
196 ; X86-NEXT:    movl (%ecx), %ecx
197 ; X86-NEXT:    movl (%eax), %edx
198 ; X86-NEXT:    bswapl %ecx
199 ; X86-NEXT:    bswapl %edx
200 ; X86-NEXT:    xorl %eax, %eax
201 ; X86-NEXT:    cmpl %edx, %ecx
202 ; X86-NEXT:    seta %al
203 ; X86-NEXT:    sbbl $0, %eax
204 ; X86-NEXT:    retl
205   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind
206   ret i32 %m
209 define i1 @length4_eq(ptr %X, ptr %Y) nounwind {
210 ; X86-LABEL: length4_eq:
211 ; X86:       # %bb.0:
212 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
213 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
214 ; X86-NEXT:    movl (%ecx), %ecx
215 ; X86-NEXT:    cmpl (%eax), %ecx
216 ; X86-NEXT:    setne %al
217 ; X86-NEXT:    retl
218   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind
219   %c = icmp ne i32 %m, 0
220   ret i1 %c
223 define i1 @length4_lt(ptr %X, ptr %Y) nounwind {
224 ; X86-LABEL: length4_lt:
225 ; X86:       # %bb.0:
226 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
227 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
228 ; X86-NEXT:    movl (%ecx), %ecx
229 ; X86-NEXT:    movl (%eax), %edx
230 ; X86-NEXT:    bswapl %ecx
231 ; X86-NEXT:    bswapl %edx
232 ; X86-NEXT:    xorl %eax, %eax
233 ; X86-NEXT:    cmpl %edx, %ecx
234 ; X86-NEXT:    seta %al
235 ; X86-NEXT:    sbbl $0, %eax
236 ; X86-NEXT:    shrl $31, %eax
237 ; X86-NEXT:    # kill: def $al killed $al killed $eax
238 ; X86-NEXT:    retl
239   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind
240   %c = icmp slt i32 %m, 0
241   ret i1 %c
244 define i1 @length4_gt(ptr %X, ptr %Y) nounwind {
245 ; X86-LABEL: length4_gt:
246 ; X86:       # %bb.0:
247 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
248 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
249 ; X86-NEXT:    movl (%ecx), %ecx
250 ; X86-NEXT:    movl (%eax), %eax
251 ; X86-NEXT:    bswapl %ecx
252 ; X86-NEXT:    bswapl %eax
253 ; X86-NEXT:    xorl %edx, %edx
254 ; X86-NEXT:    cmpl %eax, %ecx
255 ; X86-NEXT:    seta %dl
256 ; X86-NEXT:    sbbl $0, %edx
257 ; X86-NEXT:    testl %edx, %edx
258 ; X86-NEXT:    setg %al
259 ; X86-NEXT:    retl
260   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 4) nounwind
261   %c = icmp sgt i32 %m, 0
262   ret i1 %c
265 define i1 @length4_eq_const(ptr %X) nounwind {
266 ; X86-LABEL: length4_eq_const:
267 ; X86:       # %bb.0:
268 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
269 ; X86-NEXT:    cmpl $875770417, (%eax) # imm = 0x34333231
270 ; X86-NEXT:    sete %al
271 ; X86-NEXT:    retl
272   %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i32 4) nounwind
273   %c = icmp eq i32 %m, 0
274   ret i1 %c
277 define i32 @length5(ptr %X, ptr %Y) nounwind {
278 ; X86-LABEL: length5:
279 ; X86:       # %bb.0:
280 ; X86-NEXT:    pushl %esi
281 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
282 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
283 ; X86-NEXT:    movl (%eax), %edx
284 ; X86-NEXT:    movl (%ecx), %esi
285 ; X86-NEXT:    bswapl %edx
286 ; X86-NEXT:    bswapl %esi
287 ; X86-NEXT:    cmpl %esi, %edx
288 ; X86-NEXT:    jne .LBB16_3
289 ; X86-NEXT:  # %bb.1: # %loadbb1
290 ; X86-NEXT:    movzbl 4(%eax), %eax
291 ; X86-NEXT:    movzbl 4(%ecx), %ecx
292 ; X86-NEXT:    subl %ecx, %eax
293 ; X86-NEXT:    popl %esi
294 ; X86-NEXT:    retl
295 ; X86-NEXT:  .LBB16_3: # %res_block
296 ; X86-NEXT:    xorl %eax, %eax
297 ; X86-NEXT:    cmpl %esi, %edx
298 ; X86-NEXT:    sbbl %eax, %eax
299 ; X86-NEXT:    orl $1, %eax
300 ; X86-NEXT:    popl %esi
301 ; X86-NEXT:    retl
302   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind
303   ret i32 %m
306 define i1 @length5_eq(ptr %X, ptr %Y) nounwind {
307 ; X86-LABEL: length5_eq:
308 ; X86:       # %bb.0:
309 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
310 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
311 ; X86-NEXT:    movl (%ecx), %edx
312 ; X86-NEXT:    xorl (%eax), %edx
313 ; X86-NEXT:    movzbl 4(%ecx), %ecx
314 ; X86-NEXT:    xorb 4(%eax), %cl
315 ; X86-NEXT:    movzbl %cl, %eax
316 ; X86-NEXT:    orl %edx, %eax
317 ; X86-NEXT:    setne %al
318 ; X86-NEXT:    retl
319   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind
320   %c = icmp ne i32 %m, 0
321   ret i1 %c
324 define i1 @length5_lt(ptr %X, ptr %Y) nounwind {
325 ; X86-LABEL: length5_lt:
326 ; X86:       # %bb.0:
327 ; X86-NEXT:    pushl %esi
328 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
329 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
330 ; X86-NEXT:    movl (%eax), %edx
331 ; X86-NEXT:    movl (%ecx), %esi
332 ; X86-NEXT:    bswapl %edx
333 ; X86-NEXT:    bswapl %esi
334 ; X86-NEXT:    cmpl %esi, %edx
335 ; X86-NEXT:    jne .LBB18_3
336 ; X86-NEXT:  # %bb.1: # %loadbb1
337 ; X86-NEXT:    movzbl 4(%eax), %eax
338 ; X86-NEXT:    movzbl 4(%ecx), %ecx
339 ; X86-NEXT:    subl %ecx, %eax
340 ; X86-NEXT:    jmp .LBB18_2
341 ; X86-NEXT:  .LBB18_3: # %res_block
342 ; X86-NEXT:    xorl %eax, %eax
343 ; X86-NEXT:    cmpl %esi, %edx
344 ; X86-NEXT:    sbbl %eax, %eax
345 ; X86-NEXT:    orl $1, %eax
346 ; X86-NEXT:  .LBB18_2: # %endblock
347 ; X86-NEXT:    shrl $31, %eax
348 ; X86-NEXT:    # kill: def $al killed $al killed $eax
349 ; X86-NEXT:    popl %esi
350 ; X86-NEXT:    retl
351   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 5) nounwind
352   %c = icmp slt i32 %m, 0
353   ret i1 %c
356 define i32 @length7(ptr %X, ptr %Y) nounwind {
357 ; X86-LABEL: length7:
358 ; X86:       # %bb.0:
359 ; X86-NEXT:    pushl %esi
360 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
361 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
362 ; X86-NEXT:    movl (%esi), %ecx
363 ; X86-NEXT:    movl (%eax), %edx
364 ; X86-NEXT:    bswapl %ecx
365 ; X86-NEXT:    bswapl %edx
366 ; X86-NEXT:    cmpl %edx, %ecx
367 ; X86-NEXT:    jne .LBB19_2
368 ; X86-NEXT:  # %bb.1: # %loadbb1
369 ; X86-NEXT:    movl 3(%esi), %ecx
370 ; X86-NEXT:    movl 3(%eax), %edx
371 ; X86-NEXT:    bswapl %ecx
372 ; X86-NEXT:    bswapl %edx
373 ; X86-NEXT:    xorl %eax, %eax
374 ; X86-NEXT:    cmpl %edx, %ecx
375 ; X86-NEXT:    je .LBB19_3
376 ; X86-NEXT:  .LBB19_2: # %res_block
377 ; X86-NEXT:    xorl %eax, %eax
378 ; X86-NEXT:    cmpl %edx, %ecx
379 ; X86-NEXT:    sbbl %eax, %eax
380 ; X86-NEXT:    orl $1, %eax
381 ; X86-NEXT:  .LBB19_3: # %endblock
382 ; X86-NEXT:    popl %esi
383 ; X86-NEXT:    retl
384   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 7) nounwind
385   ret i32 %m
388 define i1 @length7_eq(ptr %X, ptr %Y) nounwind {
389 ; X86-LABEL: length7_eq:
390 ; X86:       # %bb.0:
391 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
392 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
393 ; X86-NEXT:    movl (%ecx), %edx
394 ; X86-NEXT:    movl 3(%ecx), %ecx
395 ; X86-NEXT:    xorl (%eax), %edx
396 ; X86-NEXT:    xorl 3(%eax), %ecx
397 ; X86-NEXT:    orl %edx, %ecx
398 ; X86-NEXT:    setne %al
399 ; X86-NEXT:    retl
400   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 7) nounwind
401   %c = icmp ne i32 %m, 0
402   ret i1 %c
405 define i1 @length7_lt(ptr %X, ptr %Y) nounwind {
406 ; X86-LABEL: length7_lt:
407 ; X86:       # %bb.0:
408 ; X86-NEXT:    pushl %esi
409 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
410 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
411 ; X86-NEXT:    movl (%esi), %ecx
412 ; X86-NEXT:    movl (%eax), %edx
413 ; X86-NEXT:    bswapl %ecx
414 ; X86-NEXT:    bswapl %edx
415 ; X86-NEXT:    cmpl %edx, %ecx
416 ; X86-NEXT:    jne .LBB21_2
417 ; X86-NEXT:  # %bb.1: # %loadbb1
418 ; X86-NEXT:    movl 3(%esi), %ecx
419 ; X86-NEXT:    movl 3(%eax), %edx
420 ; X86-NEXT:    bswapl %ecx
421 ; X86-NEXT:    bswapl %edx
422 ; X86-NEXT:    xorl %eax, %eax
423 ; X86-NEXT:    cmpl %edx, %ecx
424 ; X86-NEXT:    je .LBB21_3
425 ; X86-NEXT:  .LBB21_2: # %res_block
426 ; X86-NEXT:    xorl %eax, %eax
427 ; X86-NEXT:    cmpl %edx, %ecx
428 ; X86-NEXT:    sbbl %eax, %eax
429 ; X86-NEXT:    orl $1, %eax
430 ; X86-NEXT:  .LBB21_3: # %endblock
431 ; X86-NEXT:    shrl $31, %eax
432 ; X86-NEXT:    # kill: def $al killed $al killed $eax
433 ; X86-NEXT:    popl %esi
434 ; X86-NEXT:    retl
435   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 7) nounwind
436   %c = icmp slt i32 %m, 0
437   ret i1 %c
440 define i32 @length8(ptr %X, ptr %Y) nounwind {
441 ; X86-LABEL: length8:
442 ; X86:       # %bb.0:
443 ; X86-NEXT:    pushl %esi
444 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
445 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
446 ; X86-NEXT:    movl (%esi), %ecx
447 ; X86-NEXT:    movl (%eax), %edx
448 ; X86-NEXT:    bswapl %ecx
449 ; X86-NEXT:    bswapl %edx
450 ; X86-NEXT:    cmpl %edx, %ecx
451 ; X86-NEXT:    jne .LBB22_2
452 ; X86-NEXT:  # %bb.1: # %loadbb1
453 ; X86-NEXT:    movl 4(%esi), %ecx
454 ; X86-NEXT:    movl 4(%eax), %edx
455 ; X86-NEXT:    bswapl %ecx
456 ; X86-NEXT:    bswapl %edx
457 ; X86-NEXT:    xorl %eax, %eax
458 ; X86-NEXT:    cmpl %edx, %ecx
459 ; X86-NEXT:    je .LBB22_3
460 ; X86-NEXT:  .LBB22_2: # %res_block
461 ; X86-NEXT:    xorl %eax, %eax
462 ; X86-NEXT:    cmpl %edx, %ecx
463 ; X86-NEXT:    sbbl %eax, %eax
464 ; X86-NEXT:    orl $1, %eax
465 ; X86-NEXT:  .LBB22_3: # %endblock
466 ; X86-NEXT:    popl %esi
467 ; X86-NEXT:    retl
468   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 8) nounwind
469   ret i32 %m
472 define i1 @length8_eq(ptr %X, ptr %Y) nounwind {
473 ; X86-LABEL: length8_eq:
474 ; X86:       # %bb.0:
475 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
476 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
477 ; X86-NEXT:    movl (%ecx), %edx
478 ; X86-NEXT:    movl 4(%ecx), %ecx
479 ; X86-NEXT:    xorl (%eax), %edx
480 ; X86-NEXT:    xorl 4(%eax), %ecx
481 ; X86-NEXT:    orl %edx, %ecx
482 ; X86-NEXT:    sete %al
483 ; X86-NEXT:    retl
484   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 8) nounwind
485   %c = icmp eq i32 %m, 0
486   ret i1 %c
489 define i1 @length8_eq_const(ptr %X) nounwind {
490 ; X86-LABEL: length8_eq_const:
491 ; X86:       # %bb.0:
492 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
493 ; X86-NEXT:    movl $858927408, %ecx # imm = 0x33323130
494 ; X86-NEXT:    xorl (%eax), %ecx
495 ; X86-NEXT:    movl $926299444, %edx # imm = 0x37363534
496 ; X86-NEXT:    xorl 4(%eax), %edx
497 ; X86-NEXT:    orl %ecx, %edx
498 ; X86-NEXT:    setne %al
499 ; X86-NEXT:    retl
500   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 8) nounwind
501   %c = icmp ne i32 %m, 0
502   ret i1 %c
505 define i1 @length9_eq(ptr %X, ptr %Y) nounwind {
506 ; X86-LABEL: length9_eq:
507 ; X86:       # %bb.0:
508 ; X86-NEXT:    pushl %esi
509 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
510 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
511 ; X86-NEXT:    movl (%ecx), %edx
512 ; X86-NEXT:    movl 4(%ecx), %esi
513 ; X86-NEXT:    xorl (%eax), %edx
514 ; X86-NEXT:    xorl 4(%eax), %esi
515 ; X86-NEXT:    orl %edx, %esi
516 ; X86-NEXT:    movzbl 8(%ecx), %ecx
517 ; X86-NEXT:    xorb 8(%eax), %cl
518 ; X86-NEXT:    movzbl %cl, %eax
519 ; X86-NEXT:    orl %esi, %eax
520 ; X86-NEXT:    sete %al
521 ; X86-NEXT:    popl %esi
522 ; X86-NEXT:    retl
523   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 9) nounwind
524   %c = icmp eq i32 %m, 0
525   ret i1 %c
528 define i1 @length10_eq(ptr %X, ptr %Y) nounwind {
529 ; X86-LABEL: length10_eq:
530 ; X86:       # %bb.0:
531 ; X86-NEXT:    pushl %esi
532 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
533 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
534 ; X86-NEXT:    movl (%ecx), %edx
535 ; X86-NEXT:    movl 4(%ecx), %esi
536 ; X86-NEXT:    xorl (%eax), %edx
537 ; X86-NEXT:    xorl 4(%eax), %esi
538 ; X86-NEXT:    orl %edx, %esi
539 ; X86-NEXT:    movzwl 8(%ecx), %ecx
540 ; X86-NEXT:    xorw 8(%eax), %cx
541 ; X86-NEXT:    movzwl %cx, %eax
542 ; X86-NEXT:    orl %esi, %eax
543 ; X86-NEXT:    sete %al
544 ; X86-NEXT:    popl %esi
545 ; X86-NEXT:    retl
546   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 10) nounwind
547   %c = icmp eq i32 %m, 0
548   ret i1 %c
551 define i1 @length11_eq(ptr %X, ptr %Y) nounwind {
552 ; X86-LABEL: length11_eq:
553 ; X86:       # %bb.0:
554 ; X86-NEXT:    pushl %esi
555 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
556 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
557 ; X86-NEXT:    movl (%ecx), %edx
558 ; X86-NEXT:    movl 4(%ecx), %esi
559 ; X86-NEXT:    xorl (%eax), %edx
560 ; X86-NEXT:    xorl 4(%eax), %esi
561 ; X86-NEXT:    orl %edx, %esi
562 ; X86-NEXT:    movl 7(%ecx), %ecx
563 ; X86-NEXT:    xorl 7(%eax), %ecx
564 ; X86-NEXT:    orl %esi, %ecx
565 ; X86-NEXT:    sete %al
566 ; X86-NEXT:    popl %esi
567 ; X86-NEXT:    retl
568   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 11) nounwind
569   %c = icmp eq i32 %m, 0
570   ret i1 %c
573 define i1 @length12_eq(ptr %X, ptr %Y) nounwind {
574 ; X86-LABEL: length12_eq:
575 ; X86:       # %bb.0:
576 ; X86-NEXT:    pushl %esi
577 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
578 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
579 ; X86-NEXT:    movl (%ecx), %edx
580 ; X86-NEXT:    movl 4(%ecx), %esi
581 ; X86-NEXT:    xorl (%eax), %edx
582 ; X86-NEXT:    xorl 4(%eax), %esi
583 ; X86-NEXT:    orl %edx, %esi
584 ; X86-NEXT:    movl 8(%ecx), %ecx
585 ; X86-NEXT:    xorl 8(%eax), %ecx
586 ; X86-NEXT:    orl %esi, %ecx
587 ; X86-NEXT:    setne %al
588 ; X86-NEXT:    popl %esi
589 ; X86-NEXT:    retl
590   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 12) nounwind
591   %c = icmp ne i32 %m, 0
592   ret i1 %c
595 define i32 @length12(ptr %X, ptr %Y) nounwind {
596 ; X86-LABEL: length12:
597 ; X86:       # %bb.0:
598 ; X86-NEXT:    pushl %esi
599 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
600 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
601 ; X86-NEXT:    movl (%esi), %ecx
602 ; X86-NEXT:    movl (%eax), %edx
603 ; X86-NEXT:    bswapl %ecx
604 ; X86-NEXT:    bswapl %edx
605 ; X86-NEXT:    cmpl %edx, %ecx
606 ; X86-NEXT:    jne .LBB29_3
607 ; X86-NEXT:  # %bb.1: # %loadbb1
608 ; X86-NEXT:    movl 4(%esi), %ecx
609 ; X86-NEXT:    movl 4(%eax), %edx
610 ; X86-NEXT:    bswapl %ecx
611 ; X86-NEXT:    bswapl %edx
612 ; X86-NEXT:    cmpl %edx, %ecx
613 ; X86-NEXT:    jne .LBB29_3
614 ; X86-NEXT:  # %bb.2: # %loadbb2
615 ; X86-NEXT:    movl 8(%esi), %ecx
616 ; X86-NEXT:    movl 8(%eax), %edx
617 ; X86-NEXT:    bswapl %ecx
618 ; X86-NEXT:    bswapl %edx
619 ; X86-NEXT:    xorl %eax, %eax
620 ; X86-NEXT:    cmpl %edx, %ecx
621 ; X86-NEXT:    je .LBB29_4
622 ; X86-NEXT:  .LBB29_3: # %res_block
623 ; X86-NEXT:    xorl %eax, %eax
624 ; X86-NEXT:    cmpl %edx, %ecx
625 ; X86-NEXT:    sbbl %eax, %eax
626 ; X86-NEXT:    orl $1, %eax
627 ; X86-NEXT:  .LBB29_4: # %endblock
628 ; X86-NEXT:    popl %esi
629 ; X86-NEXT:    retl
630   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 12) nounwind
631   ret i32 %m
634 define i1 @length13_eq(ptr %X, ptr %Y) nounwind {
635 ; X86-LABEL: length13_eq:
636 ; X86:       # %bb.0:
637 ; X86-NEXT:    pushl %esi
638 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
639 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
640 ; X86-NEXT:    movl (%edx), %esi
641 ; X86-NEXT:    movl 4(%edx), %eax
642 ; X86-NEXT:    xorl (%ecx), %esi
643 ; X86-NEXT:    xorl 4(%ecx), %eax
644 ; X86-NEXT:    orl %esi, %eax
645 ; X86-NEXT:    movl 8(%edx), %esi
646 ; X86-NEXT:    xorl 8(%ecx), %esi
647 ; X86-NEXT:    movzbl 12(%edx), %edx
648 ; X86-NEXT:    xorb 12(%ecx), %dl
649 ; X86-NEXT:    movzbl %dl, %ecx
650 ; X86-NEXT:    orl %esi, %ecx
651 ; X86-NEXT:    orl %eax, %ecx
652 ; X86-NEXT:    sete %al
653 ; X86-NEXT:    popl %esi
654 ; X86-NEXT:    retl
655   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 13) nounwind
656   %c = icmp eq i32 %m, 0
657   ret i1 %c
660 define i1 @length14_eq(ptr %X, ptr %Y) nounwind {
661 ; X86-LABEL: length14_eq:
662 ; X86:       # %bb.0:
663 ; X86-NEXT:    pushl %esi
664 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
665 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
666 ; X86-NEXT:    movl (%edx), %esi
667 ; X86-NEXT:    movl 4(%edx), %eax
668 ; X86-NEXT:    xorl (%ecx), %esi
669 ; X86-NEXT:    xorl 4(%ecx), %eax
670 ; X86-NEXT:    orl %esi, %eax
671 ; X86-NEXT:    movl 8(%edx), %esi
672 ; X86-NEXT:    xorl 8(%ecx), %esi
673 ; X86-NEXT:    movzwl 12(%edx), %edx
674 ; X86-NEXT:    xorw 12(%ecx), %dx
675 ; X86-NEXT:    movzwl %dx, %ecx
676 ; X86-NEXT:    orl %esi, %ecx
677 ; X86-NEXT:    orl %eax, %ecx
678 ; X86-NEXT:    sete %al
679 ; X86-NEXT:    popl %esi
680 ; X86-NEXT:    retl
681   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 14) nounwind
682   %c = icmp eq i32 %m, 0
683   ret i1 %c
686 define i1 @length15_eq(ptr %X, ptr %Y) nounwind {
687 ; X86-LABEL: length15_eq:
688 ; X86:       # %bb.0:
689 ; X86-NEXT:    pushl %esi
690 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
691 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
692 ; X86-NEXT:    movl (%edx), %esi
693 ; X86-NEXT:    movl 4(%edx), %eax
694 ; X86-NEXT:    xorl (%ecx), %esi
695 ; X86-NEXT:    xorl 4(%ecx), %eax
696 ; X86-NEXT:    orl %esi, %eax
697 ; X86-NEXT:    movl 8(%edx), %esi
698 ; X86-NEXT:    xorl 8(%ecx), %esi
699 ; X86-NEXT:    movl 11(%edx), %edx
700 ; X86-NEXT:    xorl 11(%ecx), %edx
701 ; X86-NEXT:    orl %esi, %edx
702 ; X86-NEXT:    orl %eax, %edx
703 ; X86-NEXT:    sete %al
704 ; X86-NEXT:    popl %esi
705 ; X86-NEXT:    retl
706   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 15) nounwind
707   %c = icmp eq i32 %m, 0
708   ret i1 %c
711 ; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329
713 define i32 @length16(ptr %X, ptr %Y) nounwind {
714 ; X86-LABEL: length16:
715 ; X86:       # %bb.0:
716 ; X86-NEXT:    pushl %esi
717 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
718 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
719 ; X86-NEXT:    movl (%esi), %ecx
720 ; X86-NEXT:    movl (%eax), %edx
721 ; X86-NEXT:    bswapl %ecx
722 ; X86-NEXT:    bswapl %edx
723 ; X86-NEXT:    cmpl %edx, %ecx
724 ; X86-NEXT:    jne .LBB33_4
725 ; X86-NEXT:  # %bb.1: # %loadbb1
726 ; X86-NEXT:    movl 4(%esi), %ecx
727 ; X86-NEXT:    movl 4(%eax), %edx
728 ; X86-NEXT:    bswapl %ecx
729 ; X86-NEXT:    bswapl %edx
730 ; X86-NEXT:    cmpl %edx, %ecx
731 ; X86-NEXT:    jne .LBB33_4
732 ; X86-NEXT:  # %bb.2: # %loadbb2
733 ; X86-NEXT:    movl 8(%esi), %ecx
734 ; X86-NEXT:    movl 8(%eax), %edx
735 ; X86-NEXT:    bswapl %ecx
736 ; X86-NEXT:    bswapl %edx
737 ; X86-NEXT:    cmpl %edx, %ecx
738 ; X86-NEXT:    jne .LBB33_4
739 ; X86-NEXT:  # %bb.3: # %loadbb3
740 ; X86-NEXT:    movl 12(%esi), %ecx
741 ; X86-NEXT:    movl 12(%eax), %edx
742 ; X86-NEXT:    bswapl %ecx
743 ; X86-NEXT:    bswapl %edx
744 ; X86-NEXT:    xorl %eax, %eax
745 ; X86-NEXT:    cmpl %edx, %ecx
746 ; X86-NEXT:    je .LBB33_5
747 ; X86-NEXT:  .LBB33_4: # %res_block
748 ; X86-NEXT:    xorl %eax, %eax
749 ; X86-NEXT:    cmpl %edx, %ecx
750 ; X86-NEXT:    sbbl %eax, %eax
751 ; X86-NEXT:    orl $1, %eax
752 ; X86-NEXT:  .LBB33_5: # %endblock
753 ; X86-NEXT:    popl %esi
754 ; X86-NEXT:    retl
755   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 16) nounwind
756   ret i32 %m
759 define i1 @length16_eq(ptr %x, ptr %y) nounwind {
760 ; X86-NOSSE-LABEL: length16_eq:
761 ; X86-NOSSE:       # %bb.0:
762 ; X86-NOSSE-NEXT:    pushl %esi
763 ; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
764 ; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx
765 ; X86-NOSSE-NEXT:    movl (%edx), %esi
766 ; X86-NOSSE-NEXT:    movl 4(%edx), %eax
767 ; X86-NOSSE-NEXT:    xorl (%ecx), %esi
768 ; X86-NOSSE-NEXT:    xorl 4(%ecx), %eax
769 ; X86-NOSSE-NEXT:    orl %esi, %eax
770 ; X86-NOSSE-NEXT:    movl 8(%edx), %esi
771 ; X86-NOSSE-NEXT:    xorl 8(%ecx), %esi
772 ; X86-NOSSE-NEXT:    movl 12(%edx), %edx
773 ; X86-NOSSE-NEXT:    xorl 12(%ecx), %edx
774 ; X86-NOSSE-NEXT:    orl %esi, %edx
775 ; X86-NOSSE-NEXT:    orl %eax, %edx
776 ; X86-NOSSE-NEXT:    setne %al
777 ; X86-NOSSE-NEXT:    popl %esi
778 ; X86-NOSSE-NEXT:    retl
780 ; X86-SSE1-LABEL: length16_eq:
781 ; X86-SSE1:       # %bb.0:
782 ; X86-SSE1-NEXT:    pushl %esi
783 ; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx
784 ; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %edx
785 ; X86-SSE1-NEXT:    movl (%edx), %esi
786 ; X86-SSE1-NEXT:    movl 4(%edx), %eax
787 ; X86-SSE1-NEXT:    xorl (%ecx), %esi
788 ; X86-SSE1-NEXT:    xorl 4(%ecx), %eax
789 ; X86-SSE1-NEXT:    orl %esi, %eax
790 ; X86-SSE1-NEXT:    movl 8(%edx), %esi
791 ; X86-SSE1-NEXT:    xorl 8(%ecx), %esi
792 ; X86-SSE1-NEXT:    movl 12(%edx), %edx
793 ; X86-SSE1-NEXT:    xorl 12(%ecx), %edx
794 ; X86-SSE1-NEXT:    orl %esi, %edx
795 ; X86-SSE1-NEXT:    orl %eax, %edx
796 ; X86-SSE1-NEXT:    setne %al
797 ; X86-SSE1-NEXT:    popl %esi
798 ; X86-SSE1-NEXT:    retl
800 ; X86-SSE2-LABEL: length16_eq:
801 ; X86-SSE2:       # %bb.0:
802 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
803 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
804 ; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
805 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm1
806 ; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
807 ; X86-SSE2-NEXT:    pmovmskb %xmm1, %eax
808 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
809 ; X86-SSE2-NEXT:    setne %al
810 ; X86-SSE2-NEXT:    retl
812 ; X86-SSE41-LABEL: length16_eq:
813 ; X86-SSE41:       # %bb.0:
814 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
815 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
816 ; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
817 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm1
818 ; X86-SSE41-NEXT:    pxor %xmm0, %xmm1
819 ; X86-SSE41-NEXT:    ptest %xmm1, %xmm1
820 ; X86-SSE41-NEXT:    setne %al
821 ; X86-SSE41-NEXT:    retl
822   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 16) nounwind
823   %cmp = icmp ne i32 %call, 0
824   ret i1 %cmp
827 define i1 @length16_lt(ptr %x, ptr %y) nounwind {
828 ; X86-LABEL: length16_lt:
829 ; X86:       # %bb.0:
830 ; X86-NEXT:    pushl %esi
831 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
832 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
833 ; X86-NEXT:    movl (%esi), %ecx
834 ; X86-NEXT:    movl (%eax), %edx
835 ; X86-NEXT:    bswapl %ecx
836 ; X86-NEXT:    bswapl %edx
837 ; X86-NEXT:    cmpl %edx, %ecx
838 ; X86-NEXT:    jne .LBB35_4
839 ; X86-NEXT:  # %bb.1: # %loadbb1
840 ; X86-NEXT:    movl 4(%esi), %ecx
841 ; X86-NEXT:    movl 4(%eax), %edx
842 ; X86-NEXT:    bswapl %ecx
843 ; X86-NEXT:    bswapl %edx
844 ; X86-NEXT:    cmpl %edx, %ecx
845 ; X86-NEXT:    jne .LBB35_4
846 ; X86-NEXT:  # %bb.2: # %loadbb2
847 ; X86-NEXT:    movl 8(%esi), %ecx
848 ; X86-NEXT:    movl 8(%eax), %edx
849 ; X86-NEXT:    bswapl %ecx
850 ; X86-NEXT:    bswapl %edx
851 ; X86-NEXT:    cmpl %edx, %ecx
852 ; X86-NEXT:    jne .LBB35_4
853 ; X86-NEXT:  # %bb.3: # %loadbb3
854 ; X86-NEXT:    movl 12(%esi), %ecx
855 ; X86-NEXT:    movl 12(%eax), %edx
856 ; X86-NEXT:    bswapl %ecx
857 ; X86-NEXT:    bswapl %edx
858 ; X86-NEXT:    xorl %eax, %eax
859 ; X86-NEXT:    cmpl %edx, %ecx
860 ; X86-NEXT:    je .LBB35_5
861 ; X86-NEXT:  .LBB35_4: # %res_block
862 ; X86-NEXT:    xorl %eax, %eax
863 ; X86-NEXT:    cmpl %edx, %ecx
864 ; X86-NEXT:    sbbl %eax, %eax
865 ; X86-NEXT:    orl $1, %eax
866 ; X86-NEXT:  .LBB35_5: # %endblock
867 ; X86-NEXT:    shrl $31, %eax
868 ; X86-NEXT:    # kill: def $al killed $al killed $eax
869 ; X86-NEXT:    popl %esi
870 ; X86-NEXT:    retl
871   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 16) nounwind
872   %cmp = icmp slt i32 %call, 0
873   ret i1 %cmp
876 define i1 @length16_gt(ptr %x, ptr %y) nounwind {
877 ; X86-LABEL: length16_gt:
878 ; X86:       # %bb.0:
879 ; X86-NEXT:    pushl %esi
880 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
881 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
882 ; X86-NEXT:    movl (%esi), %eax
883 ; X86-NEXT:    movl (%edx), %ecx
884 ; X86-NEXT:    bswapl %eax
885 ; X86-NEXT:    bswapl %ecx
886 ; X86-NEXT:    cmpl %ecx, %eax
887 ; X86-NEXT:    jne .LBB36_4
888 ; X86-NEXT:  # %bb.1: # %loadbb1
889 ; X86-NEXT:    movl 4(%esi), %eax
890 ; X86-NEXT:    movl 4(%edx), %ecx
891 ; X86-NEXT:    bswapl %eax
892 ; X86-NEXT:    bswapl %ecx
893 ; X86-NEXT:    cmpl %ecx, %eax
894 ; X86-NEXT:    jne .LBB36_4
895 ; X86-NEXT:  # %bb.2: # %loadbb2
896 ; X86-NEXT:    movl 8(%esi), %eax
897 ; X86-NEXT:    movl 8(%edx), %ecx
898 ; X86-NEXT:    bswapl %eax
899 ; X86-NEXT:    bswapl %ecx
900 ; X86-NEXT:    cmpl %ecx, %eax
901 ; X86-NEXT:    jne .LBB36_4
902 ; X86-NEXT:  # %bb.3: # %loadbb3
903 ; X86-NEXT:    movl 12(%esi), %eax
904 ; X86-NEXT:    movl 12(%edx), %ecx
905 ; X86-NEXT:    bswapl %eax
906 ; X86-NEXT:    bswapl %ecx
907 ; X86-NEXT:    xorl %edx, %edx
908 ; X86-NEXT:    cmpl %ecx, %eax
909 ; X86-NEXT:    je .LBB36_5
910 ; X86-NEXT:  .LBB36_4: # %res_block
911 ; X86-NEXT:    xorl %edx, %edx
912 ; X86-NEXT:    cmpl %ecx, %eax
913 ; X86-NEXT:    sbbl %edx, %edx
914 ; X86-NEXT:    orl $1, %edx
915 ; X86-NEXT:  .LBB36_5: # %endblock
916 ; X86-NEXT:    testl %edx, %edx
917 ; X86-NEXT:    setg %al
918 ; X86-NEXT:    popl %esi
919 ; X86-NEXT:    retl
920   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 16) nounwind
921   %cmp = icmp sgt i32 %call, 0
922   ret i1 %cmp
925 define i1 @length16_eq_const(ptr %X) nounwind {
926 ; X86-NOSSE-LABEL: length16_eq_const:
927 ; X86-NOSSE:       # %bb.0:
928 ; X86-NOSSE-NEXT:    pushl %esi
929 ; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
930 ; X86-NOSSE-NEXT:    movl $858927408, %ecx # imm = 0x33323130
931 ; X86-NOSSE-NEXT:    xorl (%eax), %ecx
932 ; X86-NOSSE-NEXT:    movl $926299444, %edx # imm = 0x37363534
933 ; X86-NOSSE-NEXT:    xorl 4(%eax), %edx
934 ; X86-NOSSE-NEXT:    orl %ecx, %edx
935 ; X86-NOSSE-NEXT:    movl $825243960, %ecx # imm = 0x31303938
936 ; X86-NOSSE-NEXT:    xorl 8(%eax), %ecx
937 ; X86-NOSSE-NEXT:    movl $892613426, %esi # imm = 0x35343332
938 ; X86-NOSSE-NEXT:    xorl 12(%eax), %esi
939 ; X86-NOSSE-NEXT:    orl %ecx, %esi
940 ; X86-NOSSE-NEXT:    orl %edx, %esi
941 ; X86-NOSSE-NEXT:    sete %al
942 ; X86-NOSSE-NEXT:    popl %esi
943 ; X86-NOSSE-NEXT:    retl
945 ; X86-SSE1-LABEL: length16_eq_const:
946 ; X86-SSE1:       # %bb.0:
947 ; X86-SSE1-NEXT:    pushl %esi
948 ; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax
949 ; X86-SSE1-NEXT:    movl $858927408, %ecx # imm = 0x33323130
950 ; X86-SSE1-NEXT:    xorl (%eax), %ecx
951 ; X86-SSE1-NEXT:    movl $926299444, %edx # imm = 0x37363534
952 ; X86-SSE1-NEXT:    xorl 4(%eax), %edx
953 ; X86-SSE1-NEXT:    orl %ecx, %edx
954 ; X86-SSE1-NEXT:    movl $825243960, %ecx # imm = 0x31303938
955 ; X86-SSE1-NEXT:    xorl 8(%eax), %ecx
956 ; X86-SSE1-NEXT:    movl $892613426, %esi # imm = 0x35343332
957 ; X86-SSE1-NEXT:    xorl 12(%eax), %esi
958 ; X86-SSE1-NEXT:    orl %ecx, %esi
959 ; X86-SSE1-NEXT:    orl %edx, %esi
960 ; X86-SSE1-NEXT:    sete %al
961 ; X86-SSE1-NEXT:    popl %esi
962 ; X86-SSE1-NEXT:    retl
964 ; X86-SSE2-LABEL: length16_eq_const:
965 ; X86-SSE2:       # %bb.0:
966 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
967 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
968 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
969 ; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
970 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
971 ; X86-SSE2-NEXT:    sete %al
972 ; X86-SSE2-NEXT:    retl
974 ; X86-SSE41-LABEL: length16_eq_const:
975 ; X86-SSE41:       # %bb.0:
976 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
977 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
978 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
979 ; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
980 ; X86-SSE41-NEXT:    sete %al
981 ; X86-SSE41-NEXT:    retl
982   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 16) nounwind
983   %c = icmp eq i32 %m, 0
984   ret i1 %c
987 ; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914
989 define i32 @length24(ptr %X, ptr %Y) nounwind {
990 ; X86-LABEL: length24:
991 ; X86:       # %bb.0:
992 ; X86-NEXT:    pushl $24
993 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
994 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
995 ; X86-NEXT:    calll memcmp
996 ; X86-NEXT:    addl $12, %esp
997 ; X86-NEXT:    retl
998   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 24) nounwind
999   ret i32 %m
1002 define i1 @length24_eq(ptr %x, ptr %y) nounwind {
1003 ; X86-NOSSE-LABEL: length24_eq:
1004 ; X86-NOSSE:       # %bb.0:
1005 ; X86-NOSSE-NEXT:    pushl $24
1006 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1007 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1008 ; X86-NOSSE-NEXT:    calll memcmp
1009 ; X86-NOSSE-NEXT:    addl $12, %esp
1010 ; X86-NOSSE-NEXT:    testl %eax, %eax
1011 ; X86-NOSSE-NEXT:    sete %al
1012 ; X86-NOSSE-NEXT:    retl
1014 ; X86-SSE1-LABEL: length24_eq:
1015 ; X86-SSE1:       # %bb.0:
1016 ; X86-SSE1-NEXT:    pushl $24
1017 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1018 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1019 ; X86-SSE1-NEXT:    calll memcmp
1020 ; X86-SSE1-NEXT:    addl $12, %esp
1021 ; X86-SSE1-NEXT:    testl %eax, %eax
1022 ; X86-SSE1-NEXT:    sete %al
1023 ; X86-SSE1-NEXT:    retl
1025 ; X86-SSE2-LABEL: length24_eq:
1026 ; X86-SSE2:       # %bb.0:
1027 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1028 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1029 ; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
1030 ; X86-SSE2-NEXT:    movdqu 8(%ecx), %xmm1
1031 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
1032 ; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1033 ; X86-SSE2-NEXT:    movdqu 8(%eax), %xmm0
1034 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1035 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1036 ; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1037 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1038 ; X86-SSE2-NEXT:    sete %al
1039 ; X86-SSE2-NEXT:    retl
1041 ; X86-SSE41-LABEL: length24_eq:
1042 ; X86-SSE41:       # %bb.0:
1043 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1044 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1045 ; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
1046 ; X86-SSE41-NEXT:    movdqu 8(%ecx), %xmm1
1047 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
1048 ; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
1049 ; X86-SSE41-NEXT:    movdqu 8(%eax), %xmm0
1050 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
1051 ; X86-SSE41-NEXT:    por %xmm2, %xmm0
1052 ; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1053 ; X86-SSE41-NEXT:    sete %al
1054 ; X86-SSE41-NEXT:    retl
1055   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 24) nounwind
1056   %cmp = icmp eq i32 %call, 0
1057   ret i1 %cmp
1060 define i1 @length24_lt(ptr %x, ptr %y) nounwind {
1061 ; X86-LABEL: length24_lt:
1062 ; X86:       # %bb.0:
1063 ; X86-NEXT:    pushl $24
1064 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1065 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1066 ; X86-NEXT:    calll memcmp
1067 ; X86-NEXT:    addl $12, %esp
1068 ; X86-NEXT:    shrl $31, %eax
1069 ; X86-NEXT:    # kill: def $al killed $al killed $eax
1070 ; X86-NEXT:    retl
1071   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 24) nounwind
1072   %cmp = icmp slt i32 %call, 0
1073   ret i1 %cmp
1076 define i1 @length24_gt(ptr %x, ptr %y) nounwind {
1077 ; X86-LABEL: length24_gt:
1078 ; X86:       # %bb.0:
1079 ; X86-NEXT:    pushl $24
1080 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1081 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1082 ; X86-NEXT:    calll memcmp
1083 ; X86-NEXT:    addl $12, %esp
1084 ; X86-NEXT:    testl %eax, %eax
1085 ; X86-NEXT:    setg %al
1086 ; X86-NEXT:    retl
1087   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 24) nounwind
1088   %cmp = icmp sgt i32 %call, 0
1089   ret i1 %cmp
1092 define i1 @length24_eq_const(ptr %X) nounwind {
1093 ; X86-NOSSE-LABEL: length24_eq_const:
1094 ; X86-NOSSE:       # %bb.0:
1095 ; X86-NOSSE-NEXT:    pushl $24
1096 ; X86-NOSSE-NEXT:    pushl $.L.str
1097 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1098 ; X86-NOSSE-NEXT:    calll memcmp
1099 ; X86-NOSSE-NEXT:    addl $12, %esp
1100 ; X86-NOSSE-NEXT:    testl %eax, %eax
1101 ; X86-NOSSE-NEXT:    setne %al
1102 ; X86-NOSSE-NEXT:    retl
1104 ; X86-SSE1-LABEL: length24_eq_const:
1105 ; X86-SSE1:       # %bb.0:
1106 ; X86-SSE1-NEXT:    pushl $24
1107 ; X86-SSE1-NEXT:    pushl $.L.str
1108 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1109 ; X86-SSE1-NEXT:    calll memcmp
1110 ; X86-SSE1-NEXT:    addl $12, %esp
1111 ; X86-SSE1-NEXT:    testl %eax, %eax
1112 ; X86-SSE1-NEXT:    setne %al
1113 ; X86-SSE1-NEXT:    retl
1115 ; X86-SSE2-LABEL: length24_eq_const:
1116 ; X86-SSE2:       # %bb.0:
1117 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1118 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
1119 ; X86-SSE2-NEXT:    movdqu 8(%eax), %xmm1
1120 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1121 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1122 ; X86-SSE2-NEXT:    pand %xmm1, %xmm0
1123 ; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1124 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1125 ; X86-SSE2-NEXT:    setne %al
1126 ; X86-SSE2-NEXT:    retl
1128 ; X86-SSE41-LABEL: length24_eq_const:
1129 ; X86-SSE41:       # %bb.0:
1130 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1131 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
1132 ; X86-SSE41-NEXT:    movdqu 8(%eax), %xmm1
1133 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1134 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1135 ; X86-SSE41-NEXT:    por %xmm1, %xmm0
1136 ; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1137 ; X86-SSE41-NEXT:    setne %al
1138 ; X86-SSE41-NEXT:    retl
1139   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 24) nounwind
1140   %c = icmp ne i32 %m, 0
1141   ret i1 %c
1144 define i32 @length31(ptr %X, ptr %Y) nounwind {
1145 ; X86-LABEL: length31:
1146 ; X86:       # %bb.0:
1147 ; X86-NEXT:    pushl $31
1148 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1149 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1150 ; X86-NEXT:    calll memcmp
1151 ; X86-NEXT:    addl $12, %esp
1152 ; X86-NEXT:    retl
1153   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 31) nounwind
1154   ret i32 %m
1157 define i1 @length31_eq(ptr %x, ptr %y) nounwind {
1158 ; X86-NOSSE-LABEL: length31_eq:
1159 ; X86-NOSSE:       # %bb.0:
1160 ; X86-NOSSE-NEXT:    pushl $31
1161 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1162 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1163 ; X86-NOSSE-NEXT:    calll memcmp
1164 ; X86-NOSSE-NEXT:    addl $12, %esp
1165 ; X86-NOSSE-NEXT:    testl %eax, %eax
1166 ; X86-NOSSE-NEXT:    sete %al
1167 ; X86-NOSSE-NEXT:    retl
1169 ; X86-SSE1-LABEL: length31_eq:
1170 ; X86-SSE1:       # %bb.0:
1171 ; X86-SSE1-NEXT:    pushl $31
1172 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1173 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1174 ; X86-SSE1-NEXT:    calll memcmp
1175 ; X86-SSE1-NEXT:    addl $12, %esp
1176 ; X86-SSE1-NEXT:    testl %eax, %eax
1177 ; X86-SSE1-NEXT:    sete %al
1178 ; X86-SSE1-NEXT:    retl
1180 ; X86-SSE2-LABEL: length31_eq:
1181 ; X86-SSE2:       # %bb.0:
1182 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1183 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1184 ; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
1185 ; X86-SSE2-NEXT:    movdqu 15(%ecx), %xmm1
1186 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
1187 ; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1188 ; X86-SSE2-NEXT:    movdqu 15(%eax), %xmm0
1189 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1190 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1191 ; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1192 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1193 ; X86-SSE2-NEXT:    sete %al
1194 ; X86-SSE2-NEXT:    retl
1196 ; X86-SSE41-LABEL: length31_eq:
1197 ; X86-SSE41:       # %bb.0:
1198 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1199 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1200 ; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
1201 ; X86-SSE41-NEXT:    movdqu 15(%ecx), %xmm1
1202 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
1203 ; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
1204 ; X86-SSE41-NEXT:    movdqu 15(%eax), %xmm0
1205 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
1206 ; X86-SSE41-NEXT:    por %xmm2, %xmm0
1207 ; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1208 ; X86-SSE41-NEXT:    sete %al
1209 ; X86-SSE41-NEXT:    retl
1210   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind
1211   %cmp = icmp eq i32 %call, 0
1212   ret i1 %cmp
1215 define i1 @length31_lt(ptr %x, ptr %y) nounwind {
1216 ; X86-LABEL: length31_lt:
1217 ; X86:       # %bb.0:
1218 ; X86-NEXT:    pushl $31
1219 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1220 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1221 ; X86-NEXT:    calll memcmp
1222 ; X86-NEXT:    addl $12, %esp
1223 ; X86-NEXT:    shrl $31, %eax
1224 ; X86-NEXT:    # kill: def $al killed $al killed $eax
1225 ; X86-NEXT:    retl
1226   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind
1227   %cmp = icmp slt i32 %call, 0
1228   ret i1 %cmp
1231 define i1 @length31_gt(ptr %x, ptr %y) nounwind {
1232 ; X86-LABEL: length31_gt:
1233 ; X86:       # %bb.0:
1234 ; X86-NEXT:    pushl $31
1235 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1236 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1237 ; X86-NEXT:    calll memcmp
1238 ; X86-NEXT:    addl $12, %esp
1239 ; X86-NEXT:    testl %eax, %eax
1240 ; X86-NEXT:    setg %al
1241 ; X86-NEXT:    retl
1242   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind
1243   %cmp = icmp sgt i32 %call, 0
1244   ret i1 %cmp
1247 define i1 @length31_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1248 ; X86-NOSSE-LABEL: length31_eq_prefer128:
1249 ; X86-NOSSE:       # %bb.0:
1250 ; X86-NOSSE-NEXT:    pushl $31
1251 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1252 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1253 ; X86-NOSSE-NEXT:    calll memcmp
1254 ; X86-NOSSE-NEXT:    addl $12, %esp
1255 ; X86-NOSSE-NEXT:    testl %eax, %eax
1256 ; X86-NOSSE-NEXT:    sete %al
1257 ; X86-NOSSE-NEXT:    retl
1259 ; X86-SSE1-LABEL: length31_eq_prefer128:
1260 ; X86-SSE1:       # %bb.0:
1261 ; X86-SSE1-NEXT:    pushl $31
1262 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1263 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1264 ; X86-SSE1-NEXT:    calll memcmp
1265 ; X86-SSE1-NEXT:    addl $12, %esp
1266 ; X86-SSE1-NEXT:    testl %eax, %eax
1267 ; X86-SSE1-NEXT:    sete %al
1268 ; X86-SSE1-NEXT:    retl
1270 ; X86-SSE2-LABEL: length31_eq_prefer128:
1271 ; X86-SSE2:       # %bb.0:
1272 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1273 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1274 ; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
1275 ; X86-SSE2-NEXT:    movdqu 15(%ecx), %xmm1
1276 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
1277 ; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1278 ; X86-SSE2-NEXT:    movdqu 15(%eax), %xmm0
1279 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1280 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1281 ; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1282 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1283 ; X86-SSE2-NEXT:    sete %al
1284 ; X86-SSE2-NEXT:    retl
1286 ; X86-SSE41-LABEL: length31_eq_prefer128:
1287 ; X86-SSE41:       # %bb.0:
1288 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1289 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1290 ; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
1291 ; X86-SSE41-NEXT:    movdqu 15(%ecx), %xmm1
1292 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
1293 ; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
1294 ; X86-SSE41-NEXT:    movdqu 15(%eax), %xmm0
1295 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
1296 ; X86-SSE41-NEXT:    por %xmm2, %xmm0
1297 ; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1298 ; X86-SSE41-NEXT:    sete %al
1299 ; X86-SSE41-NEXT:    retl
1300   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 31) nounwind
1301   %cmp = icmp eq i32 %call, 0
1302   ret i1 %cmp
1305 define i1 @length31_eq_const(ptr %X) nounwind {
1306 ; X86-NOSSE-LABEL: length31_eq_const:
1307 ; X86-NOSSE:       # %bb.0:
1308 ; X86-NOSSE-NEXT:    pushl $31
1309 ; X86-NOSSE-NEXT:    pushl $.L.str
1310 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1311 ; X86-NOSSE-NEXT:    calll memcmp
1312 ; X86-NOSSE-NEXT:    addl $12, %esp
1313 ; X86-NOSSE-NEXT:    testl %eax, %eax
1314 ; X86-NOSSE-NEXT:    setne %al
1315 ; X86-NOSSE-NEXT:    retl
1317 ; X86-SSE1-LABEL: length31_eq_const:
1318 ; X86-SSE1:       # %bb.0:
1319 ; X86-SSE1-NEXT:    pushl $31
1320 ; X86-SSE1-NEXT:    pushl $.L.str
1321 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1322 ; X86-SSE1-NEXT:    calll memcmp
1323 ; X86-SSE1-NEXT:    addl $12, %esp
1324 ; X86-SSE1-NEXT:    testl %eax, %eax
1325 ; X86-SSE1-NEXT:    setne %al
1326 ; X86-SSE1-NEXT:    retl
1328 ; X86-SSE2-LABEL: length31_eq_const:
1329 ; X86-SSE2:       # %bb.0:
1330 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1331 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
1332 ; X86-SSE2-NEXT:    movdqu 15(%eax), %xmm1
1333 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1334 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1335 ; X86-SSE2-NEXT:    pand %xmm1, %xmm0
1336 ; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1337 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1338 ; X86-SSE2-NEXT:    setne %al
1339 ; X86-SSE2-NEXT:    retl
1341 ; X86-SSE41-LABEL: length31_eq_const:
1342 ; X86-SSE41:       # %bb.0:
1343 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1344 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
1345 ; X86-SSE41-NEXT:    movdqu 15(%eax), %xmm1
1346 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1347 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1348 ; X86-SSE41-NEXT:    por %xmm1, %xmm0
1349 ; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1350 ; X86-SSE41-NEXT:    setne %al
1351 ; X86-SSE41-NEXT:    retl
1352   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 31) nounwind
1353   %c = icmp ne i32 %m, 0
1354   ret i1 %c
1357 define i32 @length32(ptr %X, ptr %Y) nounwind {
1358 ; X86-LABEL: length32:
1359 ; X86:       # %bb.0:
1360 ; X86-NEXT:    pushl $32
1361 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1362 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1363 ; X86-NEXT:    calll memcmp
1364 ; X86-NEXT:    addl $12, %esp
1365 ; X86-NEXT:    retl
1366   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 32) nounwind
1367   ret i32 %m
1370 ; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=33325
1372 define i1 @length32_eq(ptr %x, ptr %y) nounwind {
1373 ; X86-NOSSE-LABEL: length32_eq:
1374 ; X86-NOSSE:       # %bb.0:
1375 ; X86-NOSSE-NEXT:    pushl $32
1376 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1377 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1378 ; X86-NOSSE-NEXT:    calll memcmp
1379 ; X86-NOSSE-NEXT:    addl $12, %esp
1380 ; X86-NOSSE-NEXT:    testl %eax, %eax
1381 ; X86-NOSSE-NEXT:    sete %al
1382 ; X86-NOSSE-NEXT:    retl
1384 ; X86-SSE1-LABEL: length32_eq:
1385 ; X86-SSE1:       # %bb.0:
1386 ; X86-SSE1-NEXT:    pushl $32
1387 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1388 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1389 ; X86-SSE1-NEXT:    calll memcmp
1390 ; X86-SSE1-NEXT:    addl $12, %esp
1391 ; X86-SSE1-NEXT:    testl %eax, %eax
1392 ; X86-SSE1-NEXT:    sete %al
1393 ; X86-SSE1-NEXT:    retl
1395 ; X86-SSE2-LABEL: length32_eq:
1396 ; X86-SSE2:       # %bb.0:
1397 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1398 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1399 ; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
1400 ; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm1
1401 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
1402 ; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1403 ; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm0
1404 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1405 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1406 ; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1407 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1408 ; X86-SSE2-NEXT:    sete %al
1409 ; X86-SSE2-NEXT:    retl
1411 ; X86-SSE41-LABEL: length32_eq:
1412 ; X86-SSE41:       # %bb.0:
1413 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1414 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1415 ; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
1416 ; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm1
1417 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
1418 ; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
1419 ; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm0
1420 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
1421 ; X86-SSE41-NEXT:    por %xmm2, %xmm0
1422 ; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1423 ; X86-SSE41-NEXT:    sete %al
1424 ; X86-SSE41-NEXT:    retl
1425   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind
1426   %cmp = icmp eq i32 %call, 0
1427   ret i1 %cmp
1430 define i1 @length32_lt(ptr %x, ptr %y) nounwind {
1431 ; X86-LABEL: length32_lt:
1432 ; X86:       # %bb.0:
1433 ; X86-NEXT:    pushl $32
1434 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1435 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1436 ; X86-NEXT:    calll memcmp
1437 ; X86-NEXT:    addl $12, %esp
1438 ; X86-NEXT:    shrl $31, %eax
1439 ; X86-NEXT:    # kill: def $al killed $al killed $eax
1440 ; X86-NEXT:    retl
1441   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind
1442   %cmp = icmp slt i32 %call, 0
1443   ret i1 %cmp
1446 define i1 @length32_gt(ptr %x, ptr %y) nounwind {
1447 ; X86-LABEL: length32_gt:
1448 ; X86:       # %bb.0:
1449 ; X86-NEXT:    pushl $32
1450 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1451 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1452 ; X86-NEXT:    calll memcmp
1453 ; X86-NEXT:    addl $12, %esp
1454 ; X86-NEXT:    testl %eax, %eax
1455 ; X86-NEXT:    setg %al
1456 ; X86-NEXT:    retl
1457   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind
1458   %cmp = icmp sgt i32 %call, 0
1459   ret i1 %cmp
1462 define i1 @length32_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1463 ; X86-NOSSE-LABEL: length32_eq_prefer128:
1464 ; X86-NOSSE:       # %bb.0:
1465 ; X86-NOSSE-NEXT:    pushl $32
1466 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1467 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1468 ; X86-NOSSE-NEXT:    calll memcmp
1469 ; X86-NOSSE-NEXT:    addl $12, %esp
1470 ; X86-NOSSE-NEXT:    testl %eax, %eax
1471 ; X86-NOSSE-NEXT:    sete %al
1472 ; X86-NOSSE-NEXT:    retl
1474 ; X86-SSE1-LABEL: length32_eq_prefer128:
1475 ; X86-SSE1:       # %bb.0:
1476 ; X86-SSE1-NEXT:    pushl $32
1477 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1478 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1479 ; X86-SSE1-NEXT:    calll memcmp
1480 ; X86-SSE1-NEXT:    addl $12, %esp
1481 ; X86-SSE1-NEXT:    testl %eax, %eax
1482 ; X86-SSE1-NEXT:    sete %al
1483 ; X86-SSE1-NEXT:    retl
1485 ; X86-SSE2-LABEL: length32_eq_prefer128:
1486 ; X86-SSE2:       # %bb.0:
1487 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1488 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1489 ; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
1490 ; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm1
1491 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
1492 ; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1493 ; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm0
1494 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1495 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1496 ; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1497 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1498 ; X86-SSE2-NEXT:    sete %al
1499 ; X86-SSE2-NEXT:    retl
1501 ; X86-SSE41-LABEL: length32_eq_prefer128:
1502 ; X86-SSE41:       # %bb.0:
1503 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1504 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1505 ; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
1506 ; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm1
1507 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
1508 ; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
1509 ; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm0
1510 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
1511 ; X86-SSE41-NEXT:    por %xmm2, %xmm0
1512 ; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1513 ; X86-SSE41-NEXT:    sete %al
1514 ; X86-SSE41-NEXT:    retl
1515   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 32) nounwind
1516   %cmp = icmp eq i32 %call, 0
1517   ret i1 %cmp
1520 define i1 @length32_eq_const(ptr %X) nounwind {
1521 ; X86-NOSSE-LABEL: length32_eq_const:
1522 ; X86-NOSSE:       # %bb.0:
1523 ; X86-NOSSE-NEXT:    pushl $32
1524 ; X86-NOSSE-NEXT:    pushl $.L.str
1525 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1526 ; X86-NOSSE-NEXT:    calll memcmp
1527 ; X86-NOSSE-NEXT:    addl $12, %esp
1528 ; X86-NOSSE-NEXT:    testl %eax, %eax
1529 ; X86-NOSSE-NEXT:    setne %al
1530 ; X86-NOSSE-NEXT:    retl
1532 ; X86-SSE1-LABEL: length32_eq_const:
1533 ; X86-SSE1:       # %bb.0:
1534 ; X86-SSE1-NEXT:    pushl $32
1535 ; X86-SSE1-NEXT:    pushl $.L.str
1536 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1537 ; X86-SSE1-NEXT:    calll memcmp
1538 ; X86-SSE1-NEXT:    addl $12, %esp
1539 ; X86-SSE1-NEXT:    testl %eax, %eax
1540 ; X86-SSE1-NEXT:    setne %al
1541 ; X86-SSE1-NEXT:    retl
1543 ; X86-SSE2-LABEL: length32_eq_const:
1544 ; X86-SSE2:       # %bb.0:
1545 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1546 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
1547 ; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm1
1548 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1549 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1550 ; X86-SSE2-NEXT:    pand %xmm1, %xmm0
1551 ; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1552 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1553 ; X86-SSE2-NEXT:    setne %al
1554 ; X86-SSE2-NEXT:    retl
1556 ; X86-SSE41-LABEL: length32_eq_const:
1557 ; X86-SSE41:       # %bb.0:
1558 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1559 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
1560 ; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm1
1561 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1562 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1563 ; X86-SSE41-NEXT:    por %xmm1, %xmm0
1564 ; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1565 ; X86-SSE41-NEXT:    setne %al
1566 ; X86-SSE41-NEXT:    retl
1567   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 32) nounwind
1568   %c = icmp ne i32 %m, 0
1569   ret i1 %c
1572 define i32 @length48(ptr %X, ptr %Y) nounwind {
1573 ; X86-LABEL: length48:
1574 ; X86:       # %bb.0:
1575 ; X86-NEXT:    pushl $48
1576 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1577 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1578 ; X86-NEXT:    calll memcmp
1579 ; X86-NEXT:    addl $12, %esp
1580 ; X86-NEXT:    retl
1581   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 48) nounwind
1582   ret i32 %m
1585 define i1 @length48_eq(ptr %x, ptr %y) nounwind {
1586 ; X86-NOSSE-LABEL: length48_eq:
1587 ; X86-NOSSE:       # %bb.0:
1588 ; X86-NOSSE-NEXT:    pushl $48
1589 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1590 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1591 ; X86-NOSSE-NEXT:    calll memcmp
1592 ; X86-NOSSE-NEXT:    addl $12, %esp
1593 ; X86-NOSSE-NEXT:    testl %eax, %eax
1594 ; X86-NOSSE-NEXT:    sete %al
1595 ; X86-NOSSE-NEXT:    retl
1597 ; X86-SSE1-LABEL: length48_eq:
1598 ; X86-SSE1:       # %bb.0:
1599 ; X86-SSE1-NEXT:    pushl $48
1600 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1601 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1602 ; X86-SSE1-NEXT:    calll memcmp
1603 ; X86-SSE1-NEXT:    addl $12, %esp
1604 ; X86-SSE1-NEXT:    testl %eax, %eax
1605 ; X86-SSE1-NEXT:    sete %al
1606 ; X86-SSE1-NEXT:    retl
1608 ; X86-SSE2-LABEL: length48_eq:
1609 ; X86-SSE2:       # %bb.0:
1610 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1611 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1612 ; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
1613 ; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm1
1614 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
1615 ; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1616 ; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm0
1617 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1618 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1619 ; X86-SSE2-NEXT:    movdqu 32(%ecx), %xmm1
1620 ; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm2
1621 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm2
1622 ; X86-SSE2-NEXT:    pand %xmm0, %xmm2
1623 ; X86-SSE2-NEXT:    pmovmskb %xmm2, %eax
1624 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1625 ; X86-SSE2-NEXT:    sete %al
1626 ; X86-SSE2-NEXT:    retl
1628 ; X86-SSE41-LABEL: length48_eq:
1629 ; X86-SSE41:       # %bb.0:
1630 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1631 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1632 ; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
1633 ; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm1
1634 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
1635 ; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
1636 ; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm0
1637 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
1638 ; X86-SSE41-NEXT:    por %xmm2, %xmm0
1639 ; X86-SSE41-NEXT:    movdqu 32(%ecx), %xmm1
1640 ; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm2
1641 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm2
1642 ; X86-SSE41-NEXT:    por %xmm0, %xmm2
1643 ; X86-SSE41-NEXT:    ptest %xmm2, %xmm2
1644 ; X86-SSE41-NEXT:    sete %al
1645 ; X86-SSE41-NEXT:    retl
1646   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind
1647   %cmp = icmp eq i32 %call, 0
1648   ret i1 %cmp
1651 define i1 @length48_lt(ptr %x, ptr %y) nounwind {
1652 ; X86-LABEL: length48_lt:
1653 ; X86:       # %bb.0:
1654 ; X86-NEXT:    pushl $48
1655 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1656 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1657 ; X86-NEXT:    calll memcmp
1658 ; X86-NEXT:    addl $12, %esp
1659 ; X86-NEXT:    shrl $31, %eax
1660 ; X86-NEXT:    # kill: def $al killed $al killed $eax
1661 ; X86-NEXT:    retl
1662   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind
1663   %cmp = icmp slt i32 %call, 0
1664   ret i1 %cmp
1667 define i1 @length48_gt(ptr %x, ptr %y) nounwind {
1668 ; X86-LABEL: length48_gt:
1669 ; X86:       # %bb.0:
1670 ; X86-NEXT:    pushl $48
1671 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1672 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1673 ; X86-NEXT:    calll memcmp
1674 ; X86-NEXT:    addl $12, %esp
1675 ; X86-NEXT:    testl %eax, %eax
1676 ; X86-NEXT:    setg %al
1677 ; X86-NEXT:    retl
1678   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind
1679   %cmp = icmp sgt i32 %call, 0
1680   ret i1 %cmp
1683 define i1 @length48_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1684 ; X86-NOSSE-LABEL: length48_eq_prefer128:
1685 ; X86-NOSSE:       # %bb.0:
1686 ; X86-NOSSE-NEXT:    pushl $48
1687 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1688 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1689 ; X86-NOSSE-NEXT:    calll memcmp
1690 ; X86-NOSSE-NEXT:    addl $12, %esp
1691 ; X86-NOSSE-NEXT:    testl %eax, %eax
1692 ; X86-NOSSE-NEXT:    sete %al
1693 ; X86-NOSSE-NEXT:    retl
1695 ; X86-SSE1-LABEL: length48_eq_prefer128:
1696 ; X86-SSE1:       # %bb.0:
1697 ; X86-SSE1-NEXT:    pushl $48
1698 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1699 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1700 ; X86-SSE1-NEXT:    calll memcmp
1701 ; X86-SSE1-NEXT:    addl $12, %esp
1702 ; X86-SSE1-NEXT:    testl %eax, %eax
1703 ; X86-SSE1-NEXT:    sete %al
1704 ; X86-SSE1-NEXT:    retl
1706 ; X86-SSE2-LABEL: length48_eq_prefer128:
1707 ; X86-SSE2:       # %bb.0:
1708 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1709 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1710 ; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
1711 ; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm1
1712 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
1713 ; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1714 ; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm0
1715 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1716 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1717 ; X86-SSE2-NEXT:    movdqu 32(%ecx), %xmm1
1718 ; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm2
1719 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm2
1720 ; X86-SSE2-NEXT:    pand %xmm0, %xmm2
1721 ; X86-SSE2-NEXT:    pmovmskb %xmm2, %eax
1722 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1723 ; X86-SSE2-NEXT:    sete %al
1724 ; X86-SSE2-NEXT:    retl
1726 ; X86-SSE41-LABEL: length48_eq_prefer128:
1727 ; X86-SSE41:       # %bb.0:
1728 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1729 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1730 ; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
1731 ; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm1
1732 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
1733 ; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
1734 ; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm0
1735 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
1736 ; X86-SSE41-NEXT:    por %xmm2, %xmm0
1737 ; X86-SSE41-NEXT:    movdqu 32(%ecx), %xmm1
1738 ; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm2
1739 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm2
1740 ; X86-SSE41-NEXT:    por %xmm0, %xmm2
1741 ; X86-SSE41-NEXT:    ptest %xmm2, %xmm2
1742 ; X86-SSE41-NEXT:    sete %al
1743 ; X86-SSE41-NEXT:    retl
1744   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 48) nounwind
1745   %cmp = icmp eq i32 %call, 0
1746   ret i1 %cmp
1749 define i1 @length48_eq_const(ptr %X) nounwind {
1750 ; X86-NOSSE-LABEL: length48_eq_const:
1751 ; X86-NOSSE:       # %bb.0:
1752 ; X86-NOSSE-NEXT:    pushl $48
1753 ; X86-NOSSE-NEXT:    pushl $.L.str
1754 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1755 ; X86-NOSSE-NEXT:    calll memcmp
1756 ; X86-NOSSE-NEXT:    addl $12, %esp
1757 ; X86-NOSSE-NEXT:    testl %eax, %eax
1758 ; X86-NOSSE-NEXT:    setne %al
1759 ; X86-NOSSE-NEXT:    retl
1761 ; X86-SSE1-LABEL: length48_eq_const:
1762 ; X86-SSE1:       # %bb.0:
1763 ; X86-SSE1-NEXT:    pushl $48
1764 ; X86-SSE1-NEXT:    pushl $.L.str
1765 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1766 ; X86-SSE1-NEXT:    calll memcmp
1767 ; X86-SSE1-NEXT:    addl $12, %esp
1768 ; X86-SSE1-NEXT:    testl %eax, %eax
1769 ; X86-SSE1-NEXT:    setne %al
1770 ; X86-SSE1-NEXT:    retl
1772 ; X86-SSE2-LABEL: length48_eq_const:
1773 ; X86-SSE2:       # %bb.0:
1774 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1775 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
1776 ; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm1
1777 ; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm2
1778 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1779 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1780 ; X86-SSE2-NEXT:    pand %xmm1, %xmm0
1781 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
1782 ; X86-SSE2-NEXT:    pand %xmm0, %xmm2
1783 ; X86-SSE2-NEXT:    pmovmskb %xmm2, %eax
1784 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1785 ; X86-SSE2-NEXT:    setne %al
1786 ; X86-SSE2-NEXT:    retl
1788 ; X86-SSE41-LABEL: length48_eq_const:
1789 ; X86-SSE41:       # %bb.0:
1790 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1791 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
1792 ; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm1
1793 ; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm2
1794 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1795 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1796 ; X86-SSE41-NEXT:    por %xmm1, %xmm0
1797 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
1798 ; X86-SSE41-NEXT:    por %xmm0, %xmm2
1799 ; X86-SSE41-NEXT:    ptest %xmm2, %xmm2
1800 ; X86-SSE41-NEXT:    setne %al
1801 ; X86-SSE41-NEXT:    retl
1802   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 48) nounwind
1803   %c = icmp ne i32 %m, 0
1804   ret i1 %c
1807 define i32 @length63(ptr %X, ptr %Y) nounwind {
1808 ; X86-LABEL: length63:
1809 ; X86:       # %bb.0:
1810 ; X86-NEXT:    pushl $63
1811 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1812 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1813 ; X86-NEXT:    calll memcmp
1814 ; X86-NEXT:    addl $12, %esp
1815 ; X86-NEXT:    retl
1816   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 63) nounwind
1817   ret i32 %m
1820 define i1 @length63_eq(ptr %x, ptr %y) nounwind {
1821 ; X86-NOSSE-LABEL: length63_eq:
1822 ; X86-NOSSE:       # %bb.0:
1823 ; X86-NOSSE-NEXT:    pushl $63
1824 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1825 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1826 ; X86-NOSSE-NEXT:    calll memcmp
1827 ; X86-NOSSE-NEXT:    addl $12, %esp
1828 ; X86-NOSSE-NEXT:    testl %eax, %eax
1829 ; X86-NOSSE-NEXT:    setne %al
1830 ; X86-NOSSE-NEXT:    retl
1832 ; X86-SSE1-LABEL: length63_eq:
1833 ; X86-SSE1:       # %bb.0:
1834 ; X86-SSE1-NEXT:    pushl $63
1835 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1836 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1837 ; X86-SSE1-NEXT:    calll memcmp
1838 ; X86-SSE1-NEXT:    addl $12, %esp
1839 ; X86-SSE1-NEXT:    testl %eax, %eax
1840 ; X86-SSE1-NEXT:    setne %al
1841 ; X86-SSE1-NEXT:    retl
1843 ; X86-SSE2-LABEL: length63_eq:
1844 ; X86-SSE2:       # %bb.0:
1845 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1846 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1847 ; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
1848 ; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm1
1849 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
1850 ; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1851 ; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm0
1852 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1853 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1854 ; X86-SSE2-NEXT:    movdqu 32(%ecx), %xmm1
1855 ; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm2
1856 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm2
1857 ; X86-SSE2-NEXT:    movdqu 47(%ecx), %xmm1
1858 ; X86-SSE2-NEXT:    movdqu 47(%eax), %xmm3
1859 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm3
1860 ; X86-SSE2-NEXT:    pand %xmm2, %xmm3
1861 ; X86-SSE2-NEXT:    pand %xmm0, %xmm3
1862 ; X86-SSE2-NEXT:    pmovmskb %xmm3, %eax
1863 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1864 ; X86-SSE2-NEXT:    setne %al
1865 ; X86-SSE2-NEXT:    retl
1867 ; X86-SSE41-LABEL: length63_eq:
1868 ; X86-SSE41:       # %bb.0:
1869 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1870 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1871 ; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
1872 ; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm1
1873 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
1874 ; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
1875 ; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm0
1876 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
1877 ; X86-SSE41-NEXT:    por %xmm2, %xmm0
1878 ; X86-SSE41-NEXT:    movdqu 32(%ecx), %xmm1
1879 ; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm2
1880 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm2
1881 ; X86-SSE41-NEXT:    movdqu 47(%ecx), %xmm1
1882 ; X86-SSE41-NEXT:    movdqu 47(%eax), %xmm3
1883 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm3
1884 ; X86-SSE41-NEXT:    por %xmm2, %xmm3
1885 ; X86-SSE41-NEXT:    por %xmm0, %xmm3
1886 ; X86-SSE41-NEXT:    ptest %xmm3, %xmm3
1887 ; X86-SSE41-NEXT:    setne %al
1888 ; X86-SSE41-NEXT:    retl
1889   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 63) nounwind
1890   %cmp = icmp ne i32 %call, 0
1891   ret i1 %cmp
1894 define i1 @length63_lt(ptr %x, ptr %y) nounwind {
1895 ; X86-LABEL: length63_lt:
1896 ; X86:       # %bb.0:
1897 ; X86-NEXT:    pushl $63
1898 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1899 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1900 ; X86-NEXT:    calll memcmp
1901 ; X86-NEXT:    addl $12, %esp
1902 ; X86-NEXT:    shrl $31, %eax
1903 ; X86-NEXT:    # kill: def $al killed $al killed $eax
1904 ; X86-NEXT:    retl
1905   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 63) nounwind
1906   %cmp = icmp slt i32 %call, 0
1907   ret i1 %cmp
1910 define i1 @length63_gt(ptr %x, ptr %y) nounwind {
1911 ; X86-LABEL: length63_gt:
1912 ; X86:       # %bb.0:
1913 ; X86-NEXT:    pushl $63
1914 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1915 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1916 ; X86-NEXT:    calll memcmp
1917 ; X86-NEXT:    addl $12, %esp
1918 ; X86-NEXT:    testl %eax, %eax
1919 ; X86-NEXT:    setg %al
1920 ; X86-NEXT:    retl
1921   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 63) nounwind
1922   %cmp = icmp sgt i32 %call, 0
1923   ret i1 %cmp
1926 define i1 @length63_eq_const(ptr %X) nounwind {
1927 ; X86-NOSSE-LABEL: length63_eq_const:
1928 ; X86-NOSSE:       # %bb.0:
1929 ; X86-NOSSE-NEXT:    pushl $63
1930 ; X86-NOSSE-NEXT:    pushl $.L.str
1931 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
1932 ; X86-NOSSE-NEXT:    calll memcmp
1933 ; X86-NOSSE-NEXT:    addl $12, %esp
1934 ; X86-NOSSE-NEXT:    testl %eax, %eax
1935 ; X86-NOSSE-NEXT:    sete %al
1936 ; X86-NOSSE-NEXT:    retl
1938 ; X86-SSE1-LABEL: length63_eq_const:
1939 ; X86-SSE1:       # %bb.0:
1940 ; X86-SSE1-NEXT:    pushl $63
1941 ; X86-SSE1-NEXT:    pushl $.L.str
1942 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
1943 ; X86-SSE1-NEXT:    calll memcmp
1944 ; X86-SSE1-NEXT:    addl $12, %esp
1945 ; X86-SSE1-NEXT:    testl %eax, %eax
1946 ; X86-SSE1-NEXT:    sete %al
1947 ; X86-SSE1-NEXT:    retl
1949 ; X86-SSE2-LABEL: length63_eq_const:
1950 ; X86-SSE2:       # %bb.0:
1951 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
1952 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
1953 ; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm1
1954 ; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm2
1955 ; X86-SSE2-NEXT:    movdqu 47(%eax), %xmm3
1956 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
1957 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
1958 ; X86-SSE2-NEXT:    pand %xmm3, %xmm2
1959 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1960 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1961 ; X86-SSE2-NEXT:    pand %xmm1, %xmm0
1962 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
1963 ; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
1964 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1965 ; X86-SSE2-NEXT:    sete %al
1966 ; X86-SSE2-NEXT:    retl
1968 ; X86-SSE41-LABEL: length63_eq_const:
1969 ; X86-SSE41:       # %bb.0:
1970 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
1971 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
1972 ; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm1
1973 ; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm2
1974 ; X86-SSE41-NEXT:    movdqu 47(%eax), %xmm3
1975 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
1976 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
1977 ; X86-SSE41-NEXT:    por %xmm3, %xmm2
1978 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1979 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1980 ; X86-SSE41-NEXT:    por %xmm1, %xmm0
1981 ; X86-SSE41-NEXT:    por %xmm2, %xmm0
1982 ; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
1983 ; X86-SSE41-NEXT:    sete %al
1984 ; X86-SSE41-NEXT:    retl
1985   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 63) nounwind
1986   %c = icmp eq i32 %m, 0
1987   ret i1 %c
1990 define i32 @length64(ptr %X, ptr %Y) nounwind {
1991 ; X86-LABEL: length64:
1992 ; X86:       # %bb.0:
1993 ; X86-NEXT:    pushl $64
1994 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1995 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
1996 ; X86-NEXT:    calll memcmp
1997 ; X86-NEXT:    addl $12, %esp
1998 ; X86-NEXT:    retl
1999   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 64) nounwind
2000   ret i32 %m
2003 define i1 @length64_eq(ptr %x, ptr %y) nounwind {
2004 ; X86-NOSSE-LABEL: length64_eq:
2005 ; X86-NOSSE:       # %bb.0:
2006 ; X86-NOSSE-NEXT:    pushl $64
2007 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2008 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2009 ; X86-NOSSE-NEXT:    calll memcmp
2010 ; X86-NOSSE-NEXT:    addl $12, %esp
2011 ; X86-NOSSE-NEXT:    testl %eax, %eax
2012 ; X86-NOSSE-NEXT:    setne %al
2013 ; X86-NOSSE-NEXT:    retl
2015 ; X86-SSE1-LABEL: length64_eq:
2016 ; X86-SSE1:       # %bb.0:
2017 ; X86-SSE1-NEXT:    pushl $64
2018 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2019 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2020 ; X86-SSE1-NEXT:    calll memcmp
2021 ; X86-SSE1-NEXT:    addl $12, %esp
2022 ; X86-SSE1-NEXT:    testl %eax, %eax
2023 ; X86-SSE1-NEXT:    setne %al
2024 ; X86-SSE1-NEXT:    retl
2026 ; X86-SSE2-LABEL: length64_eq:
2027 ; X86-SSE2:       # %bb.0:
2028 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2029 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2030 ; X86-SSE2-NEXT:    movdqu (%ecx), %xmm0
2031 ; X86-SSE2-NEXT:    movdqu 16(%ecx), %xmm1
2032 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm2
2033 ; X86-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
2034 ; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm0
2035 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2036 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
2037 ; X86-SSE2-NEXT:    movdqu 32(%ecx), %xmm1
2038 ; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm2
2039 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm2
2040 ; X86-SSE2-NEXT:    movdqu 48(%ecx), %xmm1
2041 ; X86-SSE2-NEXT:    movdqu 48(%eax), %xmm3
2042 ; X86-SSE2-NEXT:    pcmpeqb %xmm1, %xmm3
2043 ; X86-SSE2-NEXT:    pand %xmm2, %xmm3
2044 ; X86-SSE2-NEXT:    pand %xmm0, %xmm3
2045 ; X86-SSE2-NEXT:    pmovmskb %xmm3, %eax
2046 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2047 ; X86-SSE2-NEXT:    setne %al
2048 ; X86-SSE2-NEXT:    retl
2050 ; X86-SSE41-LABEL: length64_eq:
2051 ; X86-SSE41:       # %bb.0:
2052 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2053 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2054 ; X86-SSE41-NEXT:    movdqu (%ecx), %xmm0
2055 ; X86-SSE41-NEXT:    movdqu 16(%ecx), %xmm1
2056 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm2
2057 ; X86-SSE41-NEXT:    pxor %xmm0, %xmm2
2058 ; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm0
2059 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
2060 ; X86-SSE41-NEXT:    por %xmm2, %xmm0
2061 ; X86-SSE41-NEXT:    movdqu 32(%ecx), %xmm1
2062 ; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm2
2063 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm2
2064 ; X86-SSE41-NEXT:    movdqu 48(%ecx), %xmm1
2065 ; X86-SSE41-NEXT:    movdqu 48(%eax), %xmm3
2066 ; X86-SSE41-NEXT:    pxor %xmm1, %xmm3
2067 ; X86-SSE41-NEXT:    por %xmm2, %xmm3
2068 ; X86-SSE41-NEXT:    por %xmm0, %xmm3
2069 ; X86-SSE41-NEXT:    ptest %xmm3, %xmm3
2070 ; X86-SSE41-NEXT:    setne %al
2071 ; X86-SSE41-NEXT:    retl
2072   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 64) nounwind
2073   %cmp = icmp ne i32 %call, 0
2074   ret i1 %cmp
2077 define i1 @length64_lt(ptr %x, ptr %y) nounwind {
2078 ; X86-LABEL: length64_lt:
2079 ; X86:       # %bb.0:
2080 ; X86-NEXT:    pushl $64
2081 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2082 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2083 ; X86-NEXT:    calll memcmp
2084 ; X86-NEXT:    addl $12, %esp
2085 ; X86-NEXT:    shrl $31, %eax
2086 ; X86-NEXT:    # kill: def $al killed $al killed $eax
2087 ; X86-NEXT:    retl
2088   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 64) nounwind
2089   %cmp = icmp slt i32 %call, 0
2090   ret i1 %cmp
2093 define i1 @length64_gt(ptr %x, ptr %y) nounwind {
2094 ; X86-LABEL: length64_gt:
2095 ; X86:       # %bb.0:
2096 ; X86-NEXT:    pushl $64
2097 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2098 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2099 ; X86-NEXT:    calll memcmp
2100 ; X86-NEXT:    addl $12, %esp
2101 ; X86-NEXT:    testl %eax, %eax
2102 ; X86-NEXT:    setg %al
2103 ; X86-NEXT:    retl
2104   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 64) nounwind
2105   %cmp = icmp sgt i32 %call, 0
2106   ret i1 %cmp
2109 define i1 @length64_eq_const(ptr %X) nounwind {
2110 ; X86-NOSSE-LABEL: length64_eq_const:
2111 ; X86-NOSSE:       # %bb.0:
2112 ; X86-NOSSE-NEXT:    pushl $64
2113 ; X86-NOSSE-NEXT:    pushl $.L.str
2114 ; X86-NOSSE-NEXT:    pushl {{[0-9]+}}(%esp)
2115 ; X86-NOSSE-NEXT:    calll memcmp
2116 ; X86-NOSSE-NEXT:    addl $12, %esp
2117 ; X86-NOSSE-NEXT:    testl %eax, %eax
2118 ; X86-NOSSE-NEXT:    sete %al
2119 ; X86-NOSSE-NEXT:    retl
2121 ; X86-SSE1-LABEL: length64_eq_const:
2122 ; X86-SSE1:       # %bb.0:
2123 ; X86-SSE1-NEXT:    pushl $64
2124 ; X86-SSE1-NEXT:    pushl $.L.str
2125 ; X86-SSE1-NEXT:    pushl {{[0-9]+}}(%esp)
2126 ; X86-SSE1-NEXT:    calll memcmp
2127 ; X86-SSE1-NEXT:    addl $12, %esp
2128 ; X86-SSE1-NEXT:    testl %eax, %eax
2129 ; X86-SSE1-NEXT:    sete %al
2130 ; X86-SSE1-NEXT:    retl
2132 ; X86-SSE2-LABEL: length64_eq_const:
2133 ; X86-SSE2:       # %bb.0:
2134 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2135 ; X86-SSE2-NEXT:    movdqu (%eax), %xmm0
2136 ; X86-SSE2-NEXT:    movdqu 16(%eax), %xmm1
2137 ; X86-SSE2-NEXT:    movdqu 32(%eax), %xmm2
2138 ; X86-SSE2-NEXT:    movdqu 48(%eax), %xmm3
2139 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
2140 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
2141 ; X86-SSE2-NEXT:    pand %xmm3, %xmm2
2142 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
2143 ; X86-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2144 ; X86-SSE2-NEXT:    pand %xmm1, %xmm0
2145 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
2146 ; X86-SSE2-NEXT:    pmovmskb %xmm0, %eax
2147 ; X86-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2148 ; X86-SSE2-NEXT:    sete %al
2149 ; X86-SSE2-NEXT:    retl
2151 ; X86-SSE41-LABEL: length64_eq_const:
2152 ; X86-SSE41:       # %bb.0:
2153 ; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
2154 ; X86-SSE41-NEXT:    movdqu (%eax), %xmm0
2155 ; X86-SSE41-NEXT:    movdqu 16(%eax), %xmm1
2156 ; X86-SSE41-NEXT:    movdqu 32(%eax), %xmm2
2157 ; X86-SSE41-NEXT:    movdqu 48(%eax), %xmm3
2158 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
2159 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
2160 ; X86-SSE41-NEXT:    por %xmm3, %xmm2
2161 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
2162 ; X86-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2163 ; X86-SSE41-NEXT:    por %xmm1, %xmm0
2164 ; X86-SSE41-NEXT:    por %xmm2, %xmm0
2165 ; X86-SSE41-NEXT:    ptest %xmm0, %xmm0
2166 ; X86-SSE41-NEXT:    sete %al
2167 ; X86-SSE41-NEXT:    retl
2168   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 64) nounwind
2169   %c = icmp eq i32 %m, 0
2170   ret i1 %c
2173 define i32 @length96(ptr %X, ptr %Y) nounwind {
2174 ; X86-LABEL: length96:
2175 ; X86:       # %bb.0:
2176 ; X86-NEXT:    pushl $96
2177 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2178 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2179 ; X86-NEXT:    calll memcmp
2180 ; X86-NEXT:    addl $12, %esp
2181 ; X86-NEXT:    retl
2182   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 96) nounwind
2183   ret i32 %m
2186 define i1 @length96_eq(ptr %x, ptr %y) nounwind {
2187 ; X86-LABEL: length96_eq:
2188 ; X86:       # %bb.0:
2189 ; X86-NEXT:    pushl $96
2190 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2191 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2192 ; X86-NEXT:    calll memcmp
2193 ; X86-NEXT:    addl $12, %esp
2194 ; X86-NEXT:    testl %eax, %eax
2195 ; X86-NEXT:    setne %al
2196 ; X86-NEXT:    retl
2197   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 96) nounwind
2198   %cmp = icmp ne i32 %call, 0
2199   ret i1 %cmp
2202 define i1 @length96_lt(ptr %x, ptr %y) nounwind {
2203 ; X86-LABEL: length96_lt:
2204 ; X86:       # %bb.0:
2205 ; X86-NEXT:    pushl $96
2206 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2207 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2208 ; X86-NEXT:    calll memcmp
2209 ; X86-NEXT:    addl $12, %esp
2210 ; X86-NEXT:    shrl $31, %eax
2211 ; X86-NEXT:    # kill: def $al killed $al killed $eax
2212 ; X86-NEXT:    retl
2213   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 96) nounwind
2214   %cmp = icmp slt i32 %call, 0
2215   ret i1 %cmp
2218 define i1 @length96_gt(ptr %x, ptr %y) nounwind {
2219 ; X86-LABEL: length96_gt:
2220 ; X86:       # %bb.0:
2221 ; X86-NEXT:    pushl $96
2222 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2223 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2224 ; X86-NEXT:    calll memcmp
2225 ; X86-NEXT:    addl $12, %esp
2226 ; X86-NEXT:    testl %eax, %eax
2227 ; X86-NEXT:    setg %al
2228 ; X86-NEXT:    retl
2229   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 96) nounwind
2230   %cmp = icmp sgt i32 %call, 0
2231   ret i1 %cmp
2234 define i1 @length96_eq_const(ptr %X) nounwind {
2235 ; X86-LABEL: length96_eq_const:
2236 ; X86:       # %bb.0:
2237 ; X86-NEXT:    pushl $96
2238 ; X86-NEXT:    pushl $.L.str
2239 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2240 ; X86-NEXT:    calll memcmp
2241 ; X86-NEXT:    addl $12, %esp
2242 ; X86-NEXT:    testl %eax, %eax
2243 ; X86-NEXT:    sete %al
2244 ; X86-NEXT:    retl
2245   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 96) nounwind
2246   %c = icmp eq i32 %m, 0
2247   ret i1 %c
2250 define i32 @length127(ptr %X, ptr %Y) nounwind {
2251 ; X86-LABEL: length127:
2252 ; X86:       # %bb.0:
2253 ; X86-NEXT:    pushl $127
2254 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2255 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2256 ; X86-NEXT:    calll memcmp
2257 ; X86-NEXT:    addl $12, %esp
2258 ; X86-NEXT:    retl
2259   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 127) nounwind
2260   ret i32 %m
2263 define i1 @length127_eq(ptr %x, ptr %y) nounwind {
2264 ; X86-LABEL: length127_eq:
2265 ; X86:       # %bb.0:
2266 ; X86-NEXT:    pushl $127
2267 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2268 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2269 ; X86-NEXT:    calll memcmp
2270 ; X86-NEXT:    addl $12, %esp
2271 ; X86-NEXT:    testl %eax, %eax
2272 ; X86-NEXT:    setne %al
2273 ; X86-NEXT:    retl
2274   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 127) nounwind
2275   %cmp = icmp ne i32 %call, 0
2276   ret i1 %cmp
2279 define i1 @length127_lt(ptr %x, ptr %y) nounwind {
2280 ; X86-LABEL: length127_lt:
2281 ; X86:       # %bb.0:
2282 ; X86-NEXT:    pushl $127
2283 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2284 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2285 ; X86-NEXT:    calll memcmp
2286 ; X86-NEXT:    addl $12, %esp
2287 ; X86-NEXT:    shrl $31, %eax
2288 ; X86-NEXT:    # kill: def $al killed $al killed $eax
2289 ; X86-NEXT:    retl
2290   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 127) nounwind
2291   %cmp = icmp slt i32 %call, 0
2292   ret i1 %cmp
2295 define i1 @length127_gt(ptr %x, ptr %y) nounwind {
2296 ; X86-LABEL: length127_gt:
2297 ; X86:       # %bb.0:
2298 ; X86-NEXT:    pushl $127
2299 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2300 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2301 ; X86-NEXT:    calll memcmp
2302 ; X86-NEXT:    addl $12, %esp
2303 ; X86-NEXT:    testl %eax, %eax
2304 ; X86-NEXT:    setg %al
2305 ; X86-NEXT:    retl
2306   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 127) nounwind
2307   %cmp = icmp sgt i32 %call, 0
2308   ret i1 %cmp
2311 define i1 @length127_eq_const(ptr %X) nounwind {
2312 ; X86-LABEL: length127_eq_const:
2313 ; X86:       # %bb.0:
2314 ; X86-NEXT:    pushl $127
2315 ; X86-NEXT:    pushl $.L.str
2316 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2317 ; X86-NEXT:    calll memcmp
2318 ; X86-NEXT:    addl $12, %esp
2319 ; X86-NEXT:    testl %eax, %eax
2320 ; X86-NEXT:    sete %al
2321 ; X86-NEXT:    retl
2322   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 127) nounwind
2323   %c = icmp eq i32 %m, 0
2324   ret i1 %c
2327 define i32 @length128(ptr %X, ptr %Y) nounwind {
2328 ; X86-LABEL: length128:
2329 ; X86:       # %bb.0:
2330 ; X86-NEXT:    pushl $128
2331 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2332 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2333 ; X86-NEXT:    calll memcmp
2334 ; X86-NEXT:    addl $12, %esp
2335 ; X86-NEXT:    retl
2336   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 128) nounwind
2337   ret i32 %m
2340 define i1 @length128_eq(ptr %x, ptr %y) nounwind {
2341 ; X86-LABEL: length128_eq:
2342 ; X86:       # %bb.0:
2343 ; X86-NEXT:    pushl $128
2344 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2345 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2346 ; X86-NEXT:    calll memcmp
2347 ; X86-NEXT:    addl $12, %esp
2348 ; X86-NEXT:    testl %eax, %eax
2349 ; X86-NEXT:    setne %al
2350 ; X86-NEXT:    retl
2351   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 128) nounwind
2352   %cmp = icmp ne i32 %call, 0
2353   ret i1 %cmp
2356 define i1 @length128_lt(ptr %x, ptr %y) nounwind {
2357 ; X86-LABEL: length128_lt:
2358 ; X86:       # %bb.0:
2359 ; X86-NEXT:    pushl $128
2360 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2361 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2362 ; X86-NEXT:    calll memcmp
2363 ; X86-NEXT:    addl $12, %esp
2364 ; X86-NEXT:    shrl $31, %eax
2365 ; X86-NEXT:    # kill: def $al killed $al killed $eax
2366 ; X86-NEXT:    retl
2367   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 128) nounwind
2368   %cmp = icmp slt i32 %call, 0
2369   ret i1 %cmp
2372 define i1 @length128_gt(ptr %x, ptr %y) nounwind {
2373 ; X86-LABEL: length128_gt:
2374 ; X86:       # %bb.0:
2375 ; X86-NEXT:    pushl $128
2376 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2377 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2378 ; X86-NEXT:    calll memcmp
2379 ; X86-NEXT:    addl $12, %esp
2380 ; X86-NEXT:    testl %eax, %eax
2381 ; X86-NEXT:    setg %al
2382 ; X86-NEXT:    retl
2383   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 128) nounwind
2384   %cmp = icmp sgt i32 %call, 0
2385   ret i1 %cmp
2388 define i1 @length128_eq_const(ptr %X) nounwind {
2389 ; X86-LABEL: length128_eq_const:
2390 ; X86:       # %bb.0:
2391 ; X86-NEXT:    pushl $128
2392 ; X86-NEXT:    pushl $.L.str
2393 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2394 ; X86-NEXT:    calll memcmp
2395 ; X86-NEXT:    addl $12, %esp
2396 ; X86-NEXT:    testl %eax, %eax
2397 ; X86-NEXT:    sete %al
2398 ; X86-NEXT:    retl
2399   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 128) nounwind
2400   %c = icmp eq i32 %m, 0
2401   ret i1 %c
2404 define i32 @length192(ptr %X, ptr %Y) nounwind {
2405 ; X86-LABEL: length192:
2406 ; X86:       # %bb.0:
2407 ; X86-NEXT:    pushl $192
2408 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2409 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2410 ; X86-NEXT:    calll memcmp
2411 ; X86-NEXT:    addl $12, %esp
2412 ; X86-NEXT:    retl
2413   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 192) nounwind
2414   ret i32 %m
2417 define i1 @length192_eq(ptr %x, ptr %y) nounwind {
2418 ; X86-LABEL: length192_eq:
2419 ; X86:       # %bb.0:
2420 ; X86-NEXT:    pushl $192
2421 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2422 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2423 ; X86-NEXT:    calll memcmp
2424 ; X86-NEXT:    addl $12, %esp
2425 ; X86-NEXT:    testl %eax, %eax
2426 ; X86-NEXT:    setne %al
2427 ; X86-NEXT:    retl
2428   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 192) nounwind
2429   %cmp = icmp ne i32 %call, 0
2430   ret i1 %cmp
2433 define i1 @length192_lt(ptr %x, ptr %y) nounwind {
2434 ; X86-LABEL: length192_lt:
2435 ; X86:       # %bb.0:
2436 ; X86-NEXT:    pushl $192
2437 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2438 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2439 ; X86-NEXT:    calll memcmp
2440 ; X86-NEXT:    addl $12, %esp
2441 ; X86-NEXT:    shrl $31, %eax
2442 ; X86-NEXT:    # kill: def $al killed $al killed $eax
2443 ; X86-NEXT:    retl
2444   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 192) nounwind
2445   %cmp = icmp slt i32 %call, 0
2446   ret i1 %cmp
2449 define i1 @length192_gt(ptr %x, ptr %y) nounwind {
2450 ; X86-LABEL: length192_gt:
2451 ; X86:       # %bb.0:
2452 ; X86-NEXT:    pushl $192
2453 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2454 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2455 ; X86-NEXT:    calll memcmp
2456 ; X86-NEXT:    addl $12, %esp
2457 ; X86-NEXT:    testl %eax, %eax
2458 ; X86-NEXT:    setg %al
2459 ; X86-NEXT:    retl
2460   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 192) nounwind
2461   %cmp = icmp sgt i32 %call, 0
2462   ret i1 %cmp
2465 define i1 @length192_eq_const(ptr %X) nounwind {
2466 ; X86-LABEL: length192_eq_const:
2467 ; X86:       # %bb.0:
2468 ; X86-NEXT:    pushl $192
2469 ; X86-NEXT:    pushl $.L.str
2470 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2471 ; X86-NEXT:    calll memcmp
2472 ; X86-NEXT:    addl $12, %esp
2473 ; X86-NEXT:    testl %eax, %eax
2474 ; X86-NEXT:    sete %al
2475 ; X86-NEXT:    retl
2476   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 192) nounwind
2477   %c = icmp eq i32 %m, 0
2478   ret i1 %c
2481 define i32 @length255(ptr %X, ptr %Y) nounwind {
2482 ; X86-LABEL: length255:
2483 ; X86:       # %bb.0:
2484 ; X86-NEXT:    pushl $255
2485 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2486 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2487 ; X86-NEXT:    calll memcmp
2488 ; X86-NEXT:    addl $12, %esp
2489 ; X86-NEXT:    retl
2490   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 255) nounwind
2491   ret i32 %m
2494 define i1 @length255_eq(ptr %x, ptr %y) nounwind {
2495 ; X86-LABEL: length255_eq:
2496 ; X86:       # %bb.0:
2497 ; X86-NEXT:    pushl $255
2498 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2499 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2500 ; X86-NEXT:    calll memcmp
2501 ; X86-NEXT:    addl $12, %esp
2502 ; X86-NEXT:    testl %eax, %eax
2503 ; X86-NEXT:    setne %al
2504 ; X86-NEXT:    retl
2505   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 255) nounwind
2506   %cmp = icmp ne i32 %call, 0
2507   ret i1 %cmp
2510 define i1 @length255_lt(ptr %x, ptr %y) nounwind {
2511 ; X86-LABEL: length255_lt:
2512 ; X86:       # %bb.0:
2513 ; X86-NEXT:    pushl $255
2514 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2515 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2516 ; X86-NEXT:    calll memcmp
2517 ; X86-NEXT:    addl $12, %esp
2518 ; X86-NEXT:    shrl $31, %eax
2519 ; X86-NEXT:    # kill: def $al killed $al killed $eax
2520 ; X86-NEXT:    retl
2521   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 255) nounwind
2522   %cmp = icmp slt i32 %call, 0
2523   ret i1 %cmp
2526 define i1 @length255_gt(ptr %x, ptr %y) nounwind {
2527 ; X86-LABEL: length255_gt:
2528 ; X86:       # %bb.0:
2529 ; X86-NEXT:    pushl $255
2530 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2531 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2532 ; X86-NEXT:    calll memcmp
2533 ; X86-NEXT:    addl $12, %esp
2534 ; X86-NEXT:    testl %eax, %eax
2535 ; X86-NEXT:    setg %al
2536 ; X86-NEXT:    retl
2537   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 255) nounwind
2538   %cmp = icmp sgt i32 %call, 0
2539   ret i1 %cmp
2542 define i1 @length255_eq_const(ptr %X) nounwind {
2543 ; X86-LABEL: length255_eq_const:
2544 ; X86:       # %bb.0:
2545 ; X86-NEXT:    pushl $255
2546 ; X86-NEXT:    pushl $.L.str
2547 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2548 ; X86-NEXT:    calll memcmp
2549 ; X86-NEXT:    addl $12, %esp
2550 ; X86-NEXT:    testl %eax, %eax
2551 ; X86-NEXT:    sete %al
2552 ; X86-NEXT:    retl
2553   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 255) nounwind
2554   %c = icmp eq i32 %m, 0
2555   ret i1 %c
2558 define i32 @length256(ptr %X, ptr %Y) nounwind {
2559 ; X86-LABEL: length256:
2560 ; X86:       # %bb.0:
2561 ; X86-NEXT:    pushl $256 # imm = 0x100
2562 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2563 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2564 ; X86-NEXT:    calll memcmp
2565 ; X86-NEXT:    addl $12, %esp
2566 ; X86-NEXT:    retl
2567   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 256) nounwind
2568   ret i32 %m
2571 define i1 @length256_eq(ptr %x, ptr %y) nounwind {
2572 ; X86-LABEL: length256_eq:
2573 ; X86:       # %bb.0:
2574 ; X86-NEXT:    pushl $256 # imm = 0x100
2575 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2576 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2577 ; X86-NEXT:    calll memcmp
2578 ; X86-NEXT:    addl $12, %esp
2579 ; X86-NEXT:    testl %eax, %eax
2580 ; X86-NEXT:    setne %al
2581 ; X86-NEXT:    retl
2582   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 256) nounwind
2583   %cmp = icmp ne i32 %call, 0
2584   ret i1 %cmp
2587 define i1 @length256_lt(ptr %x, ptr %y) nounwind {
2588 ; X86-LABEL: length256_lt:
2589 ; X86:       # %bb.0:
2590 ; X86-NEXT:    pushl $256 # imm = 0x100
2591 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2592 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2593 ; X86-NEXT:    calll memcmp
2594 ; X86-NEXT:    addl $12, %esp
2595 ; X86-NEXT:    shrl $31, %eax
2596 ; X86-NEXT:    # kill: def $al killed $al killed $eax
2597 ; X86-NEXT:    retl
2598   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 256) nounwind
2599   %cmp = icmp slt i32 %call, 0
2600   ret i1 %cmp
2603 define i1 @length256_gt(ptr %x, ptr %y) nounwind {
2604 ; X86-LABEL: length256_gt:
2605 ; X86:       # %bb.0:
2606 ; X86-NEXT:    pushl $256 # imm = 0x100
2607 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2608 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2609 ; X86-NEXT:    calll memcmp
2610 ; X86-NEXT:    addl $12, %esp
2611 ; X86-NEXT:    testl %eax, %eax
2612 ; X86-NEXT:    setg %al
2613 ; X86-NEXT:    retl
2614   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 256) nounwind
2615   %cmp = icmp sgt i32 %call, 0
2616   ret i1 %cmp
2619 define i1 @length256_eq_const(ptr %X) nounwind {
2620 ; X86-LABEL: length256_eq_const:
2621 ; X86:       # %bb.0:
2622 ; X86-NEXT:    pushl $256 # imm = 0x100
2623 ; X86-NEXT:    pushl $.L.str
2624 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2625 ; X86-NEXT:    calll memcmp
2626 ; X86-NEXT:    addl $12, %esp
2627 ; X86-NEXT:    testl %eax, %eax
2628 ; X86-NEXT:    sete %al
2629 ; X86-NEXT:    retl
2630   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 256) nounwind
2631   %c = icmp eq i32 %m, 0
2632   ret i1 %c
2635 define i32 @length384(ptr %X, ptr %Y) nounwind {
2636 ; X86-LABEL: length384:
2637 ; X86:       # %bb.0:
2638 ; X86-NEXT:    pushl $384 # imm = 0x180
2639 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2640 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2641 ; X86-NEXT:    calll memcmp
2642 ; X86-NEXT:    addl $12, %esp
2643 ; X86-NEXT:    retl
2644   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 384) nounwind
2645   ret i32 %m
2648 define i1 @length384_eq(ptr %x, ptr %y) nounwind {
2649 ; X86-LABEL: length384_eq:
2650 ; X86:       # %bb.0:
2651 ; X86-NEXT:    pushl $384 # imm = 0x180
2652 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2653 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2654 ; X86-NEXT:    calll memcmp
2655 ; X86-NEXT:    addl $12, %esp
2656 ; X86-NEXT:    testl %eax, %eax
2657 ; X86-NEXT:    setne %al
2658 ; X86-NEXT:    retl
2659   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 384) nounwind
2660   %cmp = icmp ne i32 %call, 0
2661   ret i1 %cmp
2664 define i1 @length384_lt(ptr %x, ptr %y) nounwind {
2665 ; X86-LABEL: length384_lt:
2666 ; X86:       # %bb.0:
2667 ; X86-NEXT:    pushl $384 # imm = 0x180
2668 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2669 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2670 ; X86-NEXT:    calll memcmp
2671 ; X86-NEXT:    addl $12, %esp
2672 ; X86-NEXT:    shrl $31, %eax
2673 ; X86-NEXT:    # kill: def $al killed $al killed $eax
2674 ; X86-NEXT:    retl
2675   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 384) nounwind
2676   %cmp = icmp slt i32 %call, 0
2677   ret i1 %cmp
2680 define i1 @length384_gt(ptr %x, ptr %y) nounwind {
2681 ; X86-LABEL: length384_gt:
2682 ; X86:       # %bb.0:
2683 ; X86-NEXT:    pushl $384 # imm = 0x180
2684 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2685 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2686 ; X86-NEXT:    calll memcmp
2687 ; X86-NEXT:    addl $12, %esp
2688 ; X86-NEXT:    testl %eax, %eax
2689 ; X86-NEXT:    setg %al
2690 ; X86-NEXT:    retl
2691   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 384) nounwind
2692   %cmp = icmp sgt i32 %call, 0
2693   ret i1 %cmp
2696 define i1 @length384_eq_const(ptr %X) nounwind {
2697 ; X86-LABEL: length384_eq_const:
2698 ; X86:       # %bb.0:
2699 ; X86-NEXT:    pushl $384 # imm = 0x180
2700 ; X86-NEXT:    pushl $.L.str
2701 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2702 ; X86-NEXT:    calll memcmp
2703 ; X86-NEXT:    addl $12, %esp
2704 ; X86-NEXT:    testl %eax, %eax
2705 ; X86-NEXT:    sete %al
2706 ; X86-NEXT:    retl
2707   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 384) nounwind
2708   %c = icmp eq i32 %m, 0
2709   ret i1 %c
2712 define i32 @length511(ptr %X, ptr %Y) nounwind {
2713 ; X86-LABEL: length511:
2714 ; X86:       # %bb.0:
2715 ; X86-NEXT:    pushl $511 # imm = 0x1FF
2716 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2717 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2718 ; X86-NEXT:    calll memcmp
2719 ; X86-NEXT:    addl $12, %esp
2720 ; X86-NEXT:    retl
2721   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 511) nounwind
2722   ret i32 %m
2725 define i1 @length511_eq(ptr %x, ptr %y) nounwind {
2726 ; X86-LABEL: length511_eq:
2727 ; X86:       # %bb.0:
2728 ; X86-NEXT:    pushl $511 # imm = 0x1FF
2729 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2730 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2731 ; X86-NEXT:    calll memcmp
2732 ; X86-NEXT:    addl $12, %esp
2733 ; X86-NEXT:    testl %eax, %eax
2734 ; X86-NEXT:    setne %al
2735 ; X86-NEXT:    retl
2736   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 511) nounwind
2737   %cmp = icmp ne i32 %call, 0
2738   ret i1 %cmp
2741 define i1 @length511_lt(ptr %x, ptr %y) nounwind {
2742 ; X86-LABEL: length511_lt:
2743 ; X86:       # %bb.0:
2744 ; X86-NEXT:    pushl $511 # imm = 0x1FF
2745 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2746 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2747 ; X86-NEXT:    calll memcmp
2748 ; X86-NEXT:    addl $12, %esp
2749 ; X86-NEXT:    shrl $31, %eax
2750 ; X86-NEXT:    # kill: def $al killed $al killed $eax
2751 ; X86-NEXT:    retl
2752   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 511) nounwind
2753   %cmp = icmp slt i32 %call, 0
2754   ret i1 %cmp
2757 define i1 @length511_gt(ptr %x, ptr %y) nounwind {
2758 ; X86-LABEL: length511_gt:
2759 ; X86:       # %bb.0:
2760 ; X86-NEXT:    pushl $511 # imm = 0x1FF
2761 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2762 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2763 ; X86-NEXT:    calll memcmp
2764 ; X86-NEXT:    addl $12, %esp
2765 ; X86-NEXT:    testl %eax, %eax
2766 ; X86-NEXT:    setg %al
2767 ; X86-NEXT:    retl
2768   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 511) nounwind
2769   %cmp = icmp sgt i32 %call, 0
2770   ret i1 %cmp
2773 define i1 @length511_eq_const(ptr %X) nounwind {
2774 ; X86-LABEL: length511_eq_const:
2775 ; X86:       # %bb.0:
2776 ; X86-NEXT:    pushl $511 # imm = 0x1FF
2777 ; X86-NEXT:    pushl $.L.str
2778 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2779 ; X86-NEXT:    calll memcmp
2780 ; X86-NEXT:    addl $12, %esp
2781 ; X86-NEXT:    testl %eax, %eax
2782 ; X86-NEXT:    sete %al
2783 ; X86-NEXT:    retl
2784   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 511) nounwind
2785   %c = icmp eq i32 %m, 0
2786   ret i1 %c
2789 define i32 @length512(ptr %X, ptr %Y) nounwind {
2790 ; X86-LABEL: length512:
2791 ; X86:       # %bb.0:
2792 ; X86-NEXT:    pushl $512 # imm = 0x200
2793 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2794 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2795 ; X86-NEXT:    calll memcmp
2796 ; X86-NEXT:    addl $12, %esp
2797 ; X86-NEXT:    retl
2798   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 512) nounwind
2799   ret i32 %m
2802 define i1 @length512_eq(ptr %x, ptr %y) nounwind {
2803 ; X86-LABEL: length512_eq:
2804 ; X86:       # %bb.0:
2805 ; X86-NEXT:    pushl $512 # imm = 0x200
2806 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2807 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2808 ; X86-NEXT:    calll memcmp
2809 ; X86-NEXT:    addl $12, %esp
2810 ; X86-NEXT:    testl %eax, %eax
2811 ; X86-NEXT:    setne %al
2812 ; X86-NEXT:    retl
2813   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 512) nounwind
2814   %cmp = icmp ne i32 %call, 0
2815   ret i1 %cmp
2818 define i1 @length512_lt(ptr %x, ptr %y) nounwind {
2819 ; X86-LABEL: length512_lt:
2820 ; X86:       # %bb.0:
2821 ; X86-NEXT:    pushl $512 # imm = 0x200
2822 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2823 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2824 ; X86-NEXT:    calll memcmp
2825 ; X86-NEXT:    addl $12, %esp
2826 ; X86-NEXT:    shrl $31, %eax
2827 ; X86-NEXT:    # kill: def $al killed $al killed $eax
2828 ; X86-NEXT:    retl
2829   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 512) nounwind
2830   %cmp = icmp slt i32 %call, 0
2831   ret i1 %cmp
2834 define i1 @length512_gt(ptr %x, ptr %y) nounwind {
2835 ; X86-LABEL: length512_gt:
2836 ; X86:       # %bb.0:
2837 ; X86-NEXT:    pushl $512 # imm = 0x200
2838 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2839 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2840 ; X86-NEXT:    calll memcmp
2841 ; X86-NEXT:    addl $12, %esp
2842 ; X86-NEXT:    testl %eax, %eax
2843 ; X86-NEXT:    setg %al
2844 ; X86-NEXT:    retl
2845   %call = tail call i32 @memcmp(ptr %x, ptr %y, i32 512) nounwind
2846   %cmp = icmp sgt i32 %call, 0
2847   ret i1 %cmp
2850 define i1 @length512_eq_const(ptr %X) nounwind {
2851 ; X86-LABEL: length512_eq_const:
2852 ; X86:       # %bb.0:
2853 ; X86-NEXT:    pushl $512 # imm = 0x200
2854 ; X86-NEXT:    pushl $.L.str
2855 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2856 ; X86-NEXT:    calll memcmp
2857 ; X86-NEXT:    addl $12, %esp
2858 ; X86-NEXT:    testl %eax, %eax
2859 ; X86-NEXT:    sete %al
2860 ; X86-NEXT:    retl
2861   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i32 512) nounwind
2862   %c = icmp eq i32 %m, 0
2863   ret i1 %c
2866 ; This checks that we do not do stupid things with huge sizes.
2867 define i32 @huge_length(ptr %X, ptr %Y) nounwind {
2868 ; X86-LABEL: huge_length:
2869 ; X86:       # %bb.0:
2870 ; X86-NEXT:    pushl $-1
2871 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2872 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2873 ; X86-NEXT:    calll memcmp
2874 ; X86-NEXT:    addl $12, %esp
2875 ; X86-NEXT:    retl
2876   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 9223372036854775807) nounwind
2877   ret i32 %m
2880 define i1 @huge_length_eq(ptr %X, ptr %Y) nounwind {
2881 ; X86-LABEL: huge_length_eq:
2882 ; X86:       # %bb.0:
2883 ; X86-NEXT:    pushl $-1
2884 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2885 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2886 ; X86-NEXT:    calll memcmp
2887 ; X86-NEXT:    addl $12, %esp
2888 ; X86-NEXT:    testl %eax, %eax
2889 ; X86-NEXT:    sete %al
2890 ; X86-NEXT:    retl
2891   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 9223372036854775807) nounwind
2892   %c = icmp eq i32 %m, 0
2893   ret i1 %c
2896 ; This checks non-constant sizes.
2897 define i32 @nonconst_length(ptr %X, ptr %Y, i32 %size) nounwind {
2898 ; X86-LABEL: nonconst_length:
2899 ; X86:       # %bb.0:
2900 ; X86-NEXT:    jmp memcmp # TAILCALL
2901   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 %size) nounwind
2902   ret i32 %m
2905 define i1 @nonconst_length_eq(ptr %X, ptr %Y, i32 %size) nounwind {
2906 ; X86-LABEL: nonconst_length_eq:
2907 ; X86:       # %bb.0:
2908 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2909 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2910 ; X86-NEXT:    pushl {{[0-9]+}}(%esp)
2911 ; X86-NEXT:    calll memcmp
2912 ; X86-NEXT:    addl $12, %esp
2913 ; X86-NEXT:    testl %eax, %eax
2914 ; X86-NEXT:    sete %al
2915 ; X86-NEXT:    retl
2916   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i32 %size) nounwind
2917   %c = icmp eq i32 %m, 0
2918   ret i1 %c