1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; NOTE: This is a copy of llvm/test/CodeGen/X86/memcmp.ll with more load pairs. Please keep it that way. 3; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=cmov | FileCheck %s --check-prefixes=X86,X86-NOSSE 4; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=+sse | FileCheck %s --check-prefixes=X86,X86-SSE1 5; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X86,X86-SSE2 6; RUN: llc -max-loads-per-memcmp=4 -memcmp-num-loads-per-block=4 < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=X86,X86-SSE41 7; 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 8; 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 9; 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 10; 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 11; 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 12; 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 13; 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 14; 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 15; 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 16; 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 17 18; This tests codegen time inlining/optimization of memcmp 19; rdar://6480398 20 21@.str = private constant [513 x i8] c"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\00", align 1 22 23declare dso_local i32 @memcmp(i8*, i8*, i64) 24 25define i32 @length0(i8* %X, i8* %Y) nounwind { 26; X86-LABEL: length0: 27; X86: # %bb.0: 28; X86-NEXT: xorl %eax, %eax 29; X86-NEXT: retl 30; 31; X64-LABEL: length0: 32; X64: # %bb.0: 33; X64-NEXT: xorl %eax, %eax 34; X64-NEXT: retq 35 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 0) nounwind 36 ret i32 %m 37 } 38 39define i1 @length0_eq(i8* %X, i8* %Y) nounwind { 40; X86-LABEL: length0_eq: 41; X86: # %bb.0: 42; X86-NEXT: movb $1, %al 43; X86-NEXT: retl 44; 45; X64-LABEL: length0_eq: 46; X64: # %bb.0: 47; X64-NEXT: movb $1, %al 48; X64-NEXT: retq 49 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 0) nounwind 50 %c = icmp eq i32 %m, 0 51 ret i1 %c 52} 53 54define i1 @length0_lt(i8* %X, i8* %Y) nounwind { 55; X86-LABEL: length0_lt: 56; X86: # %bb.0: 57; X86-NEXT: xorl %eax, %eax 58; X86-NEXT: retl 59; 60; X64-LABEL: length0_lt: 61; X64: # %bb.0: 62; X64-NEXT: xorl %eax, %eax 63; X64-NEXT: retq 64 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 0) nounwind 65 %c = icmp slt i32 %m, 0 66 ret i1 %c 67} 68 69define i32 @length2(i8* %X, i8* %Y) nounwind { 70; X86-LABEL: length2: 71; X86: # %bb.0: 72; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 73; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 74; X86-NEXT: movzwl (%ecx), %ecx 75; X86-NEXT: movzwl (%eax), %edx 76; X86-NEXT: rolw $8, %cx 77; X86-NEXT: rolw $8, %dx 78; X86-NEXT: movzwl %cx, %eax 79; X86-NEXT: movzwl %dx, %ecx 80; X86-NEXT: subl %ecx, %eax 81; X86-NEXT: retl 82; 83; X64-LABEL: length2: 84; X64: # %bb.0: 85; X64-NEXT: movzwl (%rdi), %eax 86; X64-NEXT: movzwl (%rsi), %ecx 87; X64-NEXT: rolw $8, %ax 88; X64-NEXT: rolw $8, %cx 89; X64-NEXT: movzwl %ax, %eax 90; X64-NEXT: movzwl %cx, %ecx 91; X64-NEXT: subl %ecx, %eax 92; X64-NEXT: retq 93 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind 94 ret i32 %m 95} 96 97define i1 @length2_eq(i8* %X, i8* %Y) nounwind { 98; X86-LABEL: length2_eq: 99; X86: # %bb.0: 100; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 101; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 102; X86-NEXT: movzwl (%ecx), %ecx 103; X86-NEXT: cmpw (%eax), %cx 104; X86-NEXT: sete %al 105; X86-NEXT: retl 106; 107; X64-LABEL: length2_eq: 108; X64: # %bb.0: 109; X64-NEXT: movzwl (%rdi), %eax 110; X64-NEXT: cmpw (%rsi), %ax 111; X64-NEXT: sete %al 112; X64-NEXT: retq 113 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind 114 %c = icmp eq i32 %m, 0 115 ret i1 %c 116} 117 118define i1 @length2_lt(i8* %X, i8* %Y) nounwind { 119; X86-LABEL: length2_lt: 120; X86: # %bb.0: 121; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 122; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 123; X86-NEXT: movzwl (%ecx), %ecx 124; X86-NEXT: movzwl (%eax), %edx 125; X86-NEXT: rolw $8, %cx 126; X86-NEXT: rolw $8, %dx 127; X86-NEXT: movzwl %cx, %eax 128; X86-NEXT: movzwl %dx, %ecx 129; X86-NEXT: subl %ecx, %eax 130; X86-NEXT: shrl $31, %eax 131; X86-NEXT: # kill: def $al killed $al killed $eax 132; X86-NEXT: retl 133; 134; X64-LABEL: length2_lt: 135; X64: # %bb.0: 136; X64-NEXT: movzwl (%rdi), %eax 137; X64-NEXT: movzwl (%rsi), %ecx 138; X64-NEXT: rolw $8, %ax 139; X64-NEXT: rolw $8, %cx 140; X64-NEXT: movzwl %ax, %eax 141; X64-NEXT: movzwl %cx, %ecx 142; X64-NEXT: subl %ecx, %eax 143; X64-NEXT: shrl $31, %eax 144; X64-NEXT: # kill: def $al killed $al killed $eax 145; X64-NEXT: retq 146 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind 147 %c = icmp slt i32 %m, 0 148 ret i1 %c 149} 150 151define i1 @length2_gt(i8* %X, i8* %Y) nounwind { 152; X86-LABEL: length2_gt: 153; X86: # %bb.0: 154; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 155; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 156; X86-NEXT: movzwl (%ecx), %ecx 157; X86-NEXT: movzwl (%eax), %eax 158; X86-NEXT: rolw $8, %cx 159; X86-NEXT: rolw $8, %ax 160; X86-NEXT: movzwl %cx, %ecx 161; X86-NEXT: movzwl %ax, %eax 162; X86-NEXT: subl %eax, %ecx 163; X86-NEXT: testl %ecx, %ecx 164; X86-NEXT: setg %al 165; X86-NEXT: retl 166; 167; X64-LABEL: length2_gt: 168; X64: # %bb.0: 169; X64-NEXT: movzwl (%rdi), %eax 170; X64-NEXT: movzwl (%rsi), %ecx 171; X64-NEXT: rolw $8, %ax 172; X64-NEXT: rolw $8, %cx 173; X64-NEXT: movzwl %ax, %eax 174; X64-NEXT: movzwl %cx, %ecx 175; X64-NEXT: subl %ecx, %eax 176; X64-NEXT: testl %eax, %eax 177; X64-NEXT: setg %al 178; X64-NEXT: retq 179 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind 180 %c = icmp sgt i32 %m, 0 181 ret i1 %c 182} 183 184define i1 @length2_eq_const(i8* %X) nounwind { 185; X86-LABEL: length2_eq_const: 186; X86: # %bb.0: 187; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 188; X86-NEXT: movzwl (%eax), %eax 189; X86-NEXT: cmpl $12849, %eax # imm = 0x3231 190; X86-NEXT: setne %al 191; X86-NEXT: retl 192; 193; X64-LABEL: length2_eq_const: 194; X64: # %bb.0: 195; X64-NEXT: movzwl (%rdi), %eax 196; X64-NEXT: cmpl $12849, %eax # imm = 0x3231 197; X64-NEXT: setne %al 198; X64-NEXT: retq 199 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 1), i64 2) nounwind 200 %c = icmp ne i32 %m, 0 201 ret i1 %c 202} 203 204define i1 @length2_eq_nobuiltin_attr(i8* %X, i8* %Y) nounwind { 205; X86-LABEL: length2_eq_nobuiltin_attr: 206; X86: # %bb.0: 207; X86-NEXT: pushl $0 208; X86-NEXT: pushl $2 209; X86-NEXT: pushl {{[0-9]+}}(%esp) 210; X86-NEXT: pushl {{[0-9]+}}(%esp) 211; X86-NEXT: calll memcmp 212; X86-NEXT: addl $16, %esp 213; X86-NEXT: testl %eax, %eax 214; X86-NEXT: sete %al 215; X86-NEXT: retl 216; 217; X64-LABEL: length2_eq_nobuiltin_attr: 218; X64: # %bb.0: 219; X64-NEXT: pushq %rax 220; X64-NEXT: movl $2, %edx 221; X64-NEXT: callq memcmp 222; X64-NEXT: testl %eax, %eax 223; X64-NEXT: sete %al 224; X64-NEXT: popq %rcx 225; X64-NEXT: retq 226 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 2) nounwind nobuiltin 227 %c = icmp eq i32 %m, 0 228 ret i1 %c 229} 230 231define i32 @length3(i8* %X, i8* %Y) nounwind { 232; X86-LABEL: length3: 233; X86: # %bb.0: 234; X86-NEXT: pushl %esi 235; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 236; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 237; X86-NEXT: movzwl (%eax), %edx 238; X86-NEXT: movzwl (%ecx), %esi 239; X86-NEXT: rolw $8, %dx 240; X86-NEXT: rolw $8, %si 241; X86-NEXT: cmpw %si, %dx 242; X86-NEXT: jne .LBB9_3 243; X86-NEXT: # %bb.1: # %loadbb1 244; X86-NEXT: movzbl 2(%eax), %eax 245; X86-NEXT: movzbl 2(%ecx), %ecx 246; X86-NEXT: subl %ecx, %eax 247; X86-NEXT: popl %esi 248; X86-NEXT: retl 249; X86-NEXT: .LBB9_3: # %res_block 250; X86-NEXT: setae %al 251; X86-NEXT: movzbl %al, %eax 252; X86-NEXT: leal -1(%eax,%eax), %eax 253; X86-NEXT: popl %esi 254; X86-NEXT: retl 255; 256; X64-LABEL: length3: 257; X64: # %bb.0: 258; X64-NEXT: movzwl (%rdi), %eax 259; X64-NEXT: movzwl (%rsi), %ecx 260; X64-NEXT: rolw $8, %ax 261; X64-NEXT: rolw $8, %cx 262; X64-NEXT: cmpw %cx, %ax 263; X64-NEXT: jne .LBB9_3 264; X64-NEXT: # %bb.1: # %loadbb1 265; X64-NEXT: movzbl 2(%rdi), %eax 266; X64-NEXT: movzbl 2(%rsi), %ecx 267; X64-NEXT: subl %ecx, %eax 268; X64-NEXT: retq 269; X64-NEXT: .LBB9_3: # %res_block 270; X64-NEXT: setae %al 271; X64-NEXT: movzbl %al, %eax 272; X64-NEXT: leal -1(%rax,%rax), %eax 273; X64-NEXT: retq 274 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 3) nounwind 275 ret i32 %m 276} 277 278define i1 @length3_eq(i8* %X, i8* %Y) nounwind { 279; X86-LABEL: length3_eq: 280; X86: # %bb.0: 281; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 282; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 283; X86-NEXT: movzwl (%ecx), %edx 284; X86-NEXT: xorw (%eax), %dx 285; X86-NEXT: movb 2(%ecx), %cl 286; X86-NEXT: xorb 2(%eax), %cl 287; X86-NEXT: movzbl %cl, %eax 288; X86-NEXT: orw %dx, %ax 289; X86-NEXT: setne %al 290; X86-NEXT: retl 291; 292; X64-LABEL: length3_eq: 293; X64: # %bb.0: 294; X64-NEXT: movzwl (%rdi), %eax 295; X64-NEXT: xorw (%rsi), %ax 296; X64-NEXT: movb 2(%rdi), %cl 297; X64-NEXT: xorb 2(%rsi), %cl 298; X64-NEXT: movzbl %cl, %ecx 299; X64-NEXT: orw %ax, %cx 300; X64-NEXT: setne %al 301; X64-NEXT: retq 302 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 3) nounwind 303 %c = icmp ne i32 %m, 0 304 ret i1 %c 305} 306 307define i32 @length4(i8* %X, i8* %Y) nounwind { 308; X86-LABEL: length4: 309; X86: # %bb.0: 310; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 311; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 312; X86-NEXT: movl (%ecx), %ecx 313; X86-NEXT: movl (%eax), %edx 314; X86-NEXT: bswapl %ecx 315; X86-NEXT: bswapl %edx 316; X86-NEXT: xorl %eax, %eax 317; X86-NEXT: cmpl %edx, %ecx 318; X86-NEXT: seta %al 319; X86-NEXT: sbbl $0, %eax 320; X86-NEXT: retl 321; 322; X64-LABEL: length4: 323; X64: # %bb.0: 324; X64-NEXT: movl (%rdi), %ecx 325; X64-NEXT: movl (%rsi), %edx 326; X64-NEXT: bswapl %ecx 327; X64-NEXT: bswapl %edx 328; X64-NEXT: xorl %eax, %eax 329; X64-NEXT: cmpl %edx, %ecx 330; X64-NEXT: seta %al 331; X64-NEXT: sbbl $0, %eax 332; X64-NEXT: retq 333 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind 334 ret i32 %m 335} 336 337define i1 @length4_eq(i8* %X, i8* %Y) nounwind { 338; X86-LABEL: length4_eq: 339; X86: # %bb.0: 340; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 341; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 342; X86-NEXT: movl (%ecx), %ecx 343; X86-NEXT: cmpl (%eax), %ecx 344; X86-NEXT: setne %al 345; X86-NEXT: retl 346; 347; X64-LABEL: length4_eq: 348; X64: # %bb.0: 349; X64-NEXT: movl (%rdi), %eax 350; X64-NEXT: cmpl (%rsi), %eax 351; X64-NEXT: setne %al 352; X64-NEXT: retq 353 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind 354 %c = icmp ne i32 %m, 0 355 ret i1 %c 356} 357 358define i1 @length4_lt(i8* %X, i8* %Y) nounwind { 359; X86-LABEL: length4_lt: 360; X86: # %bb.0: 361; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 362; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 363; X86-NEXT: movl (%ecx), %ecx 364; X86-NEXT: movl (%eax), %edx 365; X86-NEXT: bswapl %ecx 366; X86-NEXT: bswapl %edx 367; X86-NEXT: xorl %eax, %eax 368; X86-NEXT: cmpl %edx, %ecx 369; X86-NEXT: seta %al 370; X86-NEXT: sbbl $0, %eax 371; X86-NEXT: shrl $31, %eax 372; X86-NEXT: # kill: def $al killed $al killed $eax 373; X86-NEXT: retl 374; 375; X64-LABEL: length4_lt: 376; X64: # %bb.0: 377; X64-NEXT: movl (%rdi), %ecx 378; X64-NEXT: movl (%rsi), %edx 379; X64-NEXT: bswapl %ecx 380; X64-NEXT: bswapl %edx 381; X64-NEXT: xorl %eax, %eax 382; X64-NEXT: cmpl %edx, %ecx 383; X64-NEXT: seta %al 384; X64-NEXT: sbbl $0, %eax 385; X64-NEXT: shrl $31, %eax 386; X64-NEXT: # kill: def $al killed $al killed $eax 387; X64-NEXT: retq 388 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind 389 %c = icmp slt i32 %m, 0 390 ret i1 %c 391} 392 393define i1 @length4_gt(i8* %X, i8* %Y) nounwind { 394; X86-LABEL: length4_gt: 395; X86: # %bb.0: 396; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 397; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 398; X86-NEXT: movl (%ecx), %ecx 399; X86-NEXT: movl (%eax), %eax 400; X86-NEXT: bswapl %ecx 401; X86-NEXT: bswapl %eax 402; X86-NEXT: xorl %edx, %edx 403; X86-NEXT: cmpl %eax, %ecx 404; X86-NEXT: seta %dl 405; X86-NEXT: sbbl $0, %edx 406; X86-NEXT: testl %edx, %edx 407; X86-NEXT: setg %al 408; X86-NEXT: retl 409; 410; X64-LABEL: length4_gt: 411; X64: # %bb.0: 412; X64-NEXT: movl (%rdi), %eax 413; X64-NEXT: movl (%rsi), %ecx 414; X64-NEXT: bswapl %eax 415; X64-NEXT: bswapl %ecx 416; X64-NEXT: xorl %edx, %edx 417; X64-NEXT: cmpl %ecx, %eax 418; X64-NEXT: seta %dl 419; X64-NEXT: sbbl $0, %edx 420; X64-NEXT: testl %edx, %edx 421; X64-NEXT: setg %al 422; X64-NEXT: retq 423 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 4) nounwind 424 %c = icmp sgt i32 %m, 0 425 ret i1 %c 426} 427 428define i1 @length4_eq_const(i8* %X) nounwind { 429; X86-LABEL: length4_eq_const: 430; X86: # %bb.0: 431; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 432; X86-NEXT: cmpl $875770417, (%eax) # imm = 0x34333231 433; X86-NEXT: sete %al 434; X86-NEXT: retl 435; 436; X64-LABEL: length4_eq_const: 437; X64: # %bb.0: 438; X64-NEXT: cmpl $875770417, (%rdi) # imm = 0x34333231 439; X64-NEXT: sete %al 440; X64-NEXT: retq 441 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 1), i64 4) nounwind 442 %c = icmp eq i32 %m, 0 443 ret i1 %c 444} 445 446define i32 @length5(i8* %X, i8* %Y) nounwind { 447; X86-LABEL: length5: 448; X86: # %bb.0: 449; X86-NEXT: pushl %esi 450; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 451; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 452; X86-NEXT: movl (%eax), %edx 453; X86-NEXT: movl (%ecx), %esi 454; X86-NEXT: bswapl %edx 455; X86-NEXT: bswapl %esi 456; X86-NEXT: cmpl %esi, %edx 457; X86-NEXT: jne .LBB16_3 458; X86-NEXT: # %bb.1: # %loadbb1 459; X86-NEXT: movzbl 4(%eax), %eax 460; X86-NEXT: movzbl 4(%ecx), %ecx 461; X86-NEXT: subl %ecx, %eax 462; X86-NEXT: popl %esi 463; X86-NEXT: retl 464; X86-NEXT: .LBB16_3: # %res_block 465; X86-NEXT: setae %al 466; X86-NEXT: movzbl %al, %eax 467; X86-NEXT: leal -1(%eax,%eax), %eax 468; X86-NEXT: popl %esi 469; X86-NEXT: retl 470; 471; X64-LABEL: length5: 472; X64: # %bb.0: 473; X64-NEXT: movl (%rdi), %eax 474; X64-NEXT: movl (%rsi), %ecx 475; X64-NEXT: bswapl %eax 476; X64-NEXT: bswapl %ecx 477; X64-NEXT: cmpl %ecx, %eax 478; X64-NEXT: jne .LBB16_3 479; X64-NEXT: # %bb.1: # %loadbb1 480; X64-NEXT: movzbl 4(%rdi), %eax 481; X64-NEXT: movzbl 4(%rsi), %ecx 482; X64-NEXT: subl %ecx, %eax 483; X64-NEXT: retq 484; X64-NEXT: .LBB16_3: # %res_block 485; X64-NEXT: setae %al 486; X64-NEXT: movzbl %al, %eax 487; X64-NEXT: leal -1(%rax,%rax), %eax 488; X64-NEXT: retq 489 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 5) nounwind 490 ret i32 %m 491} 492 493define i1 @length5_eq(i8* %X, i8* %Y) nounwind { 494; X86-LABEL: length5_eq: 495; X86: # %bb.0: 496; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 497; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 498; X86-NEXT: movl (%ecx), %edx 499; X86-NEXT: xorl (%eax), %edx 500; X86-NEXT: movb 4(%ecx), %cl 501; X86-NEXT: xorb 4(%eax), %cl 502; X86-NEXT: movzbl %cl, %eax 503; X86-NEXT: orl %edx, %eax 504; X86-NEXT: setne %al 505; X86-NEXT: retl 506; 507; X64-LABEL: length5_eq: 508; X64: # %bb.0: 509; X64-NEXT: movl (%rdi), %eax 510; X64-NEXT: xorl (%rsi), %eax 511; X64-NEXT: movb 4(%rdi), %cl 512; X64-NEXT: xorb 4(%rsi), %cl 513; X64-NEXT: movzbl %cl, %ecx 514; X64-NEXT: orl %eax, %ecx 515; X64-NEXT: setne %al 516; X64-NEXT: retq 517 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 5) nounwind 518 %c = icmp ne i32 %m, 0 519 ret i1 %c 520} 521 522define i1 @length5_lt(i8* %X, i8* %Y) nounwind { 523; X86-LABEL: length5_lt: 524; X86: # %bb.0: 525; X86-NEXT: pushl %esi 526; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 527; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 528; X86-NEXT: movl (%eax), %edx 529; X86-NEXT: movl (%ecx), %esi 530; X86-NEXT: bswapl %edx 531; X86-NEXT: bswapl %esi 532; X86-NEXT: cmpl %esi, %edx 533; X86-NEXT: jne .LBB18_3 534; X86-NEXT: # %bb.1: # %loadbb1 535; X86-NEXT: movzbl 4(%eax), %eax 536; X86-NEXT: movzbl 4(%ecx), %ecx 537; X86-NEXT: subl %ecx, %eax 538; X86-NEXT: jmp .LBB18_2 539; X86-NEXT: .LBB18_3: # %res_block 540; X86-NEXT: setae %al 541; X86-NEXT: movzbl %al, %eax 542; X86-NEXT: leal -1(%eax,%eax), %eax 543; X86-NEXT: .LBB18_2: # %endblock 544; X86-NEXT: shrl $31, %eax 545; X86-NEXT: # kill: def $al killed $al killed $eax 546; X86-NEXT: popl %esi 547; X86-NEXT: retl 548; 549; X64-LABEL: length5_lt: 550; X64: # %bb.0: 551; X64-NEXT: movl (%rdi), %eax 552; X64-NEXT: movl (%rsi), %ecx 553; X64-NEXT: bswapl %eax 554; X64-NEXT: bswapl %ecx 555; X64-NEXT: cmpl %ecx, %eax 556; X64-NEXT: jne .LBB18_3 557; X64-NEXT: # %bb.1: # %loadbb1 558; X64-NEXT: movzbl 4(%rdi), %eax 559; X64-NEXT: movzbl 4(%rsi), %ecx 560; X64-NEXT: subl %ecx, %eax 561; X64-NEXT: shrl $31, %eax 562; X64-NEXT: # kill: def $al killed $al killed $eax 563; X64-NEXT: retq 564; X64-NEXT: .LBB18_3: # %res_block 565; X64-NEXT: setae %al 566; X64-NEXT: movzbl %al, %eax 567; X64-NEXT: leal -1(%rax,%rax), %eax 568; X64-NEXT: shrl $31, %eax 569; X64-NEXT: # kill: def $al killed $al killed $eax 570; X64-NEXT: retq 571 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 5) nounwind 572 %c = icmp slt i32 %m, 0 573 ret i1 %c 574} 575 576define i32 @length7(i8* %X, i8* %Y) nounwind { 577; X86-LABEL: length7: 578; X86: # %bb.0: 579; X86-NEXT: pushl %esi 580; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 581; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 582; X86-NEXT: movl (%esi), %ecx 583; X86-NEXT: movl (%eax), %edx 584; X86-NEXT: bswapl %ecx 585; X86-NEXT: bswapl %edx 586; X86-NEXT: cmpl %edx, %ecx 587; X86-NEXT: jne .LBB19_2 588; X86-NEXT: # %bb.1: # %loadbb1 589; X86-NEXT: movl 3(%esi), %ecx 590; X86-NEXT: movl 3(%eax), %edx 591; X86-NEXT: bswapl %ecx 592; X86-NEXT: bswapl %edx 593; X86-NEXT: xorl %eax, %eax 594; X86-NEXT: cmpl %edx, %ecx 595; X86-NEXT: je .LBB19_3 596; X86-NEXT: .LBB19_2: # %res_block 597; X86-NEXT: xorl %eax, %eax 598; X86-NEXT: cmpl %edx, %ecx 599; X86-NEXT: setae %al 600; X86-NEXT: leal -1(%eax,%eax), %eax 601; X86-NEXT: .LBB19_3: # %endblock 602; X86-NEXT: popl %esi 603; X86-NEXT: retl 604; 605; X64-LABEL: length7: 606; X64: # %bb.0: 607; X64-NEXT: movl (%rdi), %ecx 608; X64-NEXT: movl (%rsi), %edx 609; X64-NEXT: bswapl %ecx 610; X64-NEXT: bswapl %edx 611; X64-NEXT: cmpl %edx, %ecx 612; X64-NEXT: jne .LBB19_2 613; X64-NEXT: # %bb.1: # %loadbb1 614; X64-NEXT: movl 3(%rdi), %ecx 615; X64-NEXT: movl 3(%rsi), %edx 616; X64-NEXT: bswapl %ecx 617; X64-NEXT: bswapl %edx 618; X64-NEXT: xorl %eax, %eax 619; X64-NEXT: cmpl %edx, %ecx 620; X64-NEXT: je .LBB19_3 621; X64-NEXT: .LBB19_2: # %res_block 622; X64-NEXT: xorl %eax, %eax 623; X64-NEXT: cmpl %edx, %ecx 624; X64-NEXT: setae %al 625; X64-NEXT: leal -1(%rax,%rax), %eax 626; X64-NEXT: .LBB19_3: # %endblock 627; X64-NEXT: retq 628 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 7) nounwind 629 ret i32 %m 630} 631 632define i1 @length7_eq(i8* %X, i8* %Y) nounwind { 633; X86-LABEL: length7_eq: 634; X86: # %bb.0: 635; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 636; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 637; X86-NEXT: movl (%ecx), %edx 638; X86-NEXT: movl 3(%ecx), %ecx 639; X86-NEXT: xorl (%eax), %edx 640; X86-NEXT: xorl 3(%eax), %ecx 641; X86-NEXT: orl %edx, %ecx 642; X86-NEXT: setne %al 643; X86-NEXT: retl 644; 645; X64-LABEL: length7_eq: 646; X64: # %bb.0: 647; X64-NEXT: movl (%rdi), %eax 648; X64-NEXT: movl 3(%rdi), %ecx 649; X64-NEXT: xorl (%rsi), %eax 650; X64-NEXT: xorl 3(%rsi), %ecx 651; X64-NEXT: orl %eax, %ecx 652; X64-NEXT: setne %al 653; X64-NEXT: retq 654 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 7) nounwind 655 %c = icmp ne i32 %m, 0 656 ret i1 %c 657} 658 659define i1 @length7_lt(i8* %X, i8* %Y) nounwind { 660; X86-LABEL: length7_lt: 661; X86: # %bb.0: 662; X86-NEXT: pushl %esi 663; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 664; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 665; X86-NEXT: movl (%esi), %ecx 666; X86-NEXT: movl (%eax), %edx 667; X86-NEXT: bswapl %ecx 668; X86-NEXT: bswapl %edx 669; X86-NEXT: cmpl %edx, %ecx 670; X86-NEXT: jne .LBB21_2 671; X86-NEXT: # %bb.1: # %loadbb1 672; X86-NEXT: movl 3(%esi), %ecx 673; X86-NEXT: movl 3(%eax), %edx 674; X86-NEXT: bswapl %ecx 675; X86-NEXT: bswapl %edx 676; X86-NEXT: xorl %eax, %eax 677; X86-NEXT: cmpl %edx, %ecx 678; X86-NEXT: je .LBB21_3 679; X86-NEXT: .LBB21_2: # %res_block 680; X86-NEXT: xorl %eax, %eax 681; X86-NEXT: cmpl %edx, %ecx 682; X86-NEXT: setae %al 683; X86-NEXT: leal -1(%eax,%eax), %eax 684; X86-NEXT: .LBB21_3: # %endblock 685; X86-NEXT: shrl $31, %eax 686; X86-NEXT: # kill: def $al killed $al killed $eax 687; X86-NEXT: popl %esi 688; X86-NEXT: retl 689; 690; X64-LABEL: length7_lt: 691; X64: # %bb.0: 692; X64-NEXT: movl (%rdi), %ecx 693; X64-NEXT: movl (%rsi), %edx 694; X64-NEXT: bswapl %ecx 695; X64-NEXT: bswapl %edx 696; X64-NEXT: cmpl %edx, %ecx 697; X64-NEXT: jne .LBB21_2 698; X64-NEXT: # %bb.1: # %loadbb1 699; X64-NEXT: movl 3(%rdi), %ecx 700; X64-NEXT: movl 3(%rsi), %edx 701; X64-NEXT: bswapl %ecx 702; X64-NEXT: bswapl %edx 703; X64-NEXT: xorl %eax, %eax 704; X64-NEXT: cmpl %edx, %ecx 705; X64-NEXT: je .LBB21_3 706; X64-NEXT: .LBB21_2: # %res_block 707; X64-NEXT: xorl %eax, %eax 708; X64-NEXT: cmpl %edx, %ecx 709; X64-NEXT: setae %al 710; X64-NEXT: leal -1(%rax,%rax), %eax 711; X64-NEXT: .LBB21_3: # %endblock 712; X64-NEXT: shrl $31, %eax 713; X64-NEXT: # kill: def $al killed $al killed $eax 714; X64-NEXT: retq 715 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 7) nounwind 716 %c = icmp slt i32 %m, 0 717 ret i1 %c 718} 719 720define i32 @length8(i8* %X, i8* %Y) nounwind { 721; X86-LABEL: length8: 722; X86: # %bb.0: 723; X86-NEXT: pushl %esi 724; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 725; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 726; X86-NEXT: movl (%esi), %ecx 727; X86-NEXT: movl (%eax), %edx 728; X86-NEXT: bswapl %ecx 729; X86-NEXT: bswapl %edx 730; X86-NEXT: cmpl %edx, %ecx 731; X86-NEXT: jne .LBB22_2 732; X86-NEXT: # %bb.1: # %loadbb1 733; X86-NEXT: movl 4(%esi), %ecx 734; X86-NEXT: movl 4(%eax), %edx 735; X86-NEXT: bswapl %ecx 736; X86-NEXT: bswapl %edx 737; X86-NEXT: xorl %eax, %eax 738; X86-NEXT: cmpl %edx, %ecx 739; X86-NEXT: je .LBB22_3 740; X86-NEXT: .LBB22_2: # %res_block 741; X86-NEXT: xorl %eax, %eax 742; X86-NEXT: cmpl %edx, %ecx 743; X86-NEXT: setae %al 744; X86-NEXT: leal -1(%eax,%eax), %eax 745; X86-NEXT: .LBB22_3: # %endblock 746; X86-NEXT: popl %esi 747; X86-NEXT: retl 748; 749; X64-LABEL: length8: 750; X64: # %bb.0: 751; X64-NEXT: movq (%rdi), %rcx 752; X64-NEXT: movq (%rsi), %rdx 753; X64-NEXT: bswapq %rcx 754; X64-NEXT: bswapq %rdx 755; X64-NEXT: xorl %eax, %eax 756; X64-NEXT: cmpq %rdx, %rcx 757; X64-NEXT: seta %al 758; X64-NEXT: sbbl $0, %eax 759; X64-NEXT: retq 760 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 8) nounwind 761 ret i32 %m 762} 763 764define i1 @length8_eq(i8* %X, i8* %Y) nounwind { 765; X86-LABEL: length8_eq: 766; X86: # %bb.0: 767; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 768; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 769; X86-NEXT: movl (%ecx), %edx 770; X86-NEXT: movl 4(%ecx), %ecx 771; X86-NEXT: xorl (%eax), %edx 772; X86-NEXT: xorl 4(%eax), %ecx 773; X86-NEXT: orl %edx, %ecx 774; X86-NEXT: sete %al 775; X86-NEXT: retl 776; 777; X64-LABEL: length8_eq: 778; X64: # %bb.0: 779; X64-NEXT: movq (%rdi), %rax 780; X64-NEXT: cmpq (%rsi), %rax 781; X64-NEXT: sete %al 782; X64-NEXT: retq 783 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 8) nounwind 784 %c = icmp eq i32 %m, 0 785 ret i1 %c 786} 787 788define i1 @length8_eq_const(i8* %X) nounwind { 789; X86-LABEL: length8_eq_const: 790; X86: # %bb.0: 791; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 792; X86-NEXT: movl $858927408, %ecx # imm = 0x33323130 793; X86-NEXT: xorl (%eax), %ecx 794; X86-NEXT: movl $926299444, %edx # imm = 0x37363534 795; X86-NEXT: xorl 4(%eax), %edx 796; X86-NEXT: orl %ecx, %edx 797; X86-NEXT: setne %al 798; X86-NEXT: retl 799; 800; X64-LABEL: length8_eq_const: 801; X64: # %bb.0: 802; X64-NEXT: movabsq $3978425819141910832, %rax # imm = 0x3736353433323130 803; X64-NEXT: cmpq %rax, (%rdi) 804; X64-NEXT: setne %al 805; X64-NEXT: retq 806 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 8) nounwind 807 %c = icmp ne i32 %m, 0 808 ret i1 %c 809} 810 811define i1 @length9_eq(i8* %X, i8* %Y) nounwind { 812; X86-LABEL: length9_eq: 813; X86: # %bb.0: 814; X86-NEXT: pushl %esi 815; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 816; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 817; X86-NEXT: movl (%ecx), %edx 818; X86-NEXT: movl 4(%ecx), %esi 819; X86-NEXT: xorl (%eax), %edx 820; X86-NEXT: xorl 4(%eax), %esi 821; X86-NEXT: orl %edx, %esi 822; X86-NEXT: movb 8(%ecx), %cl 823; X86-NEXT: xorb 8(%eax), %cl 824; X86-NEXT: movzbl %cl, %eax 825; X86-NEXT: orl %esi, %eax 826; X86-NEXT: sete %al 827; X86-NEXT: popl %esi 828; X86-NEXT: retl 829; 830; X64-LABEL: length9_eq: 831; X64: # %bb.0: 832; X64-NEXT: movq (%rdi), %rax 833; X64-NEXT: xorq (%rsi), %rax 834; X64-NEXT: movb 8(%rdi), %cl 835; X64-NEXT: xorb 8(%rsi), %cl 836; X64-NEXT: movzbl %cl, %ecx 837; X64-NEXT: orq %rax, %rcx 838; X64-NEXT: sete %al 839; X64-NEXT: retq 840 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 9) nounwind 841 %c = icmp eq i32 %m, 0 842 ret i1 %c 843} 844 845define i1 @length10_eq(i8* %X, i8* %Y) nounwind { 846; X86-LABEL: length10_eq: 847; X86: # %bb.0: 848; X86-NEXT: pushl %esi 849; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 850; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 851; X86-NEXT: movl (%ecx), %edx 852; X86-NEXT: movl 4(%ecx), %esi 853; X86-NEXT: xorl (%eax), %edx 854; X86-NEXT: xorl 4(%eax), %esi 855; X86-NEXT: orl %edx, %esi 856; X86-NEXT: movzwl 8(%ecx), %ecx 857; X86-NEXT: xorw 8(%eax), %cx 858; X86-NEXT: movzwl %cx, %eax 859; X86-NEXT: orl %esi, %eax 860; X86-NEXT: sete %al 861; X86-NEXT: popl %esi 862; X86-NEXT: retl 863; 864; X64-LABEL: length10_eq: 865; X64: # %bb.0: 866; X64-NEXT: movq (%rdi), %rax 867; X64-NEXT: xorq (%rsi), %rax 868; X64-NEXT: movzwl 8(%rdi), %ecx 869; X64-NEXT: xorw 8(%rsi), %cx 870; X64-NEXT: movzwl %cx, %ecx 871; X64-NEXT: orq %rax, %rcx 872; X64-NEXT: sete %al 873; X64-NEXT: retq 874 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 10) nounwind 875 %c = icmp eq i32 %m, 0 876 ret i1 %c 877} 878 879define i1 @length11_eq(i8* %X, i8* %Y) nounwind { 880; X86-LABEL: length11_eq: 881; X86: # %bb.0: 882; X86-NEXT: pushl %esi 883; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 884; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 885; X86-NEXT: movl (%ecx), %edx 886; X86-NEXT: movl 4(%ecx), %esi 887; X86-NEXT: xorl (%eax), %edx 888; X86-NEXT: xorl 4(%eax), %esi 889; X86-NEXT: orl %edx, %esi 890; X86-NEXT: movl 7(%ecx), %ecx 891; X86-NEXT: xorl 7(%eax), %ecx 892; X86-NEXT: orl %esi, %ecx 893; X86-NEXT: sete %al 894; X86-NEXT: popl %esi 895; X86-NEXT: retl 896; 897; X64-LABEL: length11_eq: 898; X64: # %bb.0: 899; X64-NEXT: movq (%rdi), %rax 900; X64-NEXT: movq 3(%rdi), %rcx 901; X64-NEXT: xorq (%rsi), %rax 902; X64-NEXT: xorq 3(%rsi), %rcx 903; X64-NEXT: orq %rax, %rcx 904; X64-NEXT: sete %al 905; X64-NEXT: retq 906 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 11) nounwind 907 %c = icmp eq i32 %m, 0 908 ret i1 %c 909} 910 911define i1 @length12_eq(i8* %X, i8* %Y) nounwind { 912; X86-LABEL: length12_eq: 913; X86: # %bb.0: 914; X86-NEXT: pushl %esi 915; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 916; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 917; X86-NEXT: movl (%ecx), %edx 918; X86-NEXT: movl 4(%ecx), %esi 919; X86-NEXT: xorl (%eax), %edx 920; X86-NEXT: xorl 4(%eax), %esi 921; X86-NEXT: orl %edx, %esi 922; X86-NEXT: movl 8(%ecx), %ecx 923; X86-NEXT: xorl 8(%eax), %ecx 924; X86-NEXT: orl %esi, %ecx 925; X86-NEXT: setne %al 926; X86-NEXT: popl %esi 927; X86-NEXT: retl 928; 929; X64-LABEL: length12_eq: 930; X64: # %bb.0: 931; X64-NEXT: movq (%rdi), %rax 932; X64-NEXT: xorq (%rsi), %rax 933; X64-NEXT: movl 8(%rdi), %ecx 934; X64-NEXT: xorl 8(%rsi), %ecx 935; X64-NEXT: orq %rax, %rcx 936; X64-NEXT: setne %al 937; X64-NEXT: retq 938 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 12) nounwind 939 %c = icmp ne i32 %m, 0 940 ret i1 %c 941} 942 943define i32 @length12(i8* %X, i8* %Y) nounwind { 944; X86-LABEL: length12: 945; X86: # %bb.0: 946; X86-NEXT: pushl %esi 947; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 948; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 949; X86-NEXT: movl (%esi), %ecx 950; X86-NEXT: movl (%eax), %edx 951; X86-NEXT: bswapl %ecx 952; X86-NEXT: bswapl %edx 953; X86-NEXT: cmpl %edx, %ecx 954; X86-NEXT: jne .LBB29_3 955; X86-NEXT: # %bb.1: # %loadbb1 956; X86-NEXT: movl 4(%esi), %ecx 957; X86-NEXT: movl 4(%eax), %edx 958; X86-NEXT: bswapl %ecx 959; X86-NEXT: bswapl %edx 960; X86-NEXT: cmpl %edx, %ecx 961; X86-NEXT: jne .LBB29_3 962; X86-NEXT: # %bb.2: # %loadbb2 963; X86-NEXT: movl 8(%esi), %ecx 964; X86-NEXT: movl 8(%eax), %edx 965; X86-NEXT: bswapl %ecx 966; X86-NEXT: bswapl %edx 967; X86-NEXT: xorl %eax, %eax 968; X86-NEXT: cmpl %edx, %ecx 969; X86-NEXT: je .LBB29_4 970; X86-NEXT: .LBB29_3: # %res_block 971; X86-NEXT: xorl %eax, %eax 972; X86-NEXT: cmpl %edx, %ecx 973; X86-NEXT: setae %al 974; X86-NEXT: leal -1(%eax,%eax), %eax 975; X86-NEXT: .LBB29_4: # %endblock 976; X86-NEXT: popl %esi 977; X86-NEXT: retl 978; 979; X64-LABEL: length12: 980; X64: # %bb.0: 981; X64-NEXT: movq (%rdi), %rcx 982; X64-NEXT: movq (%rsi), %rdx 983; X64-NEXT: bswapq %rcx 984; X64-NEXT: bswapq %rdx 985; X64-NEXT: cmpq %rdx, %rcx 986; X64-NEXT: jne .LBB29_2 987; X64-NEXT: # %bb.1: # %loadbb1 988; X64-NEXT: movl 8(%rdi), %ecx 989; X64-NEXT: movl 8(%rsi), %edx 990; X64-NEXT: bswapl %ecx 991; X64-NEXT: bswapl %edx 992; X64-NEXT: xorl %eax, %eax 993; X64-NEXT: cmpq %rdx, %rcx 994; X64-NEXT: je .LBB29_3 995; X64-NEXT: .LBB29_2: # %res_block 996; X64-NEXT: xorl %eax, %eax 997; X64-NEXT: cmpq %rdx, %rcx 998; X64-NEXT: setae %al 999; X64-NEXT: leal -1(%rax,%rax), %eax 1000; X64-NEXT: .LBB29_3: # %endblock 1001; X64-NEXT: retq 1002 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 12) nounwind 1003 ret i32 %m 1004} 1005 1006define i1 @length13_eq(i8* %X, i8* %Y) nounwind { 1007; X86-LABEL: length13_eq: 1008; X86: # %bb.0: 1009; X86-NEXT: pushl %esi 1010; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1011; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 1012; X86-NEXT: movl (%ecx), %edx 1013; X86-NEXT: movl 4(%ecx), %esi 1014; X86-NEXT: xorl (%eax), %edx 1015; X86-NEXT: xorl 4(%eax), %esi 1016; X86-NEXT: orl %edx, %esi 1017; X86-NEXT: movl 8(%ecx), %edx 1018; X86-NEXT: xorl 8(%eax), %edx 1019; X86-NEXT: movb 12(%ecx), %cl 1020; X86-NEXT: xorb 12(%eax), %cl 1021; X86-NEXT: movzbl %cl, %eax 1022; X86-NEXT: orl %edx, %eax 1023; X86-NEXT: orl %esi, %eax 1024; X86-NEXT: sete %al 1025; X86-NEXT: popl %esi 1026; X86-NEXT: retl 1027; 1028; X64-LABEL: length13_eq: 1029; X64: # %bb.0: 1030; X64-NEXT: movq (%rdi), %rax 1031; X64-NEXT: movq 5(%rdi), %rcx 1032; X64-NEXT: xorq (%rsi), %rax 1033; X64-NEXT: xorq 5(%rsi), %rcx 1034; X64-NEXT: orq %rax, %rcx 1035; X64-NEXT: sete %al 1036; X64-NEXT: retq 1037 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 13) nounwind 1038 %c = icmp eq i32 %m, 0 1039 ret i1 %c 1040} 1041 1042define i1 @length14_eq(i8* %X, i8* %Y) nounwind { 1043; X86-LABEL: length14_eq: 1044; X86: # %bb.0: 1045; X86-NEXT: pushl %esi 1046; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1047; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 1048; X86-NEXT: movl (%ecx), %edx 1049; X86-NEXT: movl 4(%ecx), %esi 1050; X86-NEXT: xorl (%eax), %edx 1051; X86-NEXT: xorl 4(%eax), %esi 1052; X86-NEXT: orl %edx, %esi 1053; X86-NEXT: movl 8(%ecx), %edx 1054; X86-NEXT: xorl 8(%eax), %edx 1055; X86-NEXT: movzwl 12(%ecx), %ecx 1056; X86-NEXT: xorw 12(%eax), %cx 1057; X86-NEXT: movzwl %cx, %eax 1058; X86-NEXT: orl %edx, %eax 1059; X86-NEXT: orl %esi, %eax 1060; X86-NEXT: sete %al 1061; X86-NEXT: popl %esi 1062; X86-NEXT: retl 1063; 1064; X64-LABEL: length14_eq: 1065; X64: # %bb.0: 1066; X64-NEXT: movq (%rdi), %rax 1067; X64-NEXT: movq 6(%rdi), %rcx 1068; X64-NEXT: xorq (%rsi), %rax 1069; X64-NEXT: xorq 6(%rsi), %rcx 1070; X64-NEXT: orq %rax, %rcx 1071; X64-NEXT: sete %al 1072; X64-NEXT: retq 1073 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 14) nounwind 1074 %c = icmp eq i32 %m, 0 1075 ret i1 %c 1076} 1077 1078define i1 @length15_eq(i8* %X, i8* %Y) nounwind { 1079; X86-LABEL: length15_eq: 1080; X86: # %bb.0: 1081; X86-NEXT: pushl %esi 1082; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1083; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 1084; X86-NEXT: movl (%ecx), %edx 1085; X86-NEXT: movl 4(%ecx), %esi 1086; X86-NEXT: xorl (%eax), %edx 1087; X86-NEXT: xorl 4(%eax), %esi 1088; X86-NEXT: orl %edx, %esi 1089; X86-NEXT: movl 8(%ecx), %edx 1090; X86-NEXT: xorl 8(%eax), %edx 1091; X86-NEXT: movl 11(%ecx), %ecx 1092; X86-NEXT: xorl 11(%eax), %ecx 1093; X86-NEXT: orl %edx, %ecx 1094; X86-NEXT: orl %esi, %ecx 1095; X86-NEXT: sete %al 1096; X86-NEXT: popl %esi 1097; X86-NEXT: retl 1098; 1099; X64-LABEL: length15_eq: 1100; X64: # %bb.0: 1101; X64-NEXT: movq (%rdi), %rax 1102; X64-NEXT: movq 7(%rdi), %rcx 1103; X64-NEXT: xorq (%rsi), %rax 1104; X64-NEXT: xorq 7(%rsi), %rcx 1105; X64-NEXT: orq %rax, %rcx 1106; X64-NEXT: sete %al 1107; X64-NEXT: retq 1108 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 15) nounwind 1109 %c = icmp eq i32 %m, 0 1110 ret i1 %c 1111} 1112 1113; PR33329 - https://bugs.llvm.org/show_bug.cgi?id=33329 1114 1115define i32 @length16(i8* %X, i8* %Y) nounwind { 1116; X86-LABEL: length16: 1117; X86: # %bb.0: 1118; X86-NEXT: pushl %esi 1119; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1120; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 1121; X86-NEXT: movl (%esi), %ecx 1122; X86-NEXT: movl (%eax), %edx 1123; X86-NEXT: bswapl %ecx 1124; X86-NEXT: bswapl %edx 1125; X86-NEXT: cmpl %edx, %ecx 1126; X86-NEXT: jne .LBB33_4 1127; X86-NEXT: # %bb.1: # %loadbb1 1128; X86-NEXT: movl 4(%esi), %ecx 1129; X86-NEXT: movl 4(%eax), %edx 1130; X86-NEXT: bswapl %ecx 1131; X86-NEXT: bswapl %edx 1132; X86-NEXT: cmpl %edx, %ecx 1133; X86-NEXT: jne .LBB33_4 1134; X86-NEXT: # %bb.2: # %loadbb2 1135; X86-NEXT: movl 8(%esi), %ecx 1136; X86-NEXT: movl 8(%eax), %edx 1137; X86-NEXT: bswapl %ecx 1138; X86-NEXT: bswapl %edx 1139; X86-NEXT: cmpl %edx, %ecx 1140; X86-NEXT: jne .LBB33_4 1141; X86-NEXT: # %bb.3: # %loadbb3 1142; X86-NEXT: movl 12(%esi), %ecx 1143; X86-NEXT: movl 12(%eax), %edx 1144; X86-NEXT: bswapl %ecx 1145; X86-NEXT: bswapl %edx 1146; X86-NEXT: xorl %eax, %eax 1147; X86-NEXT: cmpl %edx, %ecx 1148; X86-NEXT: je .LBB33_5 1149; X86-NEXT: .LBB33_4: # %res_block 1150; X86-NEXT: xorl %eax, %eax 1151; X86-NEXT: cmpl %edx, %ecx 1152; X86-NEXT: setae %al 1153; X86-NEXT: leal -1(%eax,%eax), %eax 1154; X86-NEXT: .LBB33_5: # %endblock 1155; X86-NEXT: popl %esi 1156; X86-NEXT: retl 1157; 1158; X64-LABEL: length16: 1159; X64: # %bb.0: 1160; X64-NEXT: movq (%rdi), %rcx 1161; X64-NEXT: movq (%rsi), %rdx 1162; X64-NEXT: bswapq %rcx 1163; X64-NEXT: bswapq %rdx 1164; X64-NEXT: cmpq %rdx, %rcx 1165; X64-NEXT: jne .LBB33_2 1166; X64-NEXT: # %bb.1: # %loadbb1 1167; X64-NEXT: movq 8(%rdi), %rcx 1168; X64-NEXT: movq 8(%rsi), %rdx 1169; X64-NEXT: bswapq %rcx 1170; X64-NEXT: bswapq %rdx 1171; X64-NEXT: xorl %eax, %eax 1172; X64-NEXT: cmpq %rdx, %rcx 1173; X64-NEXT: je .LBB33_3 1174; X64-NEXT: .LBB33_2: # %res_block 1175; X64-NEXT: xorl %eax, %eax 1176; X64-NEXT: cmpq %rdx, %rcx 1177; X64-NEXT: setae %al 1178; X64-NEXT: leal -1(%rax,%rax), %eax 1179; X64-NEXT: .LBB33_3: # %endblock 1180; X64-NEXT: retq 1181 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 16) nounwind 1182 ret i32 %m 1183} 1184 1185define i1 @length16_eq(i8* %x, i8* %y) nounwind { 1186; X86-NOSSE-LABEL: length16_eq: 1187; X86-NOSSE: # %bb.0: 1188; X86-NOSSE-NEXT: pushl %esi 1189; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax 1190; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 1191; X86-NOSSE-NEXT: movl (%ecx), %edx 1192; X86-NOSSE-NEXT: movl 4(%ecx), %esi 1193; X86-NOSSE-NEXT: xorl (%eax), %edx 1194; X86-NOSSE-NEXT: xorl 4(%eax), %esi 1195; X86-NOSSE-NEXT: orl %edx, %esi 1196; X86-NOSSE-NEXT: movl 8(%ecx), %edx 1197; X86-NOSSE-NEXT: xorl 8(%eax), %edx 1198; X86-NOSSE-NEXT: movl 12(%ecx), %ecx 1199; X86-NOSSE-NEXT: xorl 12(%eax), %ecx 1200; X86-NOSSE-NEXT: orl %edx, %ecx 1201; X86-NOSSE-NEXT: orl %esi, %ecx 1202; X86-NOSSE-NEXT: setne %al 1203; X86-NOSSE-NEXT: popl %esi 1204; X86-NOSSE-NEXT: retl 1205; 1206; X86-SSE1-LABEL: length16_eq: 1207; X86-SSE1: # %bb.0: 1208; X86-SSE1-NEXT: pushl %esi 1209; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %eax 1210; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %ecx 1211; X86-SSE1-NEXT: movl (%ecx), %edx 1212; X86-SSE1-NEXT: movl 4(%ecx), %esi 1213; X86-SSE1-NEXT: xorl (%eax), %edx 1214; X86-SSE1-NEXT: xorl 4(%eax), %esi 1215; X86-SSE1-NEXT: orl %edx, %esi 1216; X86-SSE1-NEXT: movl 8(%ecx), %edx 1217; X86-SSE1-NEXT: xorl 8(%eax), %edx 1218; X86-SSE1-NEXT: movl 12(%ecx), %ecx 1219; X86-SSE1-NEXT: xorl 12(%eax), %ecx 1220; X86-SSE1-NEXT: orl %edx, %ecx 1221; X86-SSE1-NEXT: orl %esi, %ecx 1222; X86-SSE1-NEXT: setne %al 1223; X86-SSE1-NEXT: popl %esi 1224; X86-SSE1-NEXT: retl 1225; 1226; X86-SSE2-LABEL: length16_eq: 1227; X86-SSE2: # %bb.0: 1228; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 1229; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 1230; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 1231; X86-SSE2-NEXT: movdqu (%eax), %xmm1 1232; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm1 1233; X86-SSE2-NEXT: pmovmskb %xmm1, %eax 1234; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1235; X86-SSE2-NEXT: setne %al 1236; X86-SSE2-NEXT: retl 1237; 1238; X86-SSE41-LABEL: length16_eq: 1239; X86-SSE41: # %bb.0: 1240; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 1241; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 1242; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 1243; X86-SSE41-NEXT: movdqu (%eax), %xmm1 1244; X86-SSE41-NEXT: pxor %xmm0, %xmm1 1245; X86-SSE41-NEXT: ptest %xmm1, %xmm1 1246; X86-SSE41-NEXT: setne %al 1247; X86-SSE41-NEXT: retl 1248; 1249; X64-SSE2-LABEL: length16_eq: 1250; X64-SSE2: # %bb.0: 1251; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1252; X64-SSE2-NEXT: movdqu (%rsi), %xmm1 1253; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1 1254; X64-SSE2-NEXT: pmovmskb %xmm1, %eax 1255; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1256; X64-SSE2-NEXT: setne %al 1257; X64-SSE2-NEXT: retq 1258; 1259; X64-SSE41-LABEL: length16_eq: 1260; X64-SSE41: # %bb.0: 1261; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1262; X64-SSE41-NEXT: movdqu (%rsi), %xmm1 1263; X64-SSE41-NEXT: pxor %xmm0, %xmm1 1264; X64-SSE41-NEXT: ptest %xmm1, %xmm1 1265; X64-SSE41-NEXT: setne %al 1266; X64-SSE41-NEXT: retq 1267; 1268; X64-AVX-LABEL: length16_eq: 1269; X64-AVX: # %bb.0: 1270; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1271; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 1272; X64-AVX-NEXT: vptest %xmm0, %xmm0 1273; X64-AVX-NEXT: setne %al 1274; X64-AVX-NEXT: retq 1275; 1276; X64-MIC-AVX-LABEL: length16_eq: 1277; X64-MIC-AVX: # %bb.0: 1278; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1279; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm1 1280; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 1281; X64-MIC-AVX-NEXT: kortestw %k0, %k0 1282; X64-MIC-AVX-NEXT: setne %al 1283; X64-MIC-AVX-NEXT: vzeroupper 1284; X64-MIC-AVX-NEXT: retq 1285 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind 1286 %cmp = icmp ne i32 %call, 0 1287 ret i1 %cmp 1288} 1289 1290define i1 @length16_lt(i8* %x, i8* %y) nounwind { 1291; X86-LABEL: length16_lt: 1292; X86: # %bb.0: 1293; X86-NEXT: pushl %esi 1294; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1295; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 1296; X86-NEXT: movl (%esi), %ecx 1297; X86-NEXT: movl (%eax), %edx 1298; X86-NEXT: bswapl %ecx 1299; X86-NEXT: bswapl %edx 1300; X86-NEXT: cmpl %edx, %ecx 1301; X86-NEXT: jne .LBB35_4 1302; X86-NEXT: # %bb.1: # %loadbb1 1303; X86-NEXT: movl 4(%esi), %ecx 1304; X86-NEXT: movl 4(%eax), %edx 1305; X86-NEXT: bswapl %ecx 1306; X86-NEXT: bswapl %edx 1307; X86-NEXT: cmpl %edx, %ecx 1308; X86-NEXT: jne .LBB35_4 1309; X86-NEXT: # %bb.2: # %loadbb2 1310; X86-NEXT: movl 8(%esi), %ecx 1311; X86-NEXT: movl 8(%eax), %edx 1312; X86-NEXT: bswapl %ecx 1313; X86-NEXT: bswapl %edx 1314; X86-NEXT: cmpl %edx, %ecx 1315; X86-NEXT: jne .LBB35_4 1316; X86-NEXT: # %bb.3: # %loadbb3 1317; X86-NEXT: movl 12(%esi), %ecx 1318; X86-NEXT: movl 12(%eax), %edx 1319; X86-NEXT: bswapl %ecx 1320; X86-NEXT: bswapl %edx 1321; X86-NEXT: xorl %eax, %eax 1322; X86-NEXT: cmpl %edx, %ecx 1323; X86-NEXT: je .LBB35_5 1324; X86-NEXT: .LBB35_4: # %res_block 1325; X86-NEXT: xorl %eax, %eax 1326; X86-NEXT: cmpl %edx, %ecx 1327; X86-NEXT: setae %al 1328; X86-NEXT: leal -1(%eax,%eax), %eax 1329; X86-NEXT: .LBB35_5: # %endblock 1330; X86-NEXT: shrl $31, %eax 1331; X86-NEXT: # kill: def $al killed $al killed $eax 1332; X86-NEXT: popl %esi 1333; X86-NEXT: retl 1334; 1335; X64-LABEL: length16_lt: 1336; X64: # %bb.0: 1337; X64-NEXT: movq (%rdi), %rcx 1338; X64-NEXT: movq (%rsi), %rdx 1339; X64-NEXT: bswapq %rcx 1340; X64-NEXT: bswapq %rdx 1341; X64-NEXT: cmpq %rdx, %rcx 1342; X64-NEXT: jne .LBB35_2 1343; X64-NEXT: # %bb.1: # %loadbb1 1344; X64-NEXT: movq 8(%rdi), %rcx 1345; X64-NEXT: movq 8(%rsi), %rdx 1346; X64-NEXT: bswapq %rcx 1347; X64-NEXT: bswapq %rdx 1348; X64-NEXT: xorl %eax, %eax 1349; X64-NEXT: cmpq %rdx, %rcx 1350; X64-NEXT: je .LBB35_3 1351; X64-NEXT: .LBB35_2: # %res_block 1352; X64-NEXT: xorl %eax, %eax 1353; X64-NEXT: cmpq %rdx, %rcx 1354; X64-NEXT: setae %al 1355; X64-NEXT: leal -1(%rax,%rax), %eax 1356; X64-NEXT: .LBB35_3: # %endblock 1357; X64-NEXT: shrl $31, %eax 1358; X64-NEXT: # kill: def $al killed $al killed $eax 1359; X64-NEXT: retq 1360 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind 1361 %cmp = icmp slt i32 %call, 0 1362 ret i1 %cmp 1363} 1364 1365define i1 @length16_gt(i8* %x, i8* %y) nounwind { 1366; X86-LABEL: length16_gt: 1367; X86: # %bb.0: 1368; X86-NEXT: pushl %esi 1369; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 1370; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 1371; X86-NEXT: movl (%esi), %eax 1372; X86-NEXT: movl (%edx), %ecx 1373; X86-NEXT: bswapl %eax 1374; X86-NEXT: bswapl %ecx 1375; X86-NEXT: cmpl %ecx, %eax 1376; X86-NEXT: jne .LBB36_4 1377; X86-NEXT: # %bb.1: # %loadbb1 1378; X86-NEXT: movl 4(%esi), %eax 1379; X86-NEXT: movl 4(%edx), %ecx 1380; X86-NEXT: bswapl %eax 1381; X86-NEXT: bswapl %ecx 1382; X86-NEXT: cmpl %ecx, %eax 1383; X86-NEXT: jne .LBB36_4 1384; X86-NEXT: # %bb.2: # %loadbb2 1385; X86-NEXT: movl 8(%esi), %eax 1386; X86-NEXT: movl 8(%edx), %ecx 1387; X86-NEXT: bswapl %eax 1388; X86-NEXT: bswapl %ecx 1389; X86-NEXT: cmpl %ecx, %eax 1390; X86-NEXT: jne .LBB36_4 1391; X86-NEXT: # %bb.3: # %loadbb3 1392; X86-NEXT: movl 12(%esi), %eax 1393; X86-NEXT: movl 12(%edx), %ecx 1394; X86-NEXT: bswapl %eax 1395; X86-NEXT: bswapl %ecx 1396; X86-NEXT: xorl %edx, %edx 1397; X86-NEXT: cmpl %ecx, %eax 1398; X86-NEXT: je .LBB36_5 1399; X86-NEXT: .LBB36_4: # %res_block 1400; X86-NEXT: xorl %edx, %edx 1401; X86-NEXT: cmpl %ecx, %eax 1402; X86-NEXT: setae %dl 1403; X86-NEXT: leal -1(%edx,%edx), %edx 1404; X86-NEXT: .LBB36_5: # %endblock 1405; X86-NEXT: testl %edx, %edx 1406; X86-NEXT: setg %al 1407; X86-NEXT: popl %esi 1408; X86-NEXT: retl 1409; 1410; X64-LABEL: length16_gt: 1411; X64: # %bb.0: 1412; X64-NEXT: movq (%rdi), %rax 1413; X64-NEXT: movq (%rsi), %rcx 1414; X64-NEXT: bswapq %rax 1415; X64-NEXT: bswapq %rcx 1416; X64-NEXT: cmpq %rcx, %rax 1417; X64-NEXT: jne .LBB36_2 1418; X64-NEXT: # %bb.1: # %loadbb1 1419; X64-NEXT: movq 8(%rdi), %rax 1420; X64-NEXT: movq 8(%rsi), %rcx 1421; X64-NEXT: bswapq %rax 1422; X64-NEXT: bswapq %rcx 1423; X64-NEXT: xorl %edx, %edx 1424; X64-NEXT: cmpq %rcx, %rax 1425; X64-NEXT: je .LBB36_3 1426; X64-NEXT: .LBB36_2: # %res_block 1427; X64-NEXT: xorl %edx, %edx 1428; X64-NEXT: cmpq %rcx, %rax 1429; X64-NEXT: setae %dl 1430; X64-NEXT: leal -1(%rdx,%rdx), %edx 1431; X64-NEXT: .LBB36_3: # %endblock 1432; X64-NEXT: testl %edx, %edx 1433; X64-NEXT: setg %al 1434; X64-NEXT: retq 1435 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 16) nounwind 1436 %cmp = icmp sgt i32 %call, 0 1437 ret i1 %cmp 1438} 1439 1440define i1 @length16_eq_const(i8* %X) nounwind { 1441; X86-NOSSE-LABEL: length16_eq_const: 1442; X86-NOSSE: # %bb.0: 1443; X86-NOSSE-NEXT: pushl %esi 1444; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax 1445; X86-NOSSE-NEXT: movl $858927408, %ecx # imm = 0x33323130 1446; X86-NOSSE-NEXT: xorl (%eax), %ecx 1447; X86-NOSSE-NEXT: movl $926299444, %edx # imm = 0x37363534 1448; X86-NOSSE-NEXT: xorl 4(%eax), %edx 1449; X86-NOSSE-NEXT: orl %ecx, %edx 1450; X86-NOSSE-NEXT: movl $825243960, %ecx # imm = 0x31303938 1451; X86-NOSSE-NEXT: xorl 8(%eax), %ecx 1452; X86-NOSSE-NEXT: movl $892613426, %esi # imm = 0x35343332 1453; X86-NOSSE-NEXT: xorl 12(%eax), %esi 1454; X86-NOSSE-NEXT: orl %ecx, %esi 1455; X86-NOSSE-NEXT: orl %edx, %esi 1456; X86-NOSSE-NEXT: sete %al 1457; X86-NOSSE-NEXT: popl %esi 1458; X86-NOSSE-NEXT: retl 1459; 1460; X86-SSE1-LABEL: length16_eq_const: 1461; X86-SSE1: # %bb.0: 1462; X86-SSE1-NEXT: pushl %esi 1463; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %eax 1464; X86-SSE1-NEXT: movl $858927408, %ecx # imm = 0x33323130 1465; X86-SSE1-NEXT: xorl (%eax), %ecx 1466; X86-SSE1-NEXT: movl $926299444, %edx # imm = 0x37363534 1467; X86-SSE1-NEXT: xorl 4(%eax), %edx 1468; X86-SSE1-NEXT: orl %ecx, %edx 1469; X86-SSE1-NEXT: movl $825243960, %ecx # imm = 0x31303938 1470; X86-SSE1-NEXT: xorl 8(%eax), %ecx 1471; X86-SSE1-NEXT: movl $892613426, %esi # imm = 0x35343332 1472; X86-SSE1-NEXT: xorl 12(%eax), %esi 1473; X86-SSE1-NEXT: orl %ecx, %esi 1474; X86-SSE1-NEXT: orl %edx, %esi 1475; X86-SSE1-NEXT: sete %al 1476; X86-SSE1-NEXT: popl %esi 1477; X86-SSE1-NEXT: retl 1478; 1479; X86-SSE2-LABEL: length16_eq_const: 1480; X86-SSE2: # %bb.0: 1481; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 1482; X86-SSE2-NEXT: movdqu (%eax), %xmm0 1483; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 1484; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 1485; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1486; X86-SSE2-NEXT: sete %al 1487; X86-SSE2-NEXT: retl 1488; 1489; X86-SSE41-LABEL: length16_eq_const: 1490; X86-SSE41: # %bb.0: 1491; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 1492; X86-SSE41-NEXT: movdqu (%eax), %xmm0 1493; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 1494; X86-SSE41-NEXT: ptest %xmm0, %xmm0 1495; X86-SSE41-NEXT: sete %al 1496; X86-SSE41-NEXT: retl 1497; 1498; X64-SSE2-LABEL: length16_eq_const: 1499; X64-SSE2: # %bb.0: 1500; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1501; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1502; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 1503; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1504; X64-SSE2-NEXT: sete %al 1505; X64-SSE2-NEXT: retq 1506; 1507; X64-SSE41-LABEL: length16_eq_const: 1508; X64-SSE41: # %bb.0: 1509; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1510; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1511; X64-SSE41-NEXT: ptest %xmm0, %xmm0 1512; X64-SSE41-NEXT: sete %al 1513; X64-SSE41-NEXT: retq 1514; 1515; X64-AVX-LABEL: length16_eq_const: 1516; X64-AVX: # %bb.0: 1517; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1518; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 1519; X64-AVX-NEXT: vptest %xmm0, %xmm0 1520; X64-AVX-NEXT: sete %al 1521; X64-AVX-NEXT: retq 1522; 1523; X64-MIC-AVX-LABEL: length16_eq_const: 1524; X64-MIC-AVX: # %bb.0: 1525; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1526; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426] 1527; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 1528; X64-MIC-AVX-NEXT: kortestw %k0, %k0 1529; X64-MIC-AVX-NEXT: sete %al 1530; X64-MIC-AVX-NEXT: vzeroupper 1531; X64-MIC-AVX-NEXT: retq 1532 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 16) nounwind 1533 %c = icmp eq i32 %m, 0 1534 ret i1 %c 1535} 1536 1537; PR33914 - https://bugs.llvm.org/show_bug.cgi?id=33914 1538 1539define i32 @length24(i8* %X, i8* %Y) nounwind { 1540; X86-LABEL: length24: 1541; X86: # %bb.0: 1542; X86-NEXT: pushl $0 1543; X86-NEXT: pushl $24 1544; X86-NEXT: pushl {{[0-9]+}}(%esp) 1545; X86-NEXT: pushl {{[0-9]+}}(%esp) 1546; X86-NEXT: calll memcmp 1547; X86-NEXT: addl $16, %esp 1548; X86-NEXT: retl 1549; 1550; X64-LABEL: length24: 1551; X64: # %bb.0: 1552; X64-NEXT: movq (%rdi), %rcx 1553; X64-NEXT: movq (%rsi), %rdx 1554; X64-NEXT: bswapq %rcx 1555; X64-NEXT: bswapq %rdx 1556; X64-NEXT: cmpq %rdx, %rcx 1557; X64-NEXT: jne .LBB38_3 1558; X64-NEXT: # %bb.1: # %loadbb1 1559; X64-NEXT: movq 8(%rdi), %rcx 1560; X64-NEXT: movq 8(%rsi), %rdx 1561; X64-NEXT: bswapq %rcx 1562; X64-NEXT: bswapq %rdx 1563; X64-NEXT: cmpq %rdx, %rcx 1564; X64-NEXT: jne .LBB38_3 1565; X64-NEXT: # %bb.2: # %loadbb2 1566; X64-NEXT: movq 16(%rdi), %rcx 1567; X64-NEXT: movq 16(%rsi), %rdx 1568; X64-NEXT: bswapq %rcx 1569; X64-NEXT: bswapq %rdx 1570; X64-NEXT: xorl %eax, %eax 1571; X64-NEXT: cmpq %rdx, %rcx 1572; X64-NEXT: je .LBB38_4 1573; X64-NEXT: .LBB38_3: # %res_block 1574; X64-NEXT: xorl %eax, %eax 1575; X64-NEXT: cmpq %rdx, %rcx 1576; X64-NEXT: setae %al 1577; X64-NEXT: leal -1(%rax,%rax), %eax 1578; X64-NEXT: .LBB38_4: # %endblock 1579; X64-NEXT: retq 1580 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 24) nounwind 1581 ret i32 %m 1582} 1583 1584define i1 @length24_eq(i8* %x, i8* %y) nounwind { 1585; X86-NOSSE-LABEL: length24_eq: 1586; X86-NOSSE: # %bb.0: 1587; X86-NOSSE-NEXT: pushl $0 1588; X86-NOSSE-NEXT: pushl $24 1589; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1590; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1591; X86-NOSSE-NEXT: calll memcmp 1592; X86-NOSSE-NEXT: addl $16, %esp 1593; X86-NOSSE-NEXT: testl %eax, %eax 1594; X86-NOSSE-NEXT: sete %al 1595; X86-NOSSE-NEXT: retl 1596; 1597; X86-SSE1-LABEL: length24_eq: 1598; X86-SSE1: # %bb.0: 1599; X86-SSE1-NEXT: pushl $0 1600; X86-SSE1-NEXT: pushl $24 1601; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1602; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1603; X86-SSE1-NEXT: calll memcmp 1604; X86-SSE1-NEXT: addl $16, %esp 1605; X86-SSE1-NEXT: testl %eax, %eax 1606; X86-SSE1-NEXT: sete %al 1607; X86-SSE1-NEXT: retl 1608; 1609; X86-SSE2-LABEL: length24_eq: 1610; X86-SSE2: # %bb.0: 1611; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 1612; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 1613; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 1614; X86-SSE2-NEXT: movdqu 8(%ecx), %xmm1 1615; X86-SSE2-NEXT: movdqu (%eax), %xmm2 1616; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1617; X86-SSE2-NEXT: movdqu 8(%eax), %xmm0 1618; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 1619; X86-SSE2-NEXT: pand %xmm2, %xmm0 1620; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 1621; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1622; X86-SSE2-NEXT: sete %al 1623; X86-SSE2-NEXT: retl 1624; 1625; X86-SSE41-LABEL: length24_eq: 1626; X86-SSE41: # %bb.0: 1627; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 1628; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 1629; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 1630; X86-SSE41-NEXT: movdqu 8(%ecx), %xmm1 1631; X86-SSE41-NEXT: movdqu (%eax), %xmm2 1632; X86-SSE41-NEXT: pxor %xmm0, %xmm2 1633; X86-SSE41-NEXT: movdqu 8(%eax), %xmm0 1634; X86-SSE41-NEXT: pxor %xmm1, %xmm0 1635; X86-SSE41-NEXT: por %xmm2, %xmm0 1636; X86-SSE41-NEXT: ptest %xmm0, %xmm0 1637; X86-SSE41-NEXT: sete %al 1638; X86-SSE41-NEXT: retl 1639; 1640; X64-SSE2-LABEL: length24_eq: 1641; X64-SSE2: # %bb.0: 1642; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1643; X64-SSE2-NEXT: movdqu (%rsi), %xmm1 1644; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1 1645; X64-SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 1646; X64-SSE2-NEXT: movq {{.*#+}} xmm2 = mem[0],zero 1647; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1648; X64-SSE2-NEXT: pand %xmm1, %xmm2 1649; X64-SSE2-NEXT: pmovmskb %xmm2, %eax 1650; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1651; X64-SSE2-NEXT: sete %al 1652; X64-SSE2-NEXT: retq 1653; 1654; X64-SSE41-LABEL: length24_eq: 1655; X64-SSE41: # %bb.0: 1656; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1657; X64-SSE41-NEXT: movdqu (%rsi), %xmm1 1658; X64-SSE41-NEXT: pxor %xmm0, %xmm1 1659; X64-SSE41-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 1660; X64-SSE41-NEXT: movq {{.*#+}} xmm2 = mem[0],zero 1661; X64-SSE41-NEXT: pxor %xmm0, %xmm2 1662; X64-SSE41-NEXT: por %xmm1, %xmm2 1663; X64-SSE41-NEXT: ptest %xmm2, %xmm2 1664; X64-SSE41-NEXT: sete %al 1665; X64-SSE41-NEXT: retq 1666; 1667; X64-AVX-LABEL: length24_eq: 1668; X64-AVX: # %bb.0: 1669; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1670; X64-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 1671; X64-AVX-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero 1672; X64-AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 1673; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 1674; X64-AVX-NEXT: vpor %xmm0, %xmm1, %xmm0 1675; X64-AVX-NEXT: vptest %xmm0, %xmm0 1676; X64-AVX-NEXT: sete %al 1677; X64-AVX-NEXT: retq 1678; 1679; X64-MIC-AVX-LABEL: length24_eq: 1680; X64-MIC-AVX: # %bb.0: 1681; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1682; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm1 1683; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm2 = mem[0],zero 1684; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm3 = mem[0],zero 1685; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm2, %k0 1686; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 1687; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1688; X64-MIC-AVX-NEXT: sete %al 1689; X64-MIC-AVX-NEXT: vzeroupper 1690; X64-MIC-AVX-NEXT: retq 1691 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind 1692 %cmp = icmp eq i32 %call, 0 1693 ret i1 %cmp 1694} 1695 1696define i1 @length24_lt(i8* %x, i8* %y) nounwind { 1697; X86-LABEL: length24_lt: 1698; X86: # %bb.0: 1699; X86-NEXT: pushl $0 1700; X86-NEXT: pushl $24 1701; X86-NEXT: pushl {{[0-9]+}}(%esp) 1702; X86-NEXT: pushl {{[0-9]+}}(%esp) 1703; X86-NEXT: calll memcmp 1704; X86-NEXT: addl $16, %esp 1705; X86-NEXT: shrl $31, %eax 1706; X86-NEXT: # kill: def $al killed $al killed $eax 1707; X86-NEXT: retl 1708; 1709; X64-LABEL: length24_lt: 1710; X64: # %bb.0: 1711; X64-NEXT: movq (%rdi), %rcx 1712; X64-NEXT: movq (%rsi), %rdx 1713; X64-NEXT: bswapq %rcx 1714; X64-NEXT: bswapq %rdx 1715; X64-NEXT: cmpq %rdx, %rcx 1716; X64-NEXT: jne .LBB40_3 1717; X64-NEXT: # %bb.1: # %loadbb1 1718; X64-NEXT: movq 8(%rdi), %rcx 1719; X64-NEXT: movq 8(%rsi), %rdx 1720; X64-NEXT: bswapq %rcx 1721; X64-NEXT: bswapq %rdx 1722; X64-NEXT: cmpq %rdx, %rcx 1723; X64-NEXT: jne .LBB40_3 1724; X64-NEXT: # %bb.2: # %loadbb2 1725; X64-NEXT: movq 16(%rdi), %rcx 1726; X64-NEXT: movq 16(%rsi), %rdx 1727; X64-NEXT: bswapq %rcx 1728; X64-NEXT: bswapq %rdx 1729; X64-NEXT: xorl %eax, %eax 1730; X64-NEXT: cmpq %rdx, %rcx 1731; X64-NEXT: je .LBB40_4 1732; X64-NEXT: .LBB40_3: # %res_block 1733; X64-NEXT: xorl %eax, %eax 1734; X64-NEXT: cmpq %rdx, %rcx 1735; X64-NEXT: setae %al 1736; X64-NEXT: leal -1(%rax,%rax), %eax 1737; X64-NEXT: .LBB40_4: # %endblock 1738; X64-NEXT: shrl $31, %eax 1739; X64-NEXT: # kill: def $al killed $al killed $eax 1740; X64-NEXT: retq 1741 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind 1742 %cmp = icmp slt i32 %call, 0 1743 ret i1 %cmp 1744} 1745 1746define i1 @length24_gt(i8* %x, i8* %y) nounwind { 1747; X86-LABEL: length24_gt: 1748; X86: # %bb.0: 1749; X86-NEXT: pushl $0 1750; X86-NEXT: pushl $24 1751; X86-NEXT: pushl {{[0-9]+}}(%esp) 1752; X86-NEXT: pushl {{[0-9]+}}(%esp) 1753; X86-NEXT: calll memcmp 1754; X86-NEXT: addl $16, %esp 1755; X86-NEXT: testl %eax, %eax 1756; X86-NEXT: setg %al 1757; X86-NEXT: retl 1758; 1759; X64-LABEL: length24_gt: 1760; X64: # %bb.0: 1761; X64-NEXT: movq (%rdi), %rax 1762; X64-NEXT: movq (%rsi), %rcx 1763; X64-NEXT: bswapq %rax 1764; X64-NEXT: bswapq %rcx 1765; X64-NEXT: cmpq %rcx, %rax 1766; X64-NEXT: jne .LBB41_3 1767; X64-NEXT: # %bb.1: # %loadbb1 1768; X64-NEXT: movq 8(%rdi), %rax 1769; X64-NEXT: movq 8(%rsi), %rcx 1770; X64-NEXT: bswapq %rax 1771; X64-NEXT: bswapq %rcx 1772; X64-NEXT: cmpq %rcx, %rax 1773; X64-NEXT: jne .LBB41_3 1774; X64-NEXT: # %bb.2: # %loadbb2 1775; X64-NEXT: movq 16(%rdi), %rax 1776; X64-NEXT: movq 16(%rsi), %rcx 1777; X64-NEXT: bswapq %rax 1778; X64-NEXT: bswapq %rcx 1779; X64-NEXT: xorl %edx, %edx 1780; X64-NEXT: cmpq %rcx, %rax 1781; X64-NEXT: je .LBB41_4 1782; X64-NEXT: .LBB41_3: # %res_block 1783; X64-NEXT: xorl %edx, %edx 1784; X64-NEXT: cmpq %rcx, %rax 1785; X64-NEXT: setae %dl 1786; X64-NEXT: leal -1(%rdx,%rdx), %edx 1787; X64-NEXT: .LBB41_4: # %endblock 1788; X64-NEXT: testl %edx, %edx 1789; X64-NEXT: setg %al 1790; X64-NEXT: retq 1791 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 24) nounwind 1792 %cmp = icmp sgt i32 %call, 0 1793 ret i1 %cmp 1794} 1795 1796define i1 @length24_eq_const(i8* %X) nounwind { 1797; X86-NOSSE-LABEL: length24_eq_const: 1798; X86-NOSSE: # %bb.0: 1799; X86-NOSSE-NEXT: pushl $0 1800; X86-NOSSE-NEXT: pushl $24 1801; X86-NOSSE-NEXT: pushl $.L.str 1802; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1803; X86-NOSSE-NEXT: calll memcmp 1804; X86-NOSSE-NEXT: addl $16, %esp 1805; X86-NOSSE-NEXT: testl %eax, %eax 1806; X86-NOSSE-NEXT: setne %al 1807; X86-NOSSE-NEXT: retl 1808; 1809; X86-SSE1-LABEL: length24_eq_const: 1810; X86-SSE1: # %bb.0: 1811; X86-SSE1-NEXT: pushl $0 1812; X86-SSE1-NEXT: pushl $24 1813; X86-SSE1-NEXT: pushl $.L.str 1814; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1815; X86-SSE1-NEXT: calll memcmp 1816; X86-SSE1-NEXT: addl $16, %esp 1817; X86-SSE1-NEXT: testl %eax, %eax 1818; X86-SSE1-NEXT: setne %al 1819; X86-SSE1-NEXT: retl 1820; 1821; X86-SSE2-LABEL: length24_eq_const: 1822; X86-SSE2: # %bb.0: 1823; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 1824; X86-SSE2-NEXT: movdqu (%eax), %xmm0 1825; X86-SSE2-NEXT: movdqu 8(%eax), %xmm1 1826; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 1827; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 1828; X86-SSE2-NEXT: pand %xmm1, %xmm0 1829; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 1830; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1831; X86-SSE2-NEXT: setne %al 1832; X86-SSE2-NEXT: retl 1833; 1834; X86-SSE41-LABEL: length24_eq_const: 1835; X86-SSE41: # %bb.0: 1836; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 1837; X86-SSE41-NEXT: movdqu (%eax), %xmm0 1838; X86-SSE41-NEXT: movdqu 8(%eax), %xmm1 1839; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 1840; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 1841; X86-SSE41-NEXT: por %xmm1, %xmm0 1842; X86-SSE41-NEXT: ptest %xmm0, %xmm0 1843; X86-SSE41-NEXT: setne %al 1844; X86-SSE41-NEXT: retl 1845; 1846; X64-SSE2-LABEL: length24_eq_const: 1847; X64-SSE2: # %bb.0: 1848; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 1849; X64-SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1850; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1851; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1852; X64-SSE2-NEXT: pand %xmm1, %xmm0 1853; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 1854; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1855; X64-SSE2-NEXT: setne %al 1856; X64-SSE2-NEXT: retq 1857; 1858; X64-SSE41-LABEL: length24_eq_const: 1859; X64-SSE41: # %bb.0: 1860; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 1861; X64-SSE41-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1862; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1863; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1864; X64-SSE41-NEXT: por %xmm1, %xmm0 1865; X64-SSE41-NEXT: ptest %xmm0, %xmm0 1866; X64-SSE41-NEXT: setne %al 1867; X64-SSE41-NEXT: retq 1868; 1869; X64-AVX-LABEL: length24_eq_const: 1870; X64-AVX: # %bb.0: 1871; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 1872; X64-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 1873; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 1874; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 1875; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 1876; X64-AVX-NEXT: vptest %xmm0, %xmm0 1877; X64-AVX-NEXT: setne %al 1878; X64-AVX-NEXT: retq 1879; 1880; X64-MIC-AVX-LABEL: length24_eq_const: 1881; X64-MIC-AVX: # %bb.0: 1882; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 1883; X64-MIC-AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 1884; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [959985462,858927408,0,0] 1885; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 1886; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426] 1887; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 1888; X64-MIC-AVX-NEXT: kortestw %k0, %k1 1889; X64-MIC-AVX-NEXT: setne %al 1890; X64-MIC-AVX-NEXT: vzeroupper 1891; X64-MIC-AVX-NEXT: retq 1892 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 24) nounwind 1893 %c = icmp ne i32 %m, 0 1894 ret i1 %c 1895} 1896 1897define i32 @length31(i8* %X, i8* %Y) nounwind { 1898; X86-LABEL: length31: 1899; X86: # %bb.0: 1900; X86-NEXT: pushl $0 1901; X86-NEXT: pushl $31 1902; X86-NEXT: pushl {{[0-9]+}}(%esp) 1903; X86-NEXT: pushl {{[0-9]+}}(%esp) 1904; X86-NEXT: calll memcmp 1905; X86-NEXT: addl $16, %esp 1906; X86-NEXT: retl 1907; 1908; X64-LABEL: length31: 1909; X64: # %bb.0: 1910; X64-NEXT: movq (%rdi), %rcx 1911; X64-NEXT: movq (%rsi), %rdx 1912; X64-NEXT: bswapq %rcx 1913; X64-NEXT: bswapq %rdx 1914; X64-NEXT: cmpq %rdx, %rcx 1915; X64-NEXT: jne .LBB43_4 1916; X64-NEXT: # %bb.1: # %loadbb1 1917; X64-NEXT: movq 8(%rdi), %rcx 1918; X64-NEXT: movq 8(%rsi), %rdx 1919; X64-NEXT: bswapq %rcx 1920; X64-NEXT: bswapq %rdx 1921; X64-NEXT: cmpq %rdx, %rcx 1922; X64-NEXT: jne .LBB43_4 1923; X64-NEXT: # %bb.2: # %loadbb2 1924; X64-NEXT: movq 16(%rdi), %rcx 1925; X64-NEXT: movq 16(%rsi), %rdx 1926; X64-NEXT: bswapq %rcx 1927; X64-NEXT: bswapq %rdx 1928; X64-NEXT: cmpq %rdx, %rcx 1929; X64-NEXT: jne .LBB43_4 1930; X64-NEXT: # %bb.3: # %loadbb3 1931; X64-NEXT: movq 23(%rdi), %rcx 1932; X64-NEXT: movq 23(%rsi), %rdx 1933; X64-NEXT: bswapq %rcx 1934; X64-NEXT: bswapq %rdx 1935; X64-NEXT: xorl %eax, %eax 1936; X64-NEXT: cmpq %rdx, %rcx 1937; X64-NEXT: je .LBB43_5 1938; X64-NEXT: .LBB43_4: # %res_block 1939; X64-NEXT: xorl %eax, %eax 1940; X64-NEXT: cmpq %rdx, %rcx 1941; X64-NEXT: setae %al 1942; X64-NEXT: leal -1(%rax,%rax), %eax 1943; X64-NEXT: .LBB43_5: # %endblock 1944; X64-NEXT: retq 1945 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 31) nounwind 1946 ret i32 %m 1947} 1948 1949define i1 @length31_eq(i8* %x, i8* %y) nounwind { 1950; X86-NOSSE-LABEL: length31_eq: 1951; X86-NOSSE: # %bb.0: 1952; X86-NOSSE-NEXT: pushl $0 1953; X86-NOSSE-NEXT: pushl $31 1954; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1955; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 1956; X86-NOSSE-NEXT: calll memcmp 1957; X86-NOSSE-NEXT: addl $16, %esp 1958; X86-NOSSE-NEXT: testl %eax, %eax 1959; X86-NOSSE-NEXT: sete %al 1960; X86-NOSSE-NEXT: retl 1961; 1962; X86-SSE1-LABEL: length31_eq: 1963; X86-SSE1: # %bb.0: 1964; X86-SSE1-NEXT: pushl $0 1965; X86-SSE1-NEXT: pushl $31 1966; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1967; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 1968; X86-SSE1-NEXT: calll memcmp 1969; X86-SSE1-NEXT: addl $16, %esp 1970; X86-SSE1-NEXT: testl %eax, %eax 1971; X86-SSE1-NEXT: sete %al 1972; X86-SSE1-NEXT: retl 1973; 1974; X86-SSE2-LABEL: length31_eq: 1975; X86-SSE2: # %bb.0: 1976; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 1977; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 1978; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 1979; X86-SSE2-NEXT: movdqu 15(%ecx), %xmm1 1980; X86-SSE2-NEXT: movdqu (%eax), %xmm2 1981; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 1982; X86-SSE2-NEXT: movdqu 15(%eax), %xmm0 1983; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 1984; X86-SSE2-NEXT: pand %xmm2, %xmm0 1985; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 1986; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 1987; X86-SSE2-NEXT: sete %al 1988; X86-SSE2-NEXT: retl 1989; 1990; X86-SSE41-LABEL: length31_eq: 1991; X86-SSE41: # %bb.0: 1992; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 1993; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 1994; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 1995; X86-SSE41-NEXT: movdqu 15(%ecx), %xmm1 1996; X86-SSE41-NEXT: movdqu (%eax), %xmm2 1997; X86-SSE41-NEXT: pxor %xmm0, %xmm2 1998; X86-SSE41-NEXT: movdqu 15(%eax), %xmm0 1999; X86-SSE41-NEXT: pxor %xmm1, %xmm0 2000; X86-SSE41-NEXT: por %xmm2, %xmm0 2001; X86-SSE41-NEXT: ptest %xmm0, %xmm0 2002; X86-SSE41-NEXT: sete %al 2003; X86-SSE41-NEXT: retl 2004; 2005; X64-SSE2-LABEL: length31_eq: 2006; X64-SSE2: # %bb.0: 2007; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 2008; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm1 2009; X64-SSE2-NEXT: movdqu (%rsi), %xmm2 2010; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 2011; X64-SSE2-NEXT: movdqu 15(%rsi), %xmm0 2012; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 2013; X64-SSE2-NEXT: pand %xmm2, %xmm0 2014; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 2015; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2016; X64-SSE2-NEXT: sete %al 2017; X64-SSE2-NEXT: retq 2018; 2019; X64-SSE41-LABEL: length31_eq: 2020; X64-SSE41: # %bb.0: 2021; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 2022; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm1 2023; X64-SSE41-NEXT: movdqu (%rsi), %xmm2 2024; X64-SSE41-NEXT: pxor %xmm0, %xmm2 2025; X64-SSE41-NEXT: movdqu 15(%rsi), %xmm0 2026; X64-SSE41-NEXT: pxor %xmm1, %xmm0 2027; X64-SSE41-NEXT: por %xmm2, %xmm0 2028; X64-SSE41-NEXT: ptest %xmm0, %xmm0 2029; X64-SSE41-NEXT: sete %al 2030; X64-SSE41-NEXT: retq 2031; 2032; X64-AVX-LABEL: length31_eq: 2033; X64-AVX: # %bb.0: 2034; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 2035; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 2036; X64-AVX-NEXT: vpxor 15(%rsi), %xmm1, %xmm1 2037; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 2038; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 2039; X64-AVX-NEXT: vptest %xmm0, %xmm0 2040; X64-AVX-NEXT: sete %al 2041; X64-AVX-NEXT: retq 2042; 2043; X64-MIC-AVX-LABEL: length31_eq: 2044; X64-MIC-AVX: # %bb.0: 2045; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 2046; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 2047; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm2 2048; X64-MIC-AVX-NEXT: vmovdqu 15(%rsi), %xmm3 2049; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 2050; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 2051; X64-MIC-AVX-NEXT: kortestw %k0, %k1 2052; X64-MIC-AVX-NEXT: sete %al 2053; X64-MIC-AVX-NEXT: vzeroupper 2054; X64-MIC-AVX-NEXT: retq 2055 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind 2056 %cmp = icmp eq i32 %call, 0 2057 ret i1 %cmp 2058} 2059 2060define i1 @length31_lt(i8* %x, i8* %y) nounwind { 2061; X86-LABEL: length31_lt: 2062; X86: # %bb.0: 2063; X86-NEXT: pushl $0 2064; X86-NEXT: pushl $31 2065; X86-NEXT: pushl {{[0-9]+}}(%esp) 2066; X86-NEXT: pushl {{[0-9]+}}(%esp) 2067; X86-NEXT: calll memcmp 2068; X86-NEXT: addl $16, %esp 2069; X86-NEXT: shrl $31, %eax 2070; X86-NEXT: # kill: def $al killed $al killed $eax 2071; X86-NEXT: retl 2072; 2073; X64-LABEL: length31_lt: 2074; X64: # %bb.0: 2075; X64-NEXT: movq (%rdi), %rcx 2076; X64-NEXT: movq (%rsi), %rdx 2077; X64-NEXT: bswapq %rcx 2078; X64-NEXT: bswapq %rdx 2079; X64-NEXT: cmpq %rdx, %rcx 2080; X64-NEXT: jne .LBB45_4 2081; X64-NEXT: # %bb.1: # %loadbb1 2082; X64-NEXT: movq 8(%rdi), %rcx 2083; X64-NEXT: movq 8(%rsi), %rdx 2084; X64-NEXT: bswapq %rcx 2085; X64-NEXT: bswapq %rdx 2086; X64-NEXT: cmpq %rdx, %rcx 2087; X64-NEXT: jne .LBB45_4 2088; X64-NEXT: # %bb.2: # %loadbb2 2089; X64-NEXT: movq 16(%rdi), %rcx 2090; X64-NEXT: movq 16(%rsi), %rdx 2091; X64-NEXT: bswapq %rcx 2092; X64-NEXT: bswapq %rdx 2093; X64-NEXT: cmpq %rdx, %rcx 2094; X64-NEXT: jne .LBB45_4 2095; X64-NEXT: # %bb.3: # %loadbb3 2096; X64-NEXT: movq 23(%rdi), %rcx 2097; X64-NEXT: movq 23(%rsi), %rdx 2098; X64-NEXT: bswapq %rcx 2099; X64-NEXT: bswapq %rdx 2100; X64-NEXT: xorl %eax, %eax 2101; X64-NEXT: cmpq %rdx, %rcx 2102; X64-NEXT: je .LBB45_5 2103; X64-NEXT: .LBB45_4: # %res_block 2104; X64-NEXT: xorl %eax, %eax 2105; X64-NEXT: cmpq %rdx, %rcx 2106; X64-NEXT: setae %al 2107; X64-NEXT: leal -1(%rax,%rax), %eax 2108; X64-NEXT: .LBB45_5: # %endblock 2109; X64-NEXT: shrl $31, %eax 2110; X64-NEXT: # kill: def $al killed $al killed $eax 2111; X64-NEXT: retq 2112 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind 2113 %cmp = icmp slt i32 %call, 0 2114 ret i1 %cmp 2115} 2116 2117define i1 @length31_gt(i8* %x, i8* %y) nounwind { 2118; X86-LABEL: length31_gt: 2119; X86: # %bb.0: 2120; X86-NEXT: pushl $0 2121; X86-NEXT: pushl $31 2122; X86-NEXT: pushl {{[0-9]+}}(%esp) 2123; X86-NEXT: pushl {{[0-9]+}}(%esp) 2124; X86-NEXT: calll memcmp 2125; X86-NEXT: addl $16, %esp 2126; X86-NEXT: testl %eax, %eax 2127; X86-NEXT: setg %al 2128; X86-NEXT: retl 2129; 2130; X64-LABEL: length31_gt: 2131; X64: # %bb.0: 2132; X64-NEXT: movq (%rdi), %rax 2133; X64-NEXT: movq (%rsi), %rcx 2134; X64-NEXT: bswapq %rax 2135; X64-NEXT: bswapq %rcx 2136; X64-NEXT: cmpq %rcx, %rax 2137; X64-NEXT: jne .LBB46_4 2138; X64-NEXT: # %bb.1: # %loadbb1 2139; X64-NEXT: movq 8(%rdi), %rax 2140; X64-NEXT: movq 8(%rsi), %rcx 2141; X64-NEXT: bswapq %rax 2142; X64-NEXT: bswapq %rcx 2143; X64-NEXT: cmpq %rcx, %rax 2144; X64-NEXT: jne .LBB46_4 2145; X64-NEXT: # %bb.2: # %loadbb2 2146; X64-NEXT: movq 16(%rdi), %rax 2147; X64-NEXT: movq 16(%rsi), %rcx 2148; X64-NEXT: bswapq %rax 2149; X64-NEXT: bswapq %rcx 2150; X64-NEXT: cmpq %rcx, %rax 2151; X64-NEXT: jne .LBB46_4 2152; X64-NEXT: # %bb.3: # %loadbb3 2153; X64-NEXT: movq 23(%rdi), %rax 2154; X64-NEXT: movq 23(%rsi), %rcx 2155; X64-NEXT: bswapq %rax 2156; X64-NEXT: bswapq %rcx 2157; X64-NEXT: xorl %edx, %edx 2158; X64-NEXT: cmpq %rcx, %rax 2159; X64-NEXT: je .LBB46_5 2160; X64-NEXT: .LBB46_4: # %res_block 2161; X64-NEXT: xorl %edx, %edx 2162; X64-NEXT: cmpq %rcx, %rax 2163; X64-NEXT: setae %dl 2164; X64-NEXT: leal -1(%rdx,%rdx), %edx 2165; X64-NEXT: .LBB46_5: # %endblock 2166; X64-NEXT: testl %edx, %edx 2167; X64-NEXT: setg %al 2168; X64-NEXT: retq 2169 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind 2170 %cmp = icmp sgt i32 %call, 0 2171 ret i1 %cmp 2172} 2173 2174define i1 @length31_eq_prefer128(i8* %x, i8* %y) nounwind "prefer-vector-width"="128" { 2175; X86-NOSSE-LABEL: length31_eq_prefer128: 2176; X86-NOSSE: # %bb.0: 2177; X86-NOSSE-NEXT: pushl $0 2178; X86-NOSSE-NEXT: pushl $31 2179; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 2180; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 2181; X86-NOSSE-NEXT: calll memcmp 2182; X86-NOSSE-NEXT: addl $16, %esp 2183; X86-NOSSE-NEXT: testl %eax, %eax 2184; X86-NOSSE-NEXT: sete %al 2185; X86-NOSSE-NEXT: retl 2186; 2187; X86-SSE1-LABEL: length31_eq_prefer128: 2188; X86-SSE1: # %bb.0: 2189; X86-SSE1-NEXT: pushl $0 2190; X86-SSE1-NEXT: pushl $31 2191; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 2192; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 2193; X86-SSE1-NEXT: calll memcmp 2194; X86-SSE1-NEXT: addl $16, %esp 2195; X86-SSE1-NEXT: testl %eax, %eax 2196; X86-SSE1-NEXT: sete %al 2197; X86-SSE1-NEXT: retl 2198; 2199; X86-SSE2-LABEL: length31_eq_prefer128: 2200; X86-SSE2: # %bb.0: 2201; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 2202; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 2203; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 2204; X86-SSE2-NEXT: movdqu 15(%ecx), %xmm1 2205; X86-SSE2-NEXT: movdqu (%eax), %xmm2 2206; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 2207; X86-SSE2-NEXT: movdqu 15(%eax), %xmm0 2208; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 2209; X86-SSE2-NEXT: pand %xmm2, %xmm0 2210; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 2211; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2212; X86-SSE2-NEXT: sete %al 2213; X86-SSE2-NEXT: retl 2214; 2215; X86-SSE41-LABEL: length31_eq_prefer128: 2216; X86-SSE41: # %bb.0: 2217; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 2218; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 2219; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 2220; X86-SSE41-NEXT: movdqu 15(%ecx), %xmm1 2221; X86-SSE41-NEXT: movdqu (%eax), %xmm2 2222; X86-SSE41-NEXT: pxor %xmm0, %xmm2 2223; X86-SSE41-NEXT: movdqu 15(%eax), %xmm0 2224; X86-SSE41-NEXT: pxor %xmm1, %xmm0 2225; X86-SSE41-NEXT: por %xmm2, %xmm0 2226; X86-SSE41-NEXT: ptest %xmm0, %xmm0 2227; X86-SSE41-NEXT: sete %al 2228; X86-SSE41-NEXT: retl 2229; 2230; X64-SSE2-LABEL: length31_eq_prefer128: 2231; X64-SSE2: # %bb.0: 2232; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 2233; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm1 2234; X64-SSE2-NEXT: movdqu (%rsi), %xmm2 2235; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 2236; X64-SSE2-NEXT: movdqu 15(%rsi), %xmm0 2237; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 2238; X64-SSE2-NEXT: pand %xmm2, %xmm0 2239; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 2240; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2241; X64-SSE2-NEXT: sete %al 2242; X64-SSE2-NEXT: retq 2243; 2244; X64-SSE41-LABEL: length31_eq_prefer128: 2245; X64-SSE41: # %bb.0: 2246; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 2247; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm1 2248; X64-SSE41-NEXT: movdqu (%rsi), %xmm2 2249; X64-SSE41-NEXT: pxor %xmm0, %xmm2 2250; X64-SSE41-NEXT: movdqu 15(%rsi), %xmm0 2251; X64-SSE41-NEXT: pxor %xmm1, %xmm0 2252; X64-SSE41-NEXT: por %xmm2, %xmm0 2253; X64-SSE41-NEXT: ptest %xmm0, %xmm0 2254; X64-SSE41-NEXT: sete %al 2255; X64-SSE41-NEXT: retq 2256; 2257; X64-AVX-LABEL: length31_eq_prefer128: 2258; X64-AVX: # %bb.0: 2259; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 2260; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 2261; X64-AVX-NEXT: vpxor 15(%rsi), %xmm1, %xmm1 2262; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 2263; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 2264; X64-AVX-NEXT: vptest %xmm0, %xmm0 2265; X64-AVX-NEXT: sete %al 2266; X64-AVX-NEXT: retq 2267; 2268; X64-MIC-AVX-LABEL: length31_eq_prefer128: 2269; X64-MIC-AVX: # %bb.0: 2270; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 2271; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 2272; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm2 2273; X64-MIC-AVX-NEXT: vmovdqu 15(%rsi), %xmm3 2274; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 2275; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 2276; X64-MIC-AVX-NEXT: kortestw %k0, %k1 2277; X64-MIC-AVX-NEXT: sete %al 2278; X64-MIC-AVX-NEXT: vzeroupper 2279; X64-MIC-AVX-NEXT: retq 2280 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 31) nounwind 2281 %cmp = icmp eq i32 %call, 0 2282 ret i1 %cmp 2283} 2284 2285define i1 @length31_eq_const(i8* %X) nounwind { 2286; X86-NOSSE-LABEL: length31_eq_const: 2287; X86-NOSSE: # %bb.0: 2288; X86-NOSSE-NEXT: pushl $0 2289; X86-NOSSE-NEXT: pushl $31 2290; X86-NOSSE-NEXT: pushl $.L.str 2291; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 2292; X86-NOSSE-NEXT: calll memcmp 2293; X86-NOSSE-NEXT: addl $16, %esp 2294; X86-NOSSE-NEXT: testl %eax, %eax 2295; X86-NOSSE-NEXT: setne %al 2296; X86-NOSSE-NEXT: retl 2297; 2298; X86-SSE1-LABEL: length31_eq_const: 2299; X86-SSE1: # %bb.0: 2300; X86-SSE1-NEXT: pushl $0 2301; X86-SSE1-NEXT: pushl $31 2302; X86-SSE1-NEXT: pushl $.L.str 2303; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 2304; X86-SSE1-NEXT: calll memcmp 2305; X86-SSE1-NEXT: addl $16, %esp 2306; X86-SSE1-NEXT: testl %eax, %eax 2307; X86-SSE1-NEXT: setne %al 2308; X86-SSE1-NEXT: retl 2309; 2310; X86-SSE2-LABEL: length31_eq_const: 2311; X86-SSE2: # %bb.0: 2312; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 2313; X86-SSE2-NEXT: movdqu (%eax), %xmm0 2314; X86-SSE2-NEXT: movdqu 15(%eax), %xmm1 2315; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 2316; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 2317; X86-SSE2-NEXT: pand %xmm1, %xmm0 2318; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 2319; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2320; X86-SSE2-NEXT: setne %al 2321; X86-SSE2-NEXT: retl 2322; 2323; X86-SSE41-LABEL: length31_eq_const: 2324; X86-SSE41: # %bb.0: 2325; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 2326; X86-SSE41-NEXT: movdqu (%eax), %xmm0 2327; X86-SSE41-NEXT: movdqu 15(%eax), %xmm1 2328; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 2329; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 2330; X86-SSE41-NEXT: por %xmm1, %xmm0 2331; X86-SSE41-NEXT: ptest %xmm0, %xmm0 2332; X86-SSE41-NEXT: setne %al 2333; X86-SSE41-NEXT: retl 2334; 2335; X64-SSE2-LABEL: length31_eq_const: 2336; X64-SSE2: # %bb.0: 2337; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 2338; X64-SSE2-NEXT: movdqu 15(%rdi), %xmm1 2339; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 2340; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 2341; X64-SSE2-NEXT: pand %xmm1, %xmm0 2342; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 2343; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2344; X64-SSE2-NEXT: setne %al 2345; X64-SSE2-NEXT: retq 2346; 2347; X64-SSE41-LABEL: length31_eq_const: 2348; X64-SSE41: # %bb.0: 2349; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 2350; X64-SSE41-NEXT: movdqu 15(%rdi), %xmm1 2351; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 2352; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 2353; X64-SSE41-NEXT: por %xmm1, %xmm0 2354; X64-SSE41-NEXT: ptest %xmm0, %xmm0 2355; X64-SSE41-NEXT: setne %al 2356; X64-SSE41-NEXT: retq 2357; 2358; X64-AVX-LABEL: length31_eq_const: 2359; X64-AVX: # %bb.0: 2360; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 2361; X64-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 2362; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 2363; X64-AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 2364; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 2365; X64-AVX-NEXT: vptest %xmm0, %xmm0 2366; X64-AVX-NEXT: setne %al 2367; X64-AVX-NEXT: retq 2368; 2369; X64-MIC-AVX-LABEL: length31_eq_const: 2370; X64-MIC-AVX: # %bb.0: 2371; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 2372; X64-MIC-AVX-NEXT: vmovdqu 15(%rdi), %xmm1 2373; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [943142453,842084409,909456435,809056311] 2374; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 2375; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [858927408,926299444,825243960,892613426] 2376; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 2377; X64-MIC-AVX-NEXT: kortestw %k0, %k1 2378; X64-MIC-AVX-NEXT: setne %al 2379; X64-MIC-AVX-NEXT: vzeroupper 2380; X64-MIC-AVX-NEXT: retq 2381 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 31) nounwind 2382 %c = icmp ne i32 %m, 0 2383 ret i1 %c 2384} 2385 2386define i32 @length32(i8* %X, i8* %Y) nounwind { 2387; X86-LABEL: length32: 2388; X86: # %bb.0: 2389; X86-NEXT: pushl $0 2390; X86-NEXT: pushl $32 2391; X86-NEXT: pushl {{[0-9]+}}(%esp) 2392; X86-NEXT: pushl {{[0-9]+}}(%esp) 2393; X86-NEXT: calll memcmp 2394; X86-NEXT: addl $16, %esp 2395; X86-NEXT: retl 2396; 2397; X64-LABEL: length32: 2398; X64: # %bb.0: 2399; X64-NEXT: movq (%rdi), %rcx 2400; X64-NEXT: movq (%rsi), %rdx 2401; X64-NEXT: bswapq %rcx 2402; X64-NEXT: bswapq %rdx 2403; X64-NEXT: cmpq %rdx, %rcx 2404; X64-NEXT: jne .LBB49_4 2405; X64-NEXT: # %bb.1: # %loadbb1 2406; X64-NEXT: movq 8(%rdi), %rcx 2407; X64-NEXT: movq 8(%rsi), %rdx 2408; X64-NEXT: bswapq %rcx 2409; X64-NEXT: bswapq %rdx 2410; X64-NEXT: cmpq %rdx, %rcx 2411; X64-NEXT: jne .LBB49_4 2412; X64-NEXT: # %bb.2: # %loadbb2 2413; X64-NEXT: movq 16(%rdi), %rcx 2414; X64-NEXT: movq 16(%rsi), %rdx 2415; X64-NEXT: bswapq %rcx 2416; X64-NEXT: bswapq %rdx 2417; X64-NEXT: cmpq %rdx, %rcx 2418; X64-NEXT: jne .LBB49_4 2419; X64-NEXT: # %bb.3: # %loadbb3 2420; X64-NEXT: movq 24(%rdi), %rcx 2421; X64-NEXT: movq 24(%rsi), %rdx 2422; X64-NEXT: bswapq %rcx 2423; X64-NEXT: bswapq %rdx 2424; X64-NEXT: xorl %eax, %eax 2425; X64-NEXT: cmpq %rdx, %rcx 2426; X64-NEXT: je .LBB49_5 2427; X64-NEXT: .LBB49_4: # %res_block 2428; X64-NEXT: xorl %eax, %eax 2429; X64-NEXT: cmpq %rdx, %rcx 2430; X64-NEXT: setae %al 2431; X64-NEXT: leal -1(%rax,%rax), %eax 2432; X64-NEXT: .LBB49_5: # %endblock 2433; X64-NEXT: retq 2434 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 32) nounwind 2435 ret i32 %m 2436} 2437 2438; PR33325 - https://bugs.llvm.org/show_bug.cgi?id=33325 2439 2440define i1 @length32_eq(i8* %x, i8* %y) nounwind { 2441; X86-NOSSE-LABEL: length32_eq: 2442; X86-NOSSE: # %bb.0: 2443; X86-NOSSE-NEXT: pushl $0 2444; X86-NOSSE-NEXT: pushl $32 2445; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 2446; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 2447; X86-NOSSE-NEXT: calll memcmp 2448; X86-NOSSE-NEXT: addl $16, %esp 2449; X86-NOSSE-NEXT: testl %eax, %eax 2450; X86-NOSSE-NEXT: sete %al 2451; X86-NOSSE-NEXT: retl 2452; 2453; X86-SSE1-LABEL: length32_eq: 2454; X86-SSE1: # %bb.0: 2455; X86-SSE1-NEXT: pushl $0 2456; X86-SSE1-NEXT: pushl $32 2457; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 2458; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 2459; X86-SSE1-NEXT: calll memcmp 2460; X86-SSE1-NEXT: addl $16, %esp 2461; X86-SSE1-NEXT: testl %eax, %eax 2462; X86-SSE1-NEXT: sete %al 2463; X86-SSE1-NEXT: retl 2464; 2465; X86-SSE2-LABEL: length32_eq: 2466; X86-SSE2: # %bb.0: 2467; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 2468; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 2469; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 2470; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1 2471; X86-SSE2-NEXT: movdqu (%eax), %xmm2 2472; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 2473; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0 2474; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 2475; X86-SSE2-NEXT: pand %xmm2, %xmm0 2476; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 2477; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2478; X86-SSE2-NEXT: sete %al 2479; X86-SSE2-NEXT: retl 2480; 2481; X86-SSE41-LABEL: length32_eq: 2482; X86-SSE41: # %bb.0: 2483; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 2484; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 2485; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 2486; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1 2487; X86-SSE41-NEXT: movdqu (%eax), %xmm2 2488; X86-SSE41-NEXT: pxor %xmm0, %xmm2 2489; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0 2490; X86-SSE41-NEXT: pxor %xmm1, %xmm0 2491; X86-SSE41-NEXT: por %xmm2, %xmm0 2492; X86-SSE41-NEXT: ptest %xmm0, %xmm0 2493; X86-SSE41-NEXT: sete %al 2494; X86-SSE41-NEXT: retl 2495; 2496; X64-SSE2-LABEL: length32_eq: 2497; X64-SSE2: # %bb.0: 2498; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 2499; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 2500; X64-SSE2-NEXT: movdqu (%rsi), %xmm2 2501; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 2502; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0 2503; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 2504; X64-SSE2-NEXT: pand %xmm2, %xmm0 2505; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 2506; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2507; X64-SSE2-NEXT: sete %al 2508; X64-SSE2-NEXT: retq 2509; 2510; X64-SSE41-LABEL: length32_eq: 2511; X64-SSE41: # %bb.0: 2512; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 2513; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 2514; X64-SSE41-NEXT: movdqu (%rsi), %xmm2 2515; X64-SSE41-NEXT: pxor %xmm0, %xmm2 2516; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0 2517; X64-SSE41-NEXT: pxor %xmm1, %xmm0 2518; X64-SSE41-NEXT: por %xmm2, %xmm0 2519; X64-SSE41-NEXT: ptest %xmm0, %xmm0 2520; X64-SSE41-NEXT: sete %al 2521; X64-SSE41-NEXT: retq 2522; 2523; X64-AVX1-LABEL: length32_eq: 2524; X64-AVX1: # %bb.0: 2525; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 2526; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 2527; X64-AVX1-NEXT: vptest %ymm0, %ymm0 2528; X64-AVX1-NEXT: sete %al 2529; X64-AVX1-NEXT: vzeroupper 2530; X64-AVX1-NEXT: retq 2531; 2532; X64-AVX2-LABEL: length32_eq: 2533; X64-AVX2: # %bb.0: 2534; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 2535; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 2536; X64-AVX2-NEXT: vptest %ymm0, %ymm0 2537; X64-AVX2-NEXT: sete %al 2538; X64-AVX2-NEXT: vzeroupper 2539; X64-AVX2-NEXT: retq 2540; 2541; X64-AVX512-LABEL: length32_eq: 2542; X64-AVX512: # %bb.0: 2543; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 2544; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0 2545; X64-AVX512-NEXT: vptest %ymm0, %ymm0 2546; X64-AVX512-NEXT: sete %al 2547; X64-AVX512-NEXT: vzeroupper 2548; X64-AVX512-NEXT: retq 2549; 2550; X64-MIC-AVX-LABEL: length32_eq: 2551; X64-MIC-AVX: # %bb.0: 2552; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 2553; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm1 2554; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 2555; X64-MIC-AVX-NEXT: kortestw %k0, %k0 2556; X64-MIC-AVX-NEXT: sete %al 2557; X64-MIC-AVX-NEXT: vzeroupper 2558; X64-MIC-AVX-NEXT: retq 2559 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind 2560 %cmp = icmp eq i32 %call, 0 2561 ret i1 %cmp 2562} 2563 2564define i1 @length32_lt(i8* %x, i8* %y) nounwind { 2565; X86-LABEL: length32_lt: 2566; X86: # %bb.0: 2567; X86-NEXT: pushl $0 2568; X86-NEXT: pushl $32 2569; X86-NEXT: pushl {{[0-9]+}}(%esp) 2570; X86-NEXT: pushl {{[0-9]+}}(%esp) 2571; X86-NEXT: calll memcmp 2572; X86-NEXT: addl $16, %esp 2573; X86-NEXT: shrl $31, %eax 2574; X86-NEXT: # kill: def $al killed $al killed $eax 2575; X86-NEXT: retl 2576; 2577; X64-LABEL: length32_lt: 2578; X64: # %bb.0: 2579; X64-NEXT: movq (%rdi), %rcx 2580; X64-NEXT: movq (%rsi), %rdx 2581; X64-NEXT: bswapq %rcx 2582; X64-NEXT: bswapq %rdx 2583; X64-NEXT: cmpq %rdx, %rcx 2584; X64-NEXT: jne .LBB51_4 2585; X64-NEXT: # %bb.1: # %loadbb1 2586; X64-NEXT: movq 8(%rdi), %rcx 2587; X64-NEXT: movq 8(%rsi), %rdx 2588; X64-NEXT: bswapq %rcx 2589; X64-NEXT: bswapq %rdx 2590; X64-NEXT: cmpq %rdx, %rcx 2591; X64-NEXT: jne .LBB51_4 2592; X64-NEXT: # %bb.2: # %loadbb2 2593; X64-NEXT: movq 16(%rdi), %rcx 2594; X64-NEXT: movq 16(%rsi), %rdx 2595; X64-NEXT: bswapq %rcx 2596; X64-NEXT: bswapq %rdx 2597; X64-NEXT: cmpq %rdx, %rcx 2598; X64-NEXT: jne .LBB51_4 2599; X64-NEXT: # %bb.3: # %loadbb3 2600; X64-NEXT: movq 24(%rdi), %rcx 2601; X64-NEXT: movq 24(%rsi), %rdx 2602; X64-NEXT: bswapq %rcx 2603; X64-NEXT: bswapq %rdx 2604; X64-NEXT: xorl %eax, %eax 2605; X64-NEXT: cmpq %rdx, %rcx 2606; X64-NEXT: je .LBB51_5 2607; X64-NEXT: .LBB51_4: # %res_block 2608; X64-NEXT: xorl %eax, %eax 2609; X64-NEXT: cmpq %rdx, %rcx 2610; X64-NEXT: setae %al 2611; X64-NEXT: leal -1(%rax,%rax), %eax 2612; X64-NEXT: .LBB51_5: # %endblock 2613; X64-NEXT: shrl $31, %eax 2614; X64-NEXT: # kill: def $al killed $al killed $eax 2615; X64-NEXT: retq 2616 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind 2617 %cmp = icmp slt i32 %call, 0 2618 ret i1 %cmp 2619} 2620 2621define i1 @length32_gt(i8* %x, i8* %y) nounwind { 2622; X86-LABEL: length32_gt: 2623; X86: # %bb.0: 2624; X86-NEXT: pushl $0 2625; X86-NEXT: pushl $32 2626; X86-NEXT: pushl {{[0-9]+}}(%esp) 2627; X86-NEXT: pushl {{[0-9]+}}(%esp) 2628; X86-NEXT: calll memcmp 2629; X86-NEXT: addl $16, %esp 2630; X86-NEXT: testl %eax, %eax 2631; X86-NEXT: setg %al 2632; X86-NEXT: retl 2633; 2634; X64-LABEL: length32_gt: 2635; X64: # %bb.0: 2636; X64-NEXT: movq (%rdi), %rax 2637; X64-NEXT: movq (%rsi), %rcx 2638; X64-NEXT: bswapq %rax 2639; X64-NEXT: bswapq %rcx 2640; X64-NEXT: cmpq %rcx, %rax 2641; X64-NEXT: jne .LBB52_4 2642; X64-NEXT: # %bb.1: # %loadbb1 2643; X64-NEXT: movq 8(%rdi), %rax 2644; X64-NEXT: movq 8(%rsi), %rcx 2645; X64-NEXT: bswapq %rax 2646; X64-NEXT: bswapq %rcx 2647; X64-NEXT: cmpq %rcx, %rax 2648; X64-NEXT: jne .LBB52_4 2649; X64-NEXT: # %bb.2: # %loadbb2 2650; X64-NEXT: movq 16(%rdi), %rax 2651; X64-NEXT: movq 16(%rsi), %rcx 2652; X64-NEXT: bswapq %rax 2653; X64-NEXT: bswapq %rcx 2654; X64-NEXT: cmpq %rcx, %rax 2655; X64-NEXT: jne .LBB52_4 2656; X64-NEXT: # %bb.3: # %loadbb3 2657; X64-NEXT: movq 24(%rdi), %rax 2658; X64-NEXT: movq 24(%rsi), %rcx 2659; X64-NEXT: bswapq %rax 2660; X64-NEXT: bswapq %rcx 2661; X64-NEXT: xorl %edx, %edx 2662; X64-NEXT: cmpq %rcx, %rax 2663; X64-NEXT: je .LBB52_5 2664; X64-NEXT: .LBB52_4: # %res_block 2665; X64-NEXT: xorl %edx, %edx 2666; X64-NEXT: cmpq %rcx, %rax 2667; X64-NEXT: setae %dl 2668; X64-NEXT: leal -1(%rdx,%rdx), %edx 2669; X64-NEXT: .LBB52_5: # %endblock 2670; X64-NEXT: testl %edx, %edx 2671; X64-NEXT: setg %al 2672; X64-NEXT: retq 2673 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind 2674 %cmp = icmp sgt i32 %call, 0 2675 ret i1 %cmp 2676} 2677 2678define i1 @length32_eq_prefer128(i8* %x, i8* %y) nounwind "prefer-vector-width"="128" { 2679; X86-NOSSE-LABEL: length32_eq_prefer128: 2680; X86-NOSSE: # %bb.0: 2681; X86-NOSSE-NEXT: pushl $0 2682; X86-NOSSE-NEXT: pushl $32 2683; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 2684; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 2685; X86-NOSSE-NEXT: calll memcmp 2686; X86-NOSSE-NEXT: addl $16, %esp 2687; X86-NOSSE-NEXT: testl %eax, %eax 2688; X86-NOSSE-NEXT: sete %al 2689; X86-NOSSE-NEXT: retl 2690; 2691; X86-SSE1-LABEL: length32_eq_prefer128: 2692; X86-SSE1: # %bb.0: 2693; X86-SSE1-NEXT: pushl $0 2694; X86-SSE1-NEXT: pushl $32 2695; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 2696; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 2697; X86-SSE1-NEXT: calll memcmp 2698; X86-SSE1-NEXT: addl $16, %esp 2699; X86-SSE1-NEXT: testl %eax, %eax 2700; X86-SSE1-NEXT: sete %al 2701; X86-SSE1-NEXT: retl 2702; 2703; X86-SSE2-LABEL: length32_eq_prefer128: 2704; X86-SSE2: # %bb.0: 2705; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 2706; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 2707; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 2708; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1 2709; X86-SSE2-NEXT: movdqu (%eax), %xmm2 2710; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 2711; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0 2712; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 2713; X86-SSE2-NEXT: pand %xmm2, %xmm0 2714; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 2715; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2716; X86-SSE2-NEXT: sete %al 2717; X86-SSE2-NEXT: retl 2718; 2719; X86-SSE41-LABEL: length32_eq_prefer128: 2720; X86-SSE41: # %bb.0: 2721; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 2722; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 2723; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 2724; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1 2725; X86-SSE41-NEXT: movdqu (%eax), %xmm2 2726; X86-SSE41-NEXT: pxor %xmm0, %xmm2 2727; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0 2728; X86-SSE41-NEXT: pxor %xmm1, %xmm0 2729; X86-SSE41-NEXT: por %xmm2, %xmm0 2730; X86-SSE41-NEXT: ptest %xmm0, %xmm0 2731; X86-SSE41-NEXT: sete %al 2732; X86-SSE41-NEXT: retl 2733; 2734; X64-SSE2-LABEL: length32_eq_prefer128: 2735; X64-SSE2: # %bb.0: 2736; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 2737; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 2738; X64-SSE2-NEXT: movdqu (%rsi), %xmm2 2739; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 2740; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0 2741; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 2742; X64-SSE2-NEXT: pand %xmm2, %xmm0 2743; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 2744; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2745; X64-SSE2-NEXT: sete %al 2746; X64-SSE2-NEXT: retq 2747; 2748; X64-SSE41-LABEL: length32_eq_prefer128: 2749; X64-SSE41: # %bb.0: 2750; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 2751; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 2752; X64-SSE41-NEXT: movdqu (%rsi), %xmm2 2753; X64-SSE41-NEXT: pxor %xmm0, %xmm2 2754; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0 2755; X64-SSE41-NEXT: pxor %xmm1, %xmm0 2756; X64-SSE41-NEXT: por %xmm2, %xmm0 2757; X64-SSE41-NEXT: ptest %xmm0, %xmm0 2758; X64-SSE41-NEXT: sete %al 2759; X64-SSE41-NEXT: retq 2760; 2761; X64-AVX-LABEL: length32_eq_prefer128: 2762; X64-AVX: # %bb.0: 2763; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 2764; X64-AVX-NEXT: vmovdqu 16(%rdi), %xmm1 2765; X64-AVX-NEXT: vpxor 16(%rsi), %xmm1, %xmm1 2766; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 2767; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 2768; X64-AVX-NEXT: vptest %xmm0, %xmm0 2769; X64-AVX-NEXT: sete %al 2770; X64-AVX-NEXT: retq 2771; 2772; X64-MIC-AVX-LABEL: length32_eq_prefer128: 2773; X64-MIC-AVX: # %bb.0: 2774; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 2775; X64-MIC-AVX-NEXT: vmovdqu 16(%rdi), %xmm1 2776; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm2 2777; X64-MIC-AVX-NEXT: vmovdqu 16(%rsi), %xmm3 2778; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 2779; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 2780; X64-MIC-AVX-NEXT: kortestw %k0, %k1 2781; X64-MIC-AVX-NEXT: sete %al 2782; X64-MIC-AVX-NEXT: vzeroupper 2783; X64-MIC-AVX-NEXT: retq 2784 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 32) nounwind 2785 %cmp = icmp eq i32 %call, 0 2786 ret i1 %cmp 2787} 2788 2789define i1 @length32_eq_const(i8* %X) nounwind { 2790; X86-NOSSE-LABEL: length32_eq_const: 2791; X86-NOSSE: # %bb.0: 2792; X86-NOSSE-NEXT: pushl $0 2793; X86-NOSSE-NEXT: pushl $32 2794; X86-NOSSE-NEXT: pushl $.L.str 2795; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 2796; X86-NOSSE-NEXT: calll memcmp 2797; X86-NOSSE-NEXT: addl $16, %esp 2798; X86-NOSSE-NEXT: testl %eax, %eax 2799; X86-NOSSE-NEXT: setne %al 2800; X86-NOSSE-NEXT: retl 2801; 2802; X86-SSE1-LABEL: length32_eq_const: 2803; X86-SSE1: # %bb.0: 2804; X86-SSE1-NEXT: pushl $0 2805; X86-SSE1-NEXT: pushl $32 2806; X86-SSE1-NEXT: pushl $.L.str 2807; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 2808; X86-SSE1-NEXT: calll memcmp 2809; X86-SSE1-NEXT: addl $16, %esp 2810; X86-SSE1-NEXT: testl %eax, %eax 2811; X86-SSE1-NEXT: setne %al 2812; X86-SSE1-NEXT: retl 2813; 2814; X86-SSE2-LABEL: length32_eq_const: 2815; X86-SSE2: # %bb.0: 2816; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 2817; X86-SSE2-NEXT: movdqu (%eax), %xmm0 2818; X86-SSE2-NEXT: movdqu 16(%eax), %xmm1 2819; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 2820; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 2821; X86-SSE2-NEXT: pand %xmm1, %xmm0 2822; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 2823; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2824; X86-SSE2-NEXT: setne %al 2825; X86-SSE2-NEXT: retl 2826; 2827; X86-SSE41-LABEL: length32_eq_const: 2828; X86-SSE41: # %bb.0: 2829; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 2830; X86-SSE41-NEXT: movdqu (%eax), %xmm0 2831; X86-SSE41-NEXT: movdqu 16(%eax), %xmm1 2832; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 2833; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 2834; X86-SSE41-NEXT: por %xmm1, %xmm0 2835; X86-SSE41-NEXT: ptest %xmm0, %xmm0 2836; X86-SSE41-NEXT: setne %al 2837; X86-SSE41-NEXT: retl 2838; 2839; X64-SSE2-LABEL: length32_eq_const: 2840; X64-SSE2: # %bb.0: 2841; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 2842; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 2843; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 2844; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 2845; X64-SSE2-NEXT: pand %xmm1, %xmm0 2846; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 2847; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2848; X64-SSE2-NEXT: setne %al 2849; X64-SSE2-NEXT: retq 2850; 2851; X64-SSE41-LABEL: length32_eq_const: 2852; X64-SSE41: # %bb.0: 2853; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 2854; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 2855; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 2856; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 2857; X64-SSE41-NEXT: por %xmm1, %xmm0 2858; X64-SSE41-NEXT: ptest %xmm0, %xmm0 2859; X64-SSE41-NEXT: setne %al 2860; X64-SSE41-NEXT: retq 2861; 2862; X64-AVX1-LABEL: length32_eq_const: 2863; X64-AVX1: # %bb.0: 2864; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 2865; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 2866; X64-AVX1-NEXT: vptest %ymm0, %ymm0 2867; X64-AVX1-NEXT: setne %al 2868; X64-AVX1-NEXT: vzeroupper 2869; X64-AVX1-NEXT: retq 2870; 2871; X64-AVX2-LABEL: length32_eq_const: 2872; X64-AVX2: # %bb.0: 2873; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 2874; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 2875; X64-AVX2-NEXT: vptest %ymm0, %ymm0 2876; X64-AVX2-NEXT: setne %al 2877; X64-AVX2-NEXT: vzeroupper 2878; X64-AVX2-NEXT: retq 2879; 2880; X64-AVX512-LABEL: length32_eq_const: 2881; X64-AVX512: # %bb.0: 2882; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 2883; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 2884; X64-AVX512-NEXT: vptest %ymm0, %ymm0 2885; X64-AVX512-NEXT: setne %al 2886; X64-AVX512-NEXT: vzeroupper 2887; X64-AVX512-NEXT: retq 2888; 2889; X64-MIC-AVX-LABEL: length32_eq_const: 2890; X64-MIC-AVX: # %bb.0: 2891; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 2892; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 2893; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 2894; X64-MIC-AVX-NEXT: kortestw %k0, %k0 2895; X64-MIC-AVX-NEXT: setne %al 2896; X64-MIC-AVX-NEXT: vzeroupper 2897; X64-MIC-AVX-NEXT: retq 2898 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 32) nounwind 2899 %c = icmp ne i32 %m, 0 2900 ret i1 %c 2901} 2902 2903define i32 @length48(i8* %X, i8* %Y) nounwind { 2904; X86-LABEL: length48: 2905; X86: # %bb.0: 2906; X86-NEXT: pushl $0 2907; X86-NEXT: pushl $48 2908; X86-NEXT: pushl {{[0-9]+}}(%esp) 2909; X86-NEXT: pushl {{[0-9]+}}(%esp) 2910; X86-NEXT: calll memcmp 2911; X86-NEXT: addl $16, %esp 2912; X86-NEXT: retl 2913; 2914; X64-LABEL: length48: 2915; X64: # %bb.0: 2916; X64-NEXT: movl $48, %edx 2917; X64-NEXT: jmp memcmp # TAILCALL 2918 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 48) nounwind 2919 ret i32 %m 2920} 2921 2922define i1 @length48_eq(i8* %x, i8* %y) nounwind { 2923; X86-NOSSE-LABEL: length48_eq: 2924; X86-NOSSE: # %bb.0: 2925; X86-NOSSE-NEXT: pushl $0 2926; X86-NOSSE-NEXT: pushl $48 2927; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 2928; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 2929; X86-NOSSE-NEXT: calll memcmp 2930; X86-NOSSE-NEXT: addl $16, %esp 2931; X86-NOSSE-NEXT: testl %eax, %eax 2932; X86-NOSSE-NEXT: sete %al 2933; X86-NOSSE-NEXT: retl 2934; 2935; X86-SSE1-LABEL: length48_eq: 2936; X86-SSE1: # %bb.0: 2937; X86-SSE1-NEXT: pushl $0 2938; X86-SSE1-NEXT: pushl $48 2939; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 2940; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 2941; X86-SSE1-NEXT: calll memcmp 2942; X86-SSE1-NEXT: addl $16, %esp 2943; X86-SSE1-NEXT: testl %eax, %eax 2944; X86-SSE1-NEXT: sete %al 2945; X86-SSE1-NEXT: retl 2946; 2947; X86-SSE2-LABEL: length48_eq: 2948; X86-SSE2: # %bb.0: 2949; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 2950; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 2951; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 2952; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1 2953; X86-SSE2-NEXT: movdqu (%eax), %xmm2 2954; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 2955; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0 2956; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 2957; X86-SSE2-NEXT: movdqu 32(%ecx), %xmm1 2958; X86-SSE2-NEXT: movdqu 32(%eax), %xmm3 2959; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm3 2960; X86-SSE2-NEXT: pand %xmm0, %xmm3 2961; X86-SSE2-NEXT: pand %xmm2, %xmm3 2962; X86-SSE2-NEXT: pmovmskb %xmm3, %eax 2963; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 2964; X86-SSE2-NEXT: sete %al 2965; X86-SSE2-NEXT: retl 2966; 2967; X86-SSE41-LABEL: length48_eq: 2968; X86-SSE41: # %bb.0: 2969; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 2970; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 2971; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 2972; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1 2973; X86-SSE41-NEXT: movdqu (%eax), %xmm2 2974; X86-SSE41-NEXT: pxor %xmm0, %xmm2 2975; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0 2976; X86-SSE41-NEXT: pxor %xmm1, %xmm0 2977; X86-SSE41-NEXT: movdqu 32(%ecx), %xmm1 2978; X86-SSE41-NEXT: movdqu 32(%eax), %xmm3 2979; X86-SSE41-NEXT: pxor %xmm1, %xmm3 2980; X86-SSE41-NEXT: por %xmm0, %xmm3 2981; X86-SSE41-NEXT: por %xmm2, %xmm3 2982; X86-SSE41-NEXT: ptest %xmm3, %xmm3 2983; X86-SSE41-NEXT: sete %al 2984; X86-SSE41-NEXT: retl 2985; 2986; X64-SSE2-LABEL: length48_eq: 2987; X64-SSE2: # %bb.0: 2988; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 2989; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 2990; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm2 2991; X64-SSE2-NEXT: movdqu (%rsi), %xmm3 2992; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm3 2993; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0 2994; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 2995; X64-SSE2-NEXT: movdqu 32(%rsi), %xmm1 2996; X64-SSE2-NEXT: pcmpeqb %xmm2, %xmm1 2997; X64-SSE2-NEXT: pand %xmm0, %xmm1 2998; X64-SSE2-NEXT: pand %xmm3, %xmm1 2999; X64-SSE2-NEXT: pmovmskb %xmm1, %eax 3000; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 3001; X64-SSE2-NEXT: sete %al 3002; X64-SSE2-NEXT: retq 3003; 3004; X64-SSE41-LABEL: length48_eq: 3005; X64-SSE41: # %bb.0: 3006; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 3007; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 3008; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm2 3009; X64-SSE41-NEXT: movdqu (%rsi), %xmm3 3010; X64-SSE41-NEXT: pxor %xmm0, %xmm3 3011; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0 3012; X64-SSE41-NEXT: pxor %xmm1, %xmm0 3013; X64-SSE41-NEXT: movdqu 32(%rsi), %xmm1 3014; X64-SSE41-NEXT: pxor %xmm2, %xmm1 3015; X64-SSE41-NEXT: por %xmm0, %xmm1 3016; X64-SSE41-NEXT: por %xmm3, %xmm1 3017; X64-SSE41-NEXT: ptest %xmm1, %xmm1 3018; X64-SSE41-NEXT: sete %al 3019; X64-SSE41-NEXT: retq 3020; 3021; X64-AVX1-LABEL: length48_eq: 3022; X64-AVX1: # %bb.0: 3023; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 3024; X64-AVX1-NEXT: vmovups 32(%rdi), %xmm1 3025; X64-AVX1-NEXT: vmovups 32(%rsi), %xmm2 3026; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 3027; X64-AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1 3028; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 3029; X64-AVX1-NEXT: vptest %ymm0, %ymm0 3030; X64-AVX1-NEXT: sete %al 3031; X64-AVX1-NEXT: vzeroupper 3032; X64-AVX1-NEXT: retq 3033; 3034; X64-AVX2-LABEL: length48_eq: 3035; X64-AVX2: # %bb.0: 3036; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 3037; X64-AVX2-NEXT: vmovdqu 32(%rdi), %xmm1 3038; X64-AVX2-NEXT: vmovdqu 32(%rsi), %xmm2 3039; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 3040; X64-AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 3041; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 3042; X64-AVX2-NEXT: vptest %ymm0, %ymm0 3043; X64-AVX2-NEXT: sete %al 3044; X64-AVX2-NEXT: vzeroupper 3045; X64-AVX2-NEXT: retq 3046; 3047; X64-AVX512-LABEL: length48_eq: 3048; X64-AVX512: # %bb.0: 3049; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 3050; X64-AVX512-NEXT: vmovdqu 32(%rdi), %xmm1 3051; X64-AVX512-NEXT: vmovdqu 32(%rsi), %xmm2 3052; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0 3053; X64-AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm1 3054; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 3055; X64-AVX512-NEXT: vptest %ymm0, %ymm0 3056; X64-AVX512-NEXT: sete %al 3057; X64-AVX512-NEXT: vzeroupper 3058; X64-AVX512-NEXT: retq 3059; 3060; X64-MIC-AVX-LABEL: length48_eq: 3061; X64-MIC-AVX: # %bb.0: 3062; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 3063; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm1 3064; X64-MIC-AVX-NEXT: vmovdqu 32(%rdi), %xmm2 3065; X64-MIC-AVX-NEXT: vmovdqu 32(%rsi), %xmm3 3066; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm2, %k0 3067; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 3068; X64-MIC-AVX-NEXT: kortestw %k0, %k1 3069; X64-MIC-AVX-NEXT: sete %al 3070; X64-MIC-AVX-NEXT: vzeroupper 3071; X64-MIC-AVX-NEXT: retq 3072 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind 3073 %cmp = icmp eq i32 %call, 0 3074 ret i1 %cmp 3075} 3076 3077define i1 @length48_lt(i8* %x, i8* %y) nounwind { 3078; X86-LABEL: length48_lt: 3079; X86: # %bb.0: 3080; X86-NEXT: pushl $0 3081; X86-NEXT: pushl $48 3082; X86-NEXT: pushl {{[0-9]+}}(%esp) 3083; X86-NEXT: pushl {{[0-9]+}}(%esp) 3084; X86-NEXT: calll memcmp 3085; X86-NEXT: addl $16, %esp 3086; X86-NEXT: shrl $31, %eax 3087; X86-NEXT: # kill: def $al killed $al killed $eax 3088; X86-NEXT: retl 3089; 3090; X64-LABEL: length48_lt: 3091; X64: # %bb.0: 3092; X64-NEXT: pushq %rax 3093; X64-NEXT: movl $48, %edx 3094; X64-NEXT: callq memcmp 3095; X64-NEXT: shrl $31, %eax 3096; X64-NEXT: # kill: def $al killed $al killed $eax 3097; X64-NEXT: popq %rcx 3098; X64-NEXT: retq 3099 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind 3100 %cmp = icmp slt i32 %call, 0 3101 ret i1 %cmp 3102} 3103 3104define i1 @length48_gt(i8* %x, i8* %y) nounwind { 3105; X86-LABEL: length48_gt: 3106; X86: # %bb.0: 3107; X86-NEXT: pushl $0 3108; X86-NEXT: pushl $48 3109; X86-NEXT: pushl {{[0-9]+}}(%esp) 3110; X86-NEXT: pushl {{[0-9]+}}(%esp) 3111; X86-NEXT: calll memcmp 3112; X86-NEXT: addl $16, %esp 3113; X86-NEXT: testl %eax, %eax 3114; X86-NEXT: setg %al 3115; X86-NEXT: retl 3116; 3117; X64-LABEL: length48_gt: 3118; X64: # %bb.0: 3119; X64-NEXT: pushq %rax 3120; X64-NEXT: movl $48, %edx 3121; X64-NEXT: callq memcmp 3122; X64-NEXT: testl %eax, %eax 3123; X64-NEXT: setg %al 3124; X64-NEXT: popq %rcx 3125; X64-NEXT: retq 3126 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind 3127 %cmp = icmp sgt i32 %call, 0 3128 ret i1 %cmp 3129} 3130 3131define i1 @length48_eq_prefer128(i8* %x, i8* %y) nounwind "prefer-vector-width"="128" { 3132; X86-NOSSE-LABEL: length48_eq_prefer128: 3133; X86-NOSSE: # %bb.0: 3134; X86-NOSSE-NEXT: pushl $0 3135; X86-NOSSE-NEXT: pushl $48 3136; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 3137; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 3138; X86-NOSSE-NEXT: calll memcmp 3139; X86-NOSSE-NEXT: addl $16, %esp 3140; X86-NOSSE-NEXT: testl %eax, %eax 3141; X86-NOSSE-NEXT: sete %al 3142; X86-NOSSE-NEXT: retl 3143; 3144; X86-SSE1-LABEL: length48_eq_prefer128: 3145; X86-SSE1: # %bb.0: 3146; X86-SSE1-NEXT: pushl $0 3147; X86-SSE1-NEXT: pushl $48 3148; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 3149; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 3150; X86-SSE1-NEXT: calll memcmp 3151; X86-SSE1-NEXT: addl $16, %esp 3152; X86-SSE1-NEXT: testl %eax, %eax 3153; X86-SSE1-NEXT: sete %al 3154; X86-SSE1-NEXT: retl 3155; 3156; X86-SSE2-LABEL: length48_eq_prefer128: 3157; X86-SSE2: # %bb.0: 3158; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 3159; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 3160; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 3161; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1 3162; X86-SSE2-NEXT: movdqu (%eax), %xmm2 3163; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 3164; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0 3165; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 3166; X86-SSE2-NEXT: movdqu 32(%ecx), %xmm1 3167; X86-SSE2-NEXT: movdqu 32(%eax), %xmm3 3168; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm3 3169; X86-SSE2-NEXT: pand %xmm0, %xmm3 3170; X86-SSE2-NEXT: pand %xmm2, %xmm3 3171; X86-SSE2-NEXT: pmovmskb %xmm3, %eax 3172; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 3173; X86-SSE2-NEXT: sete %al 3174; X86-SSE2-NEXT: retl 3175; 3176; X86-SSE41-LABEL: length48_eq_prefer128: 3177; X86-SSE41: # %bb.0: 3178; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 3179; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 3180; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 3181; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1 3182; X86-SSE41-NEXT: movdqu (%eax), %xmm2 3183; X86-SSE41-NEXT: pxor %xmm0, %xmm2 3184; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0 3185; X86-SSE41-NEXT: pxor %xmm1, %xmm0 3186; X86-SSE41-NEXT: movdqu 32(%ecx), %xmm1 3187; X86-SSE41-NEXT: movdqu 32(%eax), %xmm3 3188; X86-SSE41-NEXT: pxor %xmm1, %xmm3 3189; X86-SSE41-NEXT: por %xmm0, %xmm3 3190; X86-SSE41-NEXT: por %xmm2, %xmm3 3191; X86-SSE41-NEXT: ptest %xmm3, %xmm3 3192; X86-SSE41-NEXT: sete %al 3193; X86-SSE41-NEXT: retl 3194; 3195; X64-SSE2-LABEL: length48_eq_prefer128: 3196; X64-SSE2: # %bb.0: 3197; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 3198; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 3199; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm2 3200; X64-SSE2-NEXT: movdqu (%rsi), %xmm3 3201; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm3 3202; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0 3203; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 3204; X64-SSE2-NEXT: movdqu 32(%rsi), %xmm1 3205; X64-SSE2-NEXT: pcmpeqb %xmm2, %xmm1 3206; X64-SSE2-NEXT: pand %xmm0, %xmm1 3207; X64-SSE2-NEXT: pand %xmm3, %xmm1 3208; X64-SSE2-NEXT: pmovmskb %xmm1, %eax 3209; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 3210; X64-SSE2-NEXT: sete %al 3211; X64-SSE2-NEXT: retq 3212; 3213; X64-SSE41-LABEL: length48_eq_prefer128: 3214; X64-SSE41: # %bb.0: 3215; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 3216; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 3217; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm2 3218; X64-SSE41-NEXT: movdqu (%rsi), %xmm3 3219; X64-SSE41-NEXT: pxor %xmm0, %xmm3 3220; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0 3221; X64-SSE41-NEXT: pxor %xmm1, %xmm0 3222; X64-SSE41-NEXT: movdqu 32(%rsi), %xmm1 3223; X64-SSE41-NEXT: pxor %xmm2, %xmm1 3224; X64-SSE41-NEXT: por %xmm0, %xmm1 3225; X64-SSE41-NEXT: por %xmm3, %xmm1 3226; X64-SSE41-NEXT: ptest %xmm1, %xmm1 3227; X64-SSE41-NEXT: sete %al 3228; X64-SSE41-NEXT: retq 3229; 3230; X64-AVX-LABEL: length48_eq_prefer128: 3231; X64-AVX: # %bb.0: 3232; X64-AVX-NEXT: vmovdqu (%rdi), %xmm0 3233; X64-AVX-NEXT: vmovdqu 16(%rdi), %xmm1 3234; X64-AVX-NEXT: vmovdqu 32(%rdi), %xmm2 3235; X64-AVX-NEXT: vpxor 16(%rsi), %xmm1, %xmm1 3236; X64-AVX-NEXT: vpxor (%rsi), %xmm0, %xmm0 3237; X64-AVX-NEXT: vpxor 32(%rsi), %xmm2, %xmm2 3238; X64-AVX-NEXT: vpor %xmm2, %xmm1, %xmm1 3239; X64-AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 3240; X64-AVX-NEXT: vptest %xmm0, %xmm0 3241; X64-AVX-NEXT: sete %al 3242; X64-AVX-NEXT: retq 3243; 3244; X64-MIC-AVX-LABEL: length48_eq_prefer128: 3245; X64-MIC-AVX: # %bb.0: 3246; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %xmm0 3247; X64-MIC-AVX-NEXT: vmovdqu 16(%rdi), %xmm1 3248; X64-MIC-AVX-NEXT: vmovdqu 32(%rdi), %xmm2 3249; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %xmm3 3250; X64-MIC-AVX-NEXT: vmovdqu 16(%rsi), %xmm4 3251; X64-MIC-AVX-NEXT: vmovdqu 32(%rsi), %xmm5 3252; X64-MIC-AVX-NEXT: vpcmpneqd %zmm4, %zmm1, %k0 3253; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm0, %k1 3254; X64-MIC-AVX-NEXT: korw %k0, %k1, %k0 3255; X64-MIC-AVX-NEXT: vpcmpneqd %zmm5, %zmm2, %k1 3256; X64-MIC-AVX-NEXT: kortestw %k1, %k0 3257; X64-MIC-AVX-NEXT: sete %al 3258; X64-MIC-AVX-NEXT: vzeroupper 3259; X64-MIC-AVX-NEXT: retq 3260 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 48) nounwind 3261 %cmp = icmp eq i32 %call, 0 3262 ret i1 %cmp 3263} 3264 3265define i1 @length48_eq_const(i8* %X) nounwind { 3266; X86-NOSSE-LABEL: length48_eq_const: 3267; X86-NOSSE: # %bb.0: 3268; X86-NOSSE-NEXT: pushl $0 3269; X86-NOSSE-NEXT: pushl $48 3270; X86-NOSSE-NEXT: pushl $.L.str 3271; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 3272; X86-NOSSE-NEXT: calll memcmp 3273; X86-NOSSE-NEXT: addl $16, %esp 3274; X86-NOSSE-NEXT: testl %eax, %eax 3275; X86-NOSSE-NEXT: setne %al 3276; X86-NOSSE-NEXT: retl 3277; 3278; X86-SSE1-LABEL: length48_eq_const: 3279; X86-SSE1: # %bb.0: 3280; X86-SSE1-NEXT: pushl $0 3281; X86-SSE1-NEXT: pushl $48 3282; X86-SSE1-NEXT: pushl $.L.str 3283; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 3284; X86-SSE1-NEXT: calll memcmp 3285; X86-SSE1-NEXT: addl $16, %esp 3286; X86-SSE1-NEXT: testl %eax, %eax 3287; X86-SSE1-NEXT: setne %al 3288; X86-SSE1-NEXT: retl 3289; 3290; X86-SSE2-LABEL: length48_eq_const: 3291; X86-SSE2: # %bb.0: 3292; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 3293; X86-SSE2-NEXT: movdqu (%eax), %xmm0 3294; X86-SSE2-NEXT: movdqu 16(%eax), %xmm1 3295; X86-SSE2-NEXT: movdqu 32(%eax), %xmm2 3296; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 3297; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 3298; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2 3299; X86-SSE2-NEXT: pand %xmm1, %xmm2 3300; X86-SSE2-NEXT: pand %xmm0, %xmm2 3301; X86-SSE2-NEXT: pmovmskb %xmm2, %eax 3302; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 3303; X86-SSE2-NEXT: setne %al 3304; X86-SSE2-NEXT: retl 3305; 3306; X86-SSE41-LABEL: length48_eq_const: 3307; X86-SSE41: # %bb.0: 3308; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 3309; X86-SSE41-NEXT: movdqu (%eax), %xmm0 3310; X86-SSE41-NEXT: movdqu 16(%eax), %xmm1 3311; X86-SSE41-NEXT: movdqu 32(%eax), %xmm2 3312; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 3313; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 3314; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2 3315; X86-SSE41-NEXT: por %xmm1, %xmm2 3316; X86-SSE41-NEXT: por %xmm0, %xmm2 3317; X86-SSE41-NEXT: ptest %xmm2, %xmm2 3318; X86-SSE41-NEXT: setne %al 3319; X86-SSE41-NEXT: retl 3320; 3321; X64-SSE2-LABEL: length48_eq_const: 3322; X64-SSE2: # %bb.0: 3323; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 3324; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 3325; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm2 3326; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 3327; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 3328; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 3329; X64-SSE2-NEXT: pand %xmm1, %xmm2 3330; X64-SSE2-NEXT: pand %xmm0, %xmm2 3331; X64-SSE2-NEXT: pmovmskb %xmm2, %eax 3332; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 3333; X64-SSE2-NEXT: setne %al 3334; X64-SSE2-NEXT: retq 3335; 3336; X64-SSE41-LABEL: length48_eq_const: 3337; X64-SSE41: # %bb.0: 3338; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 3339; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 3340; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm2 3341; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 3342; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 3343; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 3344; X64-SSE41-NEXT: por %xmm1, %xmm2 3345; X64-SSE41-NEXT: por %xmm0, %xmm2 3346; X64-SSE41-NEXT: ptest %xmm2, %xmm2 3347; X64-SSE41-NEXT: setne %al 3348; X64-SSE41-NEXT: retq 3349; 3350; X64-AVX1-LABEL: length48_eq_const: 3351; X64-AVX1: # %bb.0: 3352; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 3353; X64-AVX1-NEXT: vmovups 32(%rdi), %xmm1 3354; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 3355; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 3356; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 3357; X64-AVX1-NEXT: vptest %ymm0, %ymm0 3358; X64-AVX1-NEXT: setne %al 3359; X64-AVX1-NEXT: vzeroupper 3360; X64-AVX1-NEXT: retq 3361; 3362; X64-AVX2-LABEL: length48_eq_const: 3363; X64-AVX2: # %bb.0: 3364; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 3365; X64-AVX2-NEXT: vmovdqu 32(%rdi), %xmm1 3366; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 3367; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 3368; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 3369; X64-AVX2-NEXT: vptest %ymm0, %ymm0 3370; X64-AVX2-NEXT: setne %al 3371; X64-AVX2-NEXT: vzeroupper 3372; X64-AVX2-NEXT: retq 3373; 3374; X64-AVX512-LABEL: length48_eq_const: 3375; X64-AVX512: # %bb.0: 3376; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 3377; X64-AVX512-NEXT: vmovdqu 32(%rdi), %xmm1 3378; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 3379; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 3380; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 3381; X64-AVX512-NEXT: vptest %ymm0, %ymm0 3382; X64-AVX512-NEXT: setne %al 3383; X64-AVX512-NEXT: vzeroupper 3384; X64-AVX512-NEXT: retq 3385; 3386; X64-MIC-AVX-LABEL: length48_eq_const: 3387; X64-MIC-AVX: # %bb.0: 3388; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 3389; X64-MIC-AVX-NEXT: vmovdqu 32(%rdi), %xmm1 3390; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,0,0,0,0] 3391; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 3392; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 3393; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 3394; X64-MIC-AVX-NEXT: kortestw %k0, %k1 3395; X64-MIC-AVX-NEXT: setne %al 3396; X64-MIC-AVX-NEXT: vzeroupper 3397; X64-MIC-AVX-NEXT: retq 3398 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 48) nounwind 3399 %c = icmp ne i32 %m, 0 3400 ret i1 %c 3401} 3402 3403define i32 @length63(i8* %X, i8* %Y) nounwind { 3404; X86-LABEL: length63: 3405; X86: # %bb.0: 3406; X86-NEXT: pushl $0 3407; X86-NEXT: pushl $63 3408; X86-NEXT: pushl {{[0-9]+}}(%esp) 3409; X86-NEXT: pushl {{[0-9]+}}(%esp) 3410; X86-NEXT: calll memcmp 3411; X86-NEXT: addl $16, %esp 3412; X86-NEXT: retl 3413; 3414; X64-LABEL: length63: 3415; X64: # %bb.0: 3416; X64-NEXT: movl $63, %edx 3417; X64-NEXT: jmp memcmp # TAILCALL 3418 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 63) nounwind 3419 ret i32 %m 3420} 3421 3422define i1 @length63_eq(i8* %x, i8* %y) nounwind { 3423; X86-NOSSE-LABEL: length63_eq: 3424; X86-NOSSE: # %bb.0: 3425; X86-NOSSE-NEXT: pushl $0 3426; X86-NOSSE-NEXT: pushl $63 3427; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 3428; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 3429; X86-NOSSE-NEXT: calll memcmp 3430; X86-NOSSE-NEXT: addl $16, %esp 3431; X86-NOSSE-NEXT: testl %eax, %eax 3432; X86-NOSSE-NEXT: setne %al 3433; X86-NOSSE-NEXT: retl 3434; 3435; X86-SSE1-LABEL: length63_eq: 3436; X86-SSE1: # %bb.0: 3437; X86-SSE1-NEXT: pushl $0 3438; X86-SSE1-NEXT: pushl $63 3439; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 3440; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 3441; X86-SSE1-NEXT: calll memcmp 3442; X86-SSE1-NEXT: addl $16, %esp 3443; X86-SSE1-NEXT: testl %eax, %eax 3444; X86-SSE1-NEXT: setne %al 3445; X86-SSE1-NEXT: retl 3446; 3447; X86-SSE2-LABEL: length63_eq: 3448; X86-SSE2: # %bb.0: 3449; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 3450; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 3451; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 3452; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1 3453; X86-SSE2-NEXT: movdqu (%eax), %xmm2 3454; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 3455; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0 3456; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 3457; X86-SSE2-NEXT: movdqu 32(%ecx), %xmm1 3458; X86-SSE2-NEXT: movdqu 32(%eax), %xmm3 3459; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm3 3460; X86-SSE2-NEXT: movdqu 47(%ecx), %xmm1 3461; X86-SSE2-NEXT: movdqu 47(%eax), %xmm4 3462; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm4 3463; X86-SSE2-NEXT: pand %xmm3, %xmm4 3464; X86-SSE2-NEXT: pand %xmm0, %xmm4 3465; X86-SSE2-NEXT: pand %xmm2, %xmm4 3466; X86-SSE2-NEXT: pmovmskb %xmm4, %eax 3467; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 3468; X86-SSE2-NEXT: setne %al 3469; X86-SSE2-NEXT: retl 3470; 3471; X86-SSE41-LABEL: length63_eq: 3472; X86-SSE41: # %bb.0: 3473; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 3474; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 3475; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 3476; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1 3477; X86-SSE41-NEXT: movdqu (%eax), %xmm2 3478; X86-SSE41-NEXT: pxor %xmm0, %xmm2 3479; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0 3480; X86-SSE41-NEXT: pxor %xmm1, %xmm0 3481; X86-SSE41-NEXT: movdqu 32(%ecx), %xmm1 3482; X86-SSE41-NEXT: movdqu 32(%eax), %xmm3 3483; X86-SSE41-NEXT: pxor %xmm1, %xmm3 3484; X86-SSE41-NEXT: movdqu 47(%ecx), %xmm1 3485; X86-SSE41-NEXT: movdqu 47(%eax), %xmm4 3486; X86-SSE41-NEXT: pxor %xmm1, %xmm4 3487; X86-SSE41-NEXT: por %xmm3, %xmm4 3488; X86-SSE41-NEXT: por %xmm0, %xmm4 3489; X86-SSE41-NEXT: por %xmm2, %xmm4 3490; X86-SSE41-NEXT: ptest %xmm4, %xmm4 3491; X86-SSE41-NEXT: setne %al 3492; X86-SSE41-NEXT: retl 3493; 3494; X64-SSE2-LABEL: length63_eq: 3495; X64-SSE2: # %bb.0: 3496; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 3497; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 3498; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm2 3499; X64-SSE2-NEXT: movdqu 47(%rdi), %xmm3 3500; X64-SSE2-NEXT: movdqu (%rsi), %xmm4 3501; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm4 3502; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0 3503; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 3504; X64-SSE2-NEXT: movdqu 32(%rsi), %xmm1 3505; X64-SSE2-NEXT: pcmpeqb %xmm2, %xmm1 3506; X64-SSE2-NEXT: movdqu 47(%rsi), %xmm2 3507; X64-SSE2-NEXT: pcmpeqb %xmm3, %xmm2 3508; X64-SSE2-NEXT: pand %xmm1, %xmm2 3509; X64-SSE2-NEXT: pand %xmm0, %xmm2 3510; X64-SSE2-NEXT: pand %xmm4, %xmm2 3511; X64-SSE2-NEXT: pmovmskb %xmm2, %eax 3512; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 3513; X64-SSE2-NEXT: setne %al 3514; X64-SSE2-NEXT: retq 3515; 3516; X64-SSE41-LABEL: length63_eq: 3517; X64-SSE41: # %bb.0: 3518; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 3519; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 3520; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm2 3521; X64-SSE41-NEXT: movdqu 47(%rdi), %xmm3 3522; X64-SSE41-NEXT: movdqu (%rsi), %xmm4 3523; X64-SSE41-NEXT: pxor %xmm0, %xmm4 3524; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0 3525; X64-SSE41-NEXT: pxor %xmm1, %xmm0 3526; X64-SSE41-NEXT: movdqu 32(%rsi), %xmm1 3527; X64-SSE41-NEXT: pxor %xmm2, %xmm1 3528; X64-SSE41-NEXT: movdqu 47(%rsi), %xmm2 3529; X64-SSE41-NEXT: pxor %xmm3, %xmm2 3530; X64-SSE41-NEXT: por %xmm1, %xmm2 3531; X64-SSE41-NEXT: por %xmm0, %xmm2 3532; X64-SSE41-NEXT: por %xmm4, %xmm2 3533; X64-SSE41-NEXT: ptest %xmm2, %xmm2 3534; X64-SSE41-NEXT: setne %al 3535; X64-SSE41-NEXT: retq 3536; 3537; X64-AVX1-LABEL: length63_eq: 3538; X64-AVX1: # %bb.0: 3539; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 3540; X64-AVX1-NEXT: vmovups 31(%rdi), %ymm1 3541; X64-AVX1-NEXT: vxorps 31(%rsi), %ymm1, %ymm1 3542; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 3543; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 3544; X64-AVX1-NEXT: vptest %ymm0, %ymm0 3545; X64-AVX1-NEXT: setne %al 3546; X64-AVX1-NEXT: vzeroupper 3547; X64-AVX1-NEXT: retq 3548; 3549; X64-AVX2-LABEL: length63_eq: 3550; X64-AVX2: # %bb.0: 3551; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 3552; X64-AVX2-NEXT: vmovdqu 31(%rdi), %ymm1 3553; X64-AVX2-NEXT: vpxor 31(%rsi), %ymm1, %ymm1 3554; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 3555; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 3556; X64-AVX2-NEXT: vptest %ymm0, %ymm0 3557; X64-AVX2-NEXT: setne %al 3558; X64-AVX2-NEXT: vzeroupper 3559; X64-AVX2-NEXT: retq 3560; 3561; X64-AVX512-LABEL: length63_eq: 3562; X64-AVX512: # %bb.0: 3563; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 3564; X64-AVX512-NEXT: vmovdqu 31(%rdi), %ymm1 3565; X64-AVX512-NEXT: vpxor 31(%rsi), %ymm1, %ymm1 3566; X64-AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0 3567; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 3568; X64-AVX512-NEXT: vptest %ymm0, %ymm0 3569; X64-AVX512-NEXT: setne %al 3570; X64-AVX512-NEXT: vzeroupper 3571; X64-AVX512-NEXT: retq 3572; 3573; X64-MIC-AVX-LABEL: length63_eq: 3574; X64-MIC-AVX: # %bb.0: 3575; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 3576; X64-MIC-AVX-NEXT: vmovdqu 31(%rdi), %ymm1 3577; X64-MIC-AVX-NEXT: vmovdqu (%rsi), %ymm2 3578; X64-MIC-AVX-NEXT: vmovdqu 31(%rsi), %ymm3 3579; X64-MIC-AVX-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 3580; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 3581; X64-MIC-AVX-NEXT: kortestw %k0, %k1 3582; X64-MIC-AVX-NEXT: setne %al 3583; X64-MIC-AVX-NEXT: vzeroupper 3584; X64-MIC-AVX-NEXT: retq 3585 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 63) nounwind 3586 %cmp = icmp ne i32 %call, 0 3587 ret i1 %cmp 3588} 3589 3590define i1 @length63_lt(i8* %x, i8* %y) nounwind { 3591; X86-LABEL: length63_lt: 3592; X86: # %bb.0: 3593; X86-NEXT: pushl $0 3594; X86-NEXT: pushl $63 3595; X86-NEXT: pushl {{[0-9]+}}(%esp) 3596; X86-NEXT: pushl {{[0-9]+}}(%esp) 3597; X86-NEXT: calll memcmp 3598; X86-NEXT: addl $16, %esp 3599; X86-NEXT: shrl $31, %eax 3600; X86-NEXT: # kill: def $al killed $al killed $eax 3601; X86-NEXT: retl 3602; 3603; X64-LABEL: length63_lt: 3604; X64: # %bb.0: 3605; X64-NEXT: pushq %rax 3606; X64-NEXT: movl $63, %edx 3607; X64-NEXT: callq memcmp 3608; X64-NEXT: shrl $31, %eax 3609; X64-NEXT: # kill: def $al killed $al killed $eax 3610; X64-NEXT: popq %rcx 3611; X64-NEXT: retq 3612 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 63) nounwind 3613 %cmp = icmp slt i32 %call, 0 3614 ret i1 %cmp 3615} 3616 3617define i1 @length63_gt(i8* %x, i8* %y) nounwind { 3618; X86-LABEL: length63_gt: 3619; X86: # %bb.0: 3620; X86-NEXT: pushl $0 3621; X86-NEXT: pushl $63 3622; X86-NEXT: pushl {{[0-9]+}}(%esp) 3623; X86-NEXT: pushl {{[0-9]+}}(%esp) 3624; X86-NEXT: calll memcmp 3625; X86-NEXT: addl $16, %esp 3626; X86-NEXT: testl %eax, %eax 3627; X86-NEXT: setg %al 3628; X86-NEXT: retl 3629; 3630; X64-LABEL: length63_gt: 3631; X64: # %bb.0: 3632; X64-NEXT: pushq %rax 3633; X64-NEXT: movl $63, %edx 3634; X64-NEXT: callq memcmp 3635; X64-NEXT: testl %eax, %eax 3636; X64-NEXT: setg %al 3637; X64-NEXT: popq %rcx 3638; X64-NEXT: retq 3639 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 63) nounwind 3640 %cmp = icmp sgt i32 %call, 0 3641 ret i1 %cmp 3642} 3643 3644define i1 @length63_eq_const(i8* %X) nounwind { 3645; X86-NOSSE-LABEL: length63_eq_const: 3646; X86-NOSSE: # %bb.0: 3647; X86-NOSSE-NEXT: pushl $0 3648; X86-NOSSE-NEXT: pushl $63 3649; X86-NOSSE-NEXT: pushl $.L.str 3650; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 3651; X86-NOSSE-NEXT: calll memcmp 3652; X86-NOSSE-NEXT: addl $16, %esp 3653; X86-NOSSE-NEXT: testl %eax, %eax 3654; X86-NOSSE-NEXT: sete %al 3655; X86-NOSSE-NEXT: retl 3656; 3657; X86-SSE1-LABEL: length63_eq_const: 3658; X86-SSE1: # %bb.0: 3659; X86-SSE1-NEXT: pushl $0 3660; X86-SSE1-NEXT: pushl $63 3661; X86-SSE1-NEXT: pushl $.L.str 3662; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 3663; X86-SSE1-NEXT: calll memcmp 3664; X86-SSE1-NEXT: addl $16, %esp 3665; X86-SSE1-NEXT: testl %eax, %eax 3666; X86-SSE1-NEXT: sete %al 3667; X86-SSE1-NEXT: retl 3668; 3669; X86-SSE2-LABEL: length63_eq_const: 3670; X86-SSE2: # %bb.0: 3671; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 3672; X86-SSE2-NEXT: movdqu (%eax), %xmm0 3673; X86-SSE2-NEXT: movdqu 16(%eax), %xmm1 3674; X86-SSE2-NEXT: movdqu 32(%eax), %xmm2 3675; X86-SSE2-NEXT: movdqu 47(%eax), %xmm3 3676; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3 3677; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2 3678; X86-SSE2-NEXT: pand %xmm3, %xmm2 3679; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 3680; X86-SSE2-NEXT: pand %xmm2, %xmm1 3681; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 3682; X86-SSE2-NEXT: pand %xmm1, %xmm0 3683; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 3684; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 3685; X86-SSE2-NEXT: sete %al 3686; X86-SSE2-NEXT: retl 3687; 3688; X86-SSE41-LABEL: length63_eq_const: 3689; X86-SSE41: # %bb.0: 3690; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 3691; X86-SSE41-NEXT: movdqu (%eax), %xmm0 3692; X86-SSE41-NEXT: movdqu 16(%eax), %xmm1 3693; X86-SSE41-NEXT: movdqu 32(%eax), %xmm2 3694; X86-SSE41-NEXT: movdqu 47(%eax), %xmm3 3695; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3 3696; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2 3697; X86-SSE41-NEXT: por %xmm3, %xmm2 3698; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 3699; X86-SSE41-NEXT: por %xmm2, %xmm1 3700; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 3701; X86-SSE41-NEXT: por %xmm1, %xmm0 3702; X86-SSE41-NEXT: ptest %xmm0, %xmm0 3703; X86-SSE41-NEXT: sete %al 3704; X86-SSE41-NEXT: retl 3705; 3706; X64-SSE2-LABEL: length63_eq_const: 3707; X64-SSE2: # %bb.0: 3708; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 3709; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 3710; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm2 3711; X64-SSE2-NEXT: movdqu 47(%rdi), %xmm3 3712; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 3713; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 3714; X64-SSE2-NEXT: pand %xmm3, %xmm2 3715; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 3716; X64-SSE2-NEXT: pand %xmm2, %xmm1 3717; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 3718; X64-SSE2-NEXT: pand %xmm1, %xmm0 3719; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 3720; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 3721; X64-SSE2-NEXT: sete %al 3722; X64-SSE2-NEXT: retq 3723; 3724; X64-SSE41-LABEL: length63_eq_const: 3725; X64-SSE41: # %bb.0: 3726; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 3727; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 3728; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm2 3729; X64-SSE41-NEXT: movdqu 47(%rdi), %xmm3 3730; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 3731; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 3732; X64-SSE41-NEXT: por %xmm3, %xmm2 3733; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 3734; X64-SSE41-NEXT: por %xmm2, %xmm1 3735; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 3736; X64-SSE41-NEXT: por %xmm1, %xmm0 3737; X64-SSE41-NEXT: ptest %xmm0, %xmm0 3738; X64-SSE41-NEXT: sete %al 3739; X64-SSE41-NEXT: retq 3740; 3741; X64-AVX1-LABEL: length63_eq_const: 3742; X64-AVX1: # %bb.0: 3743; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 3744; X64-AVX1-NEXT: vmovups 31(%rdi), %ymm1 3745; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 3746; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 3747; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 3748; X64-AVX1-NEXT: vptest %ymm0, %ymm0 3749; X64-AVX1-NEXT: sete %al 3750; X64-AVX1-NEXT: vzeroupper 3751; X64-AVX1-NEXT: retq 3752; 3753; X64-AVX2-LABEL: length63_eq_const: 3754; X64-AVX2: # %bb.0: 3755; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 3756; X64-AVX2-NEXT: vmovdqu 31(%rdi), %ymm1 3757; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 3758; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 3759; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 3760; X64-AVX2-NEXT: vptest %ymm0, %ymm0 3761; X64-AVX2-NEXT: sete %al 3762; X64-AVX2-NEXT: vzeroupper 3763; X64-AVX2-NEXT: retq 3764; 3765; X64-AVX512-LABEL: length63_eq_const: 3766; X64-AVX512: # %bb.0: 3767; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm0 3768; X64-AVX512-NEXT: vmovdqu 31(%rdi), %ymm1 3769; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 3770; X64-AVX512-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 3771; X64-AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 3772; X64-AVX512-NEXT: vptest %ymm0, %ymm0 3773; X64-AVX512-NEXT: sete %al 3774; X64-AVX512-NEXT: vzeroupper 3775; X64-AVX512-NEXT: retq 3776; 3777; X64-MIC-AVX-LABEL: length63_eq_const: 3778; X64-MIC-AVX: # %bb.0: 3779; X64-MIC-AVX-NEXT: vmovdqu (%rdi), %ymm0 3780; X64-MIC-AVX-NEXT: vmovdqu 31(%rdi), %ymm1 3781; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm2 = [875770417,943142453,842084409,909456435,809056311,875770417,943142453,842084409] 3782; X64-MIC-AVX-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 3783; X64-MIC-AVX-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 3784; X64-MIC-AVX-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 3785; X64-MIC-AVX-NEXT: kortestw %k0, %k1 3786; X64-MIC-AVX-NEXT: sete %al 3787; X64-MIC-AVX-NEXT: vzeroupper 3788; X64-MIC-AVX-NEXT: retq 3789 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 63) nounwind 3790 %c = icmp eq i32 %m, 0 3791 ret i1 %c 3792} 3793 3794define i32 @length64(i8* %X, i8* %Y) nounwind { 3795; X86-LABEL: length64: 3796; X86: # %bb.0: 3797; X86-NEXT: pushl $0 3798; X86-NEXT: pushl $64 3799; X86-NEXT: pushl {{[0-9]+}}(%esp) 3800; X86-NEXT: pushl {{[0-9]+}}(%esp) 3801; X86-NEXT: calll memcmp 3802; X86-NEXT: addl $16, %esp 3803; X86-NEXT: retl 3804; 3805; X64-LABEL: length64: 3806; X64: # %bb.0: 3807; X64-NEXT: movl $64, %edx 3808; X64-NEXT: jmp memcmp # TAILCALL 3809 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 64) nounwind 3810 ret i32 %m 3811} 3812 3813define i1 @length64_eq(i8* %x, i8* %y) nounwind { 3814; X86-NOSSE-LABEL: length64_eq: 3815; X86-NOSSE: # %bb.0: 3816; X86-NOSSE-NEXT: pushl $0 3817; X86-NOSSE-NEXT: pushl $64 3818; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 3819; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 3820; X86-NOSSE-NEXT: calll memcmp 3821; X86-NOSSE-NEXT: addl $16, %esp 3822; X86-NOSSE-NEXT: testl %eax, %eax 3823; X86-NOSSE-NEXT: setne %al 3824; X86-NOSSE-NEXT: retl 3825; 3826; X86-SSE1-LABEL: length64_eq: 3827; X86-SSE1: # %bb.0: 3828; X86-SSE1-NEXT: pushl $0 3829; X86-SSE1-NEXT: pushl $64 3830; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 3831; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 3832; X86-SSE1-NEXT: calll memcmp 3833; X86-SSE1-NEXT: addl $16, %esp 3834; X86-SSE1-NEXT: testl %eax, %eax 3835; X86-SSE1-NEXT: setne %al 3836; X86-SSE1-NEXT: retl 3837; 3838; X86-SSE2-LABEL: length64_eq: 3839; X86-SSE2: # %bb.0: 3840; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 3841; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx 3842; X86-SSE2-NEXT: movdqu (%ecx), %xmm0 3843; X86-SSE2-NEXT: movdqu 16(%ecx), %xmm1 3844; X86-SSE2-NEXT: movdqu (%eax), %xmm2 3845; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm2 3846; X86-SSE2-NEXT: movdqu 16(%eax), %xmm0 3847; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 3848; X86-SSE2-NEXT: movdqu 32(%ecx), %xmm1 3849; X86-SSE2-NEXT: movdqu 32(%eax), %xmm3 3850; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm3 3851; X86-SSE2-NEXT: movdqu 48(%ecx), %xmm1 3852; X86-SSE2-NEXT: movdqu 48(%eax), %xmm4 3853; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm4 3854; X86-SSE2-NEXT: pand %xmm3, %xmm4 3855; X86-SSE2-NEXT: pand %xmm0, %xmm4 3856; X86-SSE2-NEXT: pand %xmm2, %xmm4 3857; X86-SSE2-NEXT: pmovmskb %xmm4, %eax 3858; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 3859; X86-SSE2-NEXT: setne %al 3860; X86-SSE2-NEXT: retl 3861; 3862; X86-SSE41-LABEL: length64_eq: 3863; X86-SSE41: # %bb.0: 3864; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 3865; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %ecx 3866; X86-SSE41-NEXT: movdqu (%ecx), %xmm0 3867; X86-SSE41-NEXT: movdqu 16(%ecx), %xmm1 3868; X86-SSE41-NEXT: movdqu (%eax), %xmm2 3869; X86-SSE41-NEXT: pxor %xmm0, %xmm2 3870; X86-SSE41-NEXT: movdqu 16(%eax), %xmm0 3871; X86-SSE41-NEXT: pxor %xmm1, %xmm0 3872; X86-SSE41-NEXT: movdqu 32(%ecx), %xmm1 3873; X86-SSE41-NEXT: movdqu 32(%eax), %xmm3 3874; X86-SSE41-NEXT: pxor %xmm1, %xmm3 3875; X86-SSE41-NEXT: movdqu 48(%ecx), %xmm1 3876; X86-SSE41-NEXT: movdqu 48(%eax), %xmm4 3877; X86-SSE41-NEXT: pxor %xmm1, %xmm4 3878; X86-SSE41-NEXT: por %xmm3, %xmm4 3879; X86-SSE41-NEXT: por %xmm0, %xmm4 3880; X86-SSE41-NEXT: por %xmm2, %xmm4 3881; X86-SSE41-NEXT: ptest %xmm4, %xmm4 3882; X86-SSE41-NEXT: setne %al 3883; X86-SSE41-NEXT: retl 3884; 3885; X64-SSE2-LABEL: length64_eq: 3886; X64-SSE2: # %bb.0: 3887; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 3888; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 3889; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm2 3890; X64-SSE2-NEXT: movdqu 48(%rdi), %xmm3 3891; X64-SSE2-NEXT: movdqu (%rsi), %xmm4 3892; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm4 3893; X64-SSE2-NEXT: movdqu 16(%rsi), %xmm0 3894; X64-SSE2-NEXT: pcmpeqb %xmm1, %xmm0 3895; X64-SSE2-NEXT: movdqu 32(%rsi), %xmm1 3896; X64-SSE2-NEXT: pcmpeqb %xmm2, %xmm1 3897; X64-SSE2-NEXT: movdqu 48(%rsi), %xmm2 3898; X64-SSE2-NEXT: pcmpeqb %xmm3, %xmm2 3899; X64-SSE2-NEXT: pand %xmm1, %xmm2 3900; X64-SSE2-NEXT: pand %xmm0, %xmm2 3901; X64-SSE2-NEXT: pand %xmm4, %xmm2 3902; X64-SSE2-NEXT: pmovmskb %xmm2, %eax 3903; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 3904; X64-SSE2-NEXT: setne %al 3905; X64-SSE2-NEXT: retq 3906; 3907; X64-SSE41-LABEL: length64_eq: 3908; X64-SSE41: # %bb.0: 3909; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 3910; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 3911; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm2 3912; X64-SSE41-NEXT: movdqu 48(%rdi), %xmm3 3913; X64-SSE41-NEXT: movdqu (%rsi), %xmm4 3914; X64-SSE41-NEXT: pxor %xmm0, %xmm4 3915; X64-SSE41-NEXT: movdqu 16(%rsi), %xmm0 3916; X64-SSE41-NEXT: pxor %xmm1, %xmm0 3917; X64-SSE41-NEXT: movdqu 32(%rsi), %xmm1 3918; X64-SSE41-NEXT: pxor %xmm2, %xmm1 3919; X64-SSE41-NEXT: movdqu 48(%rsi), %xmm2 3920; X64-SSE41-NEXT: pxor %xmm3, %xmm2 3921; X64-SSE41-NEXT: por %xmm1, %xmm2 3922; X64-SSE41-NEXT: por %xmm0, %xmm2 3923; X64-SSE41-NEXT: por %xmm4, %xmm2 3924; X64-SSE41-NEXT: ptest %xmm2, %xmm2 3925; X64-SSE41-NEXT: setne %al 3926; X64-SSE41-NEXT: retq 3927; 3928; X64-AVX1-LABEL: length64_eq: 3929; X64-AVX1: # %bb.0: 3930; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 3931; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1 3932; X64-AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1 3933; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 3934; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 3935; X64-AVX1-NEXT: vptest %ymm0, %ymm0 3936; X64-AVX1-NEXT: setne %al 3937; X64-AVX1-NEXT: vzeroupper 3938; X64-AVX1-NEXT: retq 3939; 3940; X64-AVX2-LABEL: length64_eq: 3941; X64-AVX2: # %bb.0: 3942; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 3943; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 3944; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1 3945; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 3946; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 3947; X64-AVX2-NEXT: vptest %ymm0, %ymm0 3948; X64-AVX2-NEXT: setne %al 3949; X64-AVX2-NEXT: vzeroupper 3950; X64-AVX2-NEXT: retq 3951; 3952; X64-AVX512BW-LABEL: length64_eq: 3953; X64-AVX512BW: # %bb.0: 3954; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 3955; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k0 3956; X64-AVX512BW-NEXT: kortestq %k0, %k0 3957; X64-AVX512BW-NEXT: setne %al 3958; X64-AVX512BW-NEXT: vzeroupper 3959; X64-AVX512BW-NEXT: retq 3960; 3961; X64-AVX512F-LABEL: length64_eq: 3962; X64-AVX512F: # %bb.0: 3963; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3964; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0 3965; X64-AVX512F-NEXT: kortestw %k0, %k0 3966; X64-AVX512F-NEXT: setne %al 3967; X64-AVX512F-NEXT: vzeroupper 3968; X64-AVX512F-NEXT: retq 3969; 3970; X64-MIC-AVX2-LABEL: length64_eq: 3971; X64-MIC-AVX2: # %bb.0: 3972; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0 3973; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 3974; X64-MIC-AVX2-NEXT: vmovdqu (%rsi), %ymm2 3975; X64-MIC-AVX2-NEXT: vmovdqu 32(%rsi), %ymm3 3976; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 3977; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm0, %k1 3978; X64-MIC-AVX2-NEXT: kortestw %k0, %k1 3979; X64-MIC-AVX2-NEXT: setne %al 3980; X64-MIC-AVX2-NEXT: vzeroupper 3981; X64-MIC-AVX2-NEXT: retq 3982; 3983; X64-MIC-AVX512F-LABEL: length64_eq: 3984; X64-MIC-AVX512F: # %bb.0: 3985; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 3986; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0 3987; X64-MIC-AVX512F-NEXT: kortestw %k0, %k0 3988; X64-MIC-AVX512F-NEXT: setne %al 3989; X64-MIC-AVX512F-NEXT: vzeroupper 3990; X64-MIC-AVX512F-NEXT: retq 3991 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 64) nounwind 3992 %cmp = icmp ne i32 %call, 0 3993 ret i1 %cmp 3994} 3995 3996define i1 @length64_lt(i8* %x, i8* %y) nounwind { 3997; X86-LABEL: length64_lt: 3998; X86: # %bb.0: 3999; X86-NEXT: pushl $0 4000; X86-NEXT: pushl $64 4001; X86-NEXT: pushl {{[0-9]+}}(%esp) 4002; X86-NEXT: pushl {{[0-9]+}}(%esp) 4003; X86-NEXT: calll memcmp 4004; X86-NEXT: addl $16, %esp 4005; X86-NEXT: shrl $31, %eax 4006; X86-NEXT: # kill: def $al killed $al killed $eax 4007; X86-NEXT: retl 4008; 4009; X64-LABEL: length64_lt: 4010; X64: # %bb.0: 4011; X64-NEXT: pushq %rax 4012; X64-NEXT: movl $64, %edx 4013; X64-NEXT: callq memcmp 4014; X64-NEXT: shrl $31, %eax 4015; X64-NEXT: # kill: def $al killed $al killed $eax 4016; X64-NEXT: popq %rcx 4017; X64-NEXT: retq 4018 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 64) nounwind 4019 %cmp = icmp slt i32 %call, 0 4020 ret i1 %cmp 4021} 4022 4023define i1 @length64_gt(i8* %x, i8* %y) nounwind { 4024; X86-LABEL: length64_gt: 4025; X86: # %bb.0: 4026; X86-NEXT: pushl $0 4027; X86-NEXT: pushl $64 4028; X86-NEXT: pushl {{[0-9]+}}(%esp) 4029; X86-NEXT: pushl {{[0-9]+}}(%esp) 4030; X86-NEXT: calll memcmp 4031; X86-NEXT: addl $16, %esp 4032; X86-NEXT: testl %eax, %eax 4033; X86-NEXT: setg %al 4034; X86-NEXT: retl 4035; 4036; X64-LABEL: length64_gt: 4037; X64: # %bb.0: 4038; X64-NEXT: pushq %rax 4039; X64-NEXT: movl $64, %edx 4040; X64-NEXT: callq memcmp 4041; X64-NEXT: testl %eax, %eax 4042; X64-NEXT: setg %al 4043; X64-NEXT: popq %rcx 4044; X64-NEXT: retq 4045 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 64) nounwind 4046 %cmp = icmp sgt i32 %call, 0 4047 ret i1 %cmp 4048} 4049 4050define i1 @length64_eq_const(i8* %X) nounwind { 4051; X86-NOSSE-LABEL: length64_eq_const: 4052; X86-NOSSE: # %bb.0: 4053; X86-NOSSE-NEXT: pushl $0 4054; X86-NOSSE-NEXT: pushl $64 4055; X86-NOSSE-NEXT: pushl $.L.str 4056; X86-NOSSE-NEXT: pushl {{[0-9]+}}(%esp) 4057; X86-NOSSE-NEXT: calll memcmp 4058; X86-NOSSE-NEXT: addl $16, %esp 4059; X86-NOSSE-NEXT: testl %eax, %eax 4060; X86-NOSSE-NEXT: sete %al 4061; X86-NOSSE-NEXT: retl 4062; 4063; X86-SSE1-LABEL: length64_eq_const: 4064; X86-SSE1: # %bb.0: 4065; X86-SSE1-NEXT: pushl $0 4066; X86-SSE1-NEXT: pushl $64 4067; X86-SSE1-NEXT: pushl $.L.str 4068; X86-SSE1-NEXT: pushl {{[0-9]+}}(%esp) 4069; X86-SSE1-NEXT: calll memcmp 4070; X86-SSE1-NEXT: addl $16, %esp 4071; X86-SSE1-NEXT: testl %eax, %eax 4072; X86-SSE1-NEXT: sete %al 4073; X86-SSE1-NEXT: retl 4074; 4075; X86-SSE2-LABEL: length64_eq_const: 4076; X86-SSE2: # %bb.0: 4077; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax 4078; X86-SSE2-NEXT: movdqu (%eax), %xmm0 4079; X86-SSE2-NEXT: movdqu 16(%eax), %xmm1 4080; X86-SSE2-NEXT: movdqu 32(%eax), %xmm2 4081; X86-SSE2-NEXT: movdqu 48(%eax), %xmm3 4082; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3 4083; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2 4084; X86-SSE2-NEXT: pand %xmm3, %xmm2 4085; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 4086; X86-SSE2-NEXT: pand %xmm2, %xmm1 4087; X86-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 4088; X86-SSE2-NEXT: pand %xmm1, %xmm0 4089; X86-SSE2-NEXT: pmovmskb %xmm0, %eax 4090; X86-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 4091; X86-SSE2-NEXT: sete %al 4092; X86-SSE2-NEXT: retl 4093; 4094; X86-SSE41-LABEL: length64_eq_const: 4095; X86-SSE41: # %bb.0: 4096; X86-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 4097; X86-SSE41-NEXT: movdqu (%eax), %xmm0 4098; X86-SSE41-NEXT: movdqu 16(%eax), %xmm1 4099; X86-SSE41-NEXT: movdqu 32(%eax), %xmm2 4100; X86-SSE41-NEXT: movdqu 48(%eax), %xmm3 4101; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3 4102; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2 4103; X86-SSE41-NEXT: por %xmm3, %xmm2 4104; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 4105; X86-SSE41-NEXT: por %xmm2, %xmm1 4106; X86-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 4107; X86-SSE41-NEXT: por %xmm1, %xmm0 4108; X86-SSE41-NEXT: ptest %xmm0, %xmm0 4109; X86-SSE41-NEXT: sete %al 4110; X86-SSE41-NEXT: retl 4111; 4112; X64-SSE2-LABEL: length64_eq_const: 4113; X64-SSE2: # %bb.0: 4114; X64-SSE2-NEXT: movdqu (%rdi), %xmm0 4115; X64-SSE2-NEXT: movdqu 16(%rdi), %xmm1 4116; X64-SSE2-NEXT: movdqu 32(%rdi), %xmm2 4117; X64-SSE2-NEXT: movdqu 48(%rdi), %xmm3 4118; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 4119; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 4120; X64-SSE2-NEXT: pand %xmm3, %xmm2 4121; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 4122; X64-SSE2-NEXT: pand %xmm2, %xmm1 4123; X64-SSE2-NEXT: pcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 4124; X64-SSE2-NEXT: pand %xmm1, %xmm0 4125; X64-SSE2-NEXT: pmovmskb %xmm0, %eax 4126; X64-SSE2-NEXT: cmpl $65535, %eax # imm = 0xFFFF 4127; X64-SSE2-NEXT: sete %al 4128; X64-SSE2-NEXT: retq 4129; 4130; X64-SSE41-LABEL: length64_eq_const: 4131; X64-SSE41: # %bb.0: 4132; X64-SSE41-NEXT: movdqu (%rdi), %xmm0 4133; X64-SSE41-NEXT: movdqu 16(%rdi), %xmm1 4134; X64-SSE41-NEXT: movdqu 32(%rdi), %xmm2 4135; X64-SSE41-NEXT: movdqu 48(%rdi), %xmm3 4136; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 4137; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 4138; X64-SSE41-NEXT: por %xmm3, %xmm2 4139; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 4140; X64-SSE41-NEXT: por %xmm2, %xmm1 4141; X64-SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 4142; X64-SSE41-NEXT: por %xmm1, %xmm0 4143; X64-SSE41-NEXT: ptest %xmm0, %xmm0 4144; X64-SSE41-NEXT: sete %al 4145; X64-SSE41-NEXT: retq 4146; 4147; X64-AVX1-LABEL: length64_eq_const: 4148; X64-AVX1: # %bb.0: 4149; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 4150; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1 4151; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 4152; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 4153; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 4154; X64-AVX1-NEXT: vptest %ymm0, %ymm0 4155; X64-AVX1-NEXT: sete %al 4156; X64-AVX1-NEXT: vzeroupper 4157; X64-AVX1-NEXT: retq 4158; 4159; X64-AVX2-LABEL: length64_eq_const: 4160; X64-AVX2: # %bb.0: 4161; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 4162; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 4163; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 4164; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 4165; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 4166; X64-AVX2-NEXT: vptest %ymm0, %ymm0 4167; X64-AVX2-NEXT: sete %al 4168; X64-AVX2-NEXT: vzeroupper 4169; X64-AVX2-NEXT: retq 4170; 4171; X64-AVX512BW-LABEL: length64_eq_const: 4172; X64-AVX512BW: # %bb.0: 4173; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 4174; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k0 4175; X64-AVX512BW-NEXT: kortestq %k0, %k0 4176; X64-AVX512BW-NEXT: sete %al 4177; X64-AVX512BW-NEXT: vzeroupper 4178; X64-AVX512BW-NEXT: retq 4179; 4180; X64-AVX512F-LABEL: length64_eq_const: 4181; X64-AVX512F: # %bb.0: 4182; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 4183; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k0 4184; X64-AVX512F-NEXT: kortestw %k0, %k0 4185; X64-AVX512F-NEXT: sete %al 4186; X64-AVX512F-NEXT: vzeroupper 4187; X64-AVX512F-NEXT: retq 4188; 4189; X64-MIC-AVX2-LABEL: length64_eq_const: 4190; X64-MIC-AVX2: # %bb.0: 4191; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0 4192; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 4193; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408] 4194; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm1, %k0 4195; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 4196; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 4197; X64-MIC-AVX2-NEXT: kortestw %k0, %k1 4198; X64-MIC-AVX2-NEXT: sete %al 4199; X64-MIC-AVX2-NEXT: vzeroupper 4200; X64-MIC-AVX2-NEXT: retq 4201; 4202; X64-MIC-AVX512F-LABEL: length64_eq_const: 4203; X64-MIC-AVX512F: # %bb.0: 4204; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 4205; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k0 4206; X64-MIC-AVX512F-NEXT: kortestw %k0, %k0 4207; X64-MIC-AVX512F-NEXT: sete %al 4208; X64-MIC-AVX512F-NEXT: vzeroupper 4209; X64-MIC-AVX512F-NEXT: retq 4210 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 64) nounwind 4211 %c = icmp eq i32 %m, 0 4212 ret i1 %c 4213} 4214 4215define i32 @length96(i8* %X, i8* %Y) nounwind { 4216; X86-LABEL: length96: 4217; X86: # %bb.0: 4218; X86-NEXT: pushl $0 4219; X86-NEXT: pushl $96 4220; X86-NEXT: pushl {{[0-9]+}}(%esp) 4221; X86-NEXT: pushl {{[0-9]+}}(%esp) 4222; X86-NEXT: calll memcmp 4223; X86-NEXT: addl $16, %esp 4224; X86-NEXT: retl 4225; 4226; X64-LABEL: length96: 4227; X64: # %bb.0: 4228; X64-NEXT: movl $96, %edx 4229; X64-NEXT: jmp memcmp # TAILCALL 4230 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 96) nounwind 4231 ret i32 %m 4232} 4233 4234define i1 @length96_eq(i8* %x, i8* %y) nounwind { 4235; X86-LABEL: length96_eq: 4236; X86: # %bb.0: 4237; X86-NEXT: pushl $0 4238; X86-NEXT: pushl $96 4239; X86-NEXT: pushl {{[0-9]+}}(%esp) 4240; X86-NEXT: pushl {{[0-9]+}}(%esp) 4241; X86-NEXT: calll memcmp 4242; X86-NEXT: addl $16, %esp 4243; X86-NEXT: testl %eax, %eax 4244; X86-NEXT: setne %al 4245; X86-NEXT: retl 4246; 4247; X64-SSE-LABEL: length96_eq: 4248; X64-SSE: # %bb.0: 4249; X64-SSE-NEXT: pushq %rax 4250; X64-SSE-NEXT: movl $96, %edx 4251; X64-SSE-NEXT: callq memcmp 4252; X64-SSE-NEXT: testl %eax, %eax 4253; X64-SSE-NEXT: setne %al 4254; X64-SSE-NEXT: popq %rcx 4255; X64-SSE-NEXT: retq 4256; 4257; X64-AVX1-LABEL: length96_eq: 4258; X64-AVX1: # %bb.0: 4259; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 4260; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1 4261; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm2 4262; X64-AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1 4263; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 4264; X64-AVX1-NEXT: vxorps 64(%rsi), %ymm2, %ymm2 4265; X64-AVX1-NEXT: vorps %ymm2, %ymm1, %ymm1 4266; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 4267; X64-AVX1-NEXT: vptest %ymm0, %ymm0 4268; X64-AVX1-NEXT: setne %al 4269; X64-AVX1-NEXT: vzeroupper 4270; X64-AVX1-NEXT: retq 4271; 4272; X64-AVX2-LABEL: length96_eq: 4273; X64-AVX2: # %bb.0: 4274; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 4275; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 4276; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2 4277; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1 4278; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 4279; X64-AVX2-NEXT: vpxor 64(%rsi), %ymm2, %ymm2 4280; X64-AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1 4281; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 4282; X64-AVX2-NEXT: vptest %ymm0, %ymm0 4283; X64-AVX2-NEXT: setne %al 4284; X64-AVX2-NEXT: vzeroupper 4285; X64-AVX2-NEXT: retq 4286; 4287; X64-AVX512BW-LABEL: length96_eq: 4288; X64-AVX512BW: # %bb.0: 4289; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 4290; X64-AVX512BW-NEXT: vmovdqu 64(%rdi), %ymm1 4291; X64-AVX512BW-NEXT: vmovdqu 64(%rsi), %ymm2 4292; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k0 4293; X64-AVX512BW-NEXT: vpcmpneqb %zmm2, %zmm1, %k1 4294; X64-AVX512BW-NEXT: kortestq %k1, %k0 4295; X64-AVX512BW-NEXT: setne %al 4296; X64-AVX512BW-NEXT: vzeroupper 4297; X64-AVX512BW-NEXT: retq 4298; 4299; X64-AVX512F-LABEL: length96_eq: 4300; X64-AVX512F: # %bb.0: 4301; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 4302; X64-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1 4303; X64-AVX512F-NEXT: vmovdqu 64(%rsi), %ymm2 4304; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0 4305; X64-AVX512F-NEXT: vpcmpneqd %zmm2, %zmm1, %k1 4306; X64-AVX512F-NEXT: kortestw %k1, %k0 4307; X64-AVX512F-NEXT: setne %al 4308; X64-AVX512F-NEXT: vzeroupper 4309; X64-AVX512F-NEXT: retq 4310; 4311; X64-MIC-AVX2-LABEL: length96_eq: 4312; X64-MIC-AVX2: # %bb.0: 4313; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0 4314; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 4315; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2 4316; X64-MIC-AVX2-NEXT: vmovdqu (%rsi), %ymm3 4317; X64-MIC-AVX2-NEXT: vmovdqu 32(%rsi), %ymm4 4318; X64-MIC-AVX2-NEXT: vmovdqu 64(%rsi), %ymm5 4319; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm1, %k0 4320; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm0, %k1 4321; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k0 4322; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm5, %zmm2, %k1 4323; X64-MIC-AVX2-NEXT: kortestw %k1, %k0 4324; X64-MIC-AVX2-NEXT: setne %al 4325; X64-MIC-AVX2-NEXT: vzeroupper 4326; X64-MIC-AVX2-NEXT: retq 4327; 4328; X64-MIC-AVX512F-LABEL: length96_eq: 4329; X64-MIC-AVX512F: # %bb.0: 4330; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 4331; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1 4332; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rsi), %ymm2 4333; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k0 4334; X64-MIC-AVX512F-NEXT: vpcmpneqd %zmm2, %zmm1, %k1 4335; X64-MIC-AVX512F-NEXT: kortestw %k1, %k0 4336; X64-MIC-AVX512F-NEXT: setne %al 4337; X64-MIC-AVX512F-NEXT: vzeroupper 4338; X64-MIC-AVX512F-NEXT: retq 4339 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 96) nounwind 4340 %cmp = icmp ne i32 %call, 0 4341 ret i1 %cmp 4342} 4343 4344define i1 @length96_lt(i8* %x, i8* %y) nounwind { 4345; X86-LABEL: length96_lt: 4346; X86: # %bb.0: 4347; X86-NEXT: pushl $0 4348; X86-NEXT: pushl $96 4349; X86-NEXT: pushl {{[0-9]+}}(%esp) 4350; X86-NEXT: pushl {{[0-9]+}}(%esp) 4351; X86-NEXT: calll memcmp 4352; X86-NEXT: addl $16, %esp 4353; X86-NEXT: shrl $31, %eax 4354; X86-NEXT: # kill: def $al killed $al killed $eax 4355; X86-NEXT: retl 4356; 4357; X64-LABEL: length96_lt: 4358; X64: # %bb.0: 4359; X64-NEXT: pushq %rax 4360; X64-NEXT: movl $96, %edx 4361; X64-NEXT: callq memcmp 4362; X64-NEXT: shrl $31, %eax 4363; X64-NEXT: # kill: def $al killed $al killed $eax 4364; X64-NEXT: popq %rcx 4365; X64-NEXT: retq 4366 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 96) nounwind 4367 %cmp = icmp slt i32 %call, 0 4368 ret i1 %cmp 4369} 4370 4371define i1 @length96_gt(i8* %x, i8* %y) nounwind { 4372; X86-LABEL: length96_gt: 4373; X86: # %bb.0: 4374; X86-NEXT: pushl $0 4375; X86-NEXT: pushl $96 4376; X86-NEXT: pushl {{[0-9]+}}(%esp) 4377; X86-NEXT: pushl {{[0-9]+}}(%esp) 4378; X86-NEXT: calll memcmp 4379; X86-NEXT: addl $16, %esp 4380; X86-NEXT: testl %eax, %eax 4381; X86-NEXT: setg %al 4382; X86-NEXT: retl 4383; 4384; X64-LABEL: length96_gt: 4385; X64: # %bb.0: 4386; X64-NEXT: pushq %rax 4387; X64-NEXT: movl $96, %edx 4388; X64-NEXT: callq memcmp 4389; X64-NEXT: testl %eax, %eax 4390; X64-NEXT: setg %al 4391; X64-NEXT: popq %rcx 4392; X64-NEXT: retq 4393 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 96) nounwind 4394 %cmp = icmp sgt i32 %call, 0 4395 ret i1 %cmp 4396} 4397 4398define i1 @length96_eq_const(i8* %X) nounwind { 4399; X86-LABEL: length96_eq_const: 4400; X86: # %bb.0: 4401; X86-NEXT: pushl $0 4402; X86-NEXT: pushl $96 4403; X86-NEXT: pushl $.L.str 4404; X86-NEXT: pushl {{[0-9]+}}(%esp) 4405; X86-NEXT: calll memcmp 4406; X86-NEXT: addl $16, %esp 4407; X86-NEXT: testl %eax, %eax 4408; X86-NEXT: sete %al 4409; X86-NEXT: retl 4410; 4411; X64-SSE-LABEL: length96_eq_const: 4412; X64-SSE: # %bb.0: 4413; X64-SSE-NEXT: pushq %rax 4414; X64-SSE-NEXT: movl $.L.str, %esi 4415; X64-SSE-NEXT: movl $96, %edx 4416; X64-SSE-NEXT: callq memcmp 4417; X64-SSE-NEXT: testl %eax, %eax 4418; X64-SSE-NEXT: sete %al 4419; X64-SSE-NEXT: popq %rcx 4420; X64-SSE-NEXT: retq 4421; 4422; X64-AVX1-LABEL: length96_eq_const: 4423; X64-AVX1: # %bb.0: 4424; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 4425; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1 4426; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm2 4427; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 4428; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 4429; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 4430; X64-AVX1-NEXT: vorps %ymm2, %ymm1, %ymm1 4431; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 4432; X64-AVX1-NEXT: vptest %ymm0, %ymm0 4433; X64-AVX1-NEXT: sete %al 4434; X64-AVX1-NEXT: vzeroupper 4435; X64-AVX1-NEXT: retq 4436; 4437; X64-AVX2-LABEL: length96_eq_const: 4438; X64-AVX2: # %bb.0: 4439; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 4440; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 4441; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2 4442; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 4443; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 4444; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 4445; X64-AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1 4446; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 4447; X64-AVX2-NEXT: vptest %ymm0, %ymm0 4448; X64-AVX2-NEXT: sete %al 4449; X64-AVX2-NEXT: vzeroupper 4450; X64-AVX2-NEXT: retq 4451; 4452; X64-AVX512BW-LABEL: length96_eq_const: 4453; X64-AVX512BW: # %bb.0: 4454; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 4455; X64-AVX512BW-NEXT: vmovdqu 64(%rdi), %ymm1 4456; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k0 4457; X64-AVX512BW-NEXT: vpcmpneqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1 4458; X64-AVX512BW-NEXT: kortestq %k1, %k0 4459; X64-AVX512BW-NEXT: sete %al 4460; X64-AVX512BW-NEXT: vzeroupper 4461; X64-AVX512BW-NEXT: retq 4462; 4463; X64-AVX512F-LABEL: length96_eq_const: 4464; X64-AVX512F: # %bb.0: 4465; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 4466; X64-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1 4467; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k0 4468; X64-AVX512F-NEXT: vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1 4469; X64-AVX512F-NEXT: kortestw %k1, %k0 4470; X64-AVX512F-NEXT: sete %al 4471; X64-AVX512F-NEXT: vzeroupper 4472; X64-AVX512F-NEXT: retq 4473; 4474; X64-MIC-AVX2-LABEL: length96_eq_const: 4475; X64-MIC-AVX2: # %bb.0: 4476; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0 4477; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 4478; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2 4479; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408] 4480; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm1, %k0 4481; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 4482; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm1, %zmm0, %k1 4483; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k0 4484; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm0 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426] 4485; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm0, %zmm2, %k1 4486; X64-MIC-AVX2-NEXT: kortestw %k1, %k0 4487; X64-MIC-AVX2-NEXT: sete %al 4488; X64-MIC-AVX2-NEXT: vzeroupper 4489; X64-MIC-AVX2-NEXT: retq 4490; 4491; X64-MIC-AVX512F-LABEL: length96_eq_const: 4492; X64-MIC-AVX512F: # %bb.0: 4493; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 4494; X64-MIC-AVX512F-NEXT: vmovdqu 64(%rdi), %ymm1 4495; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k0 4496; X64-MIC-AVX512F-NEXT: vpcmpneqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %k1 4497; X64-MIC-AVX512F-NEXT: kortestw %k1, %k0 4498; X64-MIC-AVX512F-NEXT: sete %al 4499; X64-MIC-AVX512F-NEXT: vzeroupper 4500; X64-MIC-AVX512F-NEXT: retq 4501 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 96) nounwind 4502 %c = icmp eq i32 %m, 0 4503 ret i1 %c 4504} 4505 4506define i32 @length127(i8* %X, i8* %Y) nounwind { 4507; X86-LABEL: length127: 4508; X86: # %bb.0: 4509; X86-NEXT: pushl $0 4510; X86-NEXT: pushl $127 4511; X86-NEXT: pushl {{[0-9]+}}(%esp) 4512; X86-NEXT: pushl {{[0-9]+}}(%esp) 4513; X86-NEXT: calll memcmp 4514; X86-NEXT: addl $16, %esp 4515; X86-NEXT: retl 4516; 4517; X64-LABEL: length127: 4518; X64: # %bb.0: 4519; X64-NEXT: movl $127, %edx 4520; X64-NEXT: jmp memcmp # TAILCALL 4521 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 127) nounwind 4522 ret i32 %m 4523} 4524 4525define i1 @length127_eq(i8* %x, i8* %y) nounwind { 4526; X86-LABEL: length127_eq: 4527; X86: # %bb.0: 4528; X86-NEXT: pushl $0 4529; X86-NEXT: pushl $127 4530; X86-NEXT: pushl {{[0-9]+}}(%esp) 4531; X86-NEXT: pushl {{[0-9]+}}(%esp) 4532; X86-NEXT: calll memcmp 4533; X86-NEXT: addl $16, %esp 4534; X86-NEXT: testl %eax, %eax 4535; X86-NEXT: setne %al 4536; X86-NEXT: retl 4537; 4538; X64-SSE-LABEL: length127_eq: 4539; X64-SSE: # %bb.0: 4540; X64-SSE-NEXT: pushq %rax 4541; X64-SSE-NEXT: movl $127, %edx 4542; X64-SSE-NEXT: callq memcmp 4543; X64-SSE-NEXT: testl %eax, %eax 4544; X64-SSE-NEXT: setne %al 4545; X64-SSE-NEXT: popq %rcx 4546; X64-SSE-NEXT: retq 4547; 4548; X64-AVX1-LABEL: length127_eq: 4549; X64-AVX1: # %bb.0: 4550; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 4551; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1 4552; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm2 4553; X64-AVX1-NEXT: vmovups 95(%rdi), %ymm3 4554; X64-AVX1-NEXT: vxorps 95(%rsi), %ymm3, %ymm3 4555; X64-AVX1-NEXT: vxorps 64(%rsi), %ymm2, %ymm2 4556; X64-AVX1-NEXT: vorps %ymm3, %ymm2, %ymm2 4557; X64-AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1 4558; X64-AVX1-NEXT: vorps %ymm2, %ymm1, %ymm1 4559; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 4560; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 4561; X64-AVX1-NEXT: vptest %ymm0, %ymm0 4562; X64-AVX1-NEXT: setne %al 4563; X64-AVX1-NEXT: vzeroupper 4564; X64-AVX1-NEXT: retq 4565; 4566; X64-AVX2-LABEL: length127_eq: 4567; X64-AVX2: # %bb.0: 4568; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 4569; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 4570; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2 4571; X64-AVX2-NEXT: vmovdqu 95(%rdi), %ymm3 4572; X64-AVX2-NEXT: vpxor 95(%rsi), %ymm3, %ymm3 4573; X64-AVX2-NEXT: vpxor 64(%rsi), %ymm2, %ymm2 4574; X64-AVX2-NEXT: vpor %ymm3, %ymm2, %ymm2 4575; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1 4576; X64-AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1 4577; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 4578; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 4579; X64-AVX2-NEXT: vptest %ymm0, %ymm0 4580; X64-AVX2-NEXT: setne %al 4581; X64-AVX2-NEXT: vzeroupper 4582; X64-AVX2-NEXT: retq 4583; 4584; X64-AVX512BW-LABEL: length127_eq: 4585; X64-AVX512BW: # %bb.0: 4586; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 4587; X64-AVX512BW-NEXT: vmovdqu64 63(%rdi), %zmm1 4588; X64-AVX512BW-NEXT: vpcmpneqb 63(%rsi), %zmm1, %k0 4589; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k1 4590; X64-AVX512BW-NEXT: kortestq %k0, %k1 4591; X64-AVX512BW-NEXT: setne %al 4592; X64-AVX512BW-NEXT: vzeroupper 4593; X64-AVX512BW-NEXT: retq 4594; 4595; X64-AVX512F-LABEL: length127_eq: 4596; X64-AVX512F: # %bb.0: 4597; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 4598; X64-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1 4599; X64-AVX512F-NEXT: vpcmpneqd 63(%rsi), %zmm1, %k0 4600; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 4601; X64-AVX512F-NEXT: kortestw %k0, %k1 4602; X64-AVX512F-NEXT: setne %al 4603; X64-AVX512F-NEXT: vzeroupper 4604; X64-AVX512F-NEXT: retq 4605; 4606; X64-MIC-AVX2-LABEL: length127_eq: 4607; X64-MIC-AVX2: # %bb.0: 4608; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0 4609; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 4610; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2 4611; X64-MIC-AVX2-NEXT: vmovdqu 95(%rdi), %ymm3 4612; X64-MIC-AVX2-NEXT: vmovdqu (%rsi), %ymm4 4613; X64-MIC-AVX2-NEXT: vmovdqu 32(%rsi), %ymm5 4614; X64-MIC-AVX2-NEXT: vmovdqu 64(%rsi), %ymm6 4615; X64-MIC-AVX2-NEXT: vmovdqu 95(%rsi), %ymm7 4616; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm7, %zmm3, %k0 4617; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm6, %zmm2, %k1 4618; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k0 4619; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm5, %zmm1, %k1 4620; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm0, %k2 4621; X64-MIC-AVX2-NEXT: korw %k1, %k2, %k1 4622; X64-MIC-AVX2-NEXT: kortestw %k0, %k1 4623; X64-MIC-AVX2-NEXT: setne %al 4624; X64-MIC-AVX2-NEXT: vzeroupper 4625; X64-MIC-AVX2-NEXT: retq 4626; 4627; X64-MIC-AVX512F-LABEL: length127_eq: 4628; X64-MIC-AVX512F: # %bb.0: 4629; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 4630; X64-MIC-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1 4631; X64-MIC-AVX512F-NEXT: vpcmpneqd 63(%rsi), %zmm1, %k0 4632; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 4633; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 4634; X64-MIC-AVX512F-NEXT: setne %al 4635; X64-MIC-AVX512F-NEXT: vzeroupper 4636; X64-MIC-AVX512F-NEXT: retq 4637 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 127) nounwind 4638 %cmp = icmp ne i32 %call, 0 4639 ret i1 %cmp 4640} 4641 4642define i1 @length127_lt(i8* %x, i8* %y) nounwind { 4643; X86-LABEL: length127_lt: 4644; X86: # %bb.0: 4645; X86-NEXT: pushl $0 4646; X86-NEXT: pushl $127 4647; X86-NEXT: pushl {{[0-9]+}}(%esp) 4648; X86-NEXT: pushl {{[0-9]+}}(%esp) 4649; X86-NEXT: calll memcmp 4650; X86-NEXT: addl $16, %esp 4651; X86-NEXT: shrl $31, %eax 4652; X86-NEXT: # kill: def $al killed $al killed $eax 4653; X86-NEXT: retl 4654; 4655; X64-LABEL: length127_lt: 4656; X64: # %bb.0: 4657; X64-NEXT: pushq %rax 4658; X64-NEXT: movl $127, %edx 4659; X64-NEXT: callq memcmp 4660; X64-NEXT: shrl $31, %eax 4661; X64-NEXT: # kill: def $al killed $al killed $eax 4662; X64-NEXT: popq %rcx 4663; X64-NEXT: retq 4664 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 127) nounwind 4665 %cmp = icmp slt i32 %call, 0 4666 ret i1 %cmp 4667} 4668 4669define i1 @length127_gt(i8* %x, i8* %y) nounwind { 4670; X86-LABEL: length127_gt: 4671; X86: # %bb.0: 4672; X86-NEXT: pushl $0 4673; X86-NEXT: pushl $127 4674; X86-NEXT: pushl {{[0-9]+}}(%esp) 4675; X86-NEXT: pushl {{[0-9]+}}(%esp) 4676; X86-NEXT: calll memcmp 4677; X86-NEXT: addl $16, %esp 4678; X86-NEXT: testl %eax, %eax 4679; X86-NEXT: setg %al 4680; X86-NEXT: retl 4681; 4682; X64-LABEL: length127_gt: 4683; X64: # %bb.0: 4684; X64-NEXT: pushq %rax 4685; X64-NEXT: movl $127, %edx 4686; X64-NEXT: callq memcmp 4687; X64-NEXT: testl %eax, %eax 4688; X64-NEXT: setg %al 4689; X64-NEXT: popq %rcx 4690; X64-NEXT: retq 4691 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 127) nounwind 4692 %cmp = icmp sgt i32 %call, 0 4693 ret i1 %cmp 4694} 4695 4696define i1 @length127_eq_const(i8* %X) nounwind { 4697; X86-LABEL: length127_eq_const: 4698; X86: # %bb.0: 4699; X86-NEXT: pushl $0 4700; X86-NEXT: pushl $127 4701; X86-NEXT: pushl $.L.str 4702; X86-NEXT: pushl {{[0-9]+}}(%esp) 4703; X86-NEXT: calll memcmp 4704; X86-NEXT: addl $16, %esp 4705; X86-NEXT: testl %eax, %eax 4706; X86-NEXT: sete %al 4707; X86-NEXT: retl 4708; 4709; X64-SSE-LABEL: length127_eq_const: 4710; X64-SSE: # %bb.0: 4711; X64-SSE-NEXT: pushq %rax 4712; X64-SSE-NEXT: movl $.L.str, %esi 4713; X64-SSE-NEXT: movl $127, %edx 4714; X64-SSE-NEXT: callq memcmp 4715; X64-SSE-NEXT: testl %eax, %eax 4716; X64-SSE-NEXT: sete %al 4717; X64-SSE-NEXT: popq %rcx 4718; X64-SSE-NEXT: retq 4719; 4720; X64-AVX1-LABEL: length127_eq_const: 4721; X64-AVX1: # %bb.0: 4722; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 4723; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1 4724; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm2 4725; X64-AVX1-NEXT: vmovups 95(%rdi), %ymm3 4726; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 4727; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 4728; X64-AVX1-NEXT: vorps %ymm3, %ymm2, %ymm2 4729; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 4730; X64-AVX1-NEXT: vorps %ymm2, %ymm1, %ymm1 4731; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 4732; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 4733; X64-AVX1-NEXT: vptest %ymm0, %ymm0 4734; X64-AVX1-NEXT: sete %al 4735; X64-AVX1-NEXT: vzeroupper 4736; X64-AVX1-NEXT: retq 4737; 4738; X64-AVX2-LABEL: length127_eq_const: 4739; X64-AVX2: # %bb.0: 4740; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 4741; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 4742; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2 4743; X64-AVX2-NEXT: vmovdqu 95(%rdi), %ymm3 4744; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 4745; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 4746; X64-AVX2-NEXT: vpor %ymm3, %ymm2, %ymm2 4747; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 4748; X64-AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1 4749; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 4750; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 4751; X64-AVX2-NEXT: vptest %ymm0, %ymm0 4752; X64-AVX2-NEXT: sete %al 4753; X64-AVX2-NEXT: vzeroupper 4754; X64-AVX2-NEXT: retq 4755; 4756; X64-AVX512BW-LABEL: length127_eq_const: 4757; X64-AVX512BW: # %bb.0: 4758; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 4759; X64-AVX512BW-NEXT: vmovdqu64 63(%rdi), %zmm1 4760; X64-AVX512BW-NEXT: vpcmpneqb .L.str+63(%rip), %zmm1, %k0 4761; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k1 4762; X64-AVX512BW-NEXT: kortestq %k0, %k1 4763; X64-AVX512BW-NEXT: sete %al 4764; X64-AVX512BW-NEXT: vzeroupper 4765; X64-AVX512BW-NEXT: retq 4766; 4767; X64-AVX512F-LABEL: length127_eq_const: 4768; X64-AVX512F: # %bb.0: 4769; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 4770; X64-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1 4771; X64-AVX512F-NEXT: vpcmpneqd .L.str+63(%rip), %zmm1, %k0 4772; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1 4773; X64-AVX512F-NEXT: kortestw %k0, %k1 4774; X64-AVX512F-NEXT: sete %al 4775; X64-AVX512F-NEXT: vzeroupper 4776; X64-AVX512F-NEXT: retq 4777; 4778; X64-MIC-AVX2-LABEL: length127_eq_const: 4779; X64-MIC-AVX2: # %bb.0: 4780; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0 4781; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 4782; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2 4783; X64-MIC-AVX2-NEXT: vmovdqu 95(%rdi), %ymm3 4784; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm4 = [943142453,842084409,909456435,809056311,875770417,943142453,842084409,909456435] 4785; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm3, %k0 4786; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426] 4787; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm2, %k1 4788; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k0 4789; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408] 4790; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm1, %k1 4791; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 4792; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm1, %zmm0, %k2 4793; X64-MIC-AVX2-NEXT: korw %k1, %k2, %k1 4794; X64-MIC-AVX2-NEXT: kortestw %k0, %k1 4795; X64-MIC-AVX2-NEXT: sete %al 4796; X64-MIC-AVX2-NEXT: vzeroupper 4797; X64-MIC-AVX2-NEXT: retq 4798; 4799; X64-MIC-AVX512F-LABEL: length127_eq_const: 4800; X64-MIC-AVX512F: # %bb.0: 4801; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 4802; X64-MIC-AVX512F-NEXT: vmovdqu64 63(%rdi), %zmm1 4803; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+63(%rip), %zmm1, %k0 4804; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1 4805; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 4806; X64-MIC-AVX512F-NEXT: sete %al 4807; X64-MIC-AVX512F-NEXT: vzeroupper 4808; X64-MIC-AVX512F-NEXT: retq 4809 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 127) nounwind 4810 %c = icmp eq i32 %m, 0 4811 ret i1 %c 4812} 4813 4814define i32 @length128(i8* %X, i8* %Y) nounwind { 4815; X86-LABEL: length128: 4816; X86: # %bb.0: 4817; X86-NEXT: pushl $0 4818; X86-NEXT: pushl $128 4819; X86-NEXT: pushl {{[0-9]+}}(%esp) 4820; X86-NEXT: pushl {{[0-9]+}}(%esp) 4821; X86-NEXT: calll memcmp 4822; X86-NEXT: addl $16, %esp 4823; X86-NEXT: retl 4824; 4825; X64-LABEL: length128: 4826; X64: # %bb.0: 4827; X64-NEXT: movl $128, %edx 4828; X64-NEXT: jmp memcmp # TAILCALL 4829 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 128) nounwind 4830 ret i32 %m 4831} 4832 4833define i1 @length128_eq(i8* %x, i8* %y) nounwind { 4834; X86-LABEL: length128_eq: 4835; X86: # %bb.0: 4836; X86-NEXT: pushl $0 4837; X86-NEXT: pushl $128 4838; X86-NEXT: pushl {{[0-9]+}}(%esp) 4839; X86-NEXT: pushl {{[0-9]+}}(%esp) 4840; X86-NEXT: calll memcmp 4841; X86-NEXT: addl $16, %esp 4842; X86-NEXT: testl %eax, %eax 4843; X86-NEXT: setne %al 4844; X86-NEXT: retl 4845; 4846; X64-SSE-LABEL: length128_eq: 4847; X64-SSE: # %bb.0: 4848; X64-SSE-NEXT: pushq %rax 4849; X64-SSE-NEXT: movl $128, %edx 4850; X64-SSE-NEXT: callq memcmp 4851; X64-SSE-NEXT: testl %eax, %eax 4852; X64-SSE-NEXT: setne %al 4853; X64-SSE-NEXT: popq %rcx 4854; X64-SSE-NEXT: retq 4855; 4856; X64-AVX1-LABEL: length128_eq: 4857; X64-AVX1: # %bb.0: 4858; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 4859; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1 4860; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm2 4861; X64-AVX1-NEXT: vmovups 96(%rdi), %ymm3 4862; X64-AVX1-NEXT: vxorps 96(%rsi), %ymm3, %ymm3 4863; X64-AVX1-NEXT: vxorps 64(%rsi), %ymm2, %ymm2 4864; X64-AVX1-NEXT: vorps %ymm3, %ymm2, %ymm2 4865; X64-AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1 4866; X64-AVX1-NEXT: vorps %ymm2, %ymm1, %ymm1 4867; X64-AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 4868; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 4869; X64-AVX1-NEXT: vptest %ymm0, %ymm0 4870; X64-AVX1-NEXT: setne %al 4871; X64-AVX1-NEXT: vzeroupper 4872; X64-AVX1-NEXT: retq 4873; 4874; X64-AVX2-LABEL: length128_eq: 4875; X64-AVX2: # %bb.0: 4876; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 4877; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 4878; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2 4879; X64-AVX2-NEXT: vmovdqu 96(%rdi), %ymm3 4880; X64-AVX2-NEXT: vpxor 96(%rsi), %ymm3, %ymm3 4881; X64-AVX2-NEXT: vpxor 64(%rsi), %ymm2, %ymm2 4882; X64-AVX2-NEXT: vpor %ymm3, %ymm2, %ymm2 4883; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1 4884; X64-AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1 4885; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 4886; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 4887; X64-AVX2-NEXT: vptest %ymm0, %ymm0 4888; X64-AVX2-NEXT: setne %al 4889; X64-AVX2-NEXT: vzeroupper 4890; X64-AVX2-NEXT: retq 4891; 4892; X64-AVX512BW-LABEL: length128_eq: 4893; X64-AVX512BW: # %bb.0: 4894; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 4895; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1 4896; X64-AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k0 4897; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k1 4898; X64-AVX512BW-NEXT: kortestq %k0, %k1 4899; X64-AVX512BW-NEXT: setne %al 4900; X64-AVX512BW-NEXT: vzeroupper 4901; X64-AVX512BW-NEXT: retq 4902; 4903; X64-AVX512F-LABEL: length128_eq: 4904; X64-AVX512F: # %bb.0: 4905; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 4906; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 4907; X64-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0 4908; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 4909; X64-AVX512F-NEXT: kortestw %k0, %k1 4910; X64-AVX512F-NEXT: setne %al 4911; X64-AVX512F-NEXT: vzeroupper 4912; X64-AVX512F-NEXT: retq 4913; 4914; X64-MIC-AVX2-LABEL: length128_eq: 4915; X64-MIC-AVX2: # %bb.0: 4916; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0 4917; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 4918; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2 4919; X64-MIC-AVX2-NEXT: vmovdqu 96(%rdi), %ymm3 4920; X64-MIC-AVX2-NEXT: vmovdqu (%rsi), %ymm4 4921; X64-MIC-AVX2-NEXT: vmovdqu 32(%rsi), %ymm5 4922; X64-MIC-AVX2-NEXT: vmovdqu 64(%rsi), %ymm6 4923; X64-MIC-AVX2-NEXT: vmovdqu 96(%rsi), %ymm7 4924; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm7, %zmm3, %k0 4925; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm6, %zmm2, %k1 4926; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k0 4927; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm5, %zmm1, %k1 4928; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm0, %k2 4929; X64-MIC-AVX2-NEXT: korw %k1, %k2, %k1 4930; X64-MIC-AVX2-NEXT: kortestw %k0, %k1 4931; X64-MIC-AVX2-NEXT: setne %al 4932; X64-MIC-AVX2-NEXT: vzeroupper 4933; X64-MIC-AVX2-NEXT: retq 4934; 4935; X64-MIC-AVX512F-LABEL: length128_eq: 4936; X64-MIC-AVX512F: # %bb.0: 4937; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 4938; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 4939; X64-MIC-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0 4940; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 4941; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 4942; X64-MIC-AVX512F-NEXT: setne %al 4943; X64-MIC-AVX512F-NEXT: vzeroupper 4944; X64-MIC-AVX512F-NEXT: retq 4945 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 128) nounwind 4946 %cmp = icmp ne i32 %call, 0 4947 ret i1 %cmp 4948} 4949 4950define i1 @length128_lt(i8* %x, i8* %y) nounwind { 4951; X86-LABEL: length128_lt: 4952; X86: # %bb.0: 4953; X86-NEXT: pushl $0 4954; X86-NEXT: pushl $128 4955; X86-NEXT: pushl {{[0-9]+}}(%esp) 4956; X86-NEXT: pushl {{[0-9]+}}(%esp) 4957; X86-NEXT: calll memcmp 4958; X86-NEXT: addl $16, %esp 4959; X86-NEXT: shrl $31, %eax 4960; X86-NEXT: # kill: def $al killed $al killed $eax 4961; X86-NEXT: retl 4962; 4963; X64-LABEL: length128_lt: 4964; X64: # %bb.0: 4965; X64-NEXT: pushq %rax 4966; X64-NEXT: movl $128, %edx 4967; X64-NEXT: callq memcmp 4968; X64-NEXT: shrl $31, %eax 4969; X64-NEXT: # kill: def $al killed $al killed $eax 4970; X64-NEXT: popq %rcx 4971; X64-NEXT: retq 4972 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 128) nounwind 4973 %cmp = icmp slt i32 %call, 0 4974 ret i1 %cmp 4975} 4976 4977define i1 @length128_gt(i8* %x, i8* %y) nounwind { 4978; X86-LABEL: length128_gt: 4979; X86: # %bb.0: 4980; X86-NEXT: pushl $0 4981; X86-NEXT: pushl $128 4982; X86-NEXT: pushl {{[0-9]+}}(%esp) 4983; X86-NEXT: pushl {{[0-9]+}}(%esp) 4984; X86-NEXT: calll memcmp 4985; X86-NEXT: addl $16, %esp 4986; X86-NEXT: testl %eax, %eax 4987; X86-NEXT: setg %al 4988; X86-NEXT: retl 4989; 4990; X64-LABEL: length128_gt: 4991; X64: # %bb.0: 4992; X64-NEXT: pushq %rax 4993; X64-NEXT: movl $128, %edx 4994; X64-NEXT: callq memcmp 4995; X64-NEXT: testl %eax, %eax 4996; X64-NEXT: setg %al 4997; X64-NEXT: popq %rcx 4998; X64-NEXT: retq 4999 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 128) nounwind 5000 %cmp = icmp sgt i32 %call, 0 5001 ret i1 %cmp 5002} 5003 5004define i1 @length128_eq_const(i8* %X) nounwind { 5005; X86-LABEL: length128_eq_const: 5006; X86: # %bb.0: 5007; X86-NEXT: pushl $0 5008; X86-NEXT: pushl $128 5009; X86-NEXT: pushl $.L.str 5010; X86-NEXT: pushl {{[0-9]+}}(%esp) 5011; X86-NEXT: calll memcmp 5012; X86-NEXT: addl $16, %esp 5013; X86-NEXT: testl %eax, %eax 5014; X86-NEXT: sete %al 5015; X86-NEXT: retl 5016; 5017; X64-SSE-LABEL: length128_eq_const: 5018; X64-SSE: # %bb.0: 5019; X64-SSE-NEXT: pushq %rax 5020; X64-SSE-NEXT: movl $.L.str, %esi 5021; X64-SSE-NEXT: movl $128, %edx 5022; X64-SSE-NEXT: callq memcmp 5023; X64-SSE-NEXT: testl %eax, %eax 5024; X64-SSE-NEXT: sete %al 5025; X64-SSE-NEXT: popq %rcx 5026; X64-SSE-NEXT: retq 5027; 5028; X64-AVX1-LABEL: length128_eq_const: 5029; X64-AVX1: # %bb.0: 5030; X64-AVX1-NEXT: vmovups (%rdi), %ymm0 5031; X64-AVX1-NEXT: vmovups 32(%rdi), %ymm1 5032; X64-AVX1-NEXT: vmovups 64(%rdi), %ymm2 5033; X64-AVX1-NEXT: vmovups 96(%rdi), %ymm3 5034; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 5035; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 5036; X64-AVX1-NEXT: vorps %ymm3, %ymm2, %ymm2 5037; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 5038; X64-AVX1-NEXT: vorps %ymm2, %ymm1, %ymm1 5039; X64-AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 5040; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 5041; X64-AVX1-NEXT: vptest %ymm0, %ymm0 5042; X64-AVX1-NEXT: sete %al 5043; X64-AVX1-NEXT: vzeroupper 5044; X64-AVX1-NEXT: retq 5045; 5046; X64-AVX2-LABEL: length128_eq_const: 5047; X64-AVX2: # %bb.0: 5048; X64-AVX2-NEXT: vmovdqu (%rdi), %ymm0 5049; X64-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 5050; X64-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2 5051; X64-AVX2-NEXT: vmovdqu 96(%rdi), %ymm3 5052; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 5053; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 5054; X64-AVX2-NEXT: vpor %ymm3, %ymm2, %ymm2 5055; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 5056; X64-AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1 5057; X64-AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 5058; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 5059; X64-AVX2-NEXT: vptest %ymm0, %ymm0 5060; X64-AVX2-NEXT: sete %al 5061; X64-AVX2-NEXT: vzeroupper 5062; X64-AVX2-NEXT: retq 5063; 5064; X64-AVX512BW-LABEL: length128_eq_const: 5065; X64-AVX512BW: # %bb.0: 5066; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 5067; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1 5068; X64-AVX512BW-NEXT: vpcmpneqb .L.str+64(%rip), %zmm1, %k0 5069; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k1 5070; X64-AVX512BW-NEXT: kortestq %k0, %k1 5071; X64-AVX512BW-NEXT: sete %al 5072; X64-AVX512BW-NEXT: vzeroupper 5073; X64-AVX512BW-NEXT: retq 5074; 5075; X64-AVX512F-LABEL: length128_eq_const: 5076; X64-AVX512F: # %bb.0: 5077; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 5078; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 5079; X64-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k0 5080; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1 5081; X64-AVX512F-NEXT: kortestw %k0, %k1 5082; X64-AVX512F-NEXT: sete %al 5083; X64-AVX512F-NEXT: vzeroupper 5084; X64-AVX512F-NEXT: retq 5085; 5086; X64-MIC-AVX2-LABEL: length128_eq_const: 5087; X64-MIC-AVX2: # %bb.0: 5088; X64-MIC-AVX2-NEXT: vmovdqu (%rdi), %ymm0 5089; X64-MIC-AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 5090; X64-MIC-AVX2-NEXT: vmovdqu 64(%rdi), %ymm2 5091; X64-MIC-AVX2-NEXT: vmovdqu 96(%rdi), %ymm3 5092; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm4 = [959985462,858927408,926299444,825243960,892613426,959985462,858927408,926299444] 5093; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm4, %zmm3, %k0 5094; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [926299444,825243960,892613426,959985462,858927408,926299444,825243960,892613426] 5095; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm3, %zmm2, %k1 5096; X64-MIC-AVX2-NEXT: korw %k0, %k1, %k0 5097; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [892613426,959985462,858927408,926299444,825243960,892613426,959985462,858927408] 5098; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm2, %zmm1, %k1 5099; X64-MIC-AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [858927408,926299444,825243960,892613426,959985462,858927408,926299444,825243960] 5100; X64-MIC-AVX2-NEXT: vpcmpneqd %zmm1, %zmm0, %k2 5101; X64-MIC-AVX2-NEXT: korw %k1, %k2, %k1 5102; X64-MIC-AVX2-NEXT: kortestw %k0, %k1 5103; X64-MIC-AVX2-NEXT: sete %al 5104; X64-MIC-AVX2-NEXT: vzeroupper 5105; X64-MIC-AVX2-NEXT: retq 5106; 5107; X64-MIC-AVX512F-LABEL: length128_eq_const: 5108; X64-MIC-AVX512F: # %bb.0: 5109; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 5110; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 5111; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k0 5112; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1 5113; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 5114; X64-MIC-AVX512F-NEXT: sete %al 5115; X64-MIC-AVX512F-NEXT: vzeroupper 5116; X64-MIC-AVX512F-NEXT: retq 5117 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 128) nounwind 5118 %c = icmp eq i32 %m, 0 5119 ret i1 %c 5120} 5121 5122define i32 @length192(i8* %X, i8* %Y) nounwind { 5123; X86-LABEL: length192: 5124; X86: # %bb.0: 5125; X86-NEXT: pushl $0 5126; X86-NEXT: pushl $192 5127; X86-NEXT: pushl {{[0-9]+}}(%esp) 5128; X86-NEXT: pushl {{[0-9]+}}(%esp) 5129; X86-NEXT: calll memcmp 5130; X86-NEXT: addl $16, %esp 5131; X86-NEXT: retl 5132; 5133; X64-LABEL: length192: 5134; X64: # %bb.0: 5135; X64-NEXT: movl $192, %edx 5136; X64-NEXT: jmp memcmp # TAILCALL 5137 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 192) nounwind 5138 ret i32 %m 5139} 5140 5141define i1 @length192_eq(i8* %x, i8* %y) nounwind { 5142; X86-LABEL: length192_eq: 5143; X86: # %bb.0: 5144; X86-NEXT: pushl $0 5145; X86-NEXT: pushl $192 5146; X86-NEXT: pushl {{[0-9]+}}(%esp) 5147; X86-NEXT: pushl {{[0-9]+}}(%esp) 5148; X86-NEXT: calll memcmp 5149; X86-NEXT: addl $16, %esp 5150; X86-NEXT: testl %eax, %eax 5151; X86-NEXT: setne %al 5152; X86-NEXT: retl 5153; 5154; X64-SSE-LABEL: length192_eq: 5155; X64-SSE: # %bb.0: 5156; X64-SSE-NEXT: pushq %rax 5157; X64-SSE-NEXT: movl $192, %edx 5158; X64-SSE-NEXT: callq memcmp 5159; X64-SSE-NEXT: testl %eax, %eax 5160; X64-SSE-NEXT: setne %al 5161; X64-SSE-NEXT: popq %rcx 5162; X64-SSE-NEXT: retq 5163; 5164; X64-AVX1-LABEL: length192_eq: 5165; X64-AVX1: # %bb.0: 5166; X64-AVX1-NEXT: pushq %rax 5167; X64-AVX1-NEXT: movl $192, %edx 5168; X64-AVX1-NEXT: callq memcmp 5169; X64-AVX1-NEXT: testl %eax, %eax 5170; X64-AVX1-NEXT: setne %al 5171; X64-AVX1-NEXT: popq %rcx 5172; X64-AVX1-NEXT: retq 5173; 5174; X64-AVX2-LABEL: length192_eq: 5175; X64-AVX2: # %bb.0: 5176; X64-AVX2-NEXT: pushq %rax 5177; X64-AVX2-NEXT: movl $192, %edx 5178; X64-AVX2-NEXT: callq memcmp 5179; X64-AVX2-NEXT: testl %eax, %eax 5180; X64-AVX2-NEXT: setne %al 5181; X64-AVX2-NEXT: popq %rcx 5182; X64-AVX2-NEXT: retq 5183; 5184; X64-AVX512BW-LABEL: length192_eq: 5185; X64-AVX512BW: # %bb.0: 5186; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 5187; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1 5188; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm2 5189; X64-AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k0 5190; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k1 5191; X64-AVX512BW-NEXT: korq %k0, %k1, %k0 5192; X64-AVX512BW-NEXT: vpcmpneqb 128(%rsi), %zmm2, %k1 5193; X64-AVX512BW-NEXT: kortestq %k1, %k0 5194; X64-AVX512BW-NEXT: setne %al 5195; X64-AVX512BW-NEXT: vzeroupper 5196; X64-AVX512BW-NEXT: retq 5197; 5198; X64-AVX512F-LABEL: length192_eq: 5199; X64-AVX512F: # %bb.0: 5200; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 5201; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 5202; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2 5203; X64-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0 5204; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 5205; X64-AVX512F-NEXT: korw %k0, %k1, %k0 5206; X64-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k1 5207; X64-AVX512F-NEXT: kortestw %k1, %k0 5208; X64-AVX512F-NEXT: setne %al 5209; X64-AVX512F-NEXT: vzeroupper 5210; X64-AVX512F-NEXT: retq 5211; 5212; X64-MIC-AVX2-LABEL: length192_eq: 5213; X64-MIC-AVX2: # %bb.0: 5214; X64-MIC-AVX2-NEXT: pushq %rax 5215; X64-MIC-AVX2-NEXT: movl $192, %edx 5216; X64-MIC-AVX2-NEXT: callq memcmp 5217; X64-MIC-AVX2-NEXT: testl %eax, %eax 5218; X64-MIC-AVX2-NEXT: setne %al 5219; X64-MIC-AVX2-NEXT: popq %rcx 5220; X64-MIC-AVX2-NEXT: retq 5221; 5222; X64-MIC-AVX512F-LABEL: length192_eq: 5223; X64-MIC-AVX512F: # %bb.0: 5224; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 5225; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 5226; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2 5227; X64-MIC-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0 5228; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 5229; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k0 5230; X64-MIC-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k1 5231; X64-MIC-AVX512F-NEXT: kortestw %k1, %k0 5232; X64-MIC-AVX512F-NEXT: setne %al 5233; X64-MIC-AVX512F-NEXT: vzeroupper 5234; X64-MIC-AVX512F-NEXT: retq 5235 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 192) nounwind 5236 %cmp = icmp ne i32 %call, 0 5237 ret i1 %cmp 5238} 5239 5240define i1 @length192_lt(i8* %x, i8* %y) nounwind { 5241; X86-LABEL: length192_lt: 5242; X86: # %bb.0: 5243; X86-NEXT: pushl $0 5244; X86-NEXT: pushl $192 5245; X86-NEXT: pushl {{[0-9]+}}(%esp) 5246; X86-NEXT: pushl {{[0-9]+}}(%esp) 5247; X86-NEXT: calll memcmp 5248; X86-NEXT: addl $16, %esp 5249; X86-NEXT: shrl $31, %eax 5250; X86-NEXT: # kill: def $al killed $al killed $eax 5251; X86-NEXT: retl 5252; 5253; X64-LABEL: length192_lt: 5254; X64: # %bb.0: 5255; X64-NEXT: pushq %rax 5256; X64-NEXT: movl $192, %edx 5257; X64-NEXT: callq memcmp 5258; X64-NEXT: shrl $31, %eax 5259; X64-NEXT: # kill: def $al killed $al killed $eax 5260; X64-NEXT: popq %rcx 5261; X64-NEXT: retq 5262 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 192) nounwind 5263 %cmp = icmp slt i32 %call, 0 5264 ret i1 %cmp 5265} 5266 5267define i1 @length192_gt(i8* %x, i8* %y) nounwind { 5268; X86-LABEL: length192_gt: 5269; X86: # %bb.0: 5270; X86-NEXT: pushl $0 5271; X86-NEXT: pushl $192 5272; X86-NEXT: pushl {{[0-9]+}}(%esp) 5273; X86-NEXT: pushl {{[0-9]+}}(%esp) 5274; X86-NEXT: calll memcmp 5275; X86-NEXT: addl $16, %esp 5276; X86-NEXT: testl %eax, %eax 5277; X86-NEXT: setg %al 5278; X86-NEXT: retl 5279; 5280; X64-LABEL: length192_gt: 5281; X64: # %bb.0: 5282; X64-NEXT: pushq %rax 5283; X64-NEXT: movl $192, %edx 5284; X64-NEXT: callq memcmp 5285; X64-NEXT: testl %eax, %eax 5286; X64-NEXT: setg %al 5287; X64-NEXT: popq %rcx 5288; X64-NEXT: retq 5289 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 192) nounwind 5290 %cmp = icmp sgt i32 %call, 0 5291 ret i1 %cmp 5292} 5293 5294define i1 @length192_eq_const(i8* %X) nounwind { 5295; X86-LABEL: length192_eq_const: 5296; X86: # %bb.0: 5297; X86-NEXT: pushl $0 5298; X86-NEXT: pushl $192 5299; X86-NEXT: pushl $.L.str 5300; X86-NEXT: pushl {{[0-9]+}}(%esp) 5301; X86-NEXT: calll memcmp 5302; X86-NEXT: addl $16, %esp 5303; X86-NEXT: testl %eax, %eax 5304; X86-NEXT: sete %al 5305; X86-NEXT: retl 5306; 5307; X64-SSE-LABEL: length192_eq_const: 5308; X64-SSE: # %bb.0: 5309; X64-SSE-NEXT: pushq %rax 5310; X64-SSE-NEXT: movl $.L.str, %esi 5311; X64-SSE-NEXT: movl $192, %edx 5312; X64-SSE-NEXT: callq memcmp 5313; X64-SSE-NEXT: testl %eax, %eax 5314; X64-SSE-NEXT: sete %al 5315; X64-SSE-NEXT: popq %rcx 5316; X64-SSE-NEXT: retq 5317; 5318; X64-AVX1-LABEL: length192_eq_const: 5319; X64-AVX1: # %bb.0: 5320; X64-AVX1-NEXT: pushq %rax 5321; X64-AVX1-NEXT: movl $.L.str, %esi 5322; X64-AVX1-NEXT: movl $192, %edx 5323; X64-AVX1-NEXT: callq memcmp 5324; X64-AVX1-NEXT: testl %eax, %eax 5325; X64-AVX1-NEXT: sete %al 5326; X64-AVX1-NEXT: popq %rcx 5327; X64-AVX1-NEXT: retq 5328; 5329; X64-AVX2-LABEL: length192_eq_const: 5330; X64-AVX2: # %bb.0: 5331; X64-AVX2-NEXT: pushq %rax 5332; X64-AVX2-NEXT: movl $.L.str, %esi 5333; X64-AVX2-NEXT: movl $192, %edx 5334; X64-AVX2-NEXT: callq memcmp 5335; X64-AVX2-NEXT: testl %eax, %eax 5336; X64-AVX2-NEXT: sete %al 5337; X64-AVX2-NEXT: popq %rcx 5338; X64-AVX2-NEXT: retq 5339; 5340; X64-AVX512BW-LABEL: length192_eq_const: 5341; X64-AVX512BW: # %bb.0: 5342; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 5343; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1 5344; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm2 5345; X64-AVX512BW-NEXT: vpcmpneqb .L.str+64(%rip), %zmm1, %k0 5346; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k1 5347; X64-AVX512BW-NEXT: korq %k0, %k1, %k0 5348; X64-AVX512BW-NEXT: vpcmpneqb .L.str+128(%rip), %zmm2, %k1 5349; X64-AVX512BW-NEXT: kortestq %k1, %k0 5350; X64-AVX512BW-NEXT: sete %al 5351; X64-AVX512BW-NEXT: vzeroupper 5352; X64-AVX512BW-NEXT: retq 5353; 5354; X64-AVX512F-LABEL: length192_eq_const: 5355; X64-AVX512F: # %bb.0: 5356; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 5357; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 5358; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2 5359; X64-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k0 5360; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1 5361; X64-AVX512F-NEXT: korw %k0, %k1, %k0 5362; X64-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k1 5363; X64-AVX512F-NEXT: kortestw %k1, %k0 5364; X64-AVX512F-NEXT: sete %al 5365; X64-AVX512F-NEXT: vzeroupper 5366; X64-AVX512F-NEXT: retq 5367; 5368; X64-MIC-AVX2-LABEL: length192_eq_const: 5369; X64-MIC-AVX2: # %bb.0: 5370; X64-MIC-AVX2-NEXT: pushq %rax 5371; X64-MIC-AVX2-NEXT: movl $.L.str, %esi 5372; X64-MIC-AVX2-NEXT: movl $192, %edx 5373; X64-MIC-AVX2-NEXT: callq memcmp 5374; X64-MIC-AVX2-NEXT: testl %eax, %eax 5375; X64-MIC-AVX2-NEXT: sete %al 5376; X64-MIC-AVX2-NEXT: popq %rcx 5377; X64-MIC-AVX2-NEXT: retq 5378; 5379; X64-MIC-AVX512F-LABEL: length192_eq_const: 5380; X64-MIC-AVX512F: # %bb.0: 5381; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 5382; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 5383; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2 5384; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k0 5385; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k1 5386; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k0 5387; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k1 5388; X64-MIC-AVX512F-NEXT: kortestw %k1, %k0 5389; X64-MIC-AVX512F-NEXT: sete %al 5390; X64-MIC-AVX512F-NEXT: vzeroupper 5391; X64-MIC-AVX512F-NEXT: retq 5392 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 192) nounwind 5393 %c = icmp eq i32 %m, 0 5394 ret i1 %c 5395} 5396 5397define i32 @length255(i8* %X, i8* %Y) nounwind { 5398; X86-LABEL: length255: 5399; X86: # %bb.0: 5400; X86-NEXT: pushl $0 5401; X86-NEXT: pushl $255 5402; X86-NEXT: pushl {{[0-9]+}}(%esp) 5403; X86-NEXT: pushl {{[0-9]+}}(%esp) 5404; X86-NEXT: calll memcmp 5405; X86-NEXT: addl $16, %esp 5406; X86-NEXT: retl 5407; 5408; X64-LABEL: length255: 5409; X64: # %bb.0: 5410; X64-NEXT: movl $255, %edx 5411; X64-NEXT: jmp memcmp # TAILCALL 5412 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 255) nounwind 5413 ret i32 %m 5414} 5415 5416define i1 @length255_eq(i8* %x, i8* %y) nounwind { 5417; X86-LABEL: length255_eq: 5418; X86: # %bb.0: 5419; X86-NEXT: pushl $0 5420; X86-NEXT: pushl $255 5421; X86-NEXT: pushl {{[0-9]+}}(%esp) 5422; X86-NEXT: pushl {{[0-9]+}}(%esp) 5423; X86-NEXT: calll memcmp 5424; X86-NEXT: addl $16, %esp 5425; X86-NEXT: testl %eax, %eax 5426; X86-NEXT: setne %al 5427; X86-NEXT: retl 5428; 5429; X64-SSE-LABEL: length255_eq: 5430; X64-SSE: # %bb.0: 5431; X64-SSE-NEXT: pushq %rax 5432; X64-SSE-NEXT: movl $255, %edx 5433; X64-SSE-NEXT: callq memcmp 5434; X64-SSE-NEXT: testl %eax, %eax 5435; X64-SSE-NEXT: setne %al 5436; X64-SSE-NEXT: popq %rcx 5437; X64-SSE-NEXT: retq 5438; 5439; X64-AVX1-LABEL: length255_eq: 5440; X64-AVX1: # %bb.0: 5441; X64-AVX1-NEXT: pushq %rax 5442; X64-AVX1-NEXT: movl $255, %edx 5443; X64-AVX1-NEXT: callq memcmp 5444; X64-AVX1-NEXT: testl %eax, %eax 5445; X64-AVX1-NEXT: setne %al 5446; X64-AVX1-NEXT: popq %rcx 5447; X64-AVX1-NEXT: retq 5448; 5449; X64-AVX2-LABEL: length255_eq: 5450; X64-AVX2: # %bb.0: 5451; X64-AVX2-NEXT: pushq %rax 5452; X64-AVX2-NEXT: movl $255, %edx 5453; X64-AVX2-NEXT: callq memcmp 5454; X64-AVX2-NEXT: testl %eax, %eax 5455; X64-AVX2-NEXT: setne %al 5456; X64-AVX2-NEXT: popq %rcx 5457; X64-AVX2-NEXT: retq 5458; 5459; X64-AVX512BW-LABEL: length255_eq: 5460; X64-AVX512BW: # %bb.0: 5461; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 5462; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1 5463; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm2 5464; X64-AVX512BW-NEXT: vmovdqu64 191(%rdi), %zmm3 5465; X64-AVX512BW-NEXT: vpcmpneqb 191(%rsi), %zmm3, %k0 5466; X64-AVX512BW-NEXT: vpcmpneqb 128(%rsi), %zmm2, %k1 5467; X64-AVX512BW-NEXT: korq %k0, %k1, %k0 5468; X64-AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k1 5469; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k2 5470; X64-AVX512BW-NEXT: korq %k1, %k2, %k1 5471; X64-AVX512BW-NEXT: kortestq %k0, %k1 5472; X64-AVX512BW-NEXT: setne %al 5473; X64-AVX512BW-NEXT: vzeroupper 5474; X64-AVX512BW-NEXT: retq 5475; 5476; X64-AVX512F-LABEL: length255_eq: 5477; X64-AVX512F: # %bb.0: 5478; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 5479; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 5480; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2 5481; X64-AVX512F-NEXT: vmovdqu64 191(%rdi), %zmm3 5482; X64-AVX512F-NEXT: vpcmpneqd 191(%rsi), %zmm3, %k0 5483; X64-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k1 5484; X64-AVX512F-NEXT: korw %k0, %k1, %k0 5485; X64-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k1 5486; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k2 5487; X64-AVX512F-NEXT: korw %k1, %k2, %k1 5488; X64-AVX512F-NEXT: kortestw %k0, %k1 5489; X64-AVX512F-NEXT: setne %al 5490; X64-AVX512F-NEXT: vzeroupper 5491; X64-AVX512F-NEXT: retq 5492; 5493; X64-MIC-AVX2-LABEL: length255_eq: 5494; X64-MIC-AVX2: # %bb.0: 5495; X64-MIC-AVX2-NEXT: pushq %rax 5496; X64-MIC-AVX2-NEXT: movl $255, %edx 5497; X64-MIC-AVX2-NEXT: callq memcmp 5498; X64-MIC-AVX2-NEXT: testl %eax, %eax 5499; X64-MIC-AVX2-NEXT: setne %al 5500; X64-MIC-AVX2-NEXT: popq %rcx 5501; X64-MIC-AVX2-NEXT: retq 5502; 5503; X64-MIC-AVX512F-LABEL: length255_eq: 5504; X64-MIC-AVX512F: # %bb.0: 5505; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 5506; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 5507; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2 5508; X64-MIC-AVX512F-NEXT: vmovdqu64 191(%rdi), %zmm3 5509; X64-MIC-AVX512F-NEXT: vpcmpneqd 191(%rsi), %zmm3, %k0 5510; X64-MIC-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k1 5511; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k0 5512; X64-MIC-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k1 5513; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k2 5514; X64-MIC-AVX512F-NEXT: korw %k1, %k2, %k1 5515; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 5516; X64-MIC-AVX512F-NEXT: setne %al 5517; X64-MIC-AVX512F-NEXT: vzeroupper 5518; X64-MIC-AVX512F-NEXT: retq 5519 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 255) nounwind 5520 %cmp = icmp ne i32 %call, 0 5521 ret i1 %cmp 5522} 5523 5524define i1 @length255_lt(i8* %x, i8* %y) nounwind { 5525; X86-LABEL: length255_lt: 5526; X86: # %bb.0: 5527; X86-NEXT: pushl $0 5528; X86-NEXT: pushl $255 5529; X86-NEXT: pushl {{[0-9]+}}(%esp) 5530; X86-NEXT: pushl {{[0-9]+}}(%esp) 5531; X86-NEXT: calll memcmp 5532; X86-NEXT: addl $16, %esp 5533; X86-NEXT: shrl $31, %eax 5534; X86-NEXT: # kill: def $al killed $al killed $eax 5535; X86-NEXT: retl 5536; 5537; X64-LABEL: length255_lt: 5538; X64: # %bb.0: 5539; X64-NEXT: pushq %rax 5540; X64-NEXT: movl $255, %edx 5541; X64-NEXT: callq memcmp 5542; X64-NEXT: shrl $31, %eax 5543; X64-NEXT: # kill: def $al killed $al killed $eax 5544; X64-NEXT: popq %rcx 5545; X64-NEXT: retq 5546 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 255) nounwind 5547 %cmp = icmp slt i32 %call, 0 5548 ret i1 %cmp 5549} 5550 5551define i1 @length255_gt(i8* %x, i8* %y) nounwind { 5552; X86-LABEL: length255_gt: 5553; X86: # %bb.0: 5554; X86-NEXT: pushl $0 5555; X86-NEXT: pushl $255 5556; X86-NEXT: pushl {{[0-9]+}}(%esp) 5557; X86-NEXT: pushl {{[0-9]+}}(%esp) 5558; X86-NEXT: calll memcmp 5559; X86-NEXT: addl $16, %esp 5560; X86-NEXT: testl %eax, %eax 5561; X86-NEXT: setg %al 5562; X86-NEXT: retl 5563; 5564; X64-LABEL: length255_gt: 5565; X64: # %bb.0: 5566; X64-NEXT: pushq %rax 5567; X64-NEXT: movl $255, %edx 5568; X64-NEXT: callq memcmp 5569; X64-NEXT: testl %eax, %eax 5570; X64-NEXT: setg %al 5571; X64-NEXT: popq %rcx 5572; X64-NEXT: retq 5573 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 255) nounwind 5574 %cmp = icmp sgt i32 %call, 0 5575 ret i1 %cmp 5576} 5577 5578define i1 @length255_eq_const(i8* %X) nounwind { 5579; X86-LABEL: length255_eq_const: 5580; X86: # %bb.0: 5581; X86-NEXT: pushl $0 5582; X86-NEXT: pushl $255 5583; X86-NEXT: pushl $.L.str 5584; X86-NEXT: pushl {{[0-9]+}}(%esp) 5585; X86-NEXT: calll memcmp 5586; X86-NEXT: addl $16, %esp 5587; X86-NEXT: testl %eax, %eax 5588; X86-NEXT: sete %al 5589; X86-NEXT: retl 5590; 5591; X64-SSE-LABEL: length255_eq_const: 5592; X64-SSE: # %bb.0: 5593; X64-SSE-NEXT: pushq %rax 5594; X64-SSE-NEXT: movl $.L.str, %esi 5595; X64-SSE-NEXT: movl $255, %edx 5596; X64-SSE-NEXT: callq memcmp 5597; X64-SSE-NEXT: testl %eax, %eax 5598; X64-SSE-NEXT: sete %al 5599; X64-SSE-NEXT: popq %rcx 5600; X64-SSE-NEXT: retq 5601; 5602; X64-AVX1-LABEL: length255_eq_const: 5603; X64-AVX1: # %bb.0: 5604; X64-AVX1-NEXT: pushq %rax 5605; X64-AVX1-NEXT: movl $.L.str, %esi 5606; X64-AVX1-NEXT: movl $255, %edx 5607; X64-AVX1-NEXT: callq memcmp 5608; X64-AVX1-NEXT: testl %eax, %eax 5609; X64-AVX1-NEXT: sete %al 5610; X64-AVX1-NEXT: popq %rcx 5611; X64-AVX1-NEXT: retq 5612; 5613; X64-AVX2-LABEL: length255_eq_const: 5614; X64-AVX2: # %bb.0: 5615; X64-AVX2-NEXT: pushq %rax 5616; X64-AVX2-NEXT: movl $.L.str, %esi 5617; X64-AVX2-NEXT: movl $255, %edx 5618; X64-AVX2-NEXT: callq memcmp 5619; X64-AVX2-NEXT: testl %eax, %eax 5620; X64-AVX2-NEXT: sete %al 5621; X64-AVX2-NEXT: popq %rcx 5622; X64-AVX2-NEXT: retq 5623; 5624; X64-AVX512BW-LABEL: length255_eq_const: 5625; X64-AVX512BW: # %bb.0: 5626; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 5627; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1 5628; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm2 5629; X64-AVX512BW-NEXT: vmovdqu64 191(%rdi), %zmm3 5630; X64-AVX512BW-NEXT: vpcmpneqb .L.str+191(%rip), %zmm3, %k0 5631; X64-AVX512BW-NEXT: vpcmpneqb .L.str+128(%rip), %zmm2, %k1 5632; X64-AVX512BW-NEXT: korq %k0, %k1, %k0 5633; X64-AVX512BW-NEXT: vpcmpneqb .L.str+64(%rip), %zmm1, %k1 5634; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k2 5635; X64-AVX512BW-NEXT: korq %k1, %k2, %k1 5636; X64-AVX512BW-NEXT: kortestq %k0, %k1 5637; X64-AVX512BW-NEXT: sete %al 5638; X64-AVX512BW-NEXT: vzeroupper 5639; X64-AVX512BW-NEXT: retq 5640; 5641; X64-AVX512F-LABEL: length255_eq_const: 5642; X64-AVX512F: # %bb.0: 5643; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 5644; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 5645; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2 5646; X64-AVX512F-NEXT: vmovdqu64 191(%rdi), %zmm3 5647; X64-AVX512F-NEXT: vpcmpneqd .L.str+191(%rip), %zmm3, %k0 5648; X64-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k1 5649; X64-AVX512F-NEXT: korw %k0, %k1, %k0 5650; X64-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k1 5651; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k2 5652; X64-AVX512F-NEXT: korw %k1, %k2, %k1 5653; X64-AVX512F-NEXT: kortestw %k0, %k1 5654; X64-AVX512F-NEXT: sete %al 5655; X64-AVX512F-NEXT: vzeroupper 5656; X64-AVX512F-NEXT: retq 5657; 5658; X64-MIC-AVX2-LABEL: length255_eq_const: 5659; X64-MIC-AVX2: # %bb.0: 5660; X64-MIC-AVX2-NEXT: pushq %rax 5661; X64-MIC-AVX2-NEXT: movl $.L.str, %esi 5662; X64-MIC-AVX2-NEXT: movl $255, %edx 5663; X64-MIC-AVX2-NEXT: callq memcmp 5664; X64-MIC-AVX2-NEXT: testl %eax, %eax 5665; X64-MIC-AVX2-NEXT: sete %al 5666; X64-MIC-AVX2-NEXT: popq %rcx 5667; X64-MIC-AVX2-NEXT: retq 5668; 5669; X64-MIC-AVX512F-LABEL: length255_eq_const: 5670; X64-MIC-AVX512F: # %bb.0: 5671; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 5672; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 5673; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2 5674; X64-MIC-AVX512F-NEXT: vmovdqu64 191(%rdi), %zmm3 5675; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+191(%rip), %zmm3, %k0 5676; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k1 5677; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k0 5678; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k1 5679; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k2 5680; X64-MIC-AVX512F-NEXT: korw %k1, %k2, %k1 5681; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 5682; X64-MIC-AVX512F-NEXT: sete %al 5683; X64-MIC-AVX512F-NEXT: vzeroupper 5684; X64-MIC-AVX512F-NEXT: retq 5685 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 255) nounwind 5686 %c = icmp eq i32 %m, 0 5687 ret i1 %c 5688} 5689 5690define i32 @length256(i8* %X, i8* %Y) nounwind { 5691; X86-LABEL: length256: 5692; X86: # %bb.0: 5693; X86-NEXT: pushl $0 5694; X86-NEXT: pushl $256 # imm = 0x100 5695; X86-NEXT: pushl {{[0-9]+}}(%esp) 5696; X86-NEXT: pushl {{[0-9]+}}(%esp) 5697; X86-NEXT: calll memcmp 5698; X86-NEXT: addl $16, %esp 5699; X86-NEXT: retl 5700; 5701; X64-LABEL: length256: 5702; X64: # %bb.0: 5703; X64-NEXT: movl $256, %edx # imm = 0x100 5704; X64-NEXT: jmp memcmp # TAILCALL 5705 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 256) nounwind 5706 ret i32 %m 5707} 5708 5709define i1 @length256_eq(i8* %x, i8* %y) nounwind { 5710; X86-LABEL: length256_eq: 5711; X86: # %bb.0: 5712; X86-NEXT: pushl $0 5713; X86-NEXT: pushl $256 # imm = 0x100 5714; X86-NEXT: pushl {{[0-9]+}}(%esp) 5715; X86-NEXT: pushl {{[0-9]+}}(%esp) 5716; X86-NEXT: calll memcmp 5717; X86-NEXT: addl $16, %esp 5718; X86-NEXT: testl %eax, %eax 5719; X86-NEXT: setne %al 5720; X86-NEXT: retl 5721; 5722; X64-SSE-LABEL: length256_eq: 5723; X64-SSE: # %bb.0: 5724; X64-SSE-NEXT: pushq %rax 5725; X64-SSE-NEXT: movl $256, %edx # imm = 0x100 5726; X64-SSE-NEXT: callq memcmp 5727; X64-SSE-NEXT: testl %eax, %eax 5728; X64-SSE-NEXT: setne %al 5729; X64-SSE-NEXT: popq %rcx 5730; X64-SSE-NEXT: retq 5731; 5732; X64-AVX1-LABEL: length256_eq: 5733; X64-AVX1: # %bb.0: 5734; X64-AVX1-NEXT: pushq %rax 5735; X64-AVX1-NEXT: movl $256, %edx # imm = 0x100 5736; X64-AVX1-NEXT: callq memcmp 5737; X64-AVX1-NEXT: testl %eax, %eax 5738; X64-AVX1-NEXT: setne %al 5739; X64-AVX1-NEXT: popq %rcx 5740; X64-AVX1-NEXT: retq 5741; 5742; X64-AVX2-LABEL: length256_eq: 5743; X64-AVX2: # %bb.0: 5744; X64-AVX2-NEXT: pushq %rax 5745; X64-AVX2-NEXT: movl $256, %edx # imm = 0x100 5746; X64-AVX2-NEXT: callq memcmp 5747; X64-AVX2-NEXT: testl %eax, %eax 5748; X64-AVX2-NEXT: setne %al 5749; X64-AVX2-NEXT: popq %rcx 5750; X64-AVX2-NEXT: retq 5751; 5752; X64-AVX512BW-LABEL: length256_eq: 5753; X64-AVX512BW: # %bb.0: 5754; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 5755; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1 5756; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm2 5757; X64-AVX512BW-NEXT: vmovdqu64 192(%rdi), %zmm3 5758; X64-AVX512BW-NEXT: vpcmpneqb 192(%rsi), %zmm3, %k0 5759; X64-AVX512BW-NEXT: vpcmpneqb 128(%rsi), %zmm2, %k1 5760; X64-AVX512BW-NEXT: korq %k0, %k1, %k0 5761; X64-AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k1 5762; X64-AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k2 5763; X64-AVX512BW-NEXT: korq %k1, %k2, %k1 5764; X64-AVX512BW-NEXT: kortestq %k0, %k1 5765; X64-AVX512BW-NEXT: setne %al 5766; X64-AVX512BW-NEXT: vzeroupper 5767; X64-AVX512BW-NEXT: retq 5768; 5769; X64-AVX512F-LABEL: length256_eq: 5770; X64-AVX512F: # %bb.0: 5771; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 5772; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 5773; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2 5774; X64-AVX512F-NEXT: vmovdqu64 192(%rdi), %zmm3 5775; X64-AVX512F-NEXT: vpcmpneqd 192(%rsi), %zmm3, %k0 5776; X64-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k1 5777; X64-AVX512F-NEXT: korw %k0, %k1, %k0 5778; X64-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k1 5779; X64-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k2 5780; X64-AVX512F-NEXT: korw %k1, %k2, %k1 5781; X64-AVX512F-NEXT: kortestw %k0, %k1 5782; X64-AVX512F-NEXT: setne %al 5783; X64-AVX512F-NEXT: vzeroupper 5784; X64-AVX512F-NEXT: retq 5785; 5786; X64-MIC-AVX2-LABEL: length256_eq: 5787; X64-MIC-AVX2: # %bb.0: 5788; X64-MIC-AVX2-NEXT: pushq %rax 5789; X64-MIC-AVX2-NEXT: movl $256, %edx # imm = 0x100 5790; X64-MIC-AVX2-NEXT: callq memcmp 5791; X64-MIC-AVX2-NEXT: testl %eax, %eax 5792; X64-MIC-AVX2-NEXT: setne %al 5793; X64-MIC-AVX2-NEXT: popq %rcx 5794; X64-MIC-AVX2-NEXT: retq 5795; 5796; X64-MIC-AVX512F-LABEL: length256_eq: 5797; X64-MIC-AVX512F: # %bb.0: 5798; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 5799; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 5800; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2 5801; X64-MIC-AVX512F-NEXT: vmovdqu64 192(%rdi), %zmm3 5802; X64-MIC-AVX512F-NEXT: vpcmpneqd 192(%rsi), %zmm3, %k0 5803; X64-MIC-AVX512F-NEXT: vpcmpneqd 128(%rsi), %zmm2, %k1 5804; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k0 5805; X64-MIC-AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k1 5806; X64-MIC-AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k2 5807; X64-MIC-AVX512F-NEXT: korw %k1, %k2, %k1 5808; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 5809; X64-MIC-AVX512F-NEXT: setne %al 5810; X64-MIC-AVX512F-NEXT: vzeroupper 5811; X64-MIC-AVX512F-NEXT: retq 5812 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 256) nounwind 5813 %cmp = icmp ne i32 %call, 0 5814 ret i1 %cmp 5815} 5816 5817define i1 @length256_lt(i8* %x, i8* %y) nounwind { 5818; X86-LABEL: length256_lt: 5819; X86: # %bb.0: 5820; X86-NEXT: pushl $0 5821; X86-NEXT: pushl $256 # imm = 0x100 5822; X86-NEXT: pushl {{[0-9]+}}(%esp) 5823; X86-NEXT: pushl {{[0-9]+}}(%esp) 5824; X86-NEXT: calll memcmp 5825; X86-NEXT: addl $16, %esp 5826; X86-NEXT: shrl $31, %eax 5827; X86-NEXT: # kill: def $al killed $al killed $eax 5828; X86-NEXT: retl 5829; 5830; X64-LABEL: length256_lt: 5831; X64: # %bb.0: 5832; X64-NEXT: pushq %rax 5833; X64-NEXT: movl $256, %edx # imm = 0x100 5834; X64-NEXT: callq memcmp 5835; X64-NEXT: shrl $31, %eax 5836; X64-NEXT: # kill: def $al killed $al killed $eax 5837; X64-NEXT: popq %rcx 5838; X64-NEXT: retq 5839 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 256) nounwind 5840 %cmp = icmp slt i32 %call, 0 5841 ret i1 %cmp 5842} 5843 5844define i1 @length256_gt(i8* %x, i8* %y) nounwind { 5845; X86-LABEL: length256_gt: 5846; X86: # %bb.0: 5847; X86-NEXT: pushl $0 5848; X86-NEXT: pushl $256 # imm = 0x100 5849; X86-NEXT: pushl {{[0-9]+}}(%esp) 5850; X86-NEXT: pushl {{[0-9]+}}(%esp) 5851; X86-NEXT: calll memcmp 5852; X86-NEXT: addl $16, %esp 5853; X86-NEXT: testl %eax, %eax 5854; X86-NEXT: setg %al 5855; X86-NEXT: retl 5856; 5857; X64-LABEL: length256_gt: 5858; X64: # %bb.0: 5859; X64-NEXT: pushq %rax 5860; X64-NEXT: movl $256, %edx # imm = 0x100 5861; X64-NEXT: callq memcmp 5862; X64-NEXT: testl %eax, %eax 5863; X64-NEXT: setg %al 5864; X64-NEXT: popq %rcx 5865; X64-NEXT: retq 5866 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 256) nounwind 5867 %cmp = icmp sgt i32 %call, 0 5868 ret i1 %cmp 5869} 5870 5871define i1 @length256_eq_const(i8* %X) nounwind { 5872; X86-LABEL: length256_eq_const: 5873; X86: # %bb.0: 5874; X86-NEXT: pushl $0 5875; X86-NEXT: pushl $256 # imm = 0x100 5876; X86-NEXT: pushl $.L.str 5877; X86-NEXT: pushl {{[0-9]+}}(%esp) 5878; X86-NEXT: calll memcmp 5879; X86-NEXT: addl $16, %esp 5880; X86-NEXT: testl %eax, %eax 5881; X86-NEXT: sete %al 5882; X86-NEXT: retl 5883; 5884; X64-SSE-LABEL: length256_eq_const: 5885; X64-SSE: # %bb.0: 5886; X64-SSE-NEXT: pushq %rax 5887; X64-SSE-NEXT: movl $.L.str, %esi 5888; X64-SSE-NEXT: movl $256, %edx # imm = 0x100 5889; X64-SSE-NEXT: callq memcmp 5890; X64-SSE-NEXT: testl %eax, %eax 5891; X64-SSE-NEXT: sete %al 5892; X64-SSE-NEXT: popq %rcx 5893; X64-SSE-NEXT: retq 5894; 5895; X64-AVX1-LABEL: length256_eq_const: 5896; X64-AVX1: # %bb.0: 5897; X64-AVX1-NEXT: pushq %rax 5898; X64-AVX1-NEXT: movl $.L.str, %esi 5899; X64-AVX1-NEXT: movl $256, %edx # imm = 0x100 5900; X64-AVX1-NEXT: callq memcmp 5901; X64-AVX1-NEXT: testl %eax, %eax 5902; X64-AVX1-NEXT: sete %al 5903; X64-AVX1-NEXT: popq %rcx 5904; X64-AVX1-NEXT: retq 5905; 5906; X64-AVX2-LABEL: length256_eq_const: 5907; X64-AVX2: # %bb.0: 5908; X64-AVX2-NEXT: pushq %rax 5909; X64-AVX2-NEXT: movl $.L.str, %esi 5910; X64-AVX2-NEXT: movl $256, %edx # imm = 0x100 5911; X64-AVX2-NEXT: callq memcmp 5912; X64-AVX2-NEXT: testl %eax, %eax 5913; X64-AVX2-NEXT: sete %al 5914; X64-AVX2-NEXT: popq %rcx 5915; X64-AVX2-NEXT: retq 5916; 5917; X64-AVX512BW-LABEL: length256_eq_const: 5918; X64-AVX512BW: # %bb.0: 5919; X64-AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 5920; X64-AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1 5921; X64-AVX512BW-NEXT: vmovdqu64 128(%rdi), %zmm2 5922; X64-AVX512BW-NEXT: vmovdqu64 192(%rdi), %zmm3 5923; X64-AVX512BW-NEXT: vpcmpneqb .L.str+192(%rip), %zmm3, %k0 5924; X64-AVX512BW-NEXT: vpcmpneqb .L.str+128(%rip), %zmm2, %k1 5925; X64-AVX512BW-NEXT: korq %k0, %k1, %k0 5926; X64-AVX512BW-NEXT: vpcmpneqb .L.str+64(%rip), %zmm1, %k1 5927; X64-AVX512BW-NEXT: vpcmpneqb .L.str(%rip), %zmm0, %k2 5928; X64-AVX512BW-NEXT: korq %k1, %k2, %k1 5929; X64-AVX512BW-NEXT: kortestq %k0, %k1 5930; X64-AVX512BW-NEXT: sete %al 5931; X64-AVX512BW-NEXT: vzeroupper 5932; X64-AVX512BW-NEXT: retq 5933; 5934; X64-AVX512F-LABEL: length256_eq_const: 5935; X64-AVX512F: # %bb.0: 5936; X64-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 5937; X64-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 5938; X64-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2 5939; X64-AVX512F-NEXT: vmovdqu64 192(%rdi), %zmm3 5940; X64-AVX512F-NEXT: vpcmpneqd .L.str+192(%rip), %zmm3, %k0 5941; X64-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k1 5942; X64-AVX512F-NEXT: korw %k0, %k1, %k0 5943; X64-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k1 5944; X64-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k2 5945; X64-AVX512F-NEXT: korw %k1, %k2, %k1 5946; X64-AVX512F-NEXT: kortestw %k0, %k1 5947; X64-AVX512F-NEXT: sete %al 5948; X64-AVX512F-NEXT: vzeroupper 5949; X64-AVX512F-NEXT: retq 5950; 5951; X64-MIC-AVX2-LABEL: length256_eq_const: 5952; X64-MIC-AVX2: # %bb.0: 5953; X64-MIC-AVX2-NEXT: pushq %rax 5954; X64-MIC-AVX2-NEXT: movl $.L.str, %esi 5955; X64-MIC-AVX2-NEXT: movl $256, %edx # imm = 0x100 5956; X64-MIC-AVX2-NEXT: callq memcmp 5957; X64-MIC-AVX2-NEXT: testl %eax, %eax 5958; X64-MIC-AVX2-NEXT: sete %al 5959; X64-MIC-AVX2-NEXT: popq %rcx 5960; X64-MIC-AVX2-NEXT: retq 5961; 5962; X64-MIC-AVX512F-LABEL: length256_eq_const: 5963; X64-MIC-AVX512F: # %bb.0: 5964; X64-MIC-AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 5965; X64-MIC-AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 5966; X64-MIC-AVX512F-NEXT: vmovdqu64 128(%rdi), %zmm2 5967; X64-MIC-AVX512F-NEXT: vmovdqu64 192(%rdi), %zmm3 5968; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+192(%rip), %zmm3, %k0 5969; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+128(%rip), %zmm2, %k1 5970; X64-MIC-AVX512F-NEXT: korw %k0, %k1, %k0 5971; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str+64(%rip), %zmm1, %k1 5972; X64-MIC-AVX512F-NEXT: vpcmpneqd .L.str(%rip), %zmm0, %k2 5973; X64-MIC-AVX512F-NEXT: korw %k1, %k2, %k1 5974; X64-MIC-AVX512F-NEXT: kortestw %k0, %k1 5975; X64-MIC-AVX512F-NEXT: sete %al 5976; X64-MIC-AVX512F-NEXT: vzeroupper 5977; X64-MIC-AVX512F-NEXT: retq 5978 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 256) nounwind 5979 %c = icmp eq i32 %m, 0 5980 ret i1 %c 5981} 5982 5983define i32 @length384(i8* %X, i8* %Y) nounwind { 5984; X86-LABEL: length384: 5985; X86: # %bb.0: 5986; X86-NEXT: pushl $0 5987; X86-NEXT: pushl $384 # imm = 0x180 5988; X86-NEXT: pushl {{[0-9]+}}(%esp) 5989; X86-NEXT: pushl {{[0-9]+}}(%esp) 5990; X86-NEXT: calll memcmp 5991; X86-NEXT: addl $16, %esp 5992; X86-NEXT: retl 5993; 5994; X64-LABEL: length384: 5995; X64: # %bb.0: 5996; X64-NEXT: movl $384, %edx # imm = 0x180 5997; X64-NEXT: jmp memcmp # TAILCALL 5998 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 384) nounwind 5999 ret i32 %m 6000} 6001 6002define i1 @length384_eq(i8* %x, i8* %y) nounwind { 6003; X86-LABEL: length384_eq: 6004; X86: # %bb.0: 6005; X86-NEXT: pushl $0 6006; X86-NEXT: pushl $384 # imm = 0x180 6007; X86-NEXT: pushl {{[0-9]+}}(%esp) 6008; X86-NEXT: pushl {{[0-9]+}}(%esp) 6009; X86-NEXT: calll memcmp 6010; X86-NEXT: addl $16, %esp 6011; X86-NEXT: testl %eax, %eax 6012; X86-NEXT: setne %al 6013; X86-NEXT: retl 6014; 6015; X64-LABEL: length384_eq: 6016; X64: # %bb.0: 6017; X64-NEXT: pushq %rax 6018; X64-NEXT: movl $384, %edx # imm = 0x180 6019; X64-NEXT: callq memcmp 6020; X64-NEXT: testl %eax, %eax 6021; X64-NEXT: setne %al 6022; X64-NEXT: popq %rcx 6023; X64-NEXT: retq 6024 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 384) nounwind 6025 %cmp = icmp ne i32 %call, 0 6026 ret i1 %cmp 6027} 6028 6029define i1 @length384_lt(i8* %x, i8* %y) nounwind { 6030; X86-LABEL: length384_lt: 6031; X86: # %bb.0: 6032; X86-NEXT: pushl $0 6033; X86-NEXT: pushl $384 # imm = 0x180 6034; X86-NEXT: pushl {{[0-9]+}}(%esp) 6035; X86-NEXT: pushl {{[0-9]+}}(%esp) 6036; X86-NEXT: calll memcmp 6037; X86-NEXT: addl $16, %esp 6038; X86-NEXT: shrl $31, %eax 6039; X86-NEXT: # kill: def $al killed $al killed $eax 6040; X86-NEXT: retl 6041; 6042; X64-LABEL: length384_lt: 6043; X64: # %bb.0: 6044; X64-NEXT: pushq %rax 6045; X64-NEXT: movl $384, %edx # imm = 0x180 6046; X64-NEXT: callq memcmp 6047; X64-NEXT: shrl $31, %eax 6048; X64-NEXT: # kill: def $al killed $al killed $eax 6049; X64-NEXT: popq %rcx 6050; X64-NEXT: retq 6051 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 384) nounwind 6052 %cmp = icmp slt i32 %call, 0 6053 ret i1 %cmp 6054} 6055 6056define i1 @length384_gt(i8* %x, i8* %y) nounwind { 6057; X86-LABEL: length384_gt: 6058; X86: # %bb.0: 6059; X86-NEXT: pushl $0 6060; X86-NEXT: pushl $384 # imm = 0x180 6061; X86-NEXT: pushl {{[0-9]+}}(%esp) 6062; X86-NEXT: pushl {{[0-9]+}}(%esp) 6063; X86-NEXT: calll memcmp 6064; X86-NEXT: addl $16, %esp 6065; X86-NEXT: testl %eax, %eax 6066; X86-NEXT: setg %al 6067; X86-NEXT: retl 6068; 6069; X64-LABEL: length384_gt: 6070; X64: # %bb.0: 6071; X64-NEXT: pushq %rax 6072; X64-NEXT: movl $384, %edx # imm = 0x180 6073; X64-NEXT: callq memcmp 6074; X64-NEXT: testl %eax, %eax 6075; X64-NEXT: setg %al 6076; X64-NEXT: popq %rcx 6077; X64-NEXT: retq 6078 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 384) nounwind 6079 %cmp = icmp sgt i32 %call, 0 6080 ret i1 %cmp 6081} 6082 6083define i1 @length384_eq_const(i8* %X) nounwind { 6084; X86-LABEL: length384_eq_const: 6085; X86: # %bb.0: 6086; X86-NEXT: pushl $0 6087; X86-NEXT: pushl $384 # imm = 0x180 6088; X86-NEXT: pushl $.L.str 6089; X86-NEXT: pushl {{[0-9]+}}(%esp) 6090; X86-NEXT: calll memcmp 6091; X86-NEXT: addl $16, %esp 6092; X86-NEXT: testl %eax, %eax 6093; X86-NEXT: sete %al 6094; X86-NEXT: retl 6095; 6096; X64-LABEL: length384_eq_const: 6097; X64: # %bb.0: 6098; X64-NEXT: pushq %rax 6099; X64-NEXT: movl $.L.str, %esi 6100; X64-NEXT: movl $384, %edx # imm = 0x180 6101; X64-NEXT: callq memcmp 6102; X64-NEXT: testl %eax, %eax 6103; X64-NEXT: sete %al 6104; X64-NEXT: popq %rcx 6105; X64-NEXT: retq 6106 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 384) nounwind 6107 %c = icmp eq i32 %m, 0 6108 ret i1 %c 6109} 6110 6111define i32 @length511(i8* %X, i8* %Y) nounwind { 6112; X86-LABEL: length511: 6113; X86: # %bb.0: 6114; X86-NEXT: pushl $0 6115; X86-NEXT: pushl $511 # imm = 0x1FF 6116; X86-NEXT: pushl {{[0-9]+}}(%esp) 6117; X86-NEXT: pushl {{[0-9]+}}(%esp) 6118; X86-NEXT: calll memcmp 6119; X86-NEXT: addl $16, %esp 6120; X86-NEXT: retl 6121; 6122; X64-LABEL: length511: 6123; X64: # %bb.0: 6124; X64-NEXT: movl $511, %edx # imm = 0x1FF 6125; X64-NEXT: jmp memcmp # TAILCALL 6126 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 511) nounwind 6127 ret i32 %m 6128} 6129 6130define i1 @length511_eq(i8* %x, i8* %y) nounwind { 6131; X86-LABEL: length511_eq: 6132; X86: # %bb.0: 6133; X86-NEXT: pushl $0 6134; X86-NEXT: pushl $511 # imm = 0x1FF 6135; X86-NEXT: pushl {{[0-9]+}}(%esp) 6136; X86-NEXT: pushl {{[0-9]+}}(%esp) 6137; X86-NEXT: calll memcmp 6138; X86-NEXT: addl $16, %esp 6139; X86-NEXT: testl %eax, %eax 6140; X86-NEXT: setne %al 6141; X86-NEXT: retl 6142; 6143; X64-LABEL: length511_eq: 6144; X64: # %bb.0: 6145; X64-NEXT: pushq %rax 6146; X64-NEXT: movl $511, %edx # imm = 0x1FF 6147; X64-NEXT: callq memcmp 6148; X64-NEXT: testl %eax, %eax 6149; X64-NEXT: setne %al 6150; X64-NEXT: popq %rcx 6151; X64-NEXT: retq 6152 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 511) nounwind 6153 %cmp = icmp ne i32 %call, 0 6154 ret i1 %cmp 6155} 6156 6157define i1 @length511_lt(i8* %x, i8* %y) nounwind { 6158; X86-LABEL: length511_lt: 6159; X86: # %bb.0: 6160; X86-NEXT: pushl $0 6161; X86-NEXT: pushl $511 # imm = 0x1FF 6162; X86-NEXT: pushl {{[0-9]+}}(%esp) 6163; X86-NEXT: pushl {{[0-9]+}}(%esp) 6164; X86-NEXT: calll memcmp 6165; X86-NEXT: addl $16, %esp 6166; X86-NEXT: shrl $31, %eax 6167; X86-NEXT: # kill: def $al killed $al killed $eax 6168; X86-NEXT: retl 6169; 6170; X64-LABEL: length511_lt: 6171; X64: # %bb.0: 6172; X64-NEXT: pushq %rax 6173; X64-NEXT: movl $511, %edx # imm = 0x1FF 6174; X64-NEXT: callq memcmp 6175; X64-NEXT: shrl $31, %eax 6176; X64-NEXT: # kill: def $al killed $al killed $eax 6177; X64-NEXT: popq %rcx 6178; X64-NEXT: retq 6179 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 511) nounwind 6180 %cmp = icmp slt i32 %call, 0 6181 ret i1 %cmp 6182} 6183 6184define i1 @length511_gt(i8* %x, i8* %y) nounwind { 6185; X86-LABEL: length511_gt: 6186; X86: # %bb.0: 6187; X86-NEXT: pushl $0 6188; X86-NEXT: pushl $511 # imm = 0x1FF 6189; X86-NEXT: pushl {{[0-9]+}}(%esp) 6190; X86-NEXT: pushl {{[0-9]+}}(%esp) 6191; X86-NEXT: calll memcmp 6192; X86-NEXT: addl $16, %esp 6193; X86-NEXT: testl %eax, %eax 6194; X86-NEXT: setg %al 6195; X86-NEXT: retl 6196; 6197; X64-LABEL: length511_gt: 6198; X64: # %bb.0: 6199; X64-NEXT: pushq %rax 6200; X64-NEXT: movl $511, %edx # imm = 0x1FF 6201; X64-NEXT: callq memcmp 6202; X64-NEXT: testl %eax, %eax 6203; X64-NEXT: setg %al 6204; X64-NEXT: popq %rcx 6205; X64-NEXT: retq 6206 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 511) nounwind 6207 %cmp = icmp sgt i32 %call, 0 6208 ret i1 %cmp 6209} 6210 6211define i1 @length511_eq_const(i8* %X) nounwind { 6212; X86-LABEL: length511_eq_const: 6213; X86: # %bb.0: 6214; X86-NEXT: pushl $0 6215; X86-NEXT: pushl $511 # imm = 0x1FF 6216; X86-NEXT: pushl $.L.str 6217; X86-NEXT: pushl {{[0-9]+}}(%esp) 6218; X86-NEXT: calll memcmp 6219; X86-NEXT: addl $16, %esp 6220; X86-NEXT: testl %eax, %eax 6221; X86-NEXT: sete %al 6222; X86-NEXT: retl 6223; 6224; X64-LABEL: length511_eq_const: 6225; X64: # %bb.0: 6226; X64-NEXT: pushq %rax 6227; X64-NEXT: movl $.L.str, %esi 6228; X64-NEXT: movl $511, %edx # imm = 0x1FF 6229; X64-NEXT: callq memcmp 6230; X64-NEXT: testl %eax, %eax 6231; X64-NEXT: sete %al 6232; X64-NEXT: popq %rcx 6233; X64-NEXT: retq 6234 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 511) nounwind 6235 %c = icmp eq i32 %m, 0 6236 ret i1 %c 6237} 6238 6239define i32 @length512(i8* %X, i8* %Y) nounwind { 6240; X86-LABEL: length512: 6241; X86: # %bb.0: 6242; X86-NEXT: pushl $0 6243; X86-NEXT: pushl $512 # imm = 0x200 6244; X86-NEXT: pushl {{[0-9]+}}(%esp) 6245; X86-NEXT: pushl {{[0-9]+}}(%esp) 6246; X86-NEXT: calll memcmp 6247; X86-NEXT: addl $16, %esp 6248; X86-NEXT: retl 6249; 6250; X64-LABEL: length512: 6251; X64: # %bb.0: 6252; X64-NEXT: movl $512, %edx # imm = 0x200 6253; X64-NEXT: jmp memcmp # TAILCALL 6254 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 512) nounwind 6255 ret i32 %m 6256} 6257 6258define i1 @length512_eq(i8* %x, i8* %y) nounwind { 6259; X86-LABEL: length512_eq: 6260; X86: # %bb.0: 6261; X86-NEXT: pushl $0 6262; X86-NEXT: pushl $512 # imm = 0x200 6263; X86-NEXT: pushl {{[0-9]+}}(%esp) 6264; X86-NEXT: pushl {{[0-9]+}}(%esp) 6265; X86-NEXT: calll memcmp 6266; X86-NEXT: addl $16, %esp 6267; X86-NEXT: testl %eax, %eax 6268; X86-NEXT: setne %al 6269; X86-NEXT: retl 6270; 6271; X64-LABEL: length512_eq: 6272; X64: # %bb.0: 6273; X64-NEXT: pushq %rax 6274; X64-NEXT: movl $512, %edx # imm = 0x200 6275; X64-NEXT: callq memcmp 6276; X64-NEXT: testl %eax, %eax 6277; X64-NEXT: setne %al 6278; X64-NEXT: popq %rcx 6279; X64-NEXT: retq 6280 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 512) nounwind 6281 %cmp = icmp ne i32 %call, 0 6282 ret i1 %cmp 6283} 6284 6285define i1 @length512_lt(i8* %x, i8* %y) nounwind { 6286; X86-LABEL: length512_lt: 6287; X86: # %bb.0: 6288; X86-NEXT: pushl $0 6289; X86-NEXT: pushl $512 # imm = 0x200 6290; X86-NEXT: pushl {{[0-9]+}}(%esp) 6291; X86-NEXT: pushl {{[0-9]+}}(%esp) 6292; X86-NEXT: calll memcmp 6293; X86-NEXT: addl $16, %esp 6294; X86-NEXT: shrl $31, %eax 6295; X86-NEXT: # kill: def $al killed $al killed $eax 6296; X86-NEXT: retl 6297; 6298; X64-LABEL: length512_lt: 6299; X64: # %bb.0: 6300; X64-NEXT: pushq %rax 6301; X64-NEXT: movl $512, %edx # imm = 0x200 6302; X64-NEXT: callq memcmp 6303; X64-NEXT: shrl $31, %eax 6304; X64-NEXT: # kill: def $al killed $al killed $eax 6305; X64-NEXT: popq %rcx 6306; X64-NEXT: retq 6307 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 512) nounwind 6308 %cmp = icmp slt i32 %call, 0 6309 ret i1 %cmp 6310} 6311 6312define i1 @length512_gt(i8* %x, i8* %y) nounwind { 6313; X86-LABEL: length512_gt: 6314; X86: # %bb.0: 6315; X86-NEXT: pushl $0 6316; X86-NEXT: pushl $512 # imm = 0x200 6317; X86-NEXT: pushl {{[0-9]+}}(%esp) 6318; X86-NEXT: pushl {{[0-9]+}}(%esp) 6319; X86-NEXT: calll memcmp 6320; X86-NEXT: addl $16, %esp 6321; X86-NEXT: testl %eax, %eax 6322; X86-NEXT: setg %al 6323; X86-NEXT: retl 6324; 6325; X64-LABEL: length512_gt: 6326; X64: # %bb.0: 6327; X64-NEXT: pushq %rax 6328; X64-NEXT: movl $512, %edx # imm = 0x200 6329; X64-NEXT: callq memcmp 6330; X64-NEXT: testl %eax, %eax 6331; X64-NEXT: setg %al 6332; X64-NEXT: popq %rcx 6333; X64-NEXT: retq 6334 %call = tail call i32 @memcmp(i8* %x, i8* %y, i64 512) nounwind 6335 %cmp = icmp sgt i32 %call, 0 6336 ret i1 %cmp 6337} 6338 6339define i1 @length512_eq_const(i8* %X) nounwind { 6340; X86-LABEL: length512_eq_const: 6341; X86: # %bb.0: 6342; X86-NEXT: pushl $0 6343; X86-NEXT: pushl $512 # imm = 0x200 6344; X86-NEXT: pushl $.L.str 6345; X86-NEXT: pushl {{[0-9]+}}(%esp) 6346; X86-NEXT: calll memcmp 6347; X86-NEXT: addl $16, %esp 6348; X86-NEXT: testl %eax, %eax 6349; X86-NEXT: sete %al 6350; X86-NEXT: retl 6351; 6352; X64-LABEL: length512_eq_const: 6353; X64: # %bb.0: 6354; X64-NEXT: pushq %rax 6355; X64-NEXT: movl $.L.str, %esi 6356; X64-NEXT: movl $512, %edx # imm = 0x200 6357; X64-NEXT: callq memcmp 6358; X64-NEXT: testl %eax, %eax 6359; X64-NEXT: sete %al 6360; X64-NEXT: popq %rcx 6361; X64-NEXT: retq 6362 %m = tail call i32 @memcmp(i8* %X, i8* getelementptr inbounds ([513 x i8], [513 x i8]* @.str, i32 0, i32 0), i64 512) nounwind 6363 %c = icmp eq i32 %m, 0 6364 ret i1 %c 6365} 6366 6367; This checks that we do not do stupid things with huge sizes. 6368define i32 @huge_length(i8* %X, i8* %Y) nounwind { 6369; X86-LABEL: huge_length: 6370; X86: # %bb.0: 6371; X86-NEXT: pushl $2147483647 # imm = 0x7FFFFFFF 6372; X86-NEXT: pushl $-1 6373; X86-NEXT: pushl {{[0-9]+}}(%esp) 6374; X86-NEXT: pushl {{[0-9]+}}(%esp) 6375; X86-NEXT: calll memcmp 6376; X86-NEXT: addl $16, %esp 6377; X86-NEXT: retl 6378; 6379; X64-LABEL: huge_length: 6380; X64: # %bb.0: 6381; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF 6382; X64-NEXT: jmp memcmp # TAILCALL 6383 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 9223372036854775807) nounwind 6384 ret i32 %m 6385} 6386 6387define i1 @huge_length_eq(i8* %X, i8* %Y) nounwind { 6388; X86-LABEL: huge_length_eq: 6389; X86: # %bb.0: 6390; X86-NEXT: pushl $2147483647 # imm = 0x7FFFFFFF 6391; X86-NEXT: pushl $-1 6392; X86-NEXT: pushl {{[0-9]+}}(%esp) 6393; X86-NEXT: pushl {{[0-9]+}}(%esp) 6394; X86-NEXT: calll memcmp 6395; X86-NEXT: addl $16, %esp 6396; X86-NEXT: testl %eax, %eax 6397; X86-NEXT: sete %al 6398; X86-NEXT: retl 6399; 6400; X64-LABEL: huge_length_eq: 6401; X64: # %bb.0: 6402; X64-NEXT: pushq %rax 6403; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF 6404; X64-NEXT: callq memcmp 6405; X64-NEXT: testl %eax, %eax 6406; X64-NEXT: sete %al 6407; X64-NEXT: popq %rcx 6408; X64-NEXT: retq 6409 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 9223372036854775807) nounwind 6410 %c = icmp eq i32 %m, 0 6411 ret i1 %c 6412} 6413 6414; This checks non-constant sizes. 6415define i32 @nonconst_length(i8* %X, i8* %Y, i64 %size) nounwind { 6416; X86-LABEL: nonconst_length: 6417; X86: # %bb.0: 6418; X86-NEXT: jmp memcmp # TAILCALL 6419; 6420; X64-LABEL: nonconst_length: 6421; X64: # %bb.0: 6422; X64-NEXT: jmp memcmp # TAILCALL 6423 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 %size) nounwind 6424 ret i32 %m 6425} 6426 6427define i1 @nonconst_length_eq(i8* %X, i8* %Y, i64 %size) nounwind { 6428; X86-LABEL: nonconst_length_eq: 6429; X86: # %bb.0: 6430; X86-NEXT: pushl {{[0-9]+}}(%esp) 6431; X86-NEXT: pushl {{[0-9]+}}(%esp) 6432; X86-NEXT: pushl {{[0-9]+}}(%esp) 6433; X86-NEXT: pushl {{[0-9]+}}(%esp) 6434; X86-NEXT: calll memcmp 6435; X86-NEXT: addl $16, %esp 6436; X86-NEXT: testl %eax, %eax 6437; X86-NEXT: sete %al 6438; X86-NEXT: retl 6439; 6440; X64-LABEL: nonconst_length_eq: 6441; X64: # %bb.0: 6442; X64-NEXT: pushq %rax 6443; X64-NEXT: callq memcmp 6444; X64-NEXT: testl %eax, %eax 6445; X64-NEXT: sete %al 6446; X64-NEXT: popq %rcx 6447; X64-NEXT: retq 6448 %m = tail call i32 @memcmp(i8* %X, i8* %Y, i64 %size) nounwind 6449 %c = icmp eq i32 %m, 0 6450 ret i1 %c 6451} 6452