Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / memcmp-more-load-pairs.ll
blob56d06021867fa15c167bba60cdf82374d10c703f
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=x86_64-unknown-unknown               | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE2
4 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.1 | FileCheck %s --check-prefixes=X64,X64-SSE,X64-SSE41
5 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx    | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX1
6 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx2   | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2
7 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,+prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2
8 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw,-prefer-256-bit | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512BW
9 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,+prefer-256-bit,-prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX2
10 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,-prefer-256-bit,-prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512F
11 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,+prefer-256-bit,+prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-MIC-AVX,X64-MIC-AVX2
12 ; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f,-prefer-256-bit,+prefer-mask-registers | FileCheck %s --check-prefixes=X64,X64-MIC-AVX,X64-MIC-AVX512F
14 ; This tests codegen time inlining/optimization of memcmp
15 ; rdar://6480398
17 @.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 1
19 declare dso_local i32 @memcmp(ptr, ptr, i64)
21 define i32 @length0(ptr %X, ptr %Y) nounwind {
22 ; X64-LABEL: length0:
23 ; X64:       # %bb.0:
24 ; X64-NEXT:    xorl %eax, %eax
25 ; X64-NEXT:    retq
26    %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind
27    ret i32 %m
28  }
30 define i1 @length0_eq(ptr %X, ptr %Y) nounwind {
31 ; X64-LABEL: length0_eq:
32 ; X64:       # %bb.0:
33 ; X64-NEXT:    movb $1, %al
34 ; X64-NEXT:    retq
35   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind
36   %c = icmp eq i32 %m, 0
37   ret i1 %c
40 define i1 @length0_lt(ptr %X, ptr %Y) nounwind {
41 ; X64-LABEL: length0_lt:
42 ; X64:       # %bb.0:
43 ; X64-NEXT:    xorl %eax, %eax
44 ; X64-NEXT:    retq
45   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 0) nounwind
46   %c = icmp slt i32 %m, 0
47   ret i1 %c
50 define i32 @length2(ptr %X, ptr %Y) nounwind {
51 ; X64-LABEL: length2:
52 ; X64:       # %bb.0:
53 ; X64-NEXT:    movzwl (%rdi), %eax
54 ; X64-NEXT:    movzwl (%rsi), %ecx
55 ; X64-NEXT:    rolw $8, %ax
56 ; X64-NEXT:    rolw $8, %cx
57 ; X64-NEXT:    movzwl %ax, %eax
58 ; X64-NEXT:    movzwl %cx, %ecx
59 ; X64-NEXT:    subl %ecx, %eax
60 ; X64-NEXT:    retq
61   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind
62   ret i32 %m
65 define i1 @length2_eq(ptr %X, ptr %Y) nounwind {
66 ; X64-LABEL: length2_eq:
67 ; X64:       # %bb.0:
68 ; X64-NEXT:    movzwl (%rdi), %eax
69 ; X64-NEXT:    cmpw (%rsi), %ax
70 ; X64-NEXT:    sete %al
71 ; X64-NEXT:    retq
72   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind
73   %c = icmp eq i32 %m, 0
74   ret i1 %c
77 define i1 @length2_lt(ptr %X, ptr %Y) nounwind {
78 ; X64-LABEL: length2_lt:
79 ; X64:       # %bb.0:
80 ; X64-NEXT:    movzwl (%rdi), %eax
81 ; X64-NEXT:    movzwl (%rsi), %ecx
82 ; X64-NEXT:    rolw $8, %ax
83 ; X64-NEXT:    rolw $8, %cx
84 ; X64-NEXT:    movzwl %ax, %eax
85 ; X64-NEXT:    movzwl %cx, %ecx
86 ; X64-NEXT:    subl %ecx, %eax
87 ; X64-NEXT:    shrl $31, %eax
88 ; X64-NEXT:    # kill: def $al killed $al killed $eax
89 ; X64-NEXT:    retq
90   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind
91   %c = icmp slt i32 %m, 0
92   ret i1 %c
95 define i1 @length2_gt(ptr %X, ptr %Y) nounwind {
96 ; X64-LABEL: length2_gt:
97 ; X64:       # %bb.0:
98 ; X64-NEXT:    movzwl (%rdi), %eax
99 ; X64-NEXT:    movzwl (%rsi), %ecx
100 ; X64-NEXT:    rolw $8, %ax
101 ; X64-NEXT:    rolw $8, %cx
102 ; X64-NEXT:    movzwl %ax, %eax
103 ; X64-NEXT:    movzwl %cx, %ecx
104 ; X64-NEXT:    subl %ecx, %eax
105 ; X64-NEXT:    testl %eax, %eax
106 ; X64-NEXT:    setg %al
107 ; X64-NEXT:    retq
108   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind
109   %c = icmp sgt i32 %m, 0
110   ret i1 %c
113 define i1 @length2_eq_const(ptr %X) nounwind {
114 ; X64-LABEL: length2_eq_const:
115 ; X64:       # %bb.0:
116 ; X64-NEXT:    movzwl (%rdi), %eax
117 ; X64-NEXT:    cmpl $12849, %eax # imm = 0x3231
118 ; X64-NEXT:    setne %al
119 ; X64-NEXT:    retq
120   %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 2) nounwind
121   %c = icmp ne i32 %m, 0
122   ret i1 %c
125 define i1 @length2_eq_nobuiltin_attr(ptr %X, ptr %Y) nounwind {
126 ; X64-LABEL: length2_eq_nobuiltin_attr:
127 ; X64:       # %bb.0:
128 ; X64-NEXT:    pushq %rax
129 ; X64-NEXT:    movl $2, %edx
130 ; X64-NEXT:    callq memcmp
131 ; X64-NEXT:    testl %eax, %eax
132 ; X64-NEXT:    sete %al
133 ; X64-NEXT:    popq %rcx
134 ; X64-NEXT:    retq
135   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 2) nounwind nobuiltin
136   %c = icmp eq i32 %m, 0
137   ret i1 %c
140 define i32 @length3(ptr %X, ptr %Y) nounwind {
141 ; X64-LABEL: length3:
142 ; X64:       # %bb.0:
143 ; X64-NEXT:    movzwl (%rdi), %ecx
144 ; X64-NEXT:    movzwl (%rsi), %edx
145 ; X64-NEXT:    rolw $8, %cx
146 ; X64-NEXT:    rolw $8, %dx
147 ; X64-NEXT:    cmpw %dx, %cx
148 ; X64-NEXT:    jne .LBB9_3
149 ; X64-NEXT:  # %bb.1: # %loadbb1
150 ; X64-NEXT:    movzbl 2(%rdi), %eax
151 ; X64-NEXT:    movzbl 2(%rsi), %ecx
152 ; X64-NEXT:    subl %ecx, %eax
153 ; X64-NEXT:    retq
154 ; X64-NEXT:  .LBB9_3: # %res_block
155 ; X64-NEXT:    xorl %eax, %eax
156 ; X64-NEXT:    cmpw %dx, %cx
157 ; X64-NEXT:    sbbl %eax, %eax
158 ; X64-NEXT:    orl $1, %eax
159 ; X64-NEXT:    retq
160   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind
161   ret i32 %m
164 define i1 @length3_eq(ptr %X, ptr %Y) nounwind {
165 ; X64-LABEL: length3_eq:
166 ; X64:       # %bb.0:
167 ; X64-NEXT:    movzwl (%rdi), %eax
168 ; X64-NEXT:    xorw (%rsi), %ax
169 ; X64-NEXT:    movzbl 2(%rdi), %ecx
170 ; X64-NEXT:    xorb 2(%rsi), %cl
171 ; X64-NEXT:    movzbl %cl, %ecx
172 ; X64-NEXT:    orw %ax, %cx
173 ; X64-NEXT:    setne %al
174 ; X64-NEXT:    retq
175   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 3) nounwind
176   %c = icmp ne i32 %m, 0
177   ret i1 %c
180 define i32 @length4(ptr %X, ptr %Y) nounwind {
181 ; X64-LABEL: length4:
182 ; X64:       # %bb.0:
183 ; X64-NEXT:    movl (%rdi), %ecx
184 ; X64-NEXT:    movl (%rsi), %edx
185 ; X64-NEXT:    bswapl %ecx
186 ; X64-NEXT:    bswapl %edx
187 ; X64-NEXT:    xorl %eax, %eax
188 ; X64-NEXT:    cmpl %edx, %ecx
189 ; X64-NEXT:    seta %al
190 ; X64-NEXT:    sbbl $0, %eax
191 ; X64-NEXT:    retq
192   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind
193   ret i32 %m
196 define i1 @length4_eq(ptr %X, ptr %Y) nounwind {
197 ; X64-LABEL: length4_eq:
198 ; X64:       # %bb.0:
199 ; X64-NEXT:    movl (%rdi), %eax
200 ; X64-NEXT:    cmpl (%rsi), %eax
201 ; X64-NEXT:    setne %al
202 ; X64-NEXT:    retq
203   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind
204   %c = icmp ne i32 %m, 0
205   ret i1 %c
208 define i1 @length4_lt(ptr %X, ptr %Y) nounwind {
209 ; X64-LABEL: length4_lt:
210 ; X64:       # %bb.0:
211 ; X64-NEXT:    movl (%rdi), %ecx
212 ; X64-NEXT:    movl (%rsi), %edx
213 ; X64-NEXT:    bswapl %ecx
214 ; X64-NEXT:    bswapl %edx
215 ; X64-NEXT:    xorl %eax, %eax
216 ; X64-NEXT:    cmpl %edx, %ecx
217 ; X64-NEXT:    seta %al
218 ; X64-NEXT:    sbbl $0, %eax
219 ; X64-NEXT:    shrl $31, %eax
220 ; X64-NEXT:    # kill: def $al killed $al killed $eax
221 ; X64-NEXT:    retq
222   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind
223   %c = icmp slt i32 %m, 0
224   ret i1 %c
227 define i1 @length4_gt(ptr %X, ptr %Y) nounwind {
228 ; X64-LABEL: length4_gt:
229 ; X64:       # %bb.0:
230 ; X64-NEXT:    movl (%rdi), %eax
231 ; X64-NEXT:    movl (%rsi), %ecx
232 ; X64-NEXT:    bswapl %eax
233 ; X64-NEXT:    bswapl %ecx
234 ; X64-NEXT:    xorl %edx, %edx
235 ; X64-NEXT:    cmpl %ecx, %eax
236 ; X64-NEXT:    seta %dl
237 ; X64-NEXT:    sbbl $0, %edx
238 ; X64-NEXT:    testl %edx, %edx
239 ; X64-NEXT:    setg %al
240 ; X64-NEXT:    retq
241   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind
242   %c = icmp sgt i32 %m, 0
243   ret i1 %c
246 define i1 @length4_eq_const(ptr %X) nounwind {
247 ; X64-LABEL: length4_eq_const:
248 ; X64:       # %bb.0:
249 ; X64-NEXT:    cmpl $875770417, (%rdi) # imm = 0x34333231
250 ; X64-NEXT:    sete %al
251 ; X64-NEXT:    retq
252   %m = tail call i32 @memcmp(ptr %X, ptr getelementptr inbounds ([513 x i8], ptr @.str, i32 0, i32 1), i64 4) nounwind
253   %c = icmp eq i32 %m, 0
254   ret i1 %c
257 define i32 @length5(ptr %X, ptr %Y) nounwind {
258 ; X64-LABEL: length5:
259 ; X64:       # %bb.0:
260 ; X64-NEXT:    movl (%rdi), %ecx
261 ; X64-NEXT:    movl (%rsi), %edx
262 ; X64-NEXT:    bswapl %ecx
263 ; X64-NEXT:    bswapl %edx
264 ; X64-NEXT:    cmpl %edx, %ecx
265 ; X64-NEXT:    jne .LBB16_3
266 ; X64-NEXT:  # %bb.1: # %loadbb1
267 ; X64-NEXT:    movzbl 4(%rdi), %eax
268 ; X64-NEXT:    movzbl 4(%rsi), %ecx
269 ; X64-NEXT:    subl %ecx, %eax
270 ; X64-NEXT:    retq
271 ; X64-NEXT:  .LBB16_3: # %res_block
272 ; X64-NEXT:    xorl %eax, %eax
273 ; X64-NEXT:    cmpl %edx, %ecx
274 ; X64-NEXT:    sbbl %eax, %eax
275 ; X64-NEXT:    orl $1, %eax
276 ; X64-NEXT:    retq
277   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind
278   ret i32 %m
281 define i1 @length5_eq(ptr %X, ptr %Y) nounwind {
282 ; X64-LABEL: length5_eq:
283 ; X64:       # %bb.0:
284 ; X64-NEXT:    movl (%rdi), %eax
285 ; X64-NEXT:    xorl (%rsi), %eax
286 ; X64-NEXT:    movzbl 4(%rdi), %ecx
287 ; X64-NEXT:    xorb 4(%rsi), %cl
288 ; X64-NEXT:    movzbl %cl, %ecx
289 ; X64-NEXT:    orl %eax, %ecx
290 ; X64-NEXT:    setne %al
291 ; X64-NEXT:    retq
292   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind
293   %c = icmp ne i32 %m, 0
294   ret i1 %c
297 define i1 @length5_lt(ptr %X, ptr %Y) nounwind {
298 ; X64-LABEL: length5_lt:
299 ; X64:       # %bb.0:
300 ; X64-NEXT:    movl (%rdi), %ecx
301 ; X64-NEXT:    movl (%rsi), %edx
302 ; X64-NEXT:    bswapl %ecx
303 ; X64-NEXT:    bswapl %edx
304 ; X64-NEXT:    cmpl %edx, %ecx
305 ; X64-NEXT:    jne .LBB18_3
306 ; X64-NEXT:  # %bb.1: # %loadbb1
307 ; X64-NEXT:    movzbl 4(%rdi), %eax
308 ; X64-NEXT:    movzbl 4(%rsi), %ecx
309 ; X64-NEXT:    subl %ecx, %eax
310 ; X64-NEXT:    shrl $31, %eax
311 ; X64-NEXT:    # kill: def $al killed $al killed $eax
312 ; X64-NEXT:    retq
313 ; X64-NEXT:  .LBB18_3: # %res_block
314 ; X64-NEXT:    xorl %eax, %eax
315 ; X64-NEXT:    cmpl %edx, %ecx
316 ; X64-NEXT:    sbbl %eax, %eax
317 ; X64-NEXT:    orl $1, %eax
318 ; X64-NEXT:    shrl $31, %eax
319 ; X64-NEXT:    # kill: def $al killed $al killed $eax
320 ; X64-NEXT:    retq
321   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 5) nounwind
322   %c = icmp slt i32 %m, 0
323   ret i1 %c
326 define i32 @length7(ptr %X, ptr %Y) nounwind {
327 ; X64-LABEL: length7:
328 ; X64:       # %bb.0:
329 ; X64-NEXT:    movl (%rdi), %ecx
330 ; X64-NEXT:    movl (%rsi), %edx
331 ; X64-NEXT:    bswapl %ecx
332 ; X64-NEXT:    bswapl %edx
333 ; X64-NEXT:    cmpl %edx, %ecx
334 ; X64-NEXT:    jne .LBB19_2
335 ; X64-NEXT:  # %bb.1: # %loadbb1
336 ; X64-NEXT:    movl 3(%rdi), %ecx
337 ; X64-NEXT:    movl 3(%rsi), %edx
338 ; X64-NEXT:    bswapl %ecx
339 ; X64-NEXT:    bswapl %edx
340 ; X64-NEXT:    xorl %eax, %eax
341 ; X64-NEXT:    cmpl %edx, %ecx
342 ; X64-NEXT:    je .LBB19_3
343 ; X64-NEXT:  .LBB19_2: # %res_block
344 ; X64-NEXT:    xorl %eax, %eax
345 ; X64-NEXT:    cmpl %edx, %ecx
346 ; X64-NEXT:    sbbl %eax, %eax
347 ; X64-NEXT:    orl $1, %eax
348 ; X64-NEXT:  .LBB19_3: # %endblock
349 ; X64-NEXT:    retq
350   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind
351   ret i32 %m
354 define i1 @length7_eq(ptr %X, ptr %Y) nounwind {
355 ; X64-LABEL: length7_eq:
356 ; X64:       # %bb.0:
357 ; X64-NEXT:    movl (%rdi), %eax
358 ; X64-NEXT:    movl 3(%rdi), %ecx
359 ; X64-NEXT:    xorl (%rsi), %eax
360 ; X64-NEXT:    xorl 3(%rsi), %ecx
361 ; X64-NEXT:    orl %eax, %ecx
362 ; X64-NEXT:    setne %al
363 ; X64-NEXT:    retq
364   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind
365   %c = icmp ne i32 %m, 0
366   ret i1 %c
369 define i1 @length7_lt(ptr %X, ptr %Y) nounwind {
370 ; X64-LABEL: length7_lt:
371 ; X64:       # %bb.0:
372 ; X64-NEXT:    movl (%rdi), %ecx
373 ; X64-NEXT:    movl (%rsi), %edx
374 ; X64-NEXT:    bswapl %ecx
375 ; X64-NEXT:    bswapl %edx
376 ; X64-NEXT:    cmpl %edx, %ecx
377 ; X64-NEXT:    jne .LBB21_2
378 ; X64-NEXT:  # %bb.1: # %loadbb1
379 ; X64-NEXT:    movl 3(%rdi), %ecx
380 ; X64-NEXT:    movl 3(%rsi), %edx
381 ; X64-NEXT:    bswapl %ecx
382 ; X64-NEXT:    bswapl %edx
383 ; X64-NEXT:    xorl %eax, %eax
384 ; X64-NEXT:    cmpl %edx, %ecx
385 ; X64-NEXT:    je .LBB21_3
386 ; X64-NEXT:  .LBB21_2: # %res_block
387 ; X64-NEXT:    xorl %eax, %eax
388 ; X64-NEXT:    cmpl %edx, %ecx
389 ; X64-NEXT:    sbbl %eax, %eax
390 ; X64-NEXT:    orl $1, %eax
391 ; X64-NEXT:  .LBB21_3: # %endblock
392 ; X64-NEXT:    shrl $31, %eax
393 ; X64-NEXT:    # kill: def $al killed $al killed $eax
394 ; X64-NEXT:    retq
395   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 7) nounwind
396   %c = icmp slt i32 %m, 0
397   ret i1 %c
400 define i32 @length8(ptr %X, ptr %Y) nounwind {
401 ; X64-LABEL: length8:
402 ; X64:       # %bb.0:
403 ; X64-NEXT:    movq (%rdi), %rcx
404 ; X64-NEXT:    movq (%rsi), %rdx
405 ; X64-NEXT:    bswapq %rcx
406 ; X64-NEXT:    bswapq %rdx
407 ; X64-NEXT:    xorl %eax, %eax
408 ; X64-NEXT:    cmpq %rdx, %rcx
409 ; X64-NEXT:    seta %al
410 ; X64-NEXT:    sbbl $0, %eax
411 ; X64-NEXT:    retq
412   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind
413   ret i32 %m
416 define i1 @length8_eq(ptr %X, ptr %Y) nounwind {
417 ; X64-LABEL: length8_eq:
418 ; X64:       # %bb.0:
419 ; X64-NEXT:    movq (%rdi), %rax
420 ; X64-NEXT:    cmpq (%rsi), %rax
421 ; X64-NEXT:    sete %al
422 ; X64-NEXT:    retq
423   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind
424   %c = icmp eq i32 %m, 0
425   ret i1 %c
428 define i1 @length8_eq_const(ptr %X) nounwind {
429 ; X64-LABEL: length8_eq_const:
430 ; X64:       # %bb.0:
431 ; X64-NEXT:    movabsq $3978425819141910832, %rax # imm = 0x3736353433323130
432 ; X64-NEXT:    cmpq %rax, (%rdi)
433 ; X64-NEXT:    setne %al
434 ; X64-NEXT:    retq
435   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 8) nounwind
436   %c = icmp ne i32 %m, 0
437   ret i1 %c
440 define i1 @length9_eq(ptr %X, ptr %Y) nounwind {
441 ; X64-LABEL: length9_eq:
442 ; X64:       # %bb.0:
443 ; X64-NEXT:    movq (%rdi), %rax
444 ; X64-NEXT:    xorq (%rsi), %rax
445 ; X64-NEXT:    movzbl 8(%rdi), %ecx
446 ; X64-NEXT:    xorb 8(%rsi), %cl
447 ; X64-NEXT:    movzbl %cl, %ecx
448 ; X64-NEXT:    orq %rax, %rcx
449 ; X64-NEXT:    sete %al
450 ; X64-NEXT:    retq
451   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9) nounwind
452   %c = icmp eq i32 %m, 0
453   ret i1 %c
456 define i1 @length10_eq(ptr %X, ptr %Y) nounwind {
457 ; X64-LABEL: length10_eq:
458 ; X64:       # %bb.0:
459 ; X64-NEXT:    movq (%rdi), %rax
460 ; X64-NEXT:    xorq (%rsi), %rax
461 ; X64-NEXT:    movzwl 8(%rdi), %ecx
462 ; X64-NEXT:    xorw 8(%rsi), %cx
463 ; X64-NEXT:    movzwl %cx, %ecx
464 ; X64-NEXT:    orq %rax, %rcx
465 ; X64-NEXT:    sete %al
466 ; X64-NEXT:    retq
467   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 10) nounwind
468   %c = icmp eq i32 %m, 0
469   ret i1 %c
472 define i1 @length11_eq(ptr %X, ptr %Y) nounwind {
473 ; X64-LABEL: length11_eq:
474 ; X64:       # %bb.0:
475 ; X64-NEXT:    movq (%rdi), %rax
476 ; X64-NEXT:    movq 3(%rdi), %rcx
477 ; X64-NEXT:    xorq (%rsi), %rax
478 ; X64-NEXT:    xorq 3(%rsi), %rcx
479 ; X64-NEXT:    orq %rax, %rcx
480 ; X64-NEXT:    sete %al
481 ; X64-NEXT:    retq
482   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 11) nounwind
483   %c = icmp eq i32 %m, 0
484   ret i1 %c
487 define i1 @length12_eq(ptr %X, ptr %Y) nounwind {
488 ; X64-LABEL: length12_eq:
489 ; X64:       # %bb.0:
490 ; X64-NEXT:    movq (%rdi), %rax
491 ; X64-NEXT:    xorq (%rsi), %rax
492 ; X64-NEXT:    movl 8(%rdi), %ecx
493 ; X64-NEXT:    xorl 8(%rsi), %ecx
494 ; X64-NEXT:    orq %rax, %rcx
495 ; X64-NEXT:    setne %al
496 ; X64-NEXT:    retq
497   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind
498   %c = icmp ne i32 %m, 0
499   ret i1 %c
502 define i32 @length12(ptr %X, ptr %Y) nounwind {
503 ; X64-LABEL: length12:
504 ; X64:       # %bb.0:
505 ; X64-NEXT:    movq (%rdi), %rcx
506 ; X64-NEXT:    movq (%rsi), %rdx
507 ; X64-NEXT:    bswapq %rcx
508 ; X64-NEXT:    bswapq %rdx
509 ; X64-NEXT:    cmpq %rdx, %rcx
510 ; X64-NEXT:    jne .LBB29_2
511 ; X64-NEXT:  # %bb.1: # %loadbb1
512 ; X64-NEXT:    movl 8(%rdi), %ecx
513 ; X64-NEXT:    movl 8(%rsi), %edx
514 ; X64-NEXT:    bswapl %ecx
515 ; X64-NEXT:    bswapl %edx
516 ; X64-NEXT:    xorl %eax, %eax
517 ; X64-NEXT:    cmpq %rdx, %rcx
518 ; X64-NEXT:    je .LBB29_3
519 ; X64-NEXT:  .LBB29_2: # %res_block
520 ; X64-NEXT:    xorl %eax, %eax
521 ; X64-NEXT:    cmpq %rdx, %rcx
522 ; X64-NEXT:    sbbl %eax, %eax
523 ; X64-NEXT:    orl $1, %eax
524 ; X64-NEXT:  .LBB29_3: # %endblock
525 ; X64-NEXT:    retq
526   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 12) nounwind
527   ret i32 %m
530 define i1 @length13_eq(ptr %X, ptr %Y) nounwind {
531 ; X64-LABEL: length13_eq:
532 ; X64:       # %bb.0:
533 ; X64-NEXT:    movq (%rdi), %rax
534 ; X64-NEXT:    movq 5(%rdi), %rcx
535 ; X64-NEXT:    xorq (%rsi), %rax
536 ; X64-NEXT:    xorq 5(%rsi), %rcx
537 ; X64-NEXT:    orq %rax, %rcx
538 ; X64-NEXT:    sete %al
539 ; X64-NEXT:    retq
540   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 13) nounwind
541   %c = icmp eq i32 %m, 0
542   ret i1 %c
545 define i1 @length14_eq(ptr %X, ptr %Y) nounwind {
546 ; X64-LABEL: length14_eq:
547 ; X64:       # %bb.0:
548 ; X64-NEXT:    movq (%rdi), %rax
549 ; X64-NEXT:    movq 6(%rdi), %rcx
550 ; X64-NEXT:    xorq (%rsi), %rax
551 ; X64-NEXT:    xorq 6(%rsi), %rcx
552 ; X64-NEXT:    orq %rax, %rcx
553 ; X64-NEXT:    sete %al
554 ; X64-NEXT:    retq
555   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 14) nounwind
556   %c = icmp eq i32 %m, 0
557   ret i1 %c
560 define i1 @length15_eq(ptr %X, ptr %Y) nounwind {
561 ; X64-LABEL: length15_eq:
562 ; X64:       # %bb.0:
563 ; X64-NEXT:    movq (%rdi), %rax
564 ; X64-NEXT:    movq 7(%rdi), %rcx
565 ; X64-NEXT:    xorq (%rsi), %rax
566 ; X64-NEXT:    xorq 7(%rsi), %rcx
567 ; X64-NEXT:    orq %rax, %rcx
568 ; X64-NEXT:    sete %al
569 ; X64-NEXT:    retq
570   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 15) nounwind
571   %c = icmp eq i32 %m, 0
572   ret i1 %c
575 ; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329
577 define i32 @length16(ptr %X, ptr %Y) nounwind {
578 ; X64-LABEL: length16:
579 ; X64:       # %bb.0:
580 ; X64-NEXT:    movq (%rdi), %rcx
581 ; X64-NEXT:    movq (%rsi), %rdx
582 ; X64-NEXT:    bswapq %rcx
583 ; X64-NEXT:    bswapq %rdx
584 ; X64-NEXT:    cmpq %rdx, %rcx
585 ; X64-NEXT:    jne .LBB33_2
586 ; X64-NEXT:  # %bb.1: # %loadbb1
587 ; X64-NEXT:    movq 8(%rdi), %rcx
588 ; X64-NEXT:    movq 8(%rsi), %rdx
589 ; X64-NEXT:    bswapq %rcx
590 ; X64-NEXT:    bswapq %rdx
591 ; X64-NEXT:    xorl %eax, %eax
592 ; X64-NEXT:    cmpq %rdx, %rcx
593 ; X64-NEXT:    je .LBB33_3
594 ; X64-NEXT:  .LBB33_2: # %res_block
595 ; X64-NEXT:    xorl %eax, %eax
596 ; X64-NEXT:    cmpq %rdx, %rcx
597 ; X64-NEXT:    sbbl %eax, %eax
598 ; X64-NEXT:    orl $1, %eax
599 ; X64-NEXT:  .LBB33_3: # %endblock
600 ; X64-NEXT:    retq
601   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 16) nounwind
602   ret i32 %m
605 define i1 @length16_eq(ptr %x, ptr %y) nounwind {
606 ; X64-SSE2-LABEL: length16_eq:
607 ; X64-SSE2:       # %bb.0:
608 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
609 ; X64-SSE2-NEXT:    movdqu (%rsi), %xmm1
610 ; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
611 ; X64-SSE2-NEXT:    pmovmskb %xmm1, %eax
612 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
613 ; X64-SSE2-NEXT:    setne %al
614 ; X64-SSE2-NEXT:    retq
616 ; X64-SSE41-LABEL: length16_eq:
617 ; X64-SSE41:       # %bb.0:
618 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
619 ; X64-SSE41-NEXT:    movdqu (%rsi), %xmm1
620 ; X64-SSE41-NEXT:    pxor %xmm0, %xmm1
621 ; X64-SSE41-NEXT:    ptest %xmm1, %xmm1
622 ; X64-SSE41-NEXT:    setne %al
623 ; X64-SSE41-NEXT:    retq
625 ; X64-AVX-LABEL: length16_eq:
626 ; X64-AVX:       # %bb.0:
627 ; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
628 ; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
629 ; X64-AVX-NEXT:    vptest %xmm0, %xmm0
630 ; X64-AVX-NEXT:    setne %al
631 ; X64-AVX-NEXT:    retq
633 ; X64-MIC-AVX-LABEL: length16_eq:
634 ; X64-MIC-AVX:       # %bb.0:
635 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
636 ; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm1
637 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
638 ; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
639 ; X64-MIC-AVX-NEXT:    setne %al
640 ; X64-MIC-AVX-NEXT:    vzeroupper
641 ; X64-MIC-AVX-NEXT:    retq
642   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind
643   %cmp = icmp ne i32 %call, 0
644   ret i1 %cmp
647 define i1 @length16_lt(ptr %x, ptr %y) nounwind {
648 ; X64-LABEL: length16_lt:
649 ; X64:       # %bb.0:
650 ; X64-NEXT:    movq (%rdi), %rcx
651 ; X64-NEXT:    movq (%rsi), %rdx
652 ; X64-NEXT:    bswapq %rcx
653 ; X64-NEXT:    bswapq %rdx
654 ; X64-NEXT:    cmpq %rdx, %rcx
655 ; X64-NEXT:    jne .LBB35_2
656 ; X64-NEXT:  # %bb.1: # %loadbb1
657 ; X64-NEXT:    movq 8(%rdi), %rcx
658 ; X64-NEXT:    movq 8(%rsi), %rdx
659 ; X64-NEXT:    bswapq %rcx
660 ; X64-NEXT:    bswapq %rdx
661 ; X64-NEXT:    xorl %eax, %eax
662 ; X64-NEXT:    cmpq %rdx, %rcx
663 ; X64-NEXT:    je .LBB35_3
664 ; X64-NEXT:  .LBB35_2: # %res_block
665 ; X64-NEXT:    xorl %eax, %eax
666 ; X64-NEXT:    cmpq %rdx, %rcx
667 ; X64-NEXT:    sbbl %eax, %eax
668 ; X64-NEXT:    orl $1, %eax
669 ; X64-NEXT:  .LBB35_3: # %endblock
670 ; X64-NEXT:    shrl $31, %eax
671 ; X64-NEXT:    # kill: def $al killed $al killed $eax
672 ; X64-NEXT:    retq
673   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind
674   %cmp = icmp slt i32 %call, 0
675   ret i1 %cmp
678 define i1 @length16_gt(ptr %x, ptr %y) nounwind {
679 ; X64-LABEL: length16_gt:
680 ; X64:       # %bb.0:
681 ; X64-NEXT:    movq (%rdi), %rax
682 ; X64-NEXT:    movq (%rsi), %rcx
683 ; X64-NEXT:    bswapq %rax
684 ; X64-NEXT:    bswapq %rcx
685 ; X64-NEXT:    cmpq %rcx, %rax
686 ; X64-NEXT:    jne .LBB36_2
687 ; X64-NEXT:  # %bb.1: # %loadbb1
688 ; X64-NEXT:    movq 8(%rdi), %rax
689 ; X64-NEXT:    movq 8(%rsi), %rcx
690 ; X64-NEXT:    bswapq %rax
691 ; X64-NEXT:    bswapq %rcx
692 ; X64-NEXT:    xorl %edx, %edx
693 ; X64-NEXT:    cmpq %rcx, %rax
694 ; X64-NEXT:    je .LBB36_3
695 ; X64-NEXT:  .LBB36_2: # %res_block
696 ; X64-NEXT:    xorl %edx, %edx
697 ; X64-NEXT:    cmpq %rcx, %rax
698 ; X64-NEXT:    sbbl %edx, %edx
699 ; X64-NEXT:    orl $1, %edx
700 ; X64-NEXT:  .LBB36_3: # %endblock
701 ; X64-NEXT:    testl %edx, %edx
702 ; X64-NEXT:    setg %al
703 ; X64-NEXT:    retq
704   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 16) nounwind
705   %cmp = icmp sgt i32 %call, 0
706   ret i1 %cmp
709 define i1 @length16_eq_const(ptr %X) nounwind {
710 ; X64-SSE2-LABEL: length16_eq_const:
711 ; X64-SSE2:       # %bb.0:
712 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
713 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
714 ; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
715 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
716 ; X64-SSE2-NEXT:    sete %al
717 ; X64-SSE2-NEXT:    retq
719 ; X64-SSE41-LABEL: length16_eq_const:
720 ; X64-SSE41:       # %bb.0:
721 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
722 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
723 ; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
724 ; X64-SSE41-NEXT:    sete %al
725 ; X64-SSE41-NEXT:    retq
727 ; X64-AVX-LABEL: length16_eq_const:
728 ; X64-AVX:       # %bb.0:
729 ; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
730 ; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
731 ; X64-AVX-NEXT:    vptest %xmm0, %xmm0
732 ; X64-AVX-NEXT:    sete %al
733 ; X64-AVX-NEXT:    retq
735 ; X64-MIC-AVX-LABEL: length16_eq_const:
736 ; X64-MIC-AVX:       # %bb.0:
737 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
738 ; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
739 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
740 ; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
741 ; X64-MIC-AVX-NEXT:    sete %al
742 ; X64-MIC-AVX-NEXT:    vzeroupper
743 ; X64-MIC-AVX-NEXT:    retq
744   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 16) nounwind
745   %c = icmp eq i32 %m, 0
746   ret i1 %c
749 ; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914
751 define i32 @length24(ptr %X, ptr %Y) nounwind {
752 ; X64-LABEL: length24:
753 ; X64:       # %bb.0:
754 ; X64-NEXT:    movq (%rdi), %rcx
755 ; X64-NEXT:    movq (%rsi), %rdx
756 ; X64-NEXT:    bswapq %rcx
757 ; X64-NEXT:    bswapq %rdx
758 ; X64-NEXT:    cmpq %rdx, %rcx
759 ; X64-NEXT:    jne .LBB38_3
760 ; X64-NEXT:  # %bb.1: # %loadbb1
761 ; X64-NEXT:    movq 8(%rdi), %rcx
762 ; X64-NEXT:    movq 8(%rsi), %rdx
763 ; X64-NEXT:    bswapq %rcx
764 ; X64-NEXT:    bswapq %rdx
765 ; X64-NEXT:    cmpq %rdx, %rcx
766 ; X64-NEXT:    jne .LBB38_3
767 ; X64-NEXT:  # %bb.2: # %loadbb2
768 ; X64-NEXT:    movq 16(%rdi), %rcx
769 ; X64-NEXT:    movq 16(%rsi), %rdx
770 ; X64-NEXT:    bswapq %rcx
771 ; X64-NEXT:    bswapq %rdx
772 ; X64-NEXT:    xorl %eax, %eax
773 ; X64-NEXT:    cmpq %rdx, %rcx
774 ; X64-NEXT:    je .LBB38_4
775 ; X64-NEXT:  .LBB38_3: # %res_block
776 ; X64-NEXT:    xorl %eax, %eax
777 ; X64-NEXT:    cmpq %rdx, %rcx
778 ; X64-NEXT:    sbbl %eax, %eax
779 ; X64-NEXT:    orl $1, %eax
780 ; X64-NEXT:  .LBB38_4: # %endblock
781 ; X64-NEXT:    retq
782   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 24) nounwind
783   ret i32 %m
786 define i1 @length24_eq(ptr %x, ptr %y) nounwind {
787 ; X64-SSE2-LABEL: length24_eq:
788 ; X64-SSE2:       # %bb.0:
789 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
790 ; X64-SSE2-NEXT:    movdqu (%rsi), %xmm1
791 ; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm1
792 ; X64-SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
793 ; X64-SSE2-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
794 ; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
795 ; X64-SSE2-NEXT:    pand %xmm1, %xmm2
796 ; X64-SSE2-NEXT:    pmovmskb %xmm2, %eax
797 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
798 ; X64-SSE2-NEXT:    sete %al
799 ; X64-SSE2-NEXT:    retq
801 ; X64-SSE41-LABEL: length24_eq:
802 ; X64-SSE41:       # %bb.0:
803 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
804 ; X64-SSE41-NEXT:    movdqu (%rsi), %xmm1
805 ; X64-SSE41-NEXT:    pxor %xmm0, %xmm1
806 ; X64-SSE41-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
807 ; X64-SSE41-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
808 ; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
809 ; X64-SSE41-NEXT:    por %xmm1, %xmm2
810 ; X64-SSE41-NEXT:    ptest %xmm2, %xmm2
811 ; X64-SSE41-NEXT:    sete %al
812 ; X64-SSE41-NEXT:    retq
814 ; X64-AVX-LABEL: length24_eq:
815 ; X64-AVX:       # %bb.0:
816 ; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
817 ; X64-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
818 ; X64-AVX-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero
819 ; X64-AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm1
820 ; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
821 ; X64-AVX-NEXT:    vpor %xmm0, %xmm1, %xmm0
822 ; X64-AVX-NEXT:    vptest %xmm0, %xmm0
823 ; X64-AVX-NEXT:    sete %al
824 ; X64-AVX-NEXT:    retq
826 ; X64-MIC-AVX-LABEL: length24_eq:
827 ; X64-MIC-AVX:       # %bb.0:
828 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
829 ; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm1
830 ; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero
831 ; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm3 = mem[0],zero
832 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm2, %k0
833 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
834 ; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
835 ; X64-MIC-AVX-NEXT:    sete %al
836 ; X64-MIC-AVX-NEXT:    vzeroupper
837 ; X64-MIC-AVX-NEXT:    retq
838   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind
839   %cmp = icmp eq i32 %call, 0
840   ret i1 %cmp
843 define i1 @length24_lt(ptr %x, ptr %y) nounwind {
844 ; X64-LABEL: length24_lt:
845 ; X64:       # %bb.0:
846 ; X64-NEXT:    movq (%rdi), %rcx
847 ; X64-NEXT:    movq (%rsi), %rdx
848 ; X64-NEXT:    bswapq %rcx
849 ; X64-NEXT:    bswapq %rdx
850 ; X64-NEXT:    cmpq %rdx, %rcx
851 ; X64-NEXT:    jne .LBB40_3
852 ; X64-NEXT:  # %bb.1: # %loadbb1
853 ; X64-NEXT:    movq 8(%rdi), %rcx
854 ; X64-NEXT:    movq 8(%rsi), %rdx
855 ; X64-NEXT:    bswapq %rcx
856 ; X64-NEXT:    bswapq %rdx
857 ; X64-NEXT:    cmpq %rdx, %rcx
858 ; X64-NEXT:    jne .LBB40_3
859 ; X64-NEXT:  # %bb.2: # %loadbb2
860 ; X64-NEXT:    movq 16(%rdi), %rcx
861 ; X64-NEXT:    movq 16(%rsi), %rdx
862 ; X64-NEXT:    bswapq %rcx
863 ; X64-NEXT:    bswapq %rdx
864 ; X64-NEXT:    xorl %eax, %eax
865 ; X64-NEXT:    cmpq %rdx, %rcx
866 ; X64-NEXT:    je .LBB40_4
867 ; X64-NEXT:  .LBB40_3: # %res_block
868 ; X64-NEXT:    xorl %eax, %eax
869 ; X64-NEXT:    cmpq %rdx, %rcx
870 ; X64-NEXT:    sbbl %eax, %eax
871 ; X64-NEXT:    orl $1, %eax
872 ; X64-NEXT:  .LBB40_4: # %endblock
873 ; X64-NEXT:    shrl $31, %eax
874 ; X64-NEXT:    # kill: def $al killed $al killed $eax
875 ; X64-NEXT:    retq
876   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind
877   %cmp = icmp slt i32 %call, 0
878   ret i1 %cmp
881 define i1 @length24_gt(ptr %x, ptr %y) nounwind {
882 ; X64-LABEL: length24_gt:
883 ; X64:       # %bb.0:
884 ; X64-NEXT:    movq (%rdi), %rax
885 ; X64-NEXT:    movq (%rsi), %rcx
886 ; X64-NEXT:    bswapq %rax
887 ; X64-NEXT:    bswapq %rcx
888 ; X64-NEXT:    cmpq %rcx, %rax
889 ; X64-NEXT:    jne .LBB41_3
890 ; X64-NEXT:  # %bb.1: # %loadbb1
891 ; X64-NEXT:    movq 8(%rdi), %rax
892 ; X64-NEXT:    movq 8(%rsi), %rcx
893 ; X64-NEXT:    bswapq %rax
894 ; X64-NEXT:    bswapq %rcx
895 ; X64-NEXT:    cmpq %rcx, %rax
896 ; X64-NEXT:    jne .LBB41_3
897 ; X64-NEXT:  # %bb.2: # %loadbb2
898 ; X64-NEXT:    movq 16(%rdi), %rax
899 ; X64-NEXT:    movq 16(%rsi), %rcx
900 ; X64-NEXT:    bswapq %rax
901 ; X64-NEXT:    bswapq %rcx
902 ; X64-NEXT:    xorl %edx, %edx
903 ; X64-NEXT:    cmpq %rcx, %rax
904 ; X64-NEXT:    je .LBB41_4
905 ; X64-NEXT:  .LBB41_3: # %res_block
906 ; X64-NEXT:    xorl %edx, %edx
907 ; X64-NEXT:    cmpq %rcx, %rax
908 ; X64-NEXT:    sbbl %edx, %edx
909 ; X64-NEXT:    orl $1, %edx
910 ; X64-NEXT:  .LBB41_4: # %endblock
911 ; X64-NEXT:    testl %edx, %edx
912 ; X64-NEXT:    setg %al
913 ; X64-NEXT:    retq
914   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 24) nounwind
915   %cmp = icmp sgt i32 %call, 0
916   ret i1 %cmp
919 define i1 @length24_eq_const(ptr %X) nounwind {
920 ; X64-SSE2-LABEL: length24_eq_const:
921 ; X64-SSE2:       # %bb.0:
922 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
923 ; X64-SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
924 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
925 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
926 ; X64-SSE2-NEXT:    pand %xmm1, %xmm0
927 ; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
928 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
929 ; X64-SSE2-NEXT:    setne %al
930 ; X64-SSE2-NEXT:    retq
932 ; X64-SSE41-LABEL: length24_eq_const:
933 ; X64-SSE41:       # %bb.0:
934 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
935 ; X64-SSE41-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
936 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
937 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
938 ; X64-SSE41-NEXT:    por %xmm1, %xmm0
939 ; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
940 ; X64-SSE41-NEXT:    setne %al
941 ; X64-SSE41-NEXT:    retq
943 ; X64-AVX-LABEL: length24_eq_const:
944 ; X64-AVX:       # %bb.0:
945 ; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
946 ; X64-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
947 ; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
948 ; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
949 ; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
950 ; X64-AVX-NEXT:    vptest %xmm0, %xmm0
951 ; X64-AVX-NEXT:    setne %al
952 ; X64-AVX-NEXT:    retq
954 ; X64-MIC-AVX-LABEL: length24_eq_const:
955 ; X64-MIC-AVX:       # %bb.0:
956 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
957 ; X64-MIC-AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero
958 ; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [959985462,858927408,0,0]
959 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
960 ; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
961 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
962 ; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
963 ; X64-MIC-AVX-NEXT:    setne %al
964 ; X64-MIC-AVX-NEXT:    vzeroupper
965 ; X64-MIC-AVX-NEXT:    retq
966   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 24) nounwind
967   %c = icmp ne i32 %m, 0
968   ret i1 %c
971 define i32 @length31(ptr %X, ptr %Y) nounwind {
972 ; X64-LABEL: length31:
973 ; X64:       # %bb.0:
974 ; X64-NEXT:    movq (%rdi), %rcx
975 ; X64-NEXT:    movq (%rsi), %rdx
976 ; X64-NEXT:    bswapq %rcx
977 ; X64-NEXT:    bswapq %rdx
978 ; X64-NEXT:    cmpq %rdx, %rcx
979 ; X64-NEXT:    jne .LBB43_4
980 ; X64-NEXT:  # %bb.1: # %loadbb1
981 ; X64-NEXT:    movq 8(%rdi), %rcx
982 ; X64-NEXT:    movq 8(%rsi), %rdx
983 ; X64-NEXT:    bswapq %rcx
984 ; X64-NEXT:    bswapq %rdx
985 ; X64-NEXT:    cmpq %rdx, %rcx
986 ; X64-NEXT:    jne .LBB43_4
987 ; X64-NEXT:  # %bb.2: # %loadbb2
988 ; X64-NEXT:    movq 16(%rdi), %rcx
989 ; X64-NEXT:    movq 16(%rsi), %rdx
990 ; X64-NEXT:    bswapq %rcx
991 ; X64-NEXT:    bswapq %rdx
992 ; X64-NEXT:    cmpq %rdx, %rcx
993 ; X64-NEXT:    jne .LBB43_4
994 ; X64-NEXT:  # %bb.3: # %loadbb3
995 ; X64-NEXT:    movq 23(%rdi), %rcx
996 ; X64-NEXT:    movq 23(%rsi), %rdx
997 ; X64-NEXT:    bswapq %rcx
998 ; X64-NEXT:    bswapq %rdx
999 ; X64-NEXT:    xorl %eax, %eax
1000 ; X64-NEXT:    cmpq %rdx, %rcx
1001 ; X64-NEXT:    je .LBB43_5
1002 ; X64-NEXT:  .LBB43_4: # %res_block
1003 ; X64-NEXT:    xorl %eax, %eax
1004 ; X64-NEXT:    cmpq %rdx, %rcx
1005 ; X64-NEXT:    sbbl %eax, %eax
1006 ; X64-NEXT:    orl $1, %eax
1007 ; X64-NEXT:  .LBB43_5: # %endblock
1008 ; X64-NEXT:    retq
1009   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 31) nounwind
1010   ret i32 %m
1013 define i1 @length31_eq(ptr %x, ptr %y) nounwind {
1014 ; X64-SSE2-LABEL: length31_eq:
1015 ; X64-SSE2:       # %bb.0:
1016 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1017 ; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm1
1018 ; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
1019 ; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1020 ; X64-SSE2-NEXT:    movdqu 15(%rsi), %xmm0
1021 ; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1022 ; X64-SSE2-NEXT:    pand %xmm2, %xmm0
1023 ; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1024 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1025 ; X64-SSE2-NEXT:    sete %al
1026 ; X64-SSE2-NEXT:    retq
1028 ; X64-SSE41-LABEL: length31_eq:
1029 ; X64-SSE41:       # %bb.0:
1030 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1031 ; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm1
1032 ; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
1033 ; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
1034 ; X64-SSE41-NEXT:    movdqu 15(%rsi), %xmm0
1035 ; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
1036 ; X64-SSE41-NEXT:    por %xmm2, %xmm0
1037 ; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1038 ; X64-SSE41-NEXT:    sete %al
1039 ; X64-SSE41-NEXT:    retq
1041 ; X64-AVX-LABEL: length31_eq:
1042 ; X64-AVX:       # %bb.0:
1043 ; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1044 ; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
1045 ; X64-AVX-NEXT:    vpxor 15(%rsi), %xmm1, %xmm1
1046 ; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
1047 ; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1048 ; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1049 ; X64-AVX-NEXT:    sete %al
1050 ; X64-AVX-NEXT:    retq
1052 ; X64-MIC-AVX-LABEL: length31_eq:
1053 ; X64-MIC-AVX:       # %bb.0:
1054 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1055 ; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
1056 ; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm2
1057 ; X64-MIC-AVX-NEXT:    vmovdqu 15(%rsi), %xmm3
1058 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
1059 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
1060 ; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1061 ; X64-MIC-AVX-NEXT:    sete %al
1062 ; X64-MIC-AVX-NEXT:    vzeroupper
1063 ; X64-MIC-AVX-NEXT:    retq
1064   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind
1065   %cmp = icmp eq i32 %call, 0
1066   ret i1 %cmp
1069 define i1 @length31_lt(ptr %x, ptr %y) nounwind {
1070 ; X64-LABEL: length31_lt:
1071 ; X64:       # %bb.0:
1072 ; X64-NEXT:    movq (%rdi), %rcx
1073 ; X64-NEXT:    movq (%rsi), %rdx
1074 ; X64-NEXT:    bswapq %rcx
1075 ; X64-NEXT:    bswapq %rdx
1076 ; X64-NEXT:    cmpq %rdx, %rcx
1077 ; X64-NEXT:    jne .LBB45_4
1078 ; X64-NEXT:  # %bb.1: # %loadbb1
1079 ; X64-NEXT:    movq 8(%rdi), %rcx
1080 ; X64-NEXT:    movq 8(%rsi), %rdx
1081 ; X64-NEXT:    bswapq %rcx
1082 ; X64-NEXT:    bswapq %rdx
1083 ; X64-NEXT:    cmpq %rdx, %rcx
1084 ; X64-NEXT:    jne .LBB45_4
1085 ; X64-NEXT:  # %bb.2: # %loadbb2
1086 ; X64-NEXT:    movq 16(%rdi), %rcx
1087 ; X64-NEXT:    movq 16(%rsi), %rdx
1088 ; X64-NEXT:    bswapq %rcx
1089 ; X64-NEXT:    bswapq %rdx
1090 ; X64-NEXT:    cmpq %rdx, %rcx
1091 ; X64-NEXT:    jne .LBB45_4
1092 ; X64-NEXT:  # %bb.3: # %loadbb3
1093 ; X64-NEXT:    movq 23(%rdi), %rcx
1094 ; X64-NEXT:    movq 23(%rsi), %rdx
1095 ; X64-NEXT:    bswapq %rcx
1096 ; X64-NEXT:    bswapq %rdx
1097 ; X64-NEXT:    xorl %eax, %eax
1098 ; X64-NEXT:    cmpq %rdx, %rcx
1099 ; X64-NEXT:    je .LBB45_5
1100 ; X64-NEXT:  .LBB45_4: # %res_block
1101 ; X64-NEXT:    xorl %eax, %eax
1102 ; X64-NEXT:    cmpq %rdx, %rcx
1103 ; X64-NEXT:    sbbl %eax, %eax
1104 ; X64-NEXT:    orl $1, %eax
1105 ; X64-NEXT:  .LBB45_5: # %endblock
1106 ; X64-NEXT:    shrl $31, %eax
1107 ; X64-NEXT:    # kill: def $al killed $al killed $eax
1108 ; X64-NEXT:    retq
1109   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind
1110   %cmp = icmp slt i32 %call, 0
1111   ret i1 %cmp
1114 define i1 @length31_gt(ptr %x, ptr %y) nounwind {
1115 ; X64-LABEL: length31_gt:
1116 ; X64:       # %bb.0:
1117 ; X64-NEXT:    movq (%rdi), %rax
1118 ; X64-NEXT:    movq (%rsi), %rcx
1119 ; X64-NEXT:    bswapq %rax
1120 ; X64-NEXT:    bswapq %rcx
1121 ; X64-NEXT:    cmpq %rcx, %rax
1122 ; X64-NEXT:    jne .LBB46_4
1123 ; X64-NEXT:  # %bb.1: # %loadbb1
1124 ; X64-NEXT:    movq 8(%rdi), %rax
1125 ; X64-NEXT:    movq 8(%rsi), %rcx
1126 ; X64-NEXT:    bswapq %rax
1127 ; X64-NEXT:    bswapq %rcx
1128 ; X64-NEXT:    cmpq %rcx, %rax
1129 ; X64-NEXT:    jne .LBB46_4
1130 ; X64-NEXT:  # %bb.2: # %loadbb2
1131 ; X64-NEXT:    movq 16(%rdi), %rax
1132 ; X64-NEXT:    movq 16(%rsi), %rcx
1133 ; X64-NEXT:    bswapq %rax
1134 ; X64-NEXT:    bswapq %rcx
1135 ; X64-NEXT:    cmpq %rcx, %rax
1136 ; X64-NEXT:    jne .LBB46_4
1137 ; X64-NEXT:  # %bb.3: # %loadbb3
1138 ; X64-NEXT:    movq 23(%rdi), %rax
1139 ; X64-NEXT:    movq 23(%rsi), %rcx
1140 ; X64-NEXT:    bswapq %rax
1141 ; X64-NEXT:    bswapq %rcx
1142 ; X64-NEXT:    xorl %edx, %edx
1143 ; X64-NEXT:    cmpq %rcx, %rax
1144 ; X64-NEXT:    je .LBB46_5
1145 ; X64-NEXT:  .LBB46_4: # %res_block
1146 ; X64-NEXT:    xorl %edx, %edx
1147 ; X64-NEXT:    cmpq %rcx, %rax
1148 ; X64-NEXT:    sbbl %edx, %edx
1149 ; X64-NEXT:    orl $1, %edx
1150 ; X64-NEXT:  .LBB46_5: # %endblock
1151 ; X64-NEXT:    testl %edx, %edx
1152 ; X64-NEXT:    setg %al
1153 ; X64-NEXT:    retq
1154   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind
1155   %cmp = icmp sgt i32 %call, 0
1156   ret i1 %cmp
1159 define i1 @length31_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1160 ; X64-SSE2-LABEL: length31_eq_prefer128:
1161 ; X64-SSE2:       # %bb.0:
1162 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1163 ; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm1
1164 ; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
1165 ; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1166 ; X64-SSE2-NEXT:    movdqu 15(%rsi), %xmm0
1167 ; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1168 ; X64-SSE2-NEXT:    pand %xmm2, %xmm0
1169 ; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1170 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1171 ; X64-SSE2-NEXT:    sete %al
1172 ; X64-SSE2-NEXT:    retq
1174 ; X64-SSE41-LABEL: length31_eq_prefer128:
1175 ; X64-SSE41:       # %bb.0:
1176 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1177 ; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm1
1178 ; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
1179 ; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
1180 ; X64-SSE41-NEXT:    movdqu 15(%rsi), %xmm0
1181 ; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
1182 ; X64-SSE41-NEXT:    por %xmm2, %xmm0
1183 ; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1184 ; X64-SSE41-NEXT:    sete %al
1185 ; X64-SSE41-NEXT:    retq
1187 ; X64-AVX-LABEL: length31_eq_prefer128:
1188 ; X64-AVX:       # %bb.0:
1189 ; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1190 ; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
1191 ; X64-AVX-NEXT:    vpxor 15(%rsi), %xmm1, %xmm1
1192 ; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
1193 ; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1194 ; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1195 ; X64-AVX-NEXT:    sete %al
1196 ; X64-AVX-NEXT:    retq
1198 ; X64-MIC-AVX-LABEL: length31_eq_prefer128:
1199 ; X64-MIC-AVX:       # %bb.0:
1200 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1201 ; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
1202 ; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm2
1203 ; X64-MIC-AVX-NEXT:    vmovdqu 15(%rsi), %xmm3
1204 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
1205 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
1206 ; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1207 ; X64-MIC-AVX-NEXT:    sete %al
1208 ; X64-MIC-AVX-NEXT:    vzeroupper
1209 ; X64-MIC-AVX-NEXT:    retq
1210   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 31) nounwind
1211   %cmp = icmp eq i32 %call, 0
1212   ret i1 %cmp
1215 define i1 @length31_eq_const(ptr %X) nounwind {
1216 ; X64-SSE2-LABEL: length31_eq_const:
1217 ; X64-SSE2:       # %bb.0:
1218 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1219 ; X64-SSE2-NEXT:    movdqu 15(%rdi), %xmm1
1220 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1221 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1222 ; X64-SSE2-NEXT:    pand %xmm1, %xmm0
1223 ; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1224 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1225 ; X64-SSE2-NEXT:    setne %al
1226 ; X64-SSE2-NEXT:    retq
1228 ; X64-SSE41-LABEL: length31_eq_const:
1229 ; X64-SSE41:       # %bb.0:
1230 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1231 ; X64-SSE41-NEXT:    movdqu 15(%rdi), %xmm1
1232 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1233 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1234 ; X64-SSE41-NEXT:    por %xmm1, %xmm0
1235 ; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1236 ; X64-SSE41-NEXT:    setne %al
1237 ; X64-SSE41-NEXT:    retq
1239 ; X64-AVX-LABEL: length31_eq_const:
1240 ; X64-AVX:       # %bb.0:
1241 ; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1242 ; X64-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
1243 ; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1244 ; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1245 ; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1246 ; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1247 ; X64-AVX-NEXT:    setne %al
1248 ; X64-AVX-NEXT:    retq
1250 ; X64-MIC-AVX-LABEL: length31_eq_const:
1251 ; X64-MIC-AVX:       # %bb.0:
1252 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1253 ; X64-MIC-AVX-NEXT:    vmovdqu 15(%rdi), %xmm1
1254 ; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [943142453,842084409,909456435,809056311]
1255 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
1256 ; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426]
1257 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
1258 ; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1259 ; X64-MIC-AVX-NEXT:    setne %al
1260 ; X64-MIC-AVX-NEXT:    vzeroupper
1261 ; X64-MIC-AVX-NEXT:    retq
1262   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 31) nounwind
1263   %c = icmp ne i32 %m, 0
1264   ret i1 %c
1267 define i32 @length32(ptr %X, ptr %Y) nounwind {
1268 ; X64-LABEL: length32:
1269 ; X64:       # %bb.0:
1270 ; X64-NEXT:    movq (%rdi), %rcx
1271 ; X64-NEXT:    movq (%rsi), %rdx
1272 ; X64-NEXT:    bswapq %rcx
1273 ; X64-NEXT:    bswapq %rdx
1274 ; X64-NEXT:    cmpq %rdx, %rcx
1275 ; X64-NEXT:    jne .LBB49_4
1276 ; X64-NEXT:  # %bb.1: # %loadbb1
1277 ; X64-NEXT:    movq 8(%rdi), %rcx
1278 ; X64-NEXT:    movq 8(%rsi), %rdx
1279 ; X64-NEXT:    bswapq %rcx
1280 ; X64-NEXT:    bswapq %rdx
1281 ; X64-NEXT:    cmpq %rdx, %rcx
1282 ; X64-NEXT:    jne .LBB49_4
1283 ; X64-NEXT:  # %bb.2: # %loadbb2
1284 ; X64-NEXT:    movq 16(%rdi), %rcx
1285 ; X64-NEXT:    movq 16(%rsi), %rdx
1286 ; X64-NEXT:    bswapq %rcx
1287 ; X64-NEXT:    bswapq %rdx
1288 ; X64-NEXT:    cmpq %rdx, %rcx
1289 ; X64-NEXT:    jne .LBB49_4
1290 ; X64-NEXT:  # %bb.3: # %loadbb3
1291 ; X64-NEXT:    movq 24(%rdi), %rcx
1292 ; X64-NEXT:    movq 24(%rsi), %rdx
1293 ; X64-NEXT:    bswapq %rcx
1294 ; X64-NEXT:    bswapq %rdx
1295 ; X64-NEXT:    xorl %eax, %eax
1296 ; X64-NEXT:    cmpq %rdx, %rcx
1297 ; X64-NEXT:    je .LBB49_5
1298 ; X64-NEXT:  .LBB49_4: # %res_block
1299 ; X64-NEXT:    xorl %eax, %eax
1300 ; X64-NEXT:    cmpq %rdx, %rcx
1301 ; X64-NEXT:    sbbl %eax, %eax
1302 ; X64-NEXT:    orl $1, %eax
1303 ; X64-NEXT:  .LBB49_5: # %endblock
1304 ; X64-NEXT:    retq
1305   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 32) nounwind
1306   ret i32 %m
1309 ; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=33325
1311 define i1 @length32_eq(ptr %x, ptr %y) nounwind {
1312 ; X64-SSE2-LABEL: length32_eq:
1313 ; X64-SSE2:       # %bb.0:
1314 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1315 ; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
1316 ; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
1317 ; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1318 ; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
1319 ; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1320 ; X64-SSE2-NEXT:    pand %xmm2, %xmm0
1321 ; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1322 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1323 ; X64-SSE2-NEXT:    sete %al
1324 ; X64-SSE2-NEXT:    retq
1326 ; X64-SSE41-LABEL: length32_eq:
1327 ; X64-SSE41:       # %bb.0:
1328 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1329 ; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
1330 ; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
1331 ; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
1332 ; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
1333 ; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
1334 ; X64-SSE41-NEXT:    por %xmm2, %xmm0
1335 ; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1336 ; X64-SSE41-NEXT:    sete %al
1337 ; X64-SSE41-NEXT:    retq
1339 ; X64-AVX1-LABEL: length32_eq:
1340 ; X64-AVX1:       # %bb.0:
1341 ; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
1342 ; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
1343 ; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
1344 ; X64-AVX1-NEXT:    sete %al
1345 ; X64-AVX1-NEXT:    vzeroupper
1346 ; X64-AVX1-NEXT:    retq
1348 ; X64-AVX2-LABEL: length32_eq:
1349 ; X64-AVX2:       # %bb.0:
1350 ; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1351 ; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1352 ; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
1353 ; X64-AVX2-NEXT:    sete %al
1354 ; X64-AVX2-NEXT:    vzeroupper
1355 ; X64-AVX2-NEXT:    retq
1357 ; X64-AVX512-LABEL: length32_eq:
1358 ; X64-AVX512:       # %bb.0:
1359 ; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
1360 ; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1361 ; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
1362 ; X64-AVX512-NEXT:    sete %al
1363 ; X64-AVX512-NEXT:    vzeroupper
1364 ; X64-AVX512-NEXT:    retq
1366 ; X64-MIC-AVX-LABEL: length32_eq:
1367 ; X64-MIC-AVX:       # %bb.0:
1368 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
1369 ; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm1
1370 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
1371 ; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
1372 ; X64-MIC-AVX-NEXT:    sete %al
1373 ; X64-MIC-AVX-NEXT:    vzeroupper
1374 ; X64-MIC-AVX-NEXT:    retq
1375   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind
1376   %cmp = icmp eq i32 %call, 0
1377   ret i1 %cmp
1380 define i1 @length32_lt(ptr %x, ptr %y) nounwind {
1381 ; X64-LABEL: length32_lt:
1382 ; X64:       # %bb.0:
1383 ; X64-NEXT:    movq (%rdi), %rcx
1384 ; X64-NEXT:    movq (%rsi), %rdx
1385 ; X64-NEXT:    bswapq %rcx
1386 ; X64-NEXT:    bswapq %rdx
1387 ; X64-NEXT:    cmpq %rdx, %rcx
1388 ; X64-NEXT:    jne .LBB51_4
1389 ; X64-NEXT:  # %bb.1: # %loadbb1
1390 ; X64-NEXT:    movq 8(%rdi), %rcx
1391 ; X64-NEXT:    movq 8(%rsi), %rdx
1392 ; X64-NEXT:    bswapq %rcx
1393 ; X64-NEXT:    bswapq %rdx
1394 ; X64-NEXT:    cmpq %rdx, %rcx
1395 ; X64-NEXT:    jne .LBB51_4
1396 ; X64-NEXT:  # %bb.2: # %loadbb2
1397 ; X64-NEXT:    movq 16(%rdi), %rcx
1398 ; X64-NEXT:    movq 16(%rsi), %rdx
1399 ; X64-NEXT:    bswapq %rcx
1400 ; X64-NEXT:    bswapq %rdx
1401 ; X64-NEXT:    cmpq %rdx, %rcx
1402 ; X64-NEXT:    jne .LBB51_4
1403 ; X64-NEXT:  # %bb.3: # %loadbb3
1404 ; X64-NEXT:    movq 24(%rdi), %rcx
1405 ; X64-NEXT:    movq 24(%rsi), %rdx
1406 ; X64-NEXT:    bswapq %rcx
1407 ; X64-NEXT:    bswapq %rdx
1408 ; X64-NEXT:    xorl %eax, %eax
1409 ; X64-NEXT:    cmpq %rdx, %rcx
1410 ; X64-NEXT:    je .LBB51_5
1411 ; X64-NEXT:  .LBB51_4: # %res_block
1412 ; X64-NEXT:    xorl %eax, %eax
1413 ; X64-NEXT:    cmpq %rdx, %rcx
1414 ; X64-NEXT:    sbbl %eax, %eax
1415 ; X64-NEXT:    orl $1, %eax
1416 ; X64-NEXT:  .LBB51_5: # %endblock
1417 ; X64-NEXT:    shrl $31, %eax
1418 ; X64-NEXT:    # kill: def $al killed $al killed $eax
1419 ; X64-NEXT:    retq
1420   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind
1421   %cmp = icmp slt i32 %call, 0
1422   ret i1 %cmp
1425 define i1 @length32_gt(ptr %x, ptr %y) nounwind {
1426 ; X64-LABEL: length32_gt:
1427 ; X64:       # %bb.0:
1428 ; X64-NEXT:    movq (%rdi), %rax
1429 ; X64-NEXT:    movq (%rsi), %rcx
1430 ; X64-NEXT:    bswapq %rax
1431 ; X64-NEXT:    bswapq %rcx
1432 ; X64-NEXT:    cmpq %rcx, %rax
1433 ; X64-NEXT:    jne .LBB52_4
1434 ; X64-NEXT:  # %bb.1: # %loadbb1
1435 ; X64-NEXT:    movq 8(%rdi), %rax
1436 ; X64-NEXT:    movq 8(%rsi), %rcx
1437 ; X64-NEXT:    bswapq %rax
1438 ; X64-NEXT:    bswapq %rcx
1439 ; X64-NEXT:    cmpq %rcx, %rax
1440 ; X64-NEXT:    jne .LBB52_4
1441 ; X64-NEXT:  # %bb.2: # %loadbb2
1442 ; X64-NEXT:    movq 16(%rdi), %rax
1443 ; X64-NEXT:    movq 16(%rsi), %rcx
1444 ; X64-NEXT:    bswapq %rax
1445 ; X64-NEXT:    bswapq %rcx
1446 ; X64-NEXT:    cmpq %rcx, %rax
1447 ; X64-NEXT:    jne .LBB52_4
1448 ; X64-NEXT:  # %bb.3: # %loadbb3
1449 ; X64-NEXT:    movq 24(%rdi), %rax
1450 ; X64-NEXT:    movq 24(%rsi), %rcx
1451 ; X64-NEXT:    bswapq %rax
1452 ; X64-NEXT:    bswapq %rcx
1453 ; X64-NEXT:    xorl %edx, %edx
1454 ; X64-NEXT:    cmpq %rcx, %rax
1455 ; X64-NEXT:    je .LBB52_5
1456 ; X64-NEXT:  .LBB52_4: # %res_block
1457 ; X64-NEXT:    xorl %edx, %edx
1458 ; X64-NEXT:    cmpq %rcx, %rax
1459 ; X64-NEXT:    sbbl %edx, %edx
1460 ; X64-NEXT:    orl $1, %edx
1461 ; X64-NEXT:  .LBB52_5: # %endblock
1462 ; X64-NEXT:    testl %edx, %edx
1463 ; X64-NEXT:    setg %al
1464 ; X64-NEXT:    retq
1465   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind
1466   %cmp = icmp sgt i32 %call, 0
1467   ret i1 %cmp
1470 define i1 @length32_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1471 ; X64-SSE2-LABEL: length32_eq_prefer128:
1472 ; X64-SSE2:       # %bb.0:
1473 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1474 ; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
1475 ; X64-SSE2-NEXT:    movdqu (%rsi), %xmm2
1476 ; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1477 ; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
1478 ; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1479 ; X64-SSE2-NEXT:    pand %xmm2, %xmm0
1480 ; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1481 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1482 ; X64-SSE2-NEXT:    sete %al
1483 ; X64-SSE2-NEXT:    retq
1485 ; X64-SSE41-LABEL: length32_eq_prefer128:
1486 ; X64-SSE41:       # %bb.0:
1487 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1488 ; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
1489 ; X64-SSE41-NEXT:    movdqu (%rsi), %xmm2
1490 ; X64-SSE41-NEXT:    pxor %xmm0, %xmm2
1491 ; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
1492 ; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
1493 ; X64-SSE41-NEXT:    por %xmm2, %xmm0
1494 ; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1495 ; X64-SSE41-NEXT:    sete %al
1496 ; X64-SSE41-NEXT:    retq
1498 ; X64-AVX-LABEL: length32_eq_prefer128:
1499 ; X64-AVX:       # %bb.0:
1500 ; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1501 ; X64-AVX-NEXT:    vmovdqu 16(%rdi), %xmm1
1502 ; X64-AVX-NEXT:    vpxor 16(%rsi), %xmm1, %xmm1
1503 ; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
1504 ; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1505 ; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1506 ; X64-AVX-NEXT:    sete %al
1507 ; X64-AVX-NEXT:    retq
1509 ; X64-MIC-AVX-LABEL: length32_eq_prefer128:
1510 ; X64-MIC-AVX:       # %bb.0:
1511 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1512 ; X64-MIC-AVX-NEXT:    vmovdqu 16(%rdi), %xmm1
1513 ; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm2
1514 ; X64-MIC-AVX-NEXT:    vmovdqu 16(%rsi), %xmm3
1515 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
1516 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
1517 ; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1518 ; X64-MIC-AVX-NEXT:    sete %al
1519 ; X64-MIC-AVX-NEXT:    vzeroupper
1520 ; X64-MIC-AVX-NEXT:    retq
1521   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 32) nounwind
1522   %cmp = icmp eq i32 %call, 0
1523   ret i1 %cmp
1526 define i1 @length32_eq_const(ptr %X) nounwind {
1527 ; X64-SSE2-LABEL: length32_eq_const:
1528 ; X64-SSE2:       # %bb.0:
1529 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1530 ; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
1531 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1532 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1533 ; X64-SSE2-NEXT:    pand %xmm1, %xmm0
1534 ; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
1535 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1536 ; X64-SSE2-NEXT:    setne %al
1537 ; X64-SSE2-NEXT:    retq
1539 ; X64-SSE41-LABEL: length32_eq_const:
1540 ; X64-SSE41:       # %bb.0:
1541 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1542 ; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
1543 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1544 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1545 ; X64-SSE41-NEXT:    por %xmm1, %xmm0
1546 ; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
1547 ; X64-SSE41-NEXT:    setne %al
1548 ; X64-SSE41-NEXT:    retq
1550 ; X64-AVX1-LABEL: length32_eq_const:
1551 ; X64-AVX1:       # %bb.0:
1552 ; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
1553 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1554 ; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
1555 ; X64-AVX1-NEXT:    setne %al
1556 ; X64-AVX1-NEXT:    vzeroupper
1557 ; X64-AVX1-NEXT:    retq
1559 ; X64-AVX2-LABEL: length32_eq_const:
1560 ; X64-AVX2:       # %bb.0:
1561 ; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1562 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1563 ; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
1564 ; X64-AVX2-NEXT:    setne %al
1565 ; X64-AVX2-NEXT:    vzeroupper
1566 ; X64-AVX2-NEXT:    retq
1568 ; X64-AVX512-LABEL: length32_eq_const:
1569 ; X64-AVX512:       # %bb.0:
1570 ; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
1571 ; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1572 ; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
1573 ; X64-AVX512-NEXT:    setne %al
1574 ; X64-AVX512-NEXT:    vzeroupper
1575 ; X64-AVX512-NEXT:    retq
1577 ; X64-MIC-AVX-LABEL: length32_eq_const:
1578 ; X64-MIC-AVX:       # %bb.0:
1579 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
1580 ; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
1581 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
1582 ; X64-MIC-AVX-NEXT:    kortestw %k0, %k0
1583 ; X64-MIC-AVX-NEXT:    setne %al
1584 ; X64-MIC-AVX-NEXT:    vzeroupper
1585 ; X64-MIC-AVX-NEXT:    retq
1586   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 32) nounwind
1587   %c = icmp ne i32 %m, 0
1588   ret i1 %c
1591 define i32 @length48(ptr %X, ptr %Y) nounwind {
1592 ; X64-LABEL: length48:
1593 ; X64:       # %bb.0:
1594 ; X64-NEXT:    movl $48, %edx
1595 ; X64-NEXT:    jmp memcmp # TAILCALL
1596   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 48) nounwind
1597   ret i32 %m
1600 define i1 @length48_eq(ptr %x, ptr %y) nounwind {
1601 ; X64-SSE2-LABEL: length48_eq:
1602 ; X64-SSE2:       # %bb.0:
1603 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1604 ; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
1605 ; X64-SSE2-NEXT:    movdqu 32(%rdi), %xmm2
1606 ; X64-SSE2-NEXT:    movdqu (%rsi), %xmm3
1607 ; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm3
1608 ; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
1609 ; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1610 ; X64-SSE2-NEXT:    pand %xmm3, %xmm0
1611 ; X64-SSE2-NEXT:    movdqu 32(%rsi), %xmm1
1612 ; X64-SSE2-NEXT:    pcmpeqb %xmm2, %xmm1
1613 ; X64-SSE2-NEXT:    pand %xmm0, %xmm1
1614 ; X64-SSE2-NEXT:    pmovmskb %xmm1, %eax
1615 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1616 ; X64-SSE2-NEXT:    sete %al
1617 ; X64-SSE2-NEXT:    retq
1619 ; X64-SSE41-LABEL: length48_eq:
1620 ; X64-SSE41:       # %bb.0:
1621 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1622 ; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
1623 ; X64-SSE41-NEXT:    movdqu 32(%rdi), %xmm2
1624 ; X64-SSE41-NEXT:    movdqu (%rsi), %xmm3
1625 ; X64-SSE41-NEXT:    pxor %xmm0, %xmm3
1626 ; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
1627 ; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
1628 ; X64-SSE41-NEXT:    por %xmm3, %xmm0
1629 ; X64-SSE41-NEXT:    movdqu 32(%rsi), %xmm1
1630 ; X64-SSE41-NEXT:    pxor %xmm2, %xmm1
1631 ; X64-SSE41-NEXT:    por %xmm0, %xmm1
1632 ; X64-SSE41-NEXT:    ptest %xmm1, %xmm1
1633 ; X64-SSE41-NEXT:    sete %al
1634 ; X64-SSE41-NEXT:    retq
1636 ; X64-AVX1-LABEL: length48_eq:
1637 ; X64-AVX1:       # %bb.0:
1638 ; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
1639 ; X64-AVX1-NEXT:    vmovups 32(%rdi), %xmm1
1640 ; X64-AVX1-NEXT:    vmovups 32(%rsi), %xmm2
1641 ; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
1642 ; X64-AVX1-NEXT:    vxorps %ymm2, %ymm1, %ymm1
1643 ; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1644 ; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
1645 ; X64-AVX1-NEXT:    sete %al
1646 ; X64-AVX1-NEXT:    vzeroupper
1647 ; X64-AVX1-NEXT:    retq
1649 ; X64-AVX2-LABEL: length48_eq:
1650 ; X64-AVX2:       # %bb.0:
1651 ; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1652 ; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %xmm1
1653 ; X64-AVX2-NEXT:    vmovdqu 32(%rsi), %xmm2
1654 ; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1655 ; X64-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
1656 ; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1657 ; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
1658 ; X64-AVX2-NEXT:    sete %al
1659 ; X64-AVX2-NEXT:    vzeroupper
1660 ; X64-AVX2-NEXT:    retq
1662 ; X64-AVX512-LABEL: length48_eq:
1663 ; X64-AVX512:       # %bb.0:
1664 ; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
1665 ; X64-AVX512-NEXT:    vmovdqu 32(%rdi), %xmm1
1666 ; X64-AVX512-NEXT:    vmovdqu 32(%rsi), %xmm2
1667 ; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1668 ; X64-AVX512-NEXT:    vpxor %ymm2, %ymm1, %ymm1
1669 ; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1670 ; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
1671 ; X64-AVX512-NEXT:    sete %al
1672 ; X64-AVX512-NEXT:    vzeroupper
1673 ; X64-AVX512-NEXT:    retq
1675 ; X64-MIC-AVX-LABEL: length48_eq:
1676 ; X64-MIC-AVX:       # %bb.0:
1677 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
1678 ; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm1
1679 ; X64-MIC-AVX-NEXT:    vmovdqu 32(%rdi), %xmm2
1680 ; X64-MIC-AVX-NEXT:    vmovdqu 32(%rsi), %xmm3
1681 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm2, %k0
1682 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
1683 ; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1684 ; X64-MIC-AVX-NEXT:    sete %al
1685 ; X64-MIC-AVX-NEXT:    vzeroupper
1686 ; X64-MIC-AVX-NEXT:    retq
1687   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind
1688   %cmp = icmp eq i32 %call, 0
1689   ret i1 %cmp
1692 define i1 @length48_lt(ptr %x, ptr %y) nounwind {
1693 ; X64-LABEL: length48_lt:
1694 ; X64:       # %bb.0:
1695 ; X64-NEXT:    pushq %rax
1696 ; X64-NEXT:    movl $48, %edx
1697 ; X64-NEXT:    callq memcmp
1698 ; X64-NEXT:    shrl $31, %eax
1699 ; X64-NEXT:    # kill: def $al killed $al killed $eax
1700 ; X64-NEXT:    popq %rcx
1701 ; X64-NEXT:    retq
1702   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind
1703   %cmp = icmp slt i32 %call, 0
1704   ret i1 %cmp
1707 define i1 @length48_gt(ptr %x, ptr %y) nounwind {
1708 ; X64-LABEL: length48_gt:
1709 ; X64:       # %bb.0:
1710 ; X64-NEXT:    pushq %rax
1711 ; X64-NEXT:    movl $48, %edx
1712 ; X64-NEXT:    callq memcmp
1713 ; X64-NEXT:    testl %eax, %eax
1714 ; X64-NEXT:    setg %al
1715 ; X64-NEXT:    popq %rcx
1716 ; X64-NEXT:    retq
1717   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind
1718   %cmp = icmp sgt i32 %call, 0
1719   ret i1 %cmp
1722 define i1 @length48_eq_prefer128(ptr %x, ptr %y) nounwind "prefer-vector-width"="128" {
1723 ; X64-SSE2-LABEL: length48_eq_prefer128:
1724 ; X64-SSE2:       # %bb.0:
1725 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1726 ; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
1727 ; X64-SSE2-NEXT:    movdqu 32(%rdi), %xmm2
1728 ; X64-SSE2-NEXT:    movdqu (%rsi), %xmm3
1729 ; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm3
1730 ; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
1731 ; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1732 ; X64-SSE2-NEXT:    pand %xmm3, %xmm0
1733 ; X64-SSE2-NEXT:    movdqu 32(%rsi), %xmm1
1734 ; X64-SSE2-NEXT:    pcmpeqb %xmm2, %xmm1
1735 ; X64-SSE2-NEXT:    pand %xmm0, %xmm1
1736 ; X64-SSE2-NEXT:    pmovmskb %xmm1, %eax
1737 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1738 ; X64-SSE2-NEXT:    sete %al
1739 ; X64-SSE2-NEXT:    retq
1741 ; X64-SSE41-LABEL: length48_eq_prefer128:
1742 ; X64-SSE41:       # %bb.0:
1743 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1744 ; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
1745 ; X64-SSE41-NEXT:    movdqu 32(%rdi), %xmm2
1746 ; X64-SSE41-NEXT:    movdqu (%rsi), %xmm3
1747 ; X64-SSE41-NEXT:    pxor %xmm0, %xmm3
1748 ; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
1749 ; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
1750 ; X64-SSE41-NEXT:    por %xmm3, %xmm0
1751 ; X64-SSE41-NEXT:    movdqu 32(%rsi), %xmm1
1752 ; X64-SSE41-NEXT:    pxor %xmm2, %xmm1
1753 ; X64-SSE41-NEXT:    por %xmm0, %xmm1
1754 ; X64-SSE41-NEXT:    ptest %xmm1, %xmm1
1755 ; X64-SSE41-NEXT:    sete %al
1756 ; X64-SSE41-NEXT:    retq
1758 ; X64-AVX-LABEL: length48_eq_prefer128:
1759 ; X64-AVX:       # %bb.0:
1760 ; X64-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1761 ; X64-AVX-NEXT:    vmovdqu 16(%rdi), %xmm1
1762 ; X64-AVX-NEXT:    vmovdqu 32(%rdi), %xmm2
1763 ; X64-AVX-NEXT:    vpxor 16(%rsi), %xmm1, %xmm1
1764 ; X64-AVX-NEXT:    vpxor (%rsi), %xmm0, %xmm0
1765 ; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1766 ; X64-AVX-NEXT:    vpxor 32(%rsi), %xmm2, %xmm1
1767 ; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1768 ; X64-AVX-NEXT:    vptest %xmm0, %xmm0
1769 ; X64-AVX-NEXT:    sete %al
1770 ; X64-AVX-NEXT:    retq
1772 ; X64-MIC-AVX-LABEL: length48_eq_prefer128:
1773 ; X64-MIC-AVX:       # %bb.0:
1774 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %xmm0
1775 ; X64-MIC-AVX-NEXT:    vmovdqu 16(%rdi), %xmm1
1776 ; X64-MIC-AVX-NEXT:    vmovdqu 32(%rdi), %xmm2
1777 ; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %xmm3
1778 ; X64-MIC-AVX-NEXT:    vmovdqu 16(%rsi), %xmm4
1779 ; X64-MIC-AVX-NEXT:    vmovdqu 32(%rsi), %xmm5
1780 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm4, %zmm1, %k0
1781 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm0, %k1
1782 ; X64-MIC-AVX-NEXT:    korw %k0, %k1, %k0
1783 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm5, %zmm2, %k1
1784 ; X64-MIC-AVX-NEXT:    kortestw %k1, %k0
1785 ; X64-MIC-AVX-NEXT:    sete %al
1786 ; X64-MIC-AVX-NEXT:    vzeroupper
1787 ; X64-MIC-AVX-NEXT:    retq
1788   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 48) nounwind
1789   %cmp = icmp eq i32 %call, 0
1790   ret i1 %cmp
1793 define i1 @length48_eq_const(ptr %X) nounwind {
1794 ; X64-SSE2-LABEL: length48_eq_const:
1795 ; X64-SSE2:       # %bb.0:
1796 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1797 ; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
1798 ; X64-SSE2-NEXT:    movdqu 32(%rdi), %xmm2
1799 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1800 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1801 ; X64-SSE2-NEXT:    pand %xmm1, %xmm0
1802 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1803 ; X64-SSE2-NEXT:    pand %xmm0, %xmm2
1804 ; X64-SSE2-NEXT:    pmovmskb %xmm2, %eax
1805 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1806 ; X64-SSE2-NEXT:    setne %al
1807 ; X64-SSE2-NEXT:    retq
1809 ; X64-SSE41-LABEL: length48_eq_const:
1810 ; X64-SSE41:       # %bb.0:
1811 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1812 ; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
1813 ; X64-SSE41-NEXT:    movdqu 32(%rdi), %xmm2
1814 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1815 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1816 ; X64-SSE41-NEXT:    por %xmm1, %xmm0
1817 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1818 ; X64-SSE41-NEXT:    por %xmm0, %xmm2
1819 ; X64-SSE41-NEXT:    ptest %xmm2, %xmm2
1820 ; X64-SSE41-NEXT:    setne %al
1821 ; X64-SSE41-NEXT:    retq
1823 ; X64-AVX1-LABEL: length48_eq_const:
1824 ; X64-AVX1:       # %bb.0:
1825 ; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
1826 ; X64-AVX1-NEXT:    vmovups 32(%rdi), %xmm1
1827 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1828 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1829 ; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1830 ; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
1831 ; X64-AVX1-NEXT:    setne %al
1832 ; X64-AVX1-NEXT:    vzeroupper
1833 ; X64-AVX1-NEXT:    retq
1835 ; X64-AVX2-LABEL: length48_eq_const:
1836 ; X64-AVX2:       # %bb.0:
1837 ; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1838 ; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %xmm1
1839 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1840 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1841 ; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1842 ; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
1843 ; X64-AVX2-NEXT:    setne %al
1844 ; X64-AVX2-NEXT:    vzeroupper
1845 ; X64-AVX2-NEXT:    retq
1847 ; X64-AVX512-LABEL: length48_eq_const:
1848 ; X64-AVX512:       # %bb.0:
1849 ; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
1850 ; X64-AVX512-NEXT:    vmovdqu 32(%rdi), %xmm1
1851 ; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1852 ; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1853 ; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1854 ; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
1855 ; X64-AVX512-NEXT:    setne %al
1856 ; X64-AVX512-NEXT:    vzeroupper
1857 ; X64-AVX512-NEXT:    retq
1859 ; X64-MIC-AVX-LABEL: length48_eq_const:
1860 ; X64-MIC-AVX:       # %bb.0:
1861 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
1862 ; X64-MIC-AVX-NEXT:    vmovdqu 32(%rdi), %xmm1
1863 ; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,0,0,0,0]
1864 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
1865 ; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
1866 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
1867 ; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1868 ; X64-MIC-AVX-NEXT:    setne %al
1869 ; X64-MIC-AVX-NEXT:    vzeroupper
1870 ; X64-MIC-AVX-NEXT:    retq
1871   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 48) nounwind
1872   %c = icmp ne i32 %m, 0
1873   ret i1 %c
1876 define i32 @length63(ptr %X, ptr %Y) nounwind {
1877 ; X64-LABEL: length63:
1878 ; X64:       # %bb.0:
1879 ; X64-NEXT:    movl $63, %edx
1880 ; X64-NEXT:    jmp memcmp # TAILCALL
1881   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 63) nounwind
1882   ret i32 %m
1885 define i1 @length63_eq(ptr %x, ptr %y) nounwind {
1886 ; X64-SSE2-LABEL: length63_eq:
1887 ; X64-SSE2:       # %bb.0:
1888 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
1889 ; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
1890 ; X64-SSE2-NEXT:    movdqu 32(%rdi), %xmm2
1891 ; X64-SSE2-NEXT:    movdqu 47(%rdi), %xmm3
1892 ; X64-SSE2-NEXT:    movdqu (%rsi), %xmm4
1893 ; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm4
1894 ; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
1895 ; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
1896 ; X64-SSE2-NEXT:    pand %xmm4, %xmm0
1897 ; X64-SSE2-NEXT:    movdqu 32(%rsi), %xmm1
1898 ; X64-SSE2-NEXT:    pcmpeqb %xmm2, %xmm1
1899 ; X64-SSE2-NEXT:    movdqu 47(%rsi), %xmm2
1900 ; X64-SSE2-NEXT:    pcmpeqb %xmm3, %xmm2
1901 ; X64-SSE2-NEXT:    pand %xmm1, %xmm2
1902 ; X64-SSE2-NEXT:    pand %xmm0, %xmm2
1903 ; X64-SSE2-NEXT:    pmovmskb %xmm2, %eax
1904 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
1905 ; X64-SSE2-NEXT:    setne %al
1906 ; X64-SSE2-NEXT:    retq
1908 ; X64-SSE41-LABEL: length63_eq:
1909 ; X64-SSE41:       # %bb.0:
1910 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
1911 ; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
1912 ; X64-SSE41-NEXT:    movdqu 32(%rdi), %xmm2
1913 ; X64-SSE41-NEXT:    movdqu 47(%rdi), %xmm3
1914 ; X64-SSE41-NEXT:    movdqu (%rsi), %xmm4
1915 ; X64-SSE41-NEXT:    pxor %xmm0, %xmm4
1916 ; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
1917 ; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
1918 ; X64-SSE41-NEXT:    por %xmm4, %xmm0
1919 ; X64-SSE41-NEXT:    movdqu 32(%rsi), %xmm1
1920 ; X64-SSE41-NEXT:    pxor %xmm2, %xmm1
1921 ; X64-SSE41-NEXT:    movdqu 47(%rsi), %xmm2
1922 ; X64-SSE41-NEXT:    pxor %xmm3, %xmm2
1923 ; X64-SSE41-NEXT:    por %xmm1, %xmm2
1924 ; X64-SSE41-NEXT:    por %xmm0, %xmm2
1925 ; X64-SSE41-NEXT:    ptest %xmm2, %xmm2
1926 ; X64-SSE41-NEXT:    setne %al
1927 ; X64-SSE41-NEXT:    retq
1929 ; X64-AVX1-LABEL: length63_eq:
1930 ; X64-AVX1:       # %bb.0:
1931 ; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
1932 ; X64-AVX1-NEXT:    vmovups 31(%rdi), %ymm1
1933 ; X64-AVX1-NEXT:    vxorps 31(%rsi), %ymm1, %ymm1
1934 ; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
1935 ; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1936 ; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
1937 ; X64-AVX1-NEXT:    setne %al
1938 ; X64-AVX1-NEXT:    vzeroupper
1939 ; X64-AVX1-NEXT:    retq
1941 ; X64-AVX2-LABEL: length63_eq:
1942 ; X64-AVX2:       # %bb.0:
1943 ; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1944 ; X64-AVX2-NEXT:    vmovdqu 31(%rdi), %ymm1
1945 ; X64-AVX2-NEXT:    vpxor 31(%rsi), %ymm1, %ymm1
1946 ; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1947 ; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1948 ; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
1949 ; X64-AVX2-NEXT:    setne %al
1950 ; X64-AVX2-NEXT:    vzeroupper
1951 ; X64-AVX2-NEXT:    retq
1953 ; X64-AVX512-LABEL: length63_eq:
1954 ; X64-AVX512:       # %bb.0:
1955 ; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
1956 ; X64-AVX512-NEXT:    vmovdqu 31(%rdi), %ymm1
1957 ; X64-AVX512-NEXT:    vpxor 31(%rsi), %ymm1, %ymm1
1958 ; X64-AVX512-NEXT:    vpxor (%rsi), %ymm0, %ymm0
1959 ; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1960 ; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
1961 ; X64-AVX512-NEXT:    setne %al
1962 ; X64-AVX512-NEXT:    vzeroupper
1963 ; X64-AVX512-NEXT:    retq
1965 ; X64-MIC-AVX-LABEL: length63_eq:
1966 ; X64-MIC-AVX:       # %bb.0:
1967 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
1968 ; X64-MIC-AVX-NEXT:    vmovdqu 31(%rdi), %ymm1
1969 ; X64-MIC-AVX-NEXT:    vmovdqu (%rsi), %ymm2
1970 ; X64-MIC-AVX-NEXT:    vmovdqu 31(%rsi), %ymm3
1971 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
1972 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
1973 ; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
1974 ; X64-MIC-AVX-NEXT:    setne %al
1975 ; X64-MIC-AVX-NEXT:    vzeroupper
1976 ; X64-MIC-AVX-NEXT:    retq
1977   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind
1978   %cmp = icmp ne i32 %call, 0
1979   ret i1 %cmp
1982 define i1 @length63_lt(ptr %x, ptr %y) nounwind {
1983 ; X64-LABEL: length63_lt:
1984 ; X64:       # %bb.0:
1985 ; X64-NEXT:    pushq %rax
1986 ; X64-NEXT:    movl $63, %edx
1987 ; X64-NEXT:    callq memcmp
1988 ; X64-NEXT:    shrl $31, %eax
1989 ; X64-NEXT:    # kill: def $al killed $al killed $eax
1990 ; X64-NEXT:    popq %rcx
1991 ; X64-NEXT:    retq
1992   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind
1993   %cmp = icmp slt i32 %call, 0
1994   ret i1 %cmp
1997 define i1 @length63_gt(ptr %x, ptr %y) nounwind {
1998 ; X64-LABEL: length63_gt:
1999 ; X64:       # %bb.0:
2000 ; X64-NEXT:    pushq %rax
2001 ; X64-NEXT:    movl $63, %edx
2002 ; X64-NEXT:    callq memcmp
2003 ; X64-NEXT:    testl %eax, %eax
2004 ; X64-NEXT:    setg %al
2005 ; X64-NEXT:    popq %rcx
2006 ; X64-NEXT:    retq
2007   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 63) nounwind
2008   %cmp = icmp sgt i32 %call, 0
2009   ret i1 %cmp
2012 define i1 @length63_eq_const(ptr %X) nounwind {
2013 ; X64-SSE2-LABEL: length63_eq_const:
2014 ; X64-SSE2:       # %bb.0:
2015 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2016 ; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
2017 ; X64-SSE2-NEXT:    movdqu 32(%rdi), %xmm2
2018 ; X64-SSE2-NEXT:    movdqu 47(%rdi), %xmm3
2019 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2020 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
2021 ; X64-SSE2-NEXT:    pand %xmm3, %xmm2
2022 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2023 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2024 ; X64-SSE2-NEXT:    pand %xmm1, %xmm0
2025 ; X64-SSE2-NEXT:    pand %xmm2, %xmm0
2026 ; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
2027 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2028 ; X64-SSE2-NEXT:    sete %al
2029 ; X64-SSE2-NEXT:    retq
2031 ; X64-SSE41-LABEL: length63_eq_const:
2032 ; X64-SSE41:       # %bb.0:
2033 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
2034 ; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
2035 ; X64-SSE41-NEXT:    movdqu 32(%rdi), %xmm2
2036 ; X64-SSE41-NEXT:    movdqu 47(%rdi), %xmm3
2037 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2038 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
2039 ; X64-SSE41-NEXT:    por %xmm3, %xmm2
2040 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2041 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2042 ; X64-SSE41-NEXT:    por %xmm1, %xmm0
2043 ; X64-SSE41-NEXT:    por %xmm2, %xmm0
2044 ; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
2045 ; X64-SSE41-NEXT:    sete %al
2046 ; X64-SSE41-NEXT:    retq
2048 ; X64-AVX1-LABEL: length63_eq_const:
2049 ; X64-AVX1:       # %bb.0:
2050 ; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2051 ; X64-AVX1-NEXT:    vmovups 31(%rdi), %ymm1
2052 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2053 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2054 ; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2055 ; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2056 ; X64-AVX1-NEXT:    sete %al
2057 ; X64-AVX1-NEXT:    vzeroupper
2058 ; X64-AVX1-NEXT:    retq
2060 ; X64-AVX2-LABEL: length63_eq_const:
2061 ; X64-AVX2:       # %bb.0:
2062 ; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2063 ; X64-AVX2-NEXT:    vmovdqu 31(%rdi), %ymm1
2064 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2065 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2066 ; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2067 ; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2068 ; X64-AVX2-NEXT:    sete %al
2069 ; X64-AVX2-NEXT:    vzeroupper
2070 ; X64-AVX2-NEXT:    retq
2072 ; X64-AVX512-LABEL: length63_eq_const:
2073 ; X64-AVX512:       # %bb.0:
2074 ; X64-AVX512-NEXT:    vmovdqu (%rdi), %ymm0
2075 ; X64-AVX512-NEXT:    vmovdqu 31(%rdi), %ymm1
2076 ; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2077 ; X64-AVX512-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2078 ; X64-AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
2079 ; X64-AVX512-NEXT:    vptest %ymm0, %ymm0
2080 ; X64-AVX512-NEXT:    sete %al
2081 ; X64-AVX512-NEXT:    vzeroupper
2082 ; X64-AVX512-NEXT:    retq
2084 ; X64-MIC-AVX-LABEL: length63_eq_const:
2085 ; X64-MIC-AVX:       # %bb.0:
2086 ; X64-MIC-AVX-NEXT:    vmovdqu (%rdi), %ymm0
2087 ; X64-MIC-AVX-NEXT:    vmovdqu 31(%rdi), %ymm1
2088 ; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm2 = [875770417,943142453,842084409,909456435,809056311,875770417,943142453,842084409]
2089 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
2090 ; X64-MIC-AVX-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
2091 ; X64-MIC-AVX-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
2092 ; X64-MIC-AVX-NEXT:    kortestw %k0, %k1
2093 ; X64-MIC-AVX-NEXT:    sete %al
2094 ; X64-MIC-AVX-NEXT:    vzeroupper
2095 ; X64-MIC-AVX-NEXT:    retq
2096   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 63) nounwind
2097   %c = icmp eq i32 %m, 0
2098   ret i1 %c
2101 define i32 @length64(ptr %X, ptr %Y) nounwind {
2102 ; X64-LABEL: length64:
2103 ; X64:       # %bb.0:
2104 ; X64-NEXT:    movl $64, %edx
2105 ; X64-NEXT:    jmp memcmp # TAILCALL
2106   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 64) nounwind
2107   ret i32 %m
2110 define i1 @length64_eq(ptr %x, ptr %y) nounwind {
2111 ; X64-SSE2-LABEL: length64_eq:
2112 ; X64-SSE2:       # %bb.0:
2113 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2114 ; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
2115 ; X64-SSE2-NEXT:    movdqu 32(%rdi), %xmm2
2116 ; X64-SSE2-NEXT:    movdqu 48(%rdi), %xmm3
2117 ; X64-SSE2-NEXT:    movdqu (%rsi), %xmm4
2118 ; X64-SSE2-NEXT:    pcmpeqb %xmm0, %xmm4
2119 ; X64-SSE2-NEXT:    movdqu 16(%rsi), %xmm0
2120 ; X64-SSE2-NEXT:    pcmpeqb %xmm1, %xmm0
2121 ; X64-SSE2-NEXT:    pand %xmm4, %xmm0
2122 ; X64-SSE2-NEXT:    movdqu 32(%rsi), %xmm1
2123 ; X64-SSE2-NEXT:    pcmpeqb %xmm2, %xmm1
2124 ; X64-SSE2-NEXT:    movdqu 48(%rsi), %xmm2
2125 ; X64-SSE2-NEXT:    pcmpeqb %xmm3, %xmm2
2126 ; X64-SSE2-NEXT:    pand %xmm1, %xmm2
2127 ; X64-SSE2-NEXT:    pand %xmm0, %xmm2
2128 ; X64-SSE2-NEXT:    pmovmskb %xmm2, %eax
2129 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2130 ; X64-SSE2-NEXT:    setne %al
2131 ; X64-SSE2-NEXT:    retq
2133 ; X64-SSE41-LABEL: length64_eq:
2134 ; X64-SSE41:       # %bb.0:
2135 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
2136 ; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
2137 ; X64-SSE41-NEXT:    movdqu 32(%rdi), %xmm2
2138 ; X64-SSE41-NEXT:    movdqu 48(%rdi), %xmm3
2139 ; X64-SSE41-NEXT:    movdqu (%rsi), %xmm4
2140 ; X64-SSE41-NEXT:    pxor %xmm0, %xmm4
2141 ; X64-SSE41-NEXT:    movdqu 16(%rsi), %xmm0
2142 ; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
2143 ; X64-SSE41-NEXT:    por %xmm4, %xmm0
2144 ; X64-SSE41-NEXT:    movdqu 32(%rsi), %xmm1
2145 ; X64-SSE41-NEXT:    pxor %xmm2, %xmm1
2146 ; X64-SSE41-NEXT:    movdqu 48(%rsi), %xmm2
2147 ; X64-SSE41-NEXT:    pxor %xmm3, %xmm2
2148 ; X64-SSE41-NEXT:    por %xmm1, %xmm2
2149 ; X64-SSE41-NEXT:    por %xmm0, %xmm2
2150 ; X64-SSE41-NEXT:    ptest %xmm2, %xmm2
2151 ; X64-SSE41-NEXT:    setne %al
2152 ; X64-SSE41-NEXT:    retq
2154 ; X64-AVX1-LABEL: length64_eq:
2155 ; X64-AVX1:       # %bb.0:
2156 ; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2157 ; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
2158 ; X64-AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1
2159 ; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
2160 ; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2161 ; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2162 ; X64-AVX1-NEXT:    setne %al
2163 ; X64-AVX1-NEXT:    vzeroupper
2164 ; X64-AVX1-NEXT:    retq
2166 ; X64-AVX2-LABEL: length64_eq:
2167 ; X64-AVX2:       # %bb.0:
2168 ; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2169 ; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2170 ; X64-AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
2171 ; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
2172 ; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2173 ; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2174 ; X64-AVX2-NEXT:    setne %al
2175 ; X64-AVX2-NEXT:    vzeroupper
2176 ; X64-AVX2-NEXT:    retq
2178 ; X64-AVX512-LABEL: length64_eq:
2179 ; X64-AVX512:       # %bb.0:
2180 ; X64-AVX512-NEXT:    vmovdqu64 (%rdi), %zmm0
2181 ; X64-AVX512-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
2182 ; X64-AVX512-NEXT:    kortestw %k0, %k0
2183 ; X64-AVX512-NEXT:    setne %al
2184 ; X64-AVX512-NEXT:    vzeroupper
2185 ; X64-AVX512-NEXT:    retq
2187 ; X64-MIC-AVX2-LABEL: length64_eq:
2188 ; X64-MIC-AVX2:       # %bb.0:
2189 ; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2190 ; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2191 ; X64-MIC-AVX2-NEXT:    vmovdqu (%rsi), %ymm2
2192 ; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rsi), %ymm3
2193 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
2194 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm2, %zmm0, %k1
2195 ; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
2196 ; X64-MIC-AVX2-NEXT:    setne %al
2197 ; X64-MIC-AVX2-NEXT:    vzeroupper
2198 ; X64-MIC-AVX2-NEXT:    retq
2200 ; X64-MIC-AVX512F-LABEL: length64_eq:
2201 ; X64-MIC-AVX512F:       # %bb.0:
2202 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2203 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
2204 ; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k0
2205 ; X64-MIC-AVX512F-NEXT:    setne %al
2206 ; X64-MIC-AVX512F-NEXT:    vzeroupper
2207 ; X64-MIC-AVX512F-NEXT:    retq
2208   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind
2209   %cmp = icmp ne i32 %call, 0
2210   ret i1 %cmp
2213 define i1 @length64_lt(ptr %x, ptr %y) nounwind {
2214 ; X64-LABEL: length64_lt:
2215 ; X64:       # %bb.0:
2216 ; X64-NEXT:    pushq %rax
2217 ; X64-NEXT:    movl $64, %edx
2218 ; X64-NEXT:    callq memcmp
2219 ; X64-NEXT:    shrl $31, %eax
2220 ; X64-NEXT:    # kill: def $al killed $al killed $eax
2221 ; X64-NEXT:    popq %rcx
2222 ; X64-NEXT:    retq
2223   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind
2224   %cmp = icmp slt i32 %call, 0
2225   ret i1 %cmp
2228 define i1 @length64_gt(ptr %x, ptr %y) nounwind {
2229 ; X64-LABEL: length64_gt:
2230 ; X64:       # %bb.0:
2231 ; X64-NEXT:    pushq %rax
2232 ; X64-NEXT:    movl $64, %edx
2233 ; X64-NEXT:    callq memcmp
2234 ; X64-NEXT:    testl %eax, %eax
2235 ; X64-NEXT:    setg %al
2236 ; X64-NEXT:    popq %rcx
2237 ; X64-NEXT:    retq
2238   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 64) nounwind
2239   %cmp = icmp sgt i32 %call, 0
2240   ret i1 %cmp
2243 define i1 @length64_eq_const(ptr %X) nounwind {
2244 ; X64-SSE2-LABEL: length64_eq_const:
2245 ; X64-SSE2:       # %bb.0:
2246 ; X64-SSE2-NEXT:    movdqu (%rdi), %xmm0
2247 ; X64-SSE2-NEXT:    movdqu 16(%rdi), %xmm1
2248 ; X64-SSE2-NEXT:    movdqu 32(%rdi), %xmm2
2249 ; X64-SSE2-NEXT:    movdqu 48(%rdi), %xmm3
2250 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2251 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
2252 ; X64-SSE2-NEXT:    pand %xmm3, %xmm2
2253 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2254 ; X64-SSE2-NEXT:    pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2255 ; X64-SSE2-NEXT:    pand %xmm1, %xmm0
2256 ; X64-SSE2-NEXT:    pand %xmm2, %xmm0
2257 ; X64-SSE2-NEXT:    pmovmskb %xmm0, %eax
2258 ; X64-SSE2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
2259 ; X64-SSE2-NEXT:    sete %al
2260 ; X64-SSE2-NEXT:    retq
2262 ; X64-SSE41-LABEL: length64_eq_const:
2263 ; X64-SSE41:       # %bb.0:
2264 ; X64-SSE41-NEXT:    movdqu (%rdi), %xmm0
2265 ; X64-SSE41-NEXT:    movdqu 16(%rdi), %xmm1
2266 ; X64-SSE41-NEXT:    movdqu 32(%rdi), %xmm2
2267 ; X64-SSE41-NEXT:    movdqu 48(%rdi), %xmm3
2268 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2269 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
2270 ; X64-SSE41-NEXT:    por %xmm3, %xmm2
2271 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2272 ; X64-SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2273 ; X64-SSE41-NEXT:    por %xmm1, %xmm0
2274 ; X64-SSE41-NEXT:    por %xmm2, %xmm0
2275 ; X64-SSE41-NEXT:    ptest %xmm0, %xmm0
2276 ; X64-SSE41-NEXT:    sete %al
2277 ; X64-SSE41-NEXT:    retq
2279 ; X64-AVX1-LABEL: length64_eq_const:
2280 ; X64-AVX1:       # %bb.0:
2281 ; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2282 ; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
2283 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2284 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2285 ; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2286 ; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2287 ; X64-AVX1-NEXT:    sete %al
2288 ; X64-AVX1-NEXT:    vzeroupper
2289 ; X64-AVX1-NEXT:    retq
2291 ; X64-AVX2-LABEL: length64_eq_const:
2292 ; X64-AVX2:       # %bb.0:
2293 ; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2294 ; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2295 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2296 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2297 ; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2298 ; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2299 ; X64-AVX2-NEXT:    sete %al
2300 ; X64-AVX2-NEXT:    vzeroupper
2301 ; X64-AVX2-NEXT:    retq
2303 ; X64-AVX512-LABEL: length64_eq_const:
2304 ; X64-AVX512:       # %bb.0:
2305 ; X64-AVX512-NEXT:    vmovdqu64 (%rdi), %zmm0
2306 ; X64-AVX512-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k0
2307 ; X64-AVX512-NEXT:    kortestw %k0, %k0
2308 ; X64-AVX512-NEXT:    sete %al
2309 ; X64-AVX512-NEXT:    vzeroupper
2310 ; X64-AVX512-NEXT:    retq
2312 ; X64-MIC-AVX2-LABEL: length64_eq_const:
2313 ; X64-MIC-AVX2:       # %bb.0:
2314 ; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2315 ; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2316 ; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]
2317 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm2, %zmm1, %k0
2318 ; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
2319 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
2320 ; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
2321 ; X64-MIC-AVX2-NEXT:    sete %al
2322 ; X64-MIC-AVX2-NEXT:    vzeroupper
2323 ; X64-MIC-AVX2-NEXT:    retq
2325 ; X64-MIC-AVX512F-LABEL: length64_eq_const:
2326 ; X64-MIC-AVX512F:       # %bb.0:
2327 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2328 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k0
2329 ; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k0
2330 ; X64-MIC-AVX512F-NEXT:    sete %al
2331 ; X64-MIC-AVX512F-NEXT:    vzeroupper
2332 ; X64-MIC-AVX512F-NEXT:    retq
2333   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 64) nounwind
2334   %c = icmp eq i32 %m, 0
2335   ret i1 %c
2338 define i32 @length96(ptr %X, ptr %Y) nounwind {
2339 ; X64-LABEL: length96:
2340 ; X64:       # %bb.0:
2341 ; X64-NEXT:    movl $96, %edx
2342 ; X64-NEXT:    jmp memcmp # TAILCALL
2343   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 96) nounwind
2344   ret i32 %m
2347 define i1 @length96_eq(ptr %x, ptr %y) nounwind {
2348 ; X64-SSE-LABEL: length96_eq:
2349 ; X64-SSE:       # %bb.0:
2350 ; X64-SSE-NEXT:    pushq %rax
2351 ; X64-SSE-NEXT:    movl $96, %edx
2352 ; X64-SSE-NEXT:    callq memcmp
2353 ; X64-SSE-NEXT:    testl %eax, %eax
2354 ; X64-SSE-NEXT:    setne %al
2355 ; X64-SSE-NEXT:    popq %rcx
2356 ; X64-SSE-NEXT:    retq
2358 ; X64-AVX1-LABEL: length96_eq:
2359 ; X64-AVX1:       # %bb.0:
2360 ; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2361 ; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
2362 ; X64-AVX1-NEXT:    vmovups 64(%rdi), %ymm2
2363 ; X64-AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1
2364 ; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
2365 ; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2366 ; X64-AVX1-NEXT:    vxorps 64(%rsi), %ymm2, %ymm1
2367 ; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2368 ; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2369 ; X64-AVX1-NEXT:    setne %al
2370 ; X64-AVX1-NEXT:    vzeroupper
2371 ; X64-AVX1-NEXT:    retq
2373 ; X64-AVX2-LABEL: length96_eq:
2374 ; X64-AVX2:       # %bb.0:
2375 ; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2376 ; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2377 ; X64-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
2378 ; X64-AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
2379 ; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
2380 ; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2381 ; X64-AVX2-NEXT:    vpxor 64(%rsi), %ymm2, %ymm1
2382 ; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2383 ; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2384 ; X64-AVX2-NEXT:    setne %al
2385 ; X64-AVX2-NEXT:    vzeroupper
2386 ; X64-AVX2-NEXT:    retq
2388 ; X64-AVX512BW-LABEL: length96_eq:
2389 ; X64-AVX512BW:       # %bb.0:
2390 ; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
2391 ; X64-AVX512BW-NEXT:    vmovdqu 64(%rdi), %ymm1
2392 ; X64-AVX512BW-NEXT:    vmovdqu 64(%rsi), %ymm2
2393 ; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k0
2394 ; X64-AVX512BW-NEXT:    vpcmpneqb %zmm2, %zmm1, %k1
2395 ; X64-AVX512BW-NEXT:    kortestq %k1, %k0
2396 ; X64-AVX512BW-NEXT:    setne %al
2397 ; X64-AVX512BW-NEXT:    vzeroupper
2398 ; X64-AVX512BW-NEXT:    retq
2400 ; X64-AVX512F-LABEL: length96_eq:
2401 ; X64-AVX512F:       # %bb.0:
2402 ; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2403 ; X64-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
2404 ; X64-AVX512F-NEXT:    vmovdqu 64(%rsi), %ymm2
2405 ; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
2406 ; X64-AVX512F-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
2407 ; X64-AVX512F-NEXT:    kortestw %k1, %k0
2408 ; X64-AVX512F-NEXT:    setne %al
2409 ; X64-AVX512F-NEXT:    vzeroupper
2410 ; X64-AVX512F-NEXT:    retq
2412 ; X64-MIC-AVX2-LABEL: length96_eq:
2413 ; X64-MIC-AVX2:       # %bb.0:
2414 ; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2415 ; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2416 ; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
2417 ; X64-MIC-AVX2-NEXT:    vmovdqu (%rsi), %ymm3
2418 ; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rsi), %ymm4
2419 ; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rsi), %ymm5
2420 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm4, %zmm1, %k0
2421 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm3, %zmm0, %k1
2422 ; X64-MIC-AVX2-NEXT:    korw %k0, %k1, %k0
2423 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm5, %zmm2, %k1
2424 ; X64-MIC-AVX2-NEXT:    kortestw %k1, %k0
2425 ; X64-MIC-AVX2-NEXT:    setne %al
2426 ; X64-MIC-AVX2-NEXT:    vzeroupper
2427 ; X64-MIC-AVX2-NEXT:    retq
2429 ; X64-MIC-AVX512F-LABEL: length96_eq:
2430 ; X64-MIC-AVX512F:       # %bb.0:
2431 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2432 ; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
2433 ; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rsi), %ymm2
2434 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k0
2435 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
2436 ; X64-MIC-AVX512F-NEXT:    kortestw %k1, %k0
2437 ; X64-MIC-AVX512F-NEXT:    setne %al
2438 ; X64-MIC-AVX512F-NEXT:    vzeroupper
2439 ; X64-MIC-AVX512F-NEXT:    retq
2440   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind
2441   %cmp = icmp ne i32 %call, 0
2442   ret i1 %cmp
2445 define i1 @length96_lt(ptr %x, ptr %y) nounwind {
2446 ; X64-LABEL: length96_lt:
2447 ; X64:       # %bb.0:
2448 ; X64-NEXT:    pushq %rax
2449 ; X64-NEXT:    movl $96, %edx
2450 ; X64-NEXT:    callq memcmp
2451 ; X64-NEXT:    shrl $31, %eax
2452 ; X64-NEXT:    # kill: def $al killed $al killed $eax
2453 ; X64-NEXT:    popq %rcx
2454 ; X64-NEXT:    retq
2455   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind
2456   %cmp = icmp slt i32 %call, 0
2457   ret i1 %cmp
2460 define i1 @length96_gt(ptr %x, ptr %y) nounwind {
2461 ; X64-LABEL: length96_gt:
2462 ; X64:       # %bb.0:
2463 ; X64-NEXT:    pushq %rax
2464 ; X64-NEXT:    movl $96, %edx
2465 ; X64-NEXT:    callq memcmp
2466 ; X64-NEXT:    testl %eax, %eax
2467 ; X64-NEXT:    setg %al
2468 ; X64-NEXT:    popq %rcx
2469 ; X64-NEXT:    retq
2470   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 96) nounwind
2471   %cmp = icmp sgt i32 %call, 0
2472   ret i1 %cmp
2475 define i1 @length96_eq_const(ptr %X) nounwind {
2476 ; X64-SSE-LABEL: length96_eq_const:
2477 ; X64-SSE:       # %bb.0:
2478 ; X64-SSE-NEXT:    pushq %rax
2479 ; X64-SSE-NEXT:    movl $.L.str, %esi
2480 ; X64-SSE-NEXT:    movl $96, %edx
2481 ; X64-SSE-NEXT:    callq memcmp
2482 ; X64-SSE-NEXT:    testl %eax, %eax
2483 ; X64-SSE-NEXT:    sete %al
2484 ; X64-SSE-NEXT:    popq %rcx
2485 ; X64-SSE-NEXT:    retq
2487 ; X64-AVX1-LABEL: length96_eq_const:
2488 ; X64-AVX1:       # %bb.0:
2489 ; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2490 ; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
2491 ; X64-AVX1-NEXT:    vmovups 64(%rdi), %ymm2
2492 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2493 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2494 ; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2495 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm1
2496 ; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2497 ; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2498 ; X64-AVX1-NEXT:    sete %al
2499 ; X64-AVX1-NEXT:    vzeroupper
2500 ; X64-AVX1-NEXT:    retq
2502 ; X64-AVX2-LABEL: length96_eq_const:
2503 ; X64-AVX2:       # %bb.0:
2504 ; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2505 ; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2506 ; X64-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
2507 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2508 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2509 ; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2510 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm1
2511 ; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2512 ; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2513 ; X64-AVX2-NEXT:    sete %al
2514 ; X64-AVX2-NEXT:    vzeroupper
2515 ; X64-AVX2-NEXT:    retq
2517 ; X64-AVX512BW-LABEL: length96_eq_const:
2518 ; X64-AVX512BW:       # %bb.0:
2519 ; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
2520 ; X64-AVX512BW-NEXT:    vmovdqu 64(%rdi), %ymm1
2521 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k0
2522 ; X64-AVX512BW-NEXT:    vpcmpneqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1
2523 ; X64-AVX512BW-NEXT:    kortestq %k1, %k0
2524 ; X64-AVX512BW-NEXT:    sete %al
2525 ; X64-AVX512BW-NEXT:    vzeroupper
2526 ; X64-AVX512BW-NEXT:    retq
2528 ; X64-AVX512F-LABEL: length96_eq_const:
2529 ; X64-AVX512F:       # %bb.0:
2530 ; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2531 ; X64-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
2532 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k0
2533 ; X64-AVX512F-NEXT:    vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1
2534 ; X64-AVX512F-NEXT:    kortestw %k1, %k0
2535 ; X64-AVX512F-NEXT:    sete %al
2536 ; X64-AVX512F-NEXT:    vzeroupper
2537 ; X64-AVX512F-NEXT:    retq
2539 ; X64-MIC-AVX2-LABEL: length96_eq_const:
2540 ; X64-MIC-AVX2:       # %bb.0:
2541 ; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2542 ; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2543 ; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
2544 ; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]
2545 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm3, %zmm1, %k0
2546 ; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
2547 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm1, %zmm0, %k1
2548 ; X64-MIC-AVX2-NEXT:    korw %k0, %k1, %k0
2549 ; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm0 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426]
2550 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm0, %zmm2, %k1
2551 ; X64-MIC-AVX2-NEXT:    kortestw %k1, %k0
2552 ; X64-MIC-AVX2-NEXT:    sete %al
2553 ; X64-MIC-AVX2-NEXT:    vzeroupper
2554 ; X64-MIC-AVX2-NEXT:    retq
2556 ; X64-MIC-AVX512F-LABEL: length96_eq_const:
2557 ; X64-MIC-AVX512F:       # %bb.0:
2558 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2559 ; X64-MIC-AVX512F-NEXT:    vmovdqu 64(%rdi), %ymm1
2560 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k0
2561 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1
2562 ; X64-MIC-AVX512F-NEXT:    kortestw %k1, %k0
2563 ; X64-MIC-AVX512F-NEXT:    sete %al
2564 ; X64-MIC-AVX512F-NEXT:    vzeroupper
2565 ; X64-MIC-AVX512F-NEXT:    retq
2566   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 96) nounwind
2567   %c = icmp eq i32 %m, 0
2568   ret i1 %c
2571 define i32 @length127(ptr %X, ptr %Y) nounwind {
2572 ; X64-LABEL: length127:
2573 ; X64:       # %bb.0:
2574 ; X64-NEXT:    movl $127, %edx
2575 ; X64-NEXT:    jmp memcmp # TAILCALL
2576   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 127) nounwind
2577   ret i32 %m
2580 define i1 @length127_eq(ptr %x, ptr %y) nounwind {
2581 ; X64-SSE-LABEL: length127_eq:
2582 ; X64-SSE:       # %bb.0:
2583 ; X64-SSE-NEXT:    pushq %rax
2584 ; X64-SSE-NEXT:    movl $127, %edx
2585 ; X64-SSE-NEXT:    callq memcmp
2586 ; X64-SSE-NEXT:    testl %eax, %eax
2587 ; X64-SSE-NEXT:    setne %al
2588 ; X64-SSE-NEXT:    popq %rcx
2589 ; X64-SSE-NEXT:    retq
2591 ; X64-AVX1-LABEL: length127_eq:
2592 ; X64-AVX1:       # %bb.0:
2593 ; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2594 ; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
2595 ; X64-AVX1-NEXT:    vmovups 64(%rdi), %ymm2
2596 ; X64-AVX1-NEXT:    vmovups 95(%rdi), %ymm3
2597 ; X64-AVX1-NEXT:    vxorps 95(%rsi), %ymm3, %ymm3
2598 ; X64-AVX1-NEXT:    vxorps 64(%rsi), %ymm2, %ymm2
2599 ; X64-AVX1-NEXT:    vorps %ymm3, %ymm2, %ymm2
2600 ; X64-AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1
2601 ; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
2602 ; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2603 ; X64-AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm0
2604 ; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2605 ; X64-AVX1-NEXT:    setne %al
2606 ; X64-AVX1-NEXT:    vzeroupper
2607 ; X64-AVX1-NEXT:    retq
2609 ; X64-AVX2-LABEL: length127_eq:
2610 ; X64-AVX2:       # %bb.0:
2611 ; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2612 ; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2613 ; X64-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
2614 ; X64-AVX2-NEXT:    vmovdqu 95(%rdi), %ymm3
2615 ; X64-AVX2-NEXT:    vpxor 95(%rsi), %ymm3, %ymm3
2616 ; X64-AVX2-NEXT:    vpxor 64(%rsi), %ymm2, %ymm2
2617 ; X64-AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm2
2618 ; X64-AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
2619 ; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
2620 ; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2621 ; X64-AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
2622 ; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2623 ; X64-AVX2-NEXT:    setne %al
2624 ; X64-AVX2-NEXT:    vzeroupper
2625 ; X64-AVX2-NEXT:    retq
2627 ; X64-AVX512BW-LABEL: length127_eq:
2628 ; X64-AVX512BW:       # %bb.0:
2629 ; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
2630 ; X64-AVX512BW-NEXT:    vmovdqu64 63(%rdi), %zmm1
2631 ; X64-AVX512BW-NEXT:    vpcmpneqb 63(%rsi), %zmm1, %k0
2632 ; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k1
2633 ; X64-AVX512BW-NEXT:    kortestq %k0, %k1
2634 ; X64-AVX512BW-NEXT:    setne %al
2635 ; X64-AVX512BW-NEXT:    vzeroupper
2636 ; X64-AVX512BW-NEXT:    retq
2638 ; X64-AVX512F-LABEL: length127_eq:
2639 ; X64-AVX512F:       # %bb.0:
2640 ; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2641 ; X64-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
2642 ; X64-AVX512F-NEXT:    vpcmpneqd 63(%rsi), %zmm1, %k0
2643 ; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
2644 ; X64-AVX512F-NEXT:    kortestw %k0, %k1
2645 ; X64-AVX512F-NEXT:    setne %al
2646 ; X64-AVX512F-NEXT:    vzeroupper
2647 ; X64-AVX512F-NEXT:    retq
2649 ; X64-MIC-AVX2-LABEL: length127_eq:
2650 ; X64-MIC-AVX2:       # %bb.0:
2651 ; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2652 ; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2653 ; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
2654 ; X64-MIC-AVX2-NEXT:    vmovdqu 95(%rdi), %ymm3
2655 ; X64-MIC-AVX2-NEXT:    vmovdqu (%rsi), %ymm4
2656 ; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rsi), %ymm5
2657 ; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rsi), %ymm6
2658 ; X64-MIC-AVX2-NEXT:    vmovdqu 95(%rsi), %ymm7
2659 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm7, %zmm3, %k0
2660 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm6, %zmm2, %k1
2661 ; X64-MIC-AVX2-NEXT:    korw %k0, %k1, %k0
2662 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm5, %zmm1, %k1
2663 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm4, %zmm0, %k2
2664 ; X64-MIC-AVX2-NEXT:    korw %k1, %k2, %k1
2665 ; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
2666 ; X64-MIC-AVX2-NEXT:    setne %al
2667 ; X64-MIC-AVX2-NEXT:    vzeroupper
2668 ; X64-MIC-AVX2-NEXT:    retq
2670 ; X64-MIC-AVX512F-LABEL: length127_eq:
2671 ; X64-MIC-AVX512F:       # %bb.0:
2672 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2673 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
2674 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd 63(%rsi), %zmm1, %k0
2675 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
2676 ; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
2677 ; X64-MIC-AVX512F-NEXT:    setne %al
2678 ; X64-MIC-AVX512F-NEXT:    vzeroupper
2679 ; X64-MIC-AVX512F-NEXT:    retq
2680   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind
2681   %cmp = icmp ne i32 %call, 0
2682   ret i1 %cmp
2685 define i1 @length127_lt(ptr %x, ptr %y) nounwind {
2686 ; X64-LABEL: length127_lt:
2687 ; X64:       # %bb.0:
2688 ; X64-NEXT:    pushq %rax
2689 ; X64-NEXT:    movl $127, %edx
2690 ; X64-NEXT:    callq memcmp
2691 ; X64-NEXT:    shrl $31, %eax
2692 ; X64-NEXT:    # kill: def $al killed $al killed $eax
2693 ; X64-NEXT:    popq %rcx
2694 ; X64-NEXT:    retq
2695   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind
2696   %cmp = icmp slt i32 %call, 0
2697   ret i1 %cmp
2700 define i1 @length127_gt(ptr %x, ptr %y) nounwind {
2701 ; X64-LABEL: length127_gt:
2702 ; X64:       # %bb.0:
2703 ; X64-NEXT:    pushq %rax
2704 ; X64-NEXT:    movl $127, %edx
2705 ; X64-NEXT:    callq memcmp
2706 ; X64-NEXT:    testl %eax, %eax
2707 ; X64-NEXT:    setg %al
2708 ; X64-NEXT:    popq %rcx
2709 ; X64-NEXT:    retq
2710   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 127) nounwind
2711   %cmp = icmp sgt i32 %call, 0
2712   ret i1 %cmp
2715 define i1 @length127_eq_const(ptr %X) nounwind {
2716 ; X64-SSE-LABEL: length127_eq_const:
2717 ; X64-SSE:       # %bb.0:
2718 ; X64-SSE-NEXT:    pushq %rax
2719 ; X64-SSE-NEXT:    movl $.L.str, %esi
2720 ; X64-SSE-NEXT:    movl $127, %edx
2721 ; X64-SSE-NEXT:    callq memcmp
2722 ; X64-SSE-NEXT:    testl %eax, %eax
2723 ; X64-SSE-NEXT:    sete %al
2724 ; X64-SSE-NEXT:    popq %rcx
2725 ; X64-SSE-NEXT:    retq
2727 ; X64-AVX1-LABEL: length127_eq_const:
2728 ; X64-AVX1:       # %bb.0:
2729 ; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2730 ; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
2731 ; X64-AVX1-NEXT:    vmovups 64(%rdi), %ymm2
2732 ; X64-AVX1-NEXT:    vmovups 95(%rdi), %ymm3
2733 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
2734 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
2735 ; X64-AVX1-NEXT:    vorps %ymm3, %ymm2, %ymm2
2736 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2737 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2738 ; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2739 ; X64-AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm0
2740 ; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2741 ; X64-AVX1-NEXT:    sete %al
2742 ; X64-AVX1-NEXT:    vzeroupper
2743 ; X64-AVX1-NEXT:    retq
2745 ; X64-AVX2-LABEL: length127_eq_const:
2746 ; X64-AVX2:       # %bb.0:
2747 ; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2748 ; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2749 ; X64-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
2750 ; X64-AVX2-NEXT:    vmovdqu 95(%rdi), %ymm3
2751 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
2752 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
2753 ; X64-AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm2
2754 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2755 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2756 ; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2757 ; X64-AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
2758 ; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2759 ; X64-AVX2-NEXT:    sete %al
2760 ; X64-AVX2-NEXT:    vzeroupper
2761 ; X64-AVX2-NEXT:    retq
2763 ; X64-AVX512BW-LABEL: length127_eq_const:
2764 ; X64-AVX512BW:       # %bb.0:
2765 ; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
2766 ; X64-AVX512BW-NEXT:    vmovdqu64 63(%rdi), %zmm1
2767 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+63(%rip), %zmm1, %k0
2768 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k1
2769 ; X64-AVX512BW-NEXT:    kortestq %k0, %k1
2770 ; X64-AVX512BW-NEXT:    sete %al
2771 ; X64-AVX512BW-NEXT:    vzeroupper
2772 ; X64-AVX512BW-NEXT:    retq
2774 ; X64-AVX512F-LABEL: length127_eq_const:
2775 ; X64-AVX512F:       # %bb.0:
2776 ; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2777 ; X64-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
2778 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str+63(%rip), %zmm1, %k0
2779 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
2780 ; X64-AVX512F-NEXT:    kortestw %k0, %k1
2781 ; X64-AVX512F-NEXT:    sete %al
2782 ; X64-AVX512F-NEXT:    vzeroupper
2783 ; X64-AVX512F-NEXT:    retq
2785 ; X64-MIC-AVX2-LABEL: length127_eq_const:
2786 ; X64-MIC-AVX2:       # %bb.0:
2787 ; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2788 ; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2789 ; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
2790 ; X64-MIC-AVX2-NEXT:    vmovdqu 95(%rdi), %ymm3
2791 ; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [943142453,842084409,909456435,809056311,875770417,943142453,842084409,909456435]
2792 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm4, %zmm3, %k0
2793 ; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426]
2794 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm3, %zmm2, %k1
2795 ; X64-MIC-AVX2-NEXT:    korw %k0, %k1, %k0
2796 ; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]
2797 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
2798 ; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
2799 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm1, %zmm0, %k2
2800 ; X64-MIC-AVX2-NEXT:    korw %k1, %k2, %k1
2801 ; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
2802 ; X64-MIC-AVX2-NEXT:    sete %al
2803 ; X64-MIC-AVX2-NEXT:    vzeroupper
2804 ; X64-MIC-AVX2-NEXT:    retq
2806 ; X64-MIC-AVX512F-LABEL: length127_eq_const:
2807 ; X64-MIC-AVX512F:       # %bb.0:
2808 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2809 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 63(%rdi), %zmm1
2810 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+63(%rip), %zmm1, %k0
2811 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
2812 ; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
2813 ; X64-MIC-AVX512F-NEXT:    sete %al
2814 ; X64-MIC-AVX512F-NEXT:    vzeroupper
2815 ; X64-MIC-AVX512F-NEXT:    retq
2816   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 127) nounwind
2817   %c = icmp eq i32 %m, 0
2818   ret i1 %c
2821 define i32 @length128(ptr %X, ptr %Y) nounwind {
2822 ; X64-LABEL: length128:
2823 ; X64:       # %bb.0:
2824 ; X64-NEXT:    movl $128, %edx
2825 ; X64-NEXT:    jmp memcmp # TAILCALL
2826   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 128) nounwind
2827   ret i32 %m
2830 define i1 @length128_eq(ptr %x, ptr %y) nounwind {
2831 ; X64-SSE-LABEL: length128_eq:
2832 ; X64-SSE:       # %bb.0:
2833 ; X64-SSE-NEXT:    pushq %rax
2834 ; X64-SSE-NEXT:    movl $128, %edx
2835 ; X64-SSE-NEXT:    callq memcmp
2836 ; X64-SSE-NEXT:    testl %eax, %eax
2837 ; X64-SSE-NEXT:    setne %al
2838 ; X64-SSE-NEXT:    popq %rcx
2839 ; X64-SSE-NEXT:    retq
2841 ; X64-AVX1-LABEL: length128_eq:
2842 ; X64-AVX1:       # %bb.0:
2843 ; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2844 ; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
2845 ; X64-AVX1-NEXT:    vmovups 64(%rdi), %ymm2
2846 ; X64-AVX1-NEXT:    vmovups 96(%rdi), %ymm3
2847 ; X64-AVX1-NEXT:    vxorps 96(%rsi), %ymm3, %ymm3
2848 ; X64-AVX1-NEXT:    vxorps 64(%rsi), %ymm2, %ymm2
2849 ; X64-AVX1-NEXT:    vorps %ymm3, %ymm2, %ymm2
2850 ; X64-AVX1-NEXT:    vxorps 32(%rsi), %ymm1, %ymm1
2851 ; X64-AVX1-NEXT:    vxorps (%rsi), %ymm0, %ymm0
2852 ; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2853 ; X64-AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm0
2854 ; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2855 ; X64-AVX1-NEXT:    setne %al
2856 ; X64-AVX1-NEXT:    vzeroupper
2857 ; X64-AVX1-NEXT:    retq
2859 ; X64-AVX2-LABEL: length128_eq:
2860 ; X64-AVX2:       # %bb.0:
2861 ; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2862 ; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2863 ; X64-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
2864 ; X64-AVX2-NEXT:    vmovdqu 96(%rdi), %ymm3
2865 ; X64-AVX2-NEXT:    vpxor 96(%rsi), %ymm3, %ymm3
2866 ; X64-AVX2-NEXT:    vpxor 64(%rsi), %ymm2, %ymm2
2867 ; X64-AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm2
2868 ; X64-AVX2-NEXT:    vpxor 32(%rsi), %ymm1, %ymm1
2869 ; X64-AVX2-NEXT:    vpxor (%rsi), %ymm0, %ymm0
2870 ; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2871 ; X64-AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
2872 ; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
2873 ; X64-AVX2-NEXT:    setne %al
2874 ; X64-AVX2-NEXT:    vzeroupper
2875 ; X64-AVX2-NEXT:    retq
2877 ; X64-AVX512BW-LABEL: length128_eq:
2878 ; X64-AVX512BW:       # %bb.0:
2879 ; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
2880 ; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
2881 ; X64-AVX512BW-NEXT:    vpcmpneqb 64(%rsi), %zmm1, %k0
2882 ; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k1
2883 ; X64-AVX512BW-NEXT:    kortestq %k0, %k1
2884 ; X64-AVX512BW-NEXT:    setne %al
2885 ; X64-AVX512BW-NEXT:    vzeroupper
2886 ; X64-AVX512BW-NEXT:    retq
2888 ; X64-AVX512F-LABEL: length128_eq:
2889 ; X64-AVX512F:       # %bb.0:
2890 ; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2891 ; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
2892 ; X64-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k0
2893 ; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
2894 ; X64-AVX512F-NEXT:    kortestw %k0, %k1
2895 ; X64-AVX512F-NEXT:    setne %al
2896 ; X64-AVX512F-NEXT:    vzeroupper
2897 ; X64-AVX512F-NEXT:    retq
2899 ; X64-MIC-AVX2-LABEL: length128_eq:
2900 ; X64-MIC-AVX2:       # %bb.0:
2901 ; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2902 ; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2903 ; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
2904 ; X64-MIC-AVX2-NEXT:    vmovdqu 96(%rdi), %ymm3
2905 ; X64-MIC-AVX2-NEXT:    vmovdqu (%rsi), %ymm4
2906 ; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rsi), %ymm5
2907 ; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rsi), %ymm6
2908 ; X64-MIC-AVX2-NEXT:    vmovdqu 96(%rsi), %ymm7
2909 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm7, %zmm3, %k0
2910 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm6, %zmm2, %k1
2911 ; X64-MIC-AVX2-NEXT:    korw %k0, %k1, %k0
2912 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm5, %zmm1, %k1
2913 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm4, %zmm0, %k2
2914 ; X64-MIC-AVX2-NEXT:    korw %k1, %k2, %k1
2915 ; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
2916 ; X64-MIC-AVX2-NEXT:    setne %al
2917 ; X64-MIC-AVX2-NEXT:    vzeroupper
2918 ; X64-MIC-AVX2-NEXT:    retq
2920 ; X64-MIC-AVX512F-LABEL: length128_eq:
2921 ; X64-MIC-AVX512F:       # %bb.0:
2922 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
2923 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
2924 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k0
2925 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
2926 ; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
2927 ; X64-MIC-AVX512F-NEXT:    setne %al
2928 ; X64-MIC-AVX512F-NEXT:    vzeroupper
2929 ; X64-MIC-AVX512F-NEXT:    retq
2930   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind
2931   %cmp = icmp ne i32 %call, 0
2932   ret i1 %cmp
2935 define i1 @length128_lt(ptr %x, ptr %y) nounwind {
2936 ; X64-LABEL: length128_lt:
2937 ; X64:       # %bb.0:
2938 ; X64-NEXT:    pushq %rax
2939 ; X64-NEXT:    movl $128, %edx
2940 ; X64-NEXT:    callq memcmp
2941 ; X64-NEXT:    shrl $31, %eax
2942 ; X64-NEXT:    # kill: def $al killed $al killed $eax
2943 ; X64-NEXT:    popq %rcx
2944 ; X64-NEXT:    retq
2945   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind
2946   %cmp = icmp slt i32 %call, 0
2947   ret i1 %cmp
2950 define i1 @length128_gt(ptr %x, ptr %y) nounwind {
2951 ; X64-LABEL: length128_gt:
2952 ; X64:       # %bb.0:
2953 ; X64-NEXT:    pushq %rax
2954 ; X64-NEXT:    movl $128, %edx
2955 ; X64-NEXT:    callq memcmp
2956 ; X64-NEXT:    testl %eax, %eax
2957 ; X64-NEXT:    setg %al
2958 ; X64-NEXT:    popq %rcx
2959 ; X64-NEXT:    retq
2960   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 128) nounwind
2961   %cmp = icmp sgt i32 %call, 0
2962   ret i1 %cmp
2965 define i1 @length128_eq_const(ptr %X) nounwind {
2966 ; X64-SSE-LABEL: length128_eq_const:
2967 ; X64-SSE:       # %bb.0:
2968 ; X64-SSE-NEXT:    pushq %rax
2969 ; X64-SSE-NEXT:    movl $.L.str, %esi
2970 ; X64-SSE-NEXT:    movl $128, %edx
2971 ; X64-SSE-NEXT:    callq memcmp
2972 ; X64-SSE-NEXT:    testl %eax, %eax
2973 ; X64-SSE-NEXT:    sete %al
2974 ; X64-SSE-NEXT:    popq %rcx
2975 ; X64-SSE-NEXT:    retq
2977 ; X64-AVX1-LABEL: length128_eq_const:
2978 ; X64-AVX1:       # %bb.0:
2979 ; X64-AVX1-NEXT:    vmovups (%rdi), %ymm0
2980 ; X64-AVX1-NEXT:    vmovups 32(%rdi), %ymm1
2981 ; X64-AVX1-NEXT:    vmovups 64(%rdi), %ymm2
2982 ; X64-AVX1-NEXT:    vmovups 96(%rdi), %ymm3
2983 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
2984 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
2985 ; X64-AVX1-NEXT:    vorps %ymm3, %ymm2, %ymm2
2986 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2987 ; X64-AVX1-NEXT:    vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2988 ; X64-AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2989 ; X64-AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm0
2990 ; X64-AVX1-NEXT:    vptest %ymm0, %ymm0
2991 ; X64-AVX1-NEXT:    sete %al
2992 ; X64-AVX1-NEXT:    vzeroupper
2993 ; X64-AVX1-NEXT:    retq
2995 ; X64-AVX2-LABEL: length128_eq_const:
2996 ; X64-AVX2:       # %bb.0:
2997 ; X64-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
2998 ; X64-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
2999 ; X64-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
3000 ; X64-AVX2-NEXT:    vmovdqu 96(%rdi), %ymm3
3001 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
3002 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
3003 ; X64-AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm2
3004 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
3005 ; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
3006 ; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
3007 ; X64-AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
3008 ; X64-AVX2-NEXT:    vptest %ymm0, %ymm0
3009 ; X64-AVX2-NEXT:    sete %al
3010 ; X64-AVX2-NEXT:    vzeroupper
3011 ; X64-AVX2-NEXT:    retq
3013 ; X64-AVX512BW-LABEL: length128_eq_const:
3014 ; X64-AVX512BW:       # %bb.0:
3015 ; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3016 ; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
3017 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+64(%rip), %zmm1, %k0
3018 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k1
3019 ; X64-AVX512BW-NEXT:    kortestq %k0, %k1
3020 ; X64-AVX512BW-NEXT:    sete %al
3021 ; X64-AVX512BW-NEXT:    vzeroupper
3022 ; X64-AVX512BW-NEXT:    retq
3024 ; X64-AVX512F-LABEL: length128_eq_const:
3025 ; X64-AVX512F:       # %bb.0:
3026 ; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3027 ; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3028 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k0
3029 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
3030 ; X64-AVX512F-NEXT:    kortestw %k0, %k1
3031 ; X64-AVX512F-NEXT:    sete %al
3032 ; X64-AVX512F-NEXT:    vzeroupper
3033 ; X64-AVX512F-NEXT:    retq
3035 ; X64-MIC-AVX2-LABEL: length128_eq_const:
3036 ; X64-MIC-AVX2:       # %bb.0:
3037 ; X64-MIC-AVX2-NEXT:    vmovdqu (%rdi), %ymm0
3038 ; X64-MIC-AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
3039 ; X64-MIC-AVX2-NEXT:    vmovdqu 64(%rdi), %ymm2
3040 ; X64-MIC-AVX2-NEXT:    vmovdqu 96(%rdi), %ymm3
3041 ; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [959985462,858927408,926299444,825243960,892613426,959985462,858927408,926299444]
3042 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm4, %zmm3, %k0
3043 ; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426]
3044 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm3, %zmm2, %k1
3045 ; X64-MIC-AVX2-NEXT:    korw %k0, %k1, %k0
3046 ; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408]
3047 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm2, %zmm1, %k1
3048 ; X64-MIC-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960]
3049 ; X64-MIC-AVX2-NEXT:    vpcmpneqd %zmm1, %zmm0, %k2
3050 ; X64-MIC-AVX2-NEXT:    korw %k1, %k2, %k1
3051 ; X64-MIC-AVX2-NEXT:    kortestw %k0, %k1
3052 ; X64-MIC-AVX2-NEXT:    sete %al
3053 ; X64-MIC-AVX2-NEXT:    vzeroupper
3054 ; X64-MIC-AVX2-NEXT:    retq
3056 ; X64-MIC-AVX512F-LABEL: length128_eq_const:
3057 ; X64-MIC-AVX512F:       # %bb.0:
3058 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3059 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3060 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k0
3061 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
3062 ; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
3063 ; X64-MIC-AVX512F-NEXT:    sete %al
3064 ; X64-MIC-AVX512F-NEXT:    vzeroupper
3065 ; X64-MIC-AVX512F-NEXT:    retq
3066   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 128) nounwind
3067   %c = icmp eq i32 %m, 0
3068   ret i1 %c
3071 define i32 @length192(ptr %X, ptr %Y) nounwind {
3072 ; X64-LABEL: length192:
3073 ; X64:       # %bb.0:
3074 ; X64-NEXT:    movl $192, %edx
3075 ; X64-NEXT:    jmp memcmp # TAILCALL
3076   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 192) nounwind
3077   ret i32 %m
3080 define i1 @length192_eq(ptr %x, ptr %y) nounwind {
3081 ; X64-SSE-LABEL: length192_eq:
3082 ; X64-SSE:       # %bb.0:
3083 ; X64-SSE-NEXT:    pushq %rax
3084 ; X64-SSE-NEXT:    movl $192, %edx
3085 ; X64-SSE-NEXT:    callq memcmp
3086 ; X64-SSE-NEXT:    testl %eax, %eax
3087 ; X64-SSE-NEXT:    setne %al
3088 ; X64-SSE-NEXT:    popq %rcx
3089 ; X64-SSE-NEXT:    retq
3091 ; X64-AVX1-LABEL: length192_eq:
3092 ; X64-AVX1:       # %bb.0:
3093 ; X64-AVX1-NEXT:    pushq %rax
3094 ; X64-AVX1-NEXT:    movl $192, %edx
3095 ; X64-AVX1-NEXT:    callq memcmp
3096 ; X64-AVX1-NEXT:    testl %eax, %eax
3097 ; X64-AVX1-NEXT:    setne %al
3098 ; X64-AVX1-NEXT:    popq %rcx
3099 ; X64-AVX1-NEXT:    retq
3101 ; X64-AVX2-LABEL: length192_eq:
3102 ; X64-AVX2:       # %bb.0:
3103 ; X64-AVX2-NEXT:    pushq %rax
3104 ; X64-AVX2-NEXT:    movl $192, %edx
3105 ; X64-AVX2-NEXT:    callq memcmp
3106 ; X64-AVX2-NEXT:    testl %eax, %eax
3107 ; X64-AVX2-NEXT:    setne %al
3108 ; X64-AVX2-NEXT:    popq %rcx
3109 ; X64-AVX2-NEXT:    retq
3111 ; X64-AVX512BW-LABEL: length192_eq:
3112 ; X64-AVX512BW:       # %bb.0:
3113 ; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3114 ; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
3115 ; X64-AVX512BW-NEXT:    vmovdqu64 128(%rdi), %zmm2
3116 ; X64-AVX512BW-NEXT:    vpcmpneqb 64(%rsi), %zmm1, %k0
3117 ; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k1
3118 ; X64-AVX512BW-NEXT:    korq %k0, %k1, %k0
3119 ; X64-AVX512BW-NEXT:    vpcmpneqb 128(%rsi), %zmm2, %k1
3120 ; X64-AVX512BW-NEXT:    kortestq %k1, %k0
3121 ; X64-AVX512BW-NEXT:    setne %al
3122 ; X64-AVX512BW-NEXT:    vzeroupper
3123 ; X64-AVX512BW-NEXT:    retq
3125 ; X64-AVX512F-LABEL: length192_eq:
3126 ; X64-AVX512F:       # %bb.0:
3127 ; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3128 ; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3129 ; X64-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
3130 ; X64-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k0
3131 ; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
3132 ; X64-AVX512F-NEXT:    korw %k0, %k1, %k0
3133 ; X64-AVX512F-NEXT:    vpcmpneqd 128(%rsi), %zmm2, %k1
3134 ; X64-AVX512F-NEXT:    kortestw %k1, %k0
3135 ; X64-AVX512F-NEXT:    setne %al
3136 ; X64-AVX512F-NEXT:    vzeroupper
3137 ; X64-AVX512F-NEXT:    retq
3139 ; X64-MIC-AVX2-LABEL: length192_eq:
3140 ; X64-MIC-AVX2:       # %bb.0:
3141 ; X64-MIC-AVX2-NEXT:    pushq %rax
3142 ; X64-MIC-AVX2-NEXT:    movl $192, %edx
3143 ; X64-MIC-AVX2-NEXT:    callq memcmp
3144 ; X64-MIC-AVX2-NEXT:    testl %eax, %eax
3145 ; X64-MIC-AVX2-NEXT:    setne %al
3146 ; X64-MIC-AVX2-NEXT:    popq %rcx
3147 ; X64-MIC-AVX2-NEXT:    retq
3149 ; X64-MIC-AVX512F-LABEL: length192_eq:
3150 ; X64-MIC-AVX512F:       # %bb.0:
3151 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3152 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3153 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
3154 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k0
3155 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k1
3156 ; X64-MIC-AVX512F-NEXT:    korw %k0, %k1, %k0
3157 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd 128(%rsi), %zmm2, %k1
3158 ; X64-MIC-AVX512F-NEXT:    kortestw %k1, %k0
3159 ; X64-MIC-AVX512F-NEXT:    setne %al
3160 ; X64-MIC-AVX512F-NEXT:    vzeroupper
3161 ; X64-MIC-AVX512F-NEXT:    retq
3162   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind
3163   %cmp = icmp ne i32 %call, 0
3164   ret i1 %cmp
3167 define i1 @length192_lt(ptr %x, ptr %y) nounwind {
3168 ; X64-LABEL: length192_lt:
3169 ; X64:       # %bb.0:
3170 ; X64-NEXT:    pushq %rax
3171 ; X64-NEXT:    movl $192, %edx
3172 ; X64-NEXT:    callq memcmp
3173 ; X64-NEXT:    shrl $31, %eax
3174 ; X64-NEXT:    # kill: def $al killed $al killed $eax
3175 ; X64-NEXT:    popq %rcx
3176 ; X64-NEXT:    retq
3177   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind
3178   %cmp = icmp slt i32 %call, 0
3179   ret i1 %cmp
3182 define i1 @length192_gt(ptr %x, ptr %y) nounwind {
3183 ; X64-LABEL: length192_gt:
3184 ; X64:       # %bb.0:
3185 ; X64-NEXT:    pushq %rax
3186 ; X64-NEXT:    movl $192, %edx
3187 ; X64-NEXT:    callq memcmp
3188 ; X64-NEXT:    testl %eax, %eax
3189 ; X64-NEXT:    setg %al
3190 ; X64-NEXT:    popq %rcx
3191 ; X64-NEXT:    retq
3192   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 192) nounwind
3193   %cmp = icmp sgt i32 %call, 0
3194   ret i1 %cmp
3197 define i1 @length192_eq_const(ptr %X) nounwind {
3198 ; X64-SSE-LABEL: length192_eq_const:
3199 ; X64-SSE:       # %bb.0:
3200 ; X64-SSE-NEXT:    pushq %rax
3201 ; X64-SSE-NEXT:    movl $.L.str, %esi
3202 ; X64-SSE-NEXT:    movl $192, %edx
3203 ; X64-SSE-NEXT:    callq memcmp
3204 ; X64-SSE-NEXT:    testl %eax, %eax
3205 ; X64-SSE-NEXT:    sete %al
3206 ; X64-SSE-NEXT:    popq %rcx
3207 ; X64-SSE-NEXT:    retq
3209 ; X64-AVX1-LABEL: length192_eq_const:
3210 ; X64-AVX1:       # %bb.0:
3211 ; X64-AVX1-NEXT:    pushq %rax
3212 ; X64-AVX1-NEXT:    movl $.L.str, %esi
3213 ; X64-AVX1-NEXT:    movl $192, %edx
3214 ; X64-AVX1-NEXT:    callq memcmp
3215 ; X64-AVX1-NEXT:    testl %eax, %eax
3216 ; X64-AVX1-NEXT:    sete %al
3217 ; X64-AVX1-NEXT:    popq %rcx
3218 ; X64-AVX1-NEXT:    retq
3220 ; X64-AVX2-LABEL: length192_eq_const:
3221 ; X64-AVX2:       # %bb.0:
3222 ; X64-AVX2-NEXT:    pushq %rax
3223 ; X64-AVX2-NEXT:    movl $.L.str, %esi
3224 ; X64-AVX2-NEXT:    movl $192, %edx
3225 ; X64-AVX2-NEXT:    callq memcmp
3226 ; X64-AVX2-NEXT:    testl %eax, %eax
3227 ; X64-AVX2-NEXT:    sete %al
3228 ; X64-AVX2-NEXT:    popq %rcx
3229 ; X64-AVX2-NEXT:    retq
3231 ; X64-AVX512BW-LABEL: length192_eq_const:
3232 ; X64-AVX512BW:       # %bb.0:
3233 ; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3234 ; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
3235 ; X64-AVX512BW-NEXT:    vmovdqu64 128(%rdi), %zmm2
3236 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+64(%rip), %zmm1, %k0
3237 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k1
3238 ; X64-AVX512BW-NEXT:    korq %k0, %k1, %k0
3239 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+128(%rip), %zmm2, %k1
3240 ; X64-AVX512BW-NEXT:    kortestq %k1, %k0
3241 ; X64-AVX512BW-NEXT:    sete %al
3242 ; X64-AVX512BW-NEXT:    vzeroupper
3243 ; X64-AVX512BW-NEXT:    retq
3245 ; X64-AVX512F-LABEL: length192_eq_const:
3246 ; X64-AVX512F:       # %bb.0:
3247 ; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3248 ; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3249 ; X64-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
3250 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k0
3251 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
3252 ; X64-AVX512F-NEXT:    korw %k0, %k1, %k0
3253 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str+128(%rip), %zmm2, %k1
3254 ; X64-AVX512F-NEXT:    kortestw %k1, %k0
3255 ; X64-AVX512F-NEXT:    sete %al
3256 ; X64-AVX512F-NEXT:    vzeroupper
3257 ; X64-AVX512F-NEXT:    retq
3259 ; X64-MIC-AVX2-LABEL: length192_eq_const:
3260 ; X64-MIC-AVX2:       # %bb.0:
3261 ; X64-MIC-AVX2-NEXT:    pushq %rax
3262 ; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi
3263 ; X64-MIC-AVX2-NEXT:    movl $192, %edx
3264 ; X64-MIC-AVX2-NEXT:    callq memcmp
3265 ; X64-MIC-AVX2-NEXT:    testl %eax, %eax
3266 ; X64-MIC-AVX2-NEXT:    sete %al
3267 ; X64-MIC-AVX2-NEXT:    popq %rcx
3268 ; X64-MIC-AVX2-NEXT:    retq
3270 ; X64-MIC-AVX512F-LABEL: length192_eq_const:
3271 ; X64-MIC-AVX512F:       # %bb.0:
3272 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3273 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3274 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
3275 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k0
3276 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k1
3277 ; X64-MIC-AVX512F-NEXT:    korw %k0, %k1, %k0
3278 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+128(%rip), %zmm2, %k1
3279 ; X64-MIC-AVX512F-NEXT:    kortestw %k1, %k0
3280 ; X64-MIC-AVX512F-NEXT:    sete %al
3281 ; X64-MIC-AVX512F-NEXT:    vzeroupper
3282 ; X64-MIC-AVX512F-NEXT:    retq
3283   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 192) nounwind
3284   %c = icmp eq i32 %m, 0
3285   ret i1 %c
3288 define i32 @length255(ptr %X, ptr %Y) nounwind {
3289 ; X64-LABEL: length255:
3290 ; X64:       # %bb.0:
3291 ; X64-NEXT:    movl $255, %edx
3292 ; X64-NEXT:    jmp memcmp # TAILCALL
3293   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 255) nounwind
3294   ret i32 %m
3297 define i1 @length255_eq(ptr %x, ptr %y) nounwind {
3298 ; X64-SSE-LABEL: length255_eq:
3299 ; X64-SSE:       # %bb.0:
3300 ; X64-SSE-NEXT:    pushq %rax
3301 ; X64-SSE-NEXT:    movl $255, %edx
3302 ; X64-SSE-NEXT:    callq memcmp
3303 ; X64-SSE-NEXT:    testl %eax, %eax
3304 ; X64-SSE-NEXT:    setne %al
3305 ; X64-SSE-NEXT:    popq %rcx
3306 ; X64-SSE-NEXT:    retq
3308 ; X64-AVX1-LABEL: length255_eq:
3309 ; X64-AVX1:       # %bb.0:
3310 ; X64-AVX1-NEXT:    pushq %rax
3311 ; X64-AVX1-NEXT:    movl $255, %edx
3312 ; X64-AVX1-NEXT:    callq memcmp
3313 ; X64-AVX1-NEXT:    testl %eax, %eax
3314 ; X64-AVX1-NEXT:    setne %al
3315 ; X64-AVX1-NEXT:    popq %rcx
3316 ; X64-AVX1-NEXT:    retq
3318 ; X64-AVX2-LABEL: length255_eq:
3319 ; X64-AVX2:       # %bb.0:
3320 ; X64-AVX2-NEXT:    pushq %rax
3321 ; X64-AVX2-NEXT:    movl $255, %edx
3322 ; X64-AVX2-NEXT:    callq memcmp
3323 ; X64-AVX2-NEXT:    testl %eax, %eax
3324 ; X64-AVX2-NEXT:    setne %al
3325 ; X64-AVX2-NEXT:    popq %rcx
3326 ; X64-AVX2-NEXT:    retq
3328 ; X64-AVX512BW-LABEL: length255_eq:
3329 ; X64-AVX512BW:       # %bb.0:
3330 ; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3331 ; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
3332 ; X64-AVX512BW-NEXT:    vmovdqu64 128(%rdi), %zmm2
3333 ; X64-AVX512BW-NEXT:    vmovdqu64 191(%rdi), %zmm3
3334 ; X64-AVX512BW-NEXT:    vpcmpneqb 191(%rsi), %zmm3, %k0
3335 ; X64-AVX512BW-NEXT:    vpcmpneqb 128(%rsi), %zmm2, %k1
3336 ; X64-AVX512BW-NEXT:    korq %k0, %k1, %k0
3337 ; X64-AVX512BW-NEXT:    vpcmpneqb 64(%rsi), %zmm1, %k1
3338 ; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k2
3339 ; X64-AVX512BW-NEXT:    korq %k1, %k2, %k1
3340 ; X64-AVX512BW-NEXT:    kortestq %k0, %k1
3341 ; X64-AVX512BW-NEXT:    setne %al
3342 ; X64-AVX512BW-NEXT:    vzeroupper
3343 ; X64-AVX512BW-NEXT:    retq
3345 ; X64-AVX512F-LABEL: length255_eq:
3346 ; X64-AVX512F:       # %bb.0:
3347 ; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3348 ; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3349 ; X64-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
3350 ; X64-AVX512F-NEXT:    vmovdqu64 191(%rdi), %zmm3
3351 ; X64-AVX512F-NEXT:    vpcmpneqd 191(%rsi), %zmm3, %k0
3352 ; X64-AVX512F-NEXT:    vpcmpneqd 128(%rsi), %zmm2, %k1
3353 ; X64-AVX512F-NEXT:    korw %k0, %k1, %k0
3354 ; X64-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k1
3355 ; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k2
3356 ; X64-AVX512F-NEXT:    korw %k1, %k2, %k1
3357 ; X64-AVX512F-NEXT:    kortestw %k0, %k1
3358 ; X64-AVX512F-NEXT:    setne %al
3359 ; X64-AVX512F-NEXT:    vzeroupper
3360 ; X64-AVX512F-NEXT:    retq
3362 ; X64-MIC-AVX2-LABEL: length255_eq:
3363 ; X64-MIC-AVX2:       # %bb.0:
3364 ; X64-MIC-AVX2-NEXT:    pushq %rax
3365 ; X64-MIC-AVX2-NEXT:    movl $255, %edx
3366 ; X64-MIC-AVX2-NEXT:    callq memcmp
3367 ; X64-MIC-AVX2-NEXT:    testl %eax, %eax
3368 ; X64-MIC-AVX2-NEXT:    setne %al
3369 ; X64-MIC-AVX2-NEXT:    popq %rcx
3370 ; X64-MIC-AVX2-NEXT:    retq
3372 ; X64-MIC-AVX512F-LABEL: length255_eq:
3373 ; X64-MIC-AVX512F:       # %bb.0:
3374 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3375 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3376 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
3377 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 191(%rdi), %zmm3
3378 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd 191(%rsi), %zmm3, %k0
3379 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd 128(%rsi), %zmm2, %k1
3380 ; X64-MIC-AVX512F-NEXT:    korw %k0, %k1, %k0
3381 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k1
3382 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k2
3383 ; X64-MIC-AVX512F-NEXT:    korw %k1, %k2, %k1
3384 ; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
3385 ; X64-MIC-AVX512F-NEXT:    setne %al
3386 ; X64-MIC-AVX512F-NEXT:    vzeroupper
3387 ; X64-MIC-AVX512F-NEXT:    retq
3388   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind
3389   %cmp = icmp ne i32 %call, 0
3390   ret i1 %cmp
3393 define i1 @length255_lt(ptr %x, ptr %y) nounwind {
3394 ; X64-LABEL: length255_lt:
3395 ; X64:       # %bb.0:
3396 ; X64-NEXT:    pushq %rax
3397 ; X64-NEXT:    movl $255, %edx
3398 ; X64-NEXT:    callq memcmp
3399 ; X64-NEXT:    shrl $31, %eax
3400 ; X64-NEXT:    # kill: def $al killed $al killed $eax
3401 ; X64-NEXT:    popq %rcx
3402 ; X64-NEXT:    retq
3403   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind
3404   %cmp = icmp slt i32 %call, 0
3405   ret i1 %cmp
3408 define i1 @length255_gt(ptr %x, ptr %y) nounwind {
3409 ; X64-LABEL: length255_gt:
3410 ; X64:       # %bb.0:
3411 ; X64-NEXT:    pushq %rax
3412 ; X64-NEXT:    movl $255, %edx
3413 ; X64-NEXT:    callq memcmp
3414 ; X64-NEXT:    testl %eax, %eax
3415 ; X64-NEXT:    setg %al
3416 ; X64-NEXT:    popq %rcx
3417 ; X64-NEXT:    retq
3418   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 255) nounwind
3419   %cmp = icmp sgt i32 %call, 0
3420   ret i1 %cmp
3423 define i1 @length255_eq_const(ptr %X) nounwind {
3424 ; X64-SSE-LABEL: length255_eq_const:
3425 ; X64-SSE:       # %bb.0:
3426 ; X64-SSE-NEXT:    pushq %rax
3427 ; X64-SSE-NEXT:    movl $.L.str, %esi
3428 ; X64-SSE-NEXT:    movl $255, %edx
3429 ; X64-SSE-NEXT:    callq memcmp
3430 ; X64-SSE-NEXT:    testl %eax, %eax
3431 ; X64-SSE-NEXT:    sete %al
3432 ; X64-SSE-NEXT:    popq %rcx
3433 ; X64-SSE-NEXT:    retq
3435 ; X64-AVX1-LABEL: length255_eq_const:
3436 ; X64-AVX1:       # %bb.0:
3437 ; X64-AVX1-NEXT:    pushq %rax
3438 ; X64-AVX1-NEXT:    movl $.L.str, %esi
3439 ; X64-AVX1-NEXT:    movl $255, %edx
3440 ; X64-AVX1-NEXT:    callq memcmp
3441 ; X64-AVX1-NEXT:    testl %eax, %eax
3442 ; X64-AVX1-NEXT:    sete %al
3443 ; X64-AVX1-NEXT:    popq %rcx
3444 ; X64-AVX1-NEXT:    retq
3446 ; X64-AVX2-LABEL: length255_eq_const:
3447 ; X64-AVX2:       # %bb.0:
3448 ; X64-AVX2-NEXT:    pushq %rax
3449 ; X64-AVX2-NEXT:    movl $.L.str, %esi
3450 ; X64-AVX2-NEXT:    movl $255, %edx
3451 ; X64-AVX2-NEXT:    callq memcmp
3452 ; X64-AVX2-NEXT:    testl %eax, %eax
3453 ; X64-AVX2-NEXT:    sete %al
3454 ; X64-AVX2-NEXT:    popq %rcx
3455 ; X64-AVX2-NEXT:    retq
3457 ; X64-AVX512BW-LABEL: length255_eq_const:
3458 ; X64-AVX512BW:       # %bb.0:
3459 ; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3460 ; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
3461 ; X64-AVX512BW-NEXT:    vmovdqu64 128(%rdi), %zmm2
3462 ; X64-AVX512BW-NEXT:    vmovdqu64 191(%rdi), %zmm3
3463 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+191(%rip), %zmm3, %k0
3464 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+128(%rip), %zmm2, %k1
3465 ; X64-AVX512BW-NEXT:    korq %k0, %k1, %k0
3466 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+64(%rip), %zmm1, %k1
3467 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k2
3468 ; X64-AVX512BW-NEXT:    korq %k1, %k2, %k1
3469 ; X64-AVX512BW-NEXT:    kortestq %k0, %k1
3470 ; X64-AVX512BW-NEXT:    sete %al
3471 ; X64-AVX512BW-NEXT:    vzeroupper
3472 ; X64-AVX512BW-NEXT:    retq
3474 ; X64-AVX512F-LABEL: length255_eq_const:
3475 ; X64-AVX512F:       # %bb.0:
3476 ; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3477 ; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3478 ; X64-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
3479 ; X64-AVX512F-NEXT:    vmovdqu64 191(%rdi), %zmm3
3480 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str+191(%rip), %zmm3, %k0
3481 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str+128(%rip), %zmm2, %k1
3482 ; X64-AVX512F-NEXT:    korw %k0, %k1, %k0
3483 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k1
3484 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k2
3485 ; X64-AVX512F-NEXT:    korw %k1, %k2, %k1
3486 ; X64-AVX512F-NEXT:    kortestw %k0, %k1
3487 ; X64-AVX512F-NEXT:    sete %al
3488 ; X64-AVX512F-NEXT:    vzeroupper
3489 ; X64-AVX512F-NEXT:    retq
3491 ; X64-MIC-AVX2-LABEL: length255_eq_const:
3492 ; X64-MIC-AVX2:       # %bb.0:
3493 ; X64-MIC-AVX2-NEXT:    pushq %rax
3494 ; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi
3495 ; X64-MIC-AVX2-NEXT:    movl $255, %edx
3496 ; X64-MIC-AVX2-NEXT:    callq memcmp
3497 ; X64-MIC-AVX2-NEXT:    testl %eax, %eax
3498 ; X64-MIC-AVX2-NEXT:    sete %al
3499 ; X64-MIC-AVX2-NEXT:    popq %rcx
3500 ; X64-MIC-AVX2-NEXT:    retq
3502 ; X64-MIC-AVX512F-LABEL: length255_eq_const:
3503 ; X64-MIC-AVX512F:       # %bb.0:
3504 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3505 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3506 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
3507 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 191(%rdi), %zmm3
3508 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+191(%rip), %zmm3, %k0
3509 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+128(%rip), %zmm2, %k1
3510 ; X64-MIC-AVX512F-NEXT:    korw %k0, %k1, %k0
3511 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k1
3512 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k2
3513 ; X64-MIC-AVX512F-NEXT:    korw %k1, %k2, %k1
3514 ; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
3515 ; X64-MIC-AVX512F-NEXT:    sete %al
3516 ; X64-MIC-AVX512F-NEXT:    vzeroupper
3517 ; X64-MIC-AVX512F-NEXT:    retq
3518   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 255) nounwind
3519   %c = icmp eq i32 %m, 0
3520   ret i1 %c
3523 define i32 @length256(ptr %X, ptr %Y) nounwind {
3524 ; X64-LABEL: length256:
3525 ; X64:       # %bb.0:
3526 ; X64-NEXT:    movl $256, %edx # imm = 0x100
3527 ; X64-NEXT:    jmp memcmp # TAILCALL
3528   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 256) nounwind
3529   ret i32 %m
3532 define i1 @length256_eq(ptr %x, ptr %y) nounwind {
3533 ; X64-SSE-LABEL: length256_eq:
3534 ; X64-SSE:       # %bb.0:
3535 ; X64-SSE-NEXT:    pushq %rax
3536 ; X64-SSE-NEXT:    movl $256, %edx # imm = 0x100
3537 ; X64-SSE-NEXT:    callq memcmp
3538 ; X64-SSE-NEXT:    testl %eax, %eax
3539 ; X64-SSE-NEXT:    setne %al
3540 ; X64-SSE-NEXT:    popq %rcx
3541 ; X64-SSE-NEXT:    retq
3543 ; X64-AVX1-LABEL: length256_eq:
3544 ; X64-AVX1:       # %bb.0:
3545 ; X64-AVX1-NEXT:    pushq %rax
3546 ; X64-AVX1-NEXT:    movl $256, %edx # imm = 0x100
3547 ; X64-AVX1-NEXT:    callq memcmp
3548 ; X64-AVX1-NEXT:    testl %eax, %eax
3549 ; X64-AVX1-NEXT:    setne %al
3550 ; X64-AVX1-NEXT:    popq %rcx
3551 ; X64-AVX1-NEXT:    retq
3553 ; X64-AVX2-LABEL: length256_eq:
3554 ; X64-AVX2:       # %bb.0:
3555 ; X64-AVX2-NEXT:    pushq %rax
3556 ; X64-AVX2-NEXT:    movl $256, %edx # imm = 0x100
3557 ; X64-AVX2-NEXT:    callq memcmp
3558 ; X64-AVX2-NEXT:    testl %eax, %eax
3559 ; X64-AVX2-NEXT:    setne %al
3560 ; X64-AVX2-NEXT:    popq %rcx
3561 ; X64-AVX2-NEXT:    retq
3563 ; X64-AVX512BW-LABEL: length256_eq:
3564 ; X64-AVX512BW:       # %bb.0:
3565 ; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3566 ; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
3567 ; X64-AVX512BW-NEXT:    vmovdqu64 128(%rdi), %zmm2
3568 ; X64-AVX512BW-NEXT:    vmovdqu64 192(%rdi), %zmm3
3569 ; X64-AVX512BW-NEXT:    vpcmpneqb 192(%rsi), %zmm3, %k0
3570 ; X64-AVX512BW-NEXT:    vpcmpneqb 128(%rsi), %zmm2, %k1
3571 ; X64-AVX512BW-NEXT:    korq %k0, %k1, %k0
3572 ; X64-AVX512BW-NEXT:    vpcmpneqb 64(%rsi), %zmm1, %k1
3573 ; X64-AVX512BW-NEXT:    vpcmpneqb (%rsi), %zmm0, %k2
3574 ; X64-AVX512BW-NEXT:    korq %k1, %k2, %k1
3575 ; X64-AVX512BW-NEXT:    kortestq %k0, %k1
3576 ; X64-AVX512BW-NEXT:    setne %al
3577 ; X64-AVX512BW-NEXT:    vzeroupper
3578 ; X64-AVX512BW-NEXT:    retq
3580 ; X64-AVX512F-LABEL: length256_eq:
3581 ; X64-AVX512F:       # %bb.0:
3582 ; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3583 ; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3584 ; X64-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
3585 ; X64-AVX512F-NEXT:    vmovdqu64 192(%rdi), %zmm3
3586 ; X64-AVX512F-NEXT:    vpcmpneqd 192(%rsi), %zmm3, %k0
3587 ; X64-AVX512F-NEXT:    vpcmpneqd 128(%rsi), %zmm2, %k1
3588 ; X64-AVX512F-NEXT:    korw %k0, %k1, %k0
3589 ; X64-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k1
3590 ; X64-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k2
3591 ; X64-AVX512F-NEXT:    korw %k1, %k2, %k1
3592 ; X64-AVX512F-NEXT:    kortestw %k0, %k1
3593 ; X64-AVX512F-NEXT:    setne %al
3594 ; X64-AVX512F-NEXT:    vzeroupper
3595 ; X64-AVX512F-NEXT:    retq
3597 ; X64-MIC-AVX2-LABEL: length256_eq:
3598 ; X64-MIC-AVX2:       # %bb.0:
3599 ; X64-MIC-AVX2-NEXT:    pushq %rax
3600 ; X64-MIC-AVX2-NEXT:    movl $256, %edx # imm = 0x100
3601 ; X64-MIC-AVX2-NEXT:    callq memcmp
3602 ; X64-MIC-AVX2-NEXT:    testl %eax, %eax
3603 ; X64-MIC-AVX2-NEXT:    setne %al
3604 ; X64-MIC-AVX2-NEXT:    popq %rcx
3605 ; X64-MIC-AVX2-NEXT:    retq
3607 ; X64-MIC-AVX512F-LABEL: length256_eq:
3608 ; X64-MIC-AVX512F:       # %bb.0:
3609 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3610 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3611 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
3612 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 192(%rdi), %zmm3
3613 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd 192(%rsi), %zmm3, %k0
3614 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd 128(%rsi), %zmm2, %k1
3615 ; X64-MIC-AVX512F-NEXT:    korw %k0, %k1, %k0
3616 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd 64(%rsi), %zmm1, %k1
3617 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd (%rsi), %zmm0, %k2
3618 ; X64-MIC-AVX512F-NEXT:    korw %k1, %k2, %k1
3619 ; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
3620 ; X64-MIC-AVX512F-NEXT:    setne %al
3621 ; X64-MIC-AVX512F-NEXT:    vzeroupper
3622 ; X64-MIC-AVX512F-NEXT:    retq
3623   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind
3624   %cmp = icmp ne i32 %call, 0
3625   ret i1 %cmp
3628 define i1 @length256_lt(ptr %x, ptr %y) nounwind {
3629 ; X64-LABEL: length256_lt:
3630 ; X64:       # %bb.0:
3631 ; X64-NEXT:    pushq %rax
3632 ; X64-NEXT:    movl $256, %edx # imm = 0x100
3633 ; X64-NEXT:    callq memcmp
3634 ; X64-NEXT:    shrl $31, %eax
3635 ; X64-NEXT:    # kill: def $al killed $al killed $eax
3636 ; X64-NEXT:    popq %rcx
3637 ; X64-NEXT:    retq
3638   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind
3639   %cmp = icmp slt i32 %call, 0
3640   ret i1 %cmp
3643 define i1 @length256_gt(ptr %x, ptr %y) nounwind {
3644 ; X64-LABEL: length256_gt:
3645 ; X64:       # %bb.0:
3646 ; X64-NEXT:    pushq %rax
3647 ; X64-NEXT:    movl $256, %edx # imm = 0x100
3648 ; X64-NEXT:    callq memcmp
3649 ; X64-NEXT:    testl %eax, %eax
3650 ; X64-NEXT:    setg %al
3651 ; X64-NEXT:    popq %rcx
3652 ; X64-NEXT:    retq
3653   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 256) nounwind
3654   %cmp = icmp sgt i32 %call, 0
3655   ret i1 %cmp
3658 define i1 @length256_eq_const(ptr %X) nounwind {
3659 ; X64-SSE-LABEL: length256_eq_const:
3660 ; X64-SSE:       # %bb.0:
3661 ; X64-SSE-NEXT:    pushq %rax
3662 ; X64-SSE-NEXT:    movl $.L.str, %esi
3663 ; X64-SSE-NEXT:    movl $256, %edx # imm = 0x100
3664 ; X64-SSE-NEXT:    callq memcmp
3665 ; X64-SSE-NEXT:    testl %eax, %eax
3666 ; X64-SSE-NEXT:    sete %al
3667 ; X64-SSE-NEXT:    popq %rcx
3668 ; X64-SSE-NEXT:    retq
3670 ; X64-AVX1-LABEL: length256_eq_const:
3671 ; X64-AVX1:       # %bb.0:
3672 ; X64-AVX1-NEXT:    pushq %rax
3673 ; X64-AVX1-NEXT:    movl $.L.str, %esi
3674 ; X64-AVX1-NEXT:    movl $256, %edx # imm = 0x100
3675 ; X64-AVX1-NEXT:    callq memcmp
3676 ; X64-AVX1-NEXT:    testl %eax, %eax
3677 ; X64-AVX1-NEXT:    sete %al
3678 ; X64-AVX1-NEXT:    popq %rcx
3679 ; X64-AVX1-NEXT:    retq
3681 ; X64-AVX2-LABEL: length256_eq_const:
3682 ; X64-AVX2:       # %bb.0:
3683 ; X64-AVX2-NEXT:    pushq %rax
3684 ; X64-AVX2-NEXT:    movl $.L.str, %esi
3685 ; X64-AVX2-NEXT:    movl $256, %edx # imm = 0x100
3686 ; X64-AVX2-NEXT:    callq memcmp
3687 ; X64-AVX2-NEXT:    testl %eax, %eax
3688 ; X64-AVX2-NEXT:    sete %al
3689 ; X64-AVX2-NEXT:    popq %rcx
3690 ; X64-AVX2-NEXT:    retq
3692 ; X64-AVX512BW-LABEL: length256_eq_const:
3693 ; X64-AVX512BW:       # %bb.0:
3694 ; X64-AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0
3695 ; X64-AVX512BW-NEXT:    vmovdqu64 64(%rdi), %zmm1
3696 ; X64-AVX512BW-NEXT:    vmovdqu64 128(%rdi), %zmm2
3697 ; X64-AVX512BW-NEXT:    vmovdqu64 192(%rdi), %zmm3
3698 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+192(%rip), %zmm3, %k0
3699 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+128(%rip), %zmm2, %k1
3700 ; X64-AVX512BW-NEXT:    korq %k0, %k1, %k0
3701 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str+64(%rip), %zmm1, %k1
3702 ; X64-AVX512BW-NEXT:    vpcmpneqb .L.str(%rip), %zmm0, %k2
3703 ; X64-AVX512BW-NEXT:    korq %k1, %k2, %k1
3704 ; X64-AVX512BW-NEXT:    kortestq %k0, %k1
3705 ; X64-AVX512BW-NEXT:    sete %al
3706 ; X64-AVX512BW-NEXT:    vzeroupper
3707 ; X64-AVX512BW-NEXT:    retq
3709 ; X64-AVX512F-LABEL: length256_eq_const:
3710 ; X64-AVX512F:       # %bb.0:
3711 ; X64-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3712 ; X64-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3713 ; X64-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
3714 ; X64-AVX512F-NEXT:    vmovdqu64 192(%rdi), %zmm3
3715 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str+192(%rip), %zmm3, %k0
3716 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str+128(%rip), %zmm2, %k1
3717 ; X64-AVX512F-NEXT:    korw %k0, %k1, %k0
3718 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k1
3719 ; X64-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k2
3720 ; X64-AVX512F-NEXT:    korw %k1, %k2, %k1
3721 ; X64-AVX512F-NEXT:    kortestw %k0, %k1
3722 ; X64-AVX512F-NEXT:    sete %al
3723 ; X64-AVX512F-NEXT:    vzeroupper
3724 ; X64-AVX512F-NEXT:    retq
3726 ; X64-MIC-AVX2-LABEL: length256_eq_const:
3727 ; X64-MIC-AVX2:       # %bb.0:
3728 ; X64-MIC-AVX2-NEXT:    pushq %rax
3729 ; X64-MIC-AVX2-NEXT:    movl $.L.str, %esi
3730 ; X64-MIC-AVX2-NEXT:    movl $256, %edx # imm = 0x100
3731 ; X64-MIC-AVX2-NEXT:    callq memcmp
3732 ; X64-MIC-AVX2-NEXT:    testl %eax, %eax
3733 ; X64-MIC-AVX2-NEXT:    sete %al
3734 ; X64-MIC-AVX2-NEXT:    popq %rcx
3735 ; X64-MIC-AVX2-NEXT:    retq
3737 ; X64-MIC-AVX512F-LABEL: length256_eq_const:
3738 ; X64-MIC-AVX512F:       # %bb.0:
3739 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0
3740 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 64(%rdi), %zmm1
3741 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 128(%rdi), %zmm2
3742 ; X64-MIC-AVX512F-NEXT:    vmovdqu64 192(%rdi), %zmm3
3743 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+192(%rip), %zmm3, %k0
3744 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+128(%rip), %zmm2, %k1
3745 ; X64-MIC-AVX512F-NEXT:    korw %k0, %k1, %k0
3746 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str+64(%rip), %zmm1, %k1
3747 ; X64-MIC-AVX512F-NEXT:    vpcmpneqd .L.str(%rip), %zmm0, %k2
3748 ; X64-MIC-AVX512F-NEXT:    korw %k1, %k2, %k1
3749 ; X64-MIC-AVX512F-NEXT:    kortestw %k0, %k1
3750 ; X64-MIC-AVX512F-NEXT:    sete %al
3751 ; X64-MIC-AVX512F-NEXT:    vzeroupper
3752 ; X64-MIC-AVX512F-NEXT:    retq
3753   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 256) nounwind
3754   %c = icmp eq i32 %m, 0
3755   ret i1 %c
3758 define i32 @length384(ptr %X, ptr %Y) nounwind {
3759 ; X64-LABEL: length384:
3760 ; X64:       # %bb.0:
3761 ; X64-NEXT:    movl $384, %edx # imm = 0x180
3762 ; X64-NEXT:    jmp memcmp # TAILCALL
3763   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 384) nounwind
3764   ret i32 %m
3767 define i1 @length384_eq(ptr %x, ptr %y) nounwind {
3768 ; X64-LABEL: length384_eq:
3769 ; X64:       # %bb.0:
3770 ; X64-NEXT:    pushq %rax
3771 ; X64-NEXT:    movl $384, %edx # imm = 0x180
3772 ; X64-NEXT:    callq memcmp
3773 ; X64-NEXT:    testl %eax, %eax
3774 ; X64-NEXT:    setne %al
3775 ; X64-NEXT:    popq %rcx
3776 ; X64-NEXT:    retq
3777   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind
3778   %cmp = icmp ne i32 %call, 0
3779   ret i1 %cmp
3782 define i1 @length384_lt(ptr %x, ptr %y) nounwind {
3783 ; X64-LABEL: length384_lt:
3784 ; X64:       # %bb.0:
3785 ; X64-NEXT:    pushq %rax
3786 ; X64-NEXT:    movl $384, %edx # imm = 0x180
3787 ; X64-NEXT:    callq memcmp
3788 ; X64-NEXT:    shrl $31, %eax
3789 ; X64-NEXT:    # kill: def $al killed $al killed $eax
3790 ; X64-NEXT:    popq %rcx
3791 ; X64-NEXT:    retq
3792   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind
3793   %cmp = icmp slt i32 %call, 0
3794   ret i1 %cmp
3797 define i1 @length384_gt(ptr %x, ptr %y) nounwind {
3798 ; X64-LABEL: length384_gt:
3799 ; X64:       # %bb.0:
3800 ; X64-NEXT:    pushq %rax
3801 ; X64-NEXT:    movl $384, %edx # imm = 0x180
3802 ; X64-NEXT:    callq memcmp
3803 ; X64-NEXT:    testl %eax, %eax
3804 ; X64-NEXT:    setg %al
3805 ; X64-NEXT:    popq %rcx
3806 ; X64-NEXT:    retq
3807   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 384) nounwind
3808   %cmp = icmp sgt i32 %call, 0
3809   ret i1 %cmp
3812 define i1 @length384_eq_const(ptr %X) nounwind {
3813 ; X64-LABEL: length384_eq_const:
3814 ; X64:       # %bb.0:
3815 ; X64-NEXT:    pushq %rax
3816 ; X64-NEXT:    movl $.L.str, %esi
3817 ; X64-NEXT:    movl $384, %edx # imm = 0x180
3818 ; X64-NEXT:    callq memcmp
3819 ; X64-NEXT:    testl %eax, %eax
3820 ; X64-NEXT:    sete %al
3821 ; X64-NEXT:    popq %rcx
3822 ; X64-NEXT:    retq
3823   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 384) nounwind
3824   %c = icmp eq i32 %m, 0
3825   ret i1 %c
3828 define i32 @length511(ptr %X, ptr %Y) nounwind {
3829 ; X64-LABEL: length511:
3830 ; X64:       # %bb.0:
3831 ; X64-NEXT:    movl $511, %edx # imm = 0x1FF
3832 ; X64-NEXT:    jmp memcmp # TAILCALL
3833   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 511) nounwind
3834   ret i32 %m
3837 define i1 @length511_eq(ptr %x, ptr %y) nounwind {
3838 ; X64-LABEL: length511_eq:
3839 ; X64:       # %bb.0:
3840 ; X64-NEXT:    pushq %rax
3841 ; X64-NEXT:    movl $511, %edx # imm = 0x1FF
3842 ; X64-NEXT:    callq memcmp
3843 ; X64-NEXT:    testl %eax, %eax
3844 ; X64-NEXT:    setne %al
3845 ; X64-NEXT:    popq %rcx
3846 ; X64-NEXT:    retq
3847   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind
3848   %cmp = icmp ne i32 %call, 0
3849   ret i1 %cmp
3852 define i1 @length511_lt(ptr %x, ptr %y) nounwind {
3853 ; X64-LABEL: length511_lt:
3854 ; X64:       # %bb.0:
3855 ; X64-NEXT:    pushq %rax
3856 ; X64-NEXT:    movl $511, %edx # imm = 0x1FF
3857 ; X64-NEXT:    callq memcmp
3858 ; X64-NEXT:    shrl $31, %eax
3859 ; X64-NEXT:    # kill: def $al killed $al killed $eax
3860 ; X64-NEXT:    popq %rcx
3861 ; X64-NEXT:    retq
3862   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind
3863   %cmp = icmp slt i32 %call, 0
3864   ret i1 %cmp
3867 define i1 @length511_gt(ptr %x, ptr %y) nounwind {
3868 ; X64-LABEL: length511_gt:
3869 ; X64:       # %bb.0:
3870 ; X64-NEXT:    pushq %rax
3871 ; X64-NEXT:    movl $511, %edx # imm = 0x1FF
3872 ; X64-NEXT:    callq memcmp
3873 ; X64-NEXT:    testl %eax, %eax
3874 ; X64-NEXT:    setg %al
3875 ; X64-NEXT:    popq %rcx
3876 ; X64-NEXT:    retq
3877   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 511) nounwind
3878   %cmp = icmp sgt i32 %call, 0
3879   ret i1 %cmp
3882 define i1 @length511_eq_const(ptr %X) nounwind {
3883 ; X64-LABEL: length511_eq_const:
3884 ; X64:       # %bb.0:
3885 ; X64-NEXT:    pushq %rax
3886 ; X64-NEXT:    movl $.L.str, %esi
3887 ; X64-NEXT:    movl $511, %edx # imm = 0x1FF
3888 ; X64-NEXT:    callq memcmp
3889 ; X64-NEXT:    testl %eax, %eax
3890 ; X64-NEXT:    sete %al
3891 ; X64-NEXT:    popq %rcx
3892 ; X64-NEXT:    retq
3893   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 511) nounwind
3894   %c = icmp eq i32 %m, 0
3895   ret i1 %c
3898 define i32 @length512(ptr %X, ptr %Y) nounwind {
3899 ; X64-LABEL: length512:
3900 ; X64:       # %bb.0:
3901 ; X64-NEXT:    movl $512, %edx # imm = 0x200
3902 ; X64-NEXT:    jmp memcmp # TAILCALL
3903   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 512) nounwind
3904   ret i32 %m
3907 define i1 @length512_eq(ptr %x, ptr %y) nounwind {
3908 ; X64-LABEL: length512_eq:
3909 ; X64:       # %bb.0:
3910 ; X64-NEXT:    pushq %rax
3911 ; X64-NEXT:    movl $512, %edx # imm = 0x200
3912 ; X64-NEXT:    callq memcmp
3913 ; X64-NEXT:    testl %eax, %eax
3914 ; X64-NEXT:    setne %al
3915 ; X64-NEXT:    popq %rcx
3916 ; X64-NEXT:    retq
3917   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind
3918   %cmp = icmp ne i32 %call, 0
3919   ret i1 %cmp
3922 define i1 @length512_lt(ptr %x, ptr %y) nounwind {
3923 ; X64-LABEL: length512_lt:
3924 ; X64:       # %bb.0:
3925 ; X64-NEXT:    pushq %rax
3926 ; X64-NEXT:    movl $512, %edx # imm = 0x200
3927 ; X64-NEXT:    callq memcmp
3928 ; X64-NEXT:    shrl $31, %eax
3929 ; X64-NEXT:    # kill: def $al killed $al killed $eax
3930 ; X64-NEXT:    popq %rcx
3931 ; X64-NEXT:    retq
3932   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind
3933   %cmp = icmp slt i32 %call, 0
3934   ret i1 %cmp
3937 define i1 @length512_gt(ptr %x, ptr %y) nounwind {
3938 ; X64-LABEL: length512_gt:
3939 ; X64:       # %bb.0:
3940 ; X64-NEXT:    pushq %rax
3941 ; X64-NEXT:    movl $512, %edx # imm = 0x200
3942 ; X64-NEXT:    callq memcmp
3943 ; X64-NEXT:    testl %eax, %eax
3944 ; X64-NEXT:    setg %al
3945 ; X64-NEXT:    popq %rcx
3946 ; X64-NEXT:    retq
3947   %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 512) nounwind
3948   %cmp = icmp sgt i32 %call, 0
3949   ret i1 %cmp
3952 define i1 @length512_eq_const(ptr %X) nounwind {
3953 ; X64-LABEL: length512_eq_const:
3954 ; X64:       # %bb.0:
3955 ; X64-NEXT:    pushq %rax
3956 ; X64-NEXT:    movl $.L.str, %esi
3957 ; X64-NEXT:    movl $512, %edx # imm = 0x200
3958 ; X64-NEXT:    callq memcmp
3959 ; X64-NEXT:    testl %eax, %eax
3960 ; X64-NEXT:    sete %al
3961 ; X64-NEXT:    popq %rcx
3962 ; X64-NEXT:    retq
3963   %m = tail call i32 @memcmp(ptr %X, ptr @.str, i64 512) nounwind
3964   %c = icmp eq i32 %m, 0
3965   ret i1 %c
3968 ; This checks that we do not do stupid things with huge sizes.
3969 define i32 @huge_length(ptr %X, ptr %Y) nounwind {
3970 ; X64-LABEL: huge_length:
3971 ; X64:       # %bb.0:
3972 ; X64-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF
3973 ; X64-NEXT:    jmp memcmp # TAILCALL
3974   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9223372036854775807) nounwind
3975   ret i32 %m
3978 define i1 @huge_length_eq(ptr %X, ptr %Y) nounwind {
3979 ; X64-LABEL: huge_length_eq:
3980 ; X64:       # %bb.0:
3981 ; X64-NEXT:    pushq %rax
3982 ; X64-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF
3983 ; X64-NEXT:    callq memcmp
3984 ; X64-NEXT:    testl %eax, %eax
3985 ; X64-NEXT:    sete %al
3986 ; X64-NEXT:    popq %rcx
3987 ; X64-NEXT:    retq
3988   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 9223372036854775807) nounwind
3989   %c = icmp eq i32 %m, 0
3990   ret i1 %c
3993 ; This checks non-constant sizes.
3994 define i32 @nonconst_length(ptr %X, ptr %Y, i64 %size) nounwind {
3995 ; X64-LABEL: nonconst_length:
3996 ; X64:       # %bb.0:
3997 ; X64-NEXT:    jmp memcmp # TAILCALL
3998   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 %size) nounwind
3999   ret i32 %m
4002 define i1 @nonconst_length_eq(ptr %X, ptr %Y, i64 %size) nounwind {
4003 ; X64-LABEL: nonconst_length_eq:
4004 ; X64:       # %bb.0:
4005 ; X64-NEXT:    pushq %rax
4006 ; X64-NEXT:    callq memcmp
4007 ; X64-NEXT:    testl %eax, %eax
4008 ; X64-NEXT:    sete %al
4009 ; X64-NEXT:    popq %rcx
4010 ; X64-NEXT:    retq
4011   %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 %size) nounwind
4012   %c = icmp eq i32 %m, 0
4013   ret i1 %c