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