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 13 14; This tests codegen time inlining/optimization of memcmp 15; rdar://6480398 16 17@.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 1 18 19declare dso_local i32 @memcmp(ptr, ptr, i64) 20 21define 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 } 29 30define 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 38} 39 40define 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 48} 49 50define 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 63} 64 65define 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 75} 76 77define 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 93} 94 95define 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 111} 112 113define 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 122} 123 124define 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 137} 138 139define 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 161} 162 163define 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 177} 178 179define i32 @length4(ptr %X, ptr %Y) nounwind { 180; X64-LABEL: length4: 181; X64: # %bb.0: 182; X64-NEXT: movl (%rdi), %eax 183; X64-NEXT: movl (%rsi), %ecx 184; X64-NEXT: bswapl %eax 185; X64-NEXT: bswapl %ecx 186; X64-NEXT: cmpl %ecx, %eax 187; X64-NEXT: seta %al 188; X64-NEXT: sbbb $0, %al 189; X64-NEXT: movsbl %al, %eax 190; X64-NEXT: retq 191 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 4) nounwind 192 ret i32 %m 193} 194 195define 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 205} 206 207define 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 220} 221 222define 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 235} 236 237define 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 246} 247 248define 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 270} 271 272define 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 286} 287 288define 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 315} 316 317define 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 343} 344 345define 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 358} 359 360define 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 389} 390 391define i32 @length8(ptr %X, ptr %Y) nounwind { 392; X64-LABEL: length8: 393; X64: # %bb.0: 394; X64-NEXT: movq (%rdi), %rax 395; X64-NEXT: movq (%rsi), %rcx 396; X64-NEXT: bswapq %rax 397; X64-NEXT: bswapq %rcx 398; X64-NEXT: cmpq %rcx, %rax 399; X64-NEXT: seta %al 400; X64-NEXT: sbbb $0, %al 401; X64-NEXT: movsbl %al, %eax 402; X64-NEXT: retq 403 %m = tail call i32 @memcmp(ptr %X, ptr %Y, i64 8) nounwind 404 ret i32 %m 405} 406 407define 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 417} 418 419define 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 429} 430 431define 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 445} 446 447define 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 461} 462 463define 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 476} 477 478define 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 491} 492 493define 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 519} 520 521define 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 534} 535 536define 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 549} 550 551define 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 564} 565 566; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329 567 568define 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 594} 595 596define 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 606; 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 615; 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 623; 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 636} 637 638define 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 667} 668 669define 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 698} 699 700define 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 709; 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 717; 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 725; 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 738} 739 740; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914 741 742define 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 775} 776 777define 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 791; 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 804; 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 816; 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 832} 833 834define 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 870} 871 872define 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 908} 909 910define 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 922; 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 933; 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 944; 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 960} 961 962define 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 1002} 1003 1004define 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 1018; 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 1031; 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 1042; 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 1058} 1059 1060define 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 1103} 1104 1105define 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 1148} 1149 1150define 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 1164; 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 1177; 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 1188; 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 1204} 1205 1206define 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 1218; 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 1229; 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 1240; 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 1256} 1257 1258define 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 1298} 1299 1300; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=33325 1301 1302define 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 1316; 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 1329; 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 1338; 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 1347; 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 1356; 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 1369} 1370 1371define 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 1414} 1415 1416define 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 1459} 1460 1461define 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 1475; 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 1488; 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 1499; 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 1515} 1516 1517define 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 1529; 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 1540; 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 1549; 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 1558; 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 1567; 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 1580} 1581 1582define 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 1589} 1590 1591define 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 1609; 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 1626; 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 1639; 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 1652; 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 1665; 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 1681} 1682 1683define 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 1696} 1697 1698define 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 1711} 1712 1713define 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 1731; 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 1748; 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 1762; 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 1782} 1783 1784define 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 1799; 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 1813; 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 1825; 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 1837; 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 1849; 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 1865} 1866 1867define 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 1874} 1875 1876define 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 1898; 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 1919; 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 1931; 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 1943; 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 1955; 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 1971} 1972 1973define 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 1986} 1987 1988define 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 2001} 2002 2003define 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 2021; 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 2038; 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 2050; 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 2062; 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 2074; 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 2090} 2091 2092define 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 2099} 2100 2101define 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 2123; 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 2144; 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 2156; 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 2168; 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 2177; 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 2190; 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 2202} 2203 2204define 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 2217} 2218 2219define 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 2232} 2233 2234define 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 2252; 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 2269; 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 2281; 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 2293; 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 2302; 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 2315; 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 2327} 2328 2329define 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 2336} 2337 2338define 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 2348; 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 2363; 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 2378; 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 2390; 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 2402; 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 2419; 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 2434} 2435 2436define 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 2449} 2450 2451define 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 2464} 2465 2466define 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 2477; 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 2492; 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 2507; 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 2518; 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 2529; 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 2546; 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 2560} 2561 2562define 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 2569} 2570 2571define 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 2581; 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 2599; 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 2617; 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 2628; 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 2639; 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 2660; 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 2674} 2675 2676define 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 2689} 2690 2691define 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 2704} 2705 2706define 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 2717; 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 2735; 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 2753; 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 2764; 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 2775; 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 2796; 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 2810} 2811 2812define 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 2819} 2820 2821define 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 2831; 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 2849; 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 2867; 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 2878; 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 2889; 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 2910; 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 2924} 2925 2926define 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 2939} 2940 2941define 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 2954} 2955 2956define 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 2967; 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 2985; 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 3003; 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 3014; 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 3025; 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 3046; 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 3060} 3061 3062define 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 3069} 3070 3071define 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 3081; 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 3091; 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 3101; 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 3115; 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 3129; 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 3139; 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 3156} 3157 3158define 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 3171} 3172 3173define 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 3186} 3187 3188define 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 3199; 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 3210; 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 3221; 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 3235; 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 3249; 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 3260; 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 3277} 3278 3279define 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 3286} 3287 3288define 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 3298; 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 3308; 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 3318; 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 3335; 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 3352; 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 3362; 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 3382} 3383 3384define 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 3397} 3398 3399define 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 3412} 3413 3414define 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 3425; 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 3436; 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 3447; 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 3464; 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 3481; 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 3492; 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 3512} 3513 3514define 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 3521} 3522 3523define 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 3533; 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 3543; 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 3553; 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 3570; 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 3587; 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 3597; 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 3617} 3618 3619define 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 3632} 3633 3634define 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 3647} 3648 3649define 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 3660; 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 3671; 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 3682; 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 3699; 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 3716; 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 3727; 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 3747} 3748 3749define 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 3756} 3757 3758define 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 3771} 3772 3773define 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 3786} 3787 3788define 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 3801} 3802 3803define 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 3817} 3818 3819define 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 3826} 3827 3828define 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 3841} 3842 3843define 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 3856} 3857 3858define 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 3871} 3872 3873define 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 3887} 3888 3889define 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 3896} 3897 3898define 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 3911} 3912 3913define 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 3926} 3927 3928define 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 3941} 3942 3943define 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 3957} 3958 3959; This checks that we do not do stupid things with huge sizes. 3960define 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 3967} 3968 3969define 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 3982} 3983 3984; This checks non-constant sizes. 3985define 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 3991} 3992 3993define 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 4005} 4006