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